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 42struct glamor_context; 43struct gbm_bo; 44struct 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 */ 56typedef 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 63typedef 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 */ 97extern _X_EXPORT Bool glamor_init(ScreenPtr screen, unsigned int flags); 98extern _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.*/ 109extern _X_EXPORT Bool glamor_close_screen(ScreenPtr screen); 110 111extern _X_EXPORT uint32_t glamor_get_pixmap_texture(PixmapPtr pixmap); 112 113extern _X_EXPORT Bool glamor_set_pixmap_texture(PixmapPtr pixmap, 114 unsigned int tex); 115 116extern _X_EXPORT void glamor_set_pixmap_type(PixmapPtr pixmap, 117 glamor_pixmap_type_t type); 118 119extern _X_EXPORT void glamor_clear_pixmap(PixmapPtr pixmap); 120 121extern _X_EXPORT void glamor_block_handler(ScreenPtr screen); 122 123extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h, 124 int depth, unsigned int usage); 125extern _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 * */ 142extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front, 143 PixmapPtr back); 144 145extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front, 146 PixmapPtr back); 147 148/* The DDX is not supposed to call these four functions */ 149extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen); 150extern _X_EXPORT int glamor_egl_fds_from_pixmap(ScreenPtr, PixmapPtr, int *, 151 uint32_t *, uint32_t *, 152 uint64_t *); 153extern _X_EXPORT int glamor_egl_fd_name_from_pixmap(ScreenPtr, PixmapPtr, 154 CARD16 *, CARD32 *); 155 156extern _X_EXPORT struct gbm_device *glamor_egl_get_gbm_device(ScreenPtr screen); 157extern _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 * */ 172extern _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 * */ 185extern _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 * */ 202extern _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 * */ 221extern _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 * */ 238extern _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 * */ 253extern _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 * */ 270extern _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 * */ 293extern _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 * */ 313extern _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 321extern _X_EXPORT Bool glamor_get_formats(ScreenPtr screen, 322 CARD32 *num_formats, 323 CARD32 **formats); 324 325extern _X_EXPORT Bool glamor_get_modifiers(ScreenPtr screen, 326 uint32_t format, 327 uint32_t *num_modifiers, 328 uint64_t **modifiers); 329 330extern _X_EXPORT Bool glamor_get_drawable_modifiers(DrawablePtr draw, 331 uint32_t format, 332 uint32_t *num_modifiers, 333 uint64_t **modifiers); 334 335extern _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 * */ 351extern _X_EXPORT Bool glamor_egl_init(ScrnInfoPtr scrn, int fd); 352 353extern _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 */ 364extern _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 */ 385extern _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 */ 397extern _X_EXPORT Bool 398 glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, 399 struct gbm_bo *bo, 400 Bool used_modifiers); 401 402extern _X_EXPORT const char *glamor_egl_get_driver_name(ScreenPtr screen); 403 404#endif 405 406extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen, 407 struct glamor_context *glamor_ctx); 408 409extern _X_EXPORT int glamor_create_gc(GCPtr gc); 410 411extern _X_EXPORT void glamor_validate_gc(GCPtr gc, unsigned long changes, 412 DrawablePtr drawable); 413 414extern _X_EXPORT void glamor_destroy_gc(GCPtr gc); 415 416#define HAS_GLAMOR_DESTROY_GC 1 417 418extern Bool _X_EXPORT glamor_change_window_attributes(WindowPtr pWin, unsigned long mask); 419extern void _X_EXPORT glamor_copy_window(WindowPtr window, DDXPointRec old_origin, RegionPtr src_region); 420 421extern _X_EXPORT void glamor_finish(ScreenPtr screen); 422#define HAS_GLAMOR_TEXT 1 423 424#ifdef GLAMOR_FOR_XORG 425extern _X_EXPORT XF86VideoAdaptorPtr glamor_xv_init(ScreenPtr pScreen, 426 int num_texture_ports); 427#endif 428 429#endif /* GLAMOR_H */ 430