xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

glamor.h (17353B)


      1 /*
      2  * Copyright © 2008 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Eric Anholt <eric@anholt.net>
     25  *    Zhigang Gong <zhigang.gong@linux.intel.com>
     26  *
     27  */
     28 
     29 #ifndef GLAMOR_H
     30 #define GLAMOR_H
     31 
     32 #include <scrnintstr.h>
     33 #include <pixmapstr.h>
     34 #include <gcstruct.h>
     35 #include <picturestr.h>
     36 #include <fb.h>
     37 #include <fbpict.h>
     38 #ifdef GLAMOR_FOR_XORG
     39 #include <xf86xv.h>
     40 #endif
     41 
     42 struct glamor_context;
     43 struct gbm_bo;
     44 struct gbm_device;
     45 
     46 /*
     47  * glamor_pixmap_type : glamor pixmap's type.
     48  * @MEMORY: pixmap is in memory.
     49  * @TEXTURE_DRM: pixmap is in a texture created from a DRM buffer.
     50  * @SEPARATE_TEXTURE: The texture is created from a DRM buffer, but
     51  * 		      the format is incompatible, so this type of pixmap
     52  * 		      will never fallback to DDX layer.
     53  * @DRM_ONLY: pixmap is in a external DRM buffer.
     54  * @TEXTURE_ONLY: pixmap is in an internal texture.
     55  */
     56 typedef enum glamor_pixmap_type {
     57     GLAMOR_MEMORY = 0, /* Newly calloc()ed pixmaps are memory. */
     58     GLAMOR_TEXTURE_DRM,
     59     GLAMOR_DRM_ONLY,
     60     GLAMOR_TEXTURE_ONLY,
     61 } glamor_pixmap_type_t;
     62 
     63 typedef Bool (*GetDrawableModifiersFuncPtr) (DrawablePtr draw,
     64                                              uint32_t format,
     65                                              uint32_t *num_modifiers,
     66                                              uint64_t **modifiers);
     67 
     68 #define GLAMOR_EGL_EXTERNAL_BUFFER 3
     69 #define GLAMOR_USE_EGL_SCREEN		(1 << 0)
     70 #define GLAMOR_NO_DRI3			(1 << 1)
     71 #define GLAMOR_VALID_FLAGS      (GLAMOR_USE_EGL_SCREEN                \
     72                                  | GLAMOR_NO_DRI3)
     73 
     74 /* until we need geometry shaders GL3.1 should suffice. */
     75 #define GLAMOR_GL_CORE_VER_MAJOR 3
     76 #define GLAMOR_GL_CORE_VER_MINOR 1
     77 
     78 /* @glamor_init: Initialize glamor internal data structure.
     79  *
     80  * @screen: Current screen pointer.
     81  * @flags:  Please refer the flags description above.
     82  *
     83  * 	@GLAMOR_USE_EGL_SCREEN:
     84  * 	If you are using EGL layer, then please set this bit
     85  * 	on, otherwise, clear it.
     86  *
     87  *      @GLAMOR_NO_DRI3
     88  *      Disable the built-in DRI3 support
     89  *
     90  * This function initializes necessary internal data structure
     91  * for glamor. And before calling into this function, the OpenGL
     92  * environment should be ready. Should be called before any real
     93  * glamor rendering or texture allocation functions. And should
     94  * be called after the DDX's screen initialization or at the last
     95  * step of the DDX's screen initialization.
     96  */
     97 extern _X_EXPORT Bool glamor_init(ScreenPtr screen, unsigned int flags);
     98 extern _X_EXPORT void glamor_fini(ScreenPtr screen);
     99 
    100 /* This function is used to free the glamor private screen's
    101  * resources. If the DDX driver is not set GLAMOR_USE_SCREEN,
    102  * then, DDX need to call this function at proper stage, if
    103  * it is the xorg DDX driver,then it should be called at free
    104  * screen stage not the close screen stage. The reason is after
    105  * call to this function, the xorg DDX may need to destroy the
    106  * screen pixmap which must be a glamor pixmap and requires
    107  * the internal data structure still exist at that time.
    108  * Otherwise, the glamor internal structure will not be freed.*/
    109 extern _X_EXPORT Bool glamor_close_screen(ScreenPtr screen);
    110 
    111 extern _X_EXPORT uint32_t glamor_get_pixmap_texture(PixmapPtr pixmap);
    112 
    113 extern _X_EXPORT Bool glamor_set_pixmap_texture(PixmapPtr pixmap,
    114                                                 unsigned int tex);
    115 
    116 extern _X_EXPORT void glamor_set_pixmap_type(PixmapPtr pixmap,
    117                                              glamor_pixmap_type_t type);
    118 
    119 extern _X_EXPORT void glamor_clear_pixmap(PixmapPtr pixmap);
    120 
    121 extern _X_EXPORT void glamor_block_handler(ScreenPtr screen);
    122 
    123 extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h,
    124                                                 int depth, unsigned int usage);
    125 extern _X_EXPORT Bool glamor_destroy_pixmap(PixmapPtr pixmap);
    126 
    127 #define GLAMOR_CREATE_PIXMAP_CPU        0x100
    128 #define GLAMOR_CREATE_PIXMAP_FIXUP      0x101
    129 #define GLAMOR_CREATE_FBO_NO_FBO        0x103
    130 #define GLAMOR_CREATE_NO_LARGE          0x105
    131 #define GLAMOR_CREATE_PIXMAP_NO_TEXTURE 0x106
    132 #define GLAMOR_CREATE_FORMAT_CBCR       0x107
    133 
    134 /* @glamor_egl_exchange_buffers: Exchange the underlying buffers(KHR image,fbo).
    135  *
    136  * @front: front pixmap.
    137  * @back: back pixmap.
    138  *
    139  * Used by the DRI2 page flip. This function will exchange the KHR images and
    140  * fbos of the two pixmaps.
    141  * */
    142 extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front,
    143                                                   PixmapPtr back);
    144 
    145 extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front,
    146                                                   PixmapPtr back);
    147 
    148 /* The DDX is not supposed to call these four functions */
    149 extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen);
    150 extern _X_EXPORT int glamor_egl_fds_from_pixmap(ScreenPtr, PixmapPtr, int *,
    151                                                 uint32_t *, uint32_t *,
    152                                                 uint64_t *);
    153 extern _X_EXPORT int glamor_egl_fd_name_from_pixmap(ScreenPtr, PixmapPtr,
    154                                                     CARD16 *, CARD32 *);
    155 
    156 extern _X_EXPORT struct gbm_device *glamor_egl_get_gbm_device(ScreenPtr screen);
    157 extern _X_EXPORT int glamor_egl_fd_from_pixmap(ScreenPtr, PixmapPtr, CARD16 *, CARD32 *);
    158 
    159 /* @glamor_supports_pixmap_import_export: Returns whether
    160  * glamor_fds_from_pixmap(), glamor_name_from_pixmap(), and
    161  * glamor_pixmap_from_fds() are supported.
    162  *
    163  * @screen: Current screen pointer.
    164  *
    165  * To have DRI3 support enabled, glamor and glamor_egl need to be
    166  * initialized. glamor also has to be compiled with gbm support.
    167  *
    168  * The EGL layer needs to have the following extensions working:
    169  *
    170  * .EGL_KHR_surfaceless_context
    171  * */
    172 extern _X_EXPORT Bool glamor_supports_pixmap_import_export(ScreenPtr screen);
    173 
    174 /* @glamor_fds_from_pixmap: Get a dma-buf fd from a pixmap.
    175  *
    176  * @screen: Current screen pointer.
    177  * @pixmap: The pixmap from which we want the fd.
    178  * @fds, @strides, @offsets: Pointers to fill info of each plane.
    179  * @modifier: Pointer to fill the modifier of the buffer.
    180  *
    181  * the pixmap and the buffer associated by the fds will share the same
    182  * content. The caller is responsible to close the returned file descriptors.
    183  * Returns the number of planes, -1 on error.
    184  * */
    185 extern _X_EXPORT int glamor_fds_from_pixmap(ScreenPtr screen,
    186                                             PixmapPtr pixmap,
    187                                             int *fds,
    188                                             uint32_t *strides, uint32_t *offsets,
    189                                             uint64_t *modifier);
    190 
    191 /* @glamor_fd_from_pixmap: Get a dma-buf fd from a pixmap.
    192  *
    193  * @screen: Current screen pointer.
    194  * @pixmap: The pixmap from which we want the fd.
    195  * @stride, @size: Pointers to fill the stride and size of the
    196  * 		   buffer associated to the fd.
    197  *
    198  * the pixmap and the buffer associated by the fd will share the same
    199  * content.
    200  * Returns the fd on success, -1 on error.
    201  * */
    202 extern _X_EXPORT int glamor_fd_from_pixmap(ScreenPtr screen,
    203                                            PixmapPtr pixmap,
    204                                            CARD16 *stride, CARD32 *size);
    205 
    206 /* @glamor_shareable_fd_from_pixmap: Get a dma-buf fd suitable for sharing
    207  *				     with other GPUs from a pixmap.
    208  *
    209  * @screen: Current screen pointer.
    210  * @pixmap: The pixmap from which we want the fd.
    211  * @stride, @size: Pointers to fill the stride and size of the
    212  * 		   buffer associated to the fd.
    213  *
    214  * The returned fd will point to a buffer which is suitable for sharing
    215  * across GPUs (not using GPU specific tiling).
    216  * The pixmap and the buffer associated by the fd will share the same
    217  * content.
    218  * The pixmap's stride may be modified by this function.
    219  * Returns the fd on success, -1 on error.
    220  * */
    221 extern _X_EXPORT int glamor_shareable_fd_from_pixmap(ScreenPtr screen,
    222                                                      PixmapPtr pixmap,
    223                                                      CARD16 *stride,
    224                                                      CARD32 *size);
    225 
    226 /**
    227  * @glamor_name_from_pixmap: Gets a gem name from a pixmap.
    228  *
    229  * @pixmap: The pixmap from which we want the gem name.
    230  *
    231  * the pixmap and the buffer associated by the gem name will share the
    232  * same content. This function can be used by the DDX to support DRI2,
    233  * and needs the same set of buffer export GL extensions as DRI3
    234  * support.
    235  *
    236  * Returns the name on success, -1 on error.
    237  * */
    238 extern _X_EXPORT int glamor_name_from_pixmap(PixmapPtr pixmap,
    239                                              CARD16 *stride, CARD32 *size);
    240 
    241 /* @glamor_gbm_bo_from_pixmap: Get a GBM bo from a pixmap.
    242  *
    243  * @screen: Current screen pointer.
    244  * @pixmap: The pixmap from which we want the fd.
    245  * @stride, @size: Pointers to fill the stride and size of the
    246  * 		   buffer associated to the fd.
    247  *
    248  * the pixmap and the buffer represented by the gbm_bo will share the same
    249  * content.
    250  *
    251  * Returns the gbm_bo on success, NULL on error.
    252  * */
    253 extern _X_EXPORT struct gbm_bo *glamor_gbm_bo_from_pixmap(ScreenPtr screen,
    254                                                           PixmapPtr pixmap);
    255 
    256 /* @glamor_pixmap_from_fds: Creates a pixmap to wrap a dma-buf fds.
    257  *
    258  * @screen: Current screen pointer.
    259  * @num_fds: Number of fds to import
    260  * @fds: The dma-buf fds to import.
    261  * @width: The width of the buffers.
    262  * @height: The height of the buffers.
    263  * @stride: The stride of the buffers.
    264  * @depth: The depth of the buffers.
    265  * @bpp: The bpp of the buffers.
    266  * @modifier: The modifier of the buffers.
    267  *
    268  * Returns a valid pixmap if the import succeeded, else NULL.
    269  * */
    270 extern _X_EXPORT PixmapPtr glamor_pixmap_from_fds(ScreenPtr screen,
    271                                                   CARD8 num_fds,
    272                                                   const int *fds,
    273                                                   CARD16 width,
    274                                                   CARD16 height,
    275                                                   const CARD32 *strides,
    276                                                   const CARD32 *offsets,
    277                                                   CARD8 depth,
    278                                                   CARD8 bpp,
    279                                                   uint64_t modifier);
    280 
    281 /* @glamor_pixmap_from_fd: Creates a pixmap to wrap a dma-buf fd.
    282  *
    283  * @screen: Current screen pointer.
    284  * @fd: The dma-buf fd to import.
    285  * @width: The width of the buffer.
    286  * @height: The height of the buffer.
    287  * @stride: The stride of the buffer.
    288  * @depth: The depth of the buffer.
    289  * @bpp: The bpp of the buffer.
    290  *
    291  * Returns a valid pixmap if the import succeeded, else NULL.
    292  * */
    293 extern _X_EXPORT PixmapPtr glamor_pixmap_from_fd(ScreenPtr screen,
    294                                                  int fd,
    295                                                  CARD16 width,
    296                                                  CARD16 height,
    297                                                  CARD16 stride,
    298                                                  CARD8 depth,
    299                                                  CARD8 bpp);
    300 
    301 /* @glamor_back_pixmap_from_fd: Backs an existing pixmap with a dma-buf fd.
    302  *
    303  * @pixmap: Pixmap to change backing for
    304  * @fd: The dma-buf fd to import.
    305  * @width: The width of the buffer.
    306  * @height: The height of the buffer.
    307  * @stride: The stride of the buffer.
    308  * @depth: The depth of the buffer.
    309  * @bpp: The number of bpp of the buffer.
    310  *
    311  * Returns TRUE if successful, FALSE on failure.
    312  * */
    313 extern _X_EXPORT Bool glamor_back_pixmap_from_fd(PixmapPtr pixmap,
    314                                                  int fd,
    315                                                  CARD16 width,
    316                                                  CARD16 height,
    317                                                  CARD16 stride,
    318                                                  CARD8 depth,
    319                                                  CARD8 bpp);
    320 
    321 extern _X_EXPORT Bool glamor_get_formats(ScreenPtr screen,
    322                                          CARD32 *num_formats,
    323                                          CARD32 **formats);
    324 
    325 extern _X_EXPORT Bool glamor_get_modifiers(ScreenPtr screen,
    326                                            uint32_t format,
    327                                            uint32_t *num_modifiers,
    328                                            uint64_t **modifiers);
    329 
    330 extern _X_EXPORT Bool glamor_get_drawable_modifiers(DrawablePtr draw,
    331                                                     uint32_t format,
    332                                                     uint32_t *num_modifiers,
    333                                                     uint64_t **modifiers);
    334 
    335 extern _X_EXPORT void glamor_set_drawable_modifiers_func(ScreenPtr screen,
    336                                                          GetDrawableModifiersFuncPtr func);
    337 
    338 #ifdef GLAMOR_FOR_XORG
    339 
    340 #define GLAMOR_EGL_MODULE_NAME  "glamoregl"
    341 
    342 /* @glamor_egl_init: Initialize EGL environment.
    343  *
    344  * @scrn: Current screen info pointer.
    345  * @fd:   Current drm fd.
    346  *
    347  * This function creates and initializes EGL contexts.
    348  * Should be called from DDX's preInit function.
    349  * Return TRUE if success, otherwise return FALSE.
    350  * */
    351 extern _X_EXPORT Bool glamor_egl_init(ScrnInfoPtr scrn, int fd);
    352 
    353 extern _X_EXPORT Bool glamor_egl_init_textured_pixmap(ScreenPtr screen);
    354 
    355 /* @glamor_egl_create_textured_screen: Create textured screen pixmap.
    356  *
    357  * @screen: screen pointer to be processed.
    358  * @handle: screen pixmap's BO handle.
    359  * @stride: screen pixmap's stride in bytes.
    360  *
    361  * This function is similar with the create_textured_pixmap. As the
    362  * screen pixmap is a special, we handle it separately in this function.
    363  */
    364 extern _X_EXPORT Bool glamor_egl_create_textured_screen(ScreenPtr screen,
    365                                                         int handle, int stride);
    366 
    367 /* Obsolete entrypoint, temporarily left here for API compatibility
    368  * for xf86-video-ati.
    369  */
    370 #define glamor_egl_create_textured_screen_ext(a, b, c, d) \
    371     glamor_egl_create_textured_screen(a, b, c)
    372 
    373 /*
    374  * @glamor_egl_create_textured_pixmap: Try to create a textured pixmap from
    375  * 				       a BO handle.
    376  *
    377  * @pixmap: The pixmap need to be processed.
    378  * @handle: The BO's handle attached to this pixmap at DDX layer.
    379  * @stride: Stride in bytes for this pixmap.
    380  *
    381  * This function try to create a texture from the handle and attach
    382  * the texture to the pixmap , thus glamor can render to this pixmap
    383  * as well. Return true if successful, otherwise return FALSE.
    384  */
    385 extern _X_EXPORT Bool glamor_egl_create_textured_pixmap(PixmapPtr pixmap,
    386                                                         int handle, int stride);
    387 
    388 /*
    389  * @glamor_egl_create_textured_pixmap_from_bo: Try to create a textured pixmap
    390  * 					       from a gbm_bo.
    391  *
    392  * @pixmap: The pixmap need to be processed.
    393  * @bo: a pointer on a gbm_bo structure attached to this pixmap at DDX layer.
    394  *
    395  * This function is similar to glamor_egl_create_textured_pixmap.
    396  */
    397 extern _X_EXPORT Bool
    398  glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap,
    399                                                struct gbm_bo *bo,
    400                                                Bool used_modifiers);
    401 
    402 extern _X_EXPORT const char *glamor_egl_get_driver_name(ScreenPtr screen);
    403 
    404 #endif
    405 
    406 extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen,
    407                                              struct glamor_context *glamor_ctx);
    408 
    409 extern _X_EXPORT int glamor_create_gc(GCPtr gc);
    410 
    411 extern _X_EXPORT void glamor_validate_gc(GCPtr gc, unsigned long changes,
    412                                          DrawablePtr drawable);
    413 
    414 extern _X_EXPORT void glamor_destroy_gc(GCPtr gc);
    415 
    416 #define HAS_GLAMOR_DESTROY_GC 1
    417 
    418 extern Bool _X_EXPORT glamor_change_window_attributes(WindowPtr pWin, unsigned long mask);
    419 extern void _X_EXPORT glamor_copy_window(WindowPtr window, DDXPointRec old_origin, RegionPtr src_region);
    420 
    421 extern _X_EXPORT void glamor_finish(ScreenPtr screen);
    422 #define HAS_GLAMOR_TEXT 1
    423 
    424 #ifdef GLAMOR_FOR_XORG
    425 extern _X_EXPORT XF86VideoAdaptorPtr glamor_xv_init(ScreenPtr pScreen,
    426                                                     int num_texture_ports);
    427 #endif
    428 
    429 #endif                          /* GLAMOR_H */