typedef struct drm_clip_rect drm_clip_rect_t;
#endif
+#include <GL/gl.h>
+
#include <stdint.h>
/**
typedef struct __DRI2throttleExtensionRec __DRI2throttleExtension;
typedef struct __DRI2fenceExtensionRec __DRI2fenceExtension;
typedef struct __DRI2interopExtensionRec __DRI2interopExtension;
-
+typedef struct __DRI2blobExtensionRec __DRI2blobExtension;
+typedef struct __DRI2bufferDamageExtensionRec __DRI2bufferDamageExtension;
typedef struct __DRIimageLoaderExtensionRec __DRIimageLoaderExtension;
typedef struct __DRIimageDriverExtensionRec __DRIimageDriverExtension;
enum __DRI2throttleReason reason);
};
+/**
+ * Extension for EGL_ANDROID_blob_cache
+ */
+
+#define __DRI2_BLOB "DRI2_Blob"
+#define __DRI2_BLOB_VERSION 1
+
+typedef void
+(*__DRIblobCacheSet) (const void *key, signed long keySize,
+ const void *value, signed long valueSize);
+
+typedef signed long
+(*__DRIblobCacheGet) (const void *key, signed long keySize,
+ void *value, signed long valueSize);
+
+struct __DRI2blobExtensionRec {
+ __DRIextension base;
+
+ /**
+ * Set cache functions for setting and getting cache entries.
+ */
+ void (*set_cache_funcs) (__DRIscreen *screen,
+ __DRIblobCacheSet set, __DRIblobCacheGet get);
+};
/**
* Extension for fences / synchronization objects.
struct mesa_glinterop_export_out *out);
};
+
+/**
+ * Extension for limiting window system back buffer rendering to user-defined
+ * scissor region.
+ */
+
+#define __DRI2_BUFFER_DAMAGE "DRI2_BufferDamage"
+#define __DRI2_BUFFER_DAMAGE_VERSION 1
+
+struct __DRI2bufferDamageExtensionRec {
+ __DRIextension base;
+
+ /**
+ * Provides an array of rectangles representing an overriding scissor region
+ * for rendering operations performed to the specified drawable. These
+ * rectangles do not replace client API scissor regions or draw
+ * co-ordinates, but instead inform the driver of the overall bounds of all
+ * operations which will be issued before the next flush.
+ *
+ * Any rendering operations writing pixels outside this region to the
+ * drawable will have an undefined effect on the entire drawable.
+ *
+ * This entrypoint may only be called after the drawable has either been
+ * newly created or flushed, and before any rendering operations which write
+ * pixels to the drawable. Calling this entrypoint at any other time will
+ * have an undefined effect on the entire drawable.
+ *
+ * Calling this entrypoint with @nrects 0 and @rects NULL will reset the
+ * region to the buffer's full size. This entrypoint may be called once to
+ * reset the region, followed by a second call with a populated region,
+ * before a rendering call is made.
+ *
+ * Used to implement EGL_KHR_partial_update.
+ *
+ * \param drawable affected drawable
+ * \param nrects number of rectangles provided
+ * \param rects the array of rectangles, lower-left origin
+ */
+ void (*set_damage_region)(__DRIdrawable *drawable, unsigned int nrects,
+ int *rects);
+};
+
/*@}*/
/**
* SWRast Loader extension.
*/
#define __DRI_SWRAST_LOADER "DRI_SWRastLoader"
-#define __DRI_SWRAST_LOADER_VERSION 3
+#define __DRI_SWRAST_LOADER_VERSION 5
struct __DRIswrastLoaderExtensionRec {
__DRIextension base;
void (*getImage2)(__DRIdrawable *readable,
int x, int y, int width, int height, int stride,
char *data, void *loaderPrivate);
+
+ /**
+ * Put shm image to drawable
+ *
+ * \since 4
+ */
+ void (*putImageShm)(__DRIdrawable *drawable, int op,
+ int x, int y, int width, int height, int stride,
+ int shmid, char *shmaddr, unsigned offset,
+ void *loaderPrivate);
+ /**
+ * Get shm image from readable
+ *
+ * \since 4
+ */
+ void (*getImageShm)(__DRIdrawable *readable,
+ int x, int y, int width, int height,
+ int shmid, void *loaderPrivate);
+
+ /**
+ * Put shm image to drawable (v2)
+ *
+ * The original version fixes srcx/y to 0, and expected
+ * the offset to be adjusted. This version allows src x,y
+ * to not be included in the offset. This is needed to
+ * avoid certain overflow checks in the X server, that
+ * result in lost rendering.
+ *
+ * \since 5
+ */
+ void (*putImageShm2)(__DRIdrawable *drawable, int op,
+ int x, int y,
+ int width, int height, int stride,
+ int shmid, char *shmaddr, unsigned offset,
+ void *loaderPrivate);
};
/**
#define __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS 46
#define __DRI_ATTRIB_YINVERTED 47
#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48
-#define __DRI_ATTRIB_MAX (__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE + 1)
+#define __DRI_ATTRIB_MUTABLE_RENDER_BUFFER 49 /* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR */
+#define __DRI_ATTRIB_RED_SHIFT 50
+#define __DRI_ATTRIB_GREEN_SHIFT 51
+#define __DRI_ATTRIB_BLUE_SHIFT 52
+#define __DRI_ATTRIB_ALPHA_SHIFT 53
+#define __DRI_ATTRIB_MAX 54
/* __DRI_ATTRIB_RENDER_TYPE */
#define __DRI_ATTRIB_RGBA_BIT 0x01
* only BGRA ordering can be exposed.
*/
DRI_LOADER_CAP_RGBA_ORDERING,
+ DRI_LOADER_CAP_FP16,
};
struct __DRIdri2LoaderExtensionRec {
#define __DRI_CTX_RESET_LOSE_CONTEXT 1
/*@}*/
+#define __DRI_CTX_ATTRIB_PRIORITY 4
+
+#define __DRI_CTX_PRIORITY_LOW 0
+#define __DRI_CTX_PRIORITY_MEDIUM 1
+#define __DRI_CTX_PRIORITY_HIGH 2
+
+/**
+ * \name Context release behaviors.
+ */
+/*@{*/
+#define __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR 5
+
+#define __DRI_CTX_RELEASE_BEHAVIOR_NONE 0
+#define __DRI_CTX_RELEASE_BEHAVIOR_FLUSH 1
+/*@}*/
+
/**
* \name Reasons that __DRIdri2Extension::createContextAttribs might fail
*/
* extensions.
*/
#define __DRI_IMAGE "DRI_IMAGE"
-#define __DRI_IMAGE_VERSION 15
+#define __DRI_IMAGE_VERSION 17
/**
* These formats correspond to the similarly named MESA_FORMAT_*
#define __DRI_IMAGE_FORMAT_ARGB1555 0x100c
#define __DRI_IMAGE_FORMAT_R16 0x100d
#define __DRI_IMAGE_FORMAT_GR1616 0x100e
+#define __DRI_IMAGE_FORMAT_YUYV 0x100f
+#define __DRI_IMAGE_FORMAT_XBGR2101010 0x1010
+#define __DRI_IMAGE_FORMAT_ABGR2101010 0x1011
+#define __DRI_IMAGE_FORMAT_SABGR8 0x1012
+#define __DRI_IMAGE_FORMAT_UYVY 0x1013
+#define __DRI_IMAGE_FORMAT_XBGR16161616F 0x1014
+#define __DRI_IMAGE_FORMAT_ABGR16161616F 0x1015
#define __DRI_IMAGE_USE_SHARE 0x0001
#define __DRI_IMAGE_USE_SCANOUT 0x0002
(__DRI_IMAGE_TRANSFER_READ | __DRI_IMAGE_TRANSFER_WRITE)
/**
- * Four CC formats that matches with WL_DRM_FORMAT_* from wayland_drm.h,
- * GBM_FORMAT_* from gbm.h, and DRM_FORMAT_* from drm_fourcc.h. Used with
- * createImageFromNames.
+ * Extra fourcc formats used internally to Mesa with createImageFromNames.
+ * The externally-available fourccs are defined by drm_fourcc.h (DRM_FORMAT_*)
+ * and WL_DRM_FORMAT_* from wayland_drm.h.
*
* \since 5
*/
-#define __DRI_IMAGE_FOURCC_R8 0x20203852
-#define __DRI_IMAGE_FOURCC_GR88 0x38385247
-#define __DRI_IMAGE_FOURCC_ARGB1555 0x35315241
-#define __DRI_IMAGE_FOURCC_R16 0x20363152
-#define __DRI_IMAGE_FOURCC_GR1616 0x32335247
-#define __DRI_IMAGE_FOURCC_RGB565 0x36314752
-#define __DRI_IMAGE_FOURCC_ARGB8888 0x34325241
-#define __DRI_IMAGE_FOURCC_XRGB8888 0x34325258
-#define __DRI_IMAGE_FOURCC_ABGR8888 0x34324241
-#define __DRI_IMAGE_FOURCC_XBGR8888 0x34324258
-#define __DRI_IMAGE_FOURCC_SARGB8888 0x83324258
-#define __DRI_IMAGE_FOURCC_YUV410 0x39565559
-#define __DRI_IMAGE_FOURCC_YUV411 0x31315559
-#define __DRI_IMAGE_FOURCC_YUV420 0x32315559
-#define __DRI_IMAGE_FOURCC_YUV422 0x36315559
-#define __DRI_IMAGE_FOURCC_YUV444 0x34325559
-#define __DRI_IMAGE_FOURCC_NV12 0x3231564e
-#define __DRI_IMAGE_FOURCC_NV16 0x3631564e
-#define __DRI_IMAGE_FOURCC_YUYV 0x56595559
-#define __DRI_IMAGE_FOURCC_UYVY 0x59565955
-
-#define __DRI_IMAGE_FOURCC_YVU410 0x39555659
-#define __DRI_IMAGE_FOURCC_YVU411 0x31315659
-#define __DRI_IMAGE_FOURCC_YVU420 0x32315659
-#define __DRI_IMAGE_FOURCC_YVU422 0x36315659
-#define __DRI_IMAGE_FOURCC_YVU444 0x34325659
+#define __DRI_IMAGE_FOURCC_SARGB8888 0x83324258
+#define __DRI_IMAGE_FOURCC_SABGR8888 0x84324258
/**
* Queryable on images created by createImageFromNames.
#define __DRI_IMAGE_COMPONENTS_Y_UV 0x3004
#define __DRI_IMAGE_COMPONENTS_Y_XUXV 0x3005
#define __DRI_IMAGE_COMPONENTS_Y_UXVX 0x3008
+#define __DRI_IMAGE_COMPONENTS_AYUV 0x3009
+#define __DRI_IMAGE_COMPONENTS_XYUV 0x300A
#define __DRI_IMAGE_COMPONENTS_R 0x3006
#define __DRI_IMAGE_COMPONENTS_RG 0x3007
#define __BLIT_FLAG_FLUSH 0x0001
#define __BLIT_FLAG_FINISH 0x0002
+/**
+ * queryDmaBufFormatModifierAttribs attributes
+ */
+
+/* Available in version 16 */
+#define __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT 0x0001
+
typedef struct __DRIimageRec __DRIimage;
typedef struct __DRIimageExtensionRec __DRIimageExtension;
struct __DRIimageExtensionRec {
int name, int pitch,
void *loaderPrivate);
+ /* Deprecated since version 17; see createImageFromRenderbuffer2 */
__DRIimage *(*createImageFromRenderbuffer)(__DRIcontext *context,
int renderbuffer,
void *loaderPrivate);
GLboolean (*validateUsage)(__DRIimage *image, unsigned int use);
/**
- * Unlike createImageFromName __DRI_IMAGE_FORMAT is not but instead
- * __DRI_IMAGE_FOURCC and strides are in bytes not pixels. Stride is
+ * Unlike createImageFromName __DRI_IMAGE_FORMAT is not used but instead
+ * DRM_FORMAT_*, and strides are in bytes not pixels. Stride is
* also per block and not per pixel (for non-RGB, see gallium blocks).
*
* \since 5
int max, uint64_t *modifiers,
unsigned int *external_only,
int *count);
+
+ /**
+ * dmabuf format modifier attribute query for a given format and modifier.
+ *
+ * \param fourcc The format to query. If this format is not supported by
+ * the driver, return false.
+ * \param modifier The modifier to query. If this format+modifier is not
+ * supported by the driver, return false.
+ * \param attrib The __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB to query.
+ * \param value A pointer to where to store the result of the query.
+ *
+ * Returns true upon success.
+ *
+ * \since 16
+ */
+ GLboolean (*queryDmaBufFormatModifierAttribs)(__DRIscreen *screen,
+ uint32_t fourcc, uint64_t modifier,
+ int attrib, uint64_t *value);
+
+ /**
+ * Create a DRI image from the given renderbuffer.
+ *
+ * \param context the current DRI context
+ * \param renderbuffer the GL name of the renderbuffer
+ * \param loaderPrivate for callbacks into the loader related to the image
+ * \param error will be set to one of __DRI_IMAGE_ERROR_xxx
+ * \return the newly created image on success, or NULL otherwise
+ *
+ * \since 17
+ */
+ __DRIimage *(*createImageFromRenderbuffer2)(__DRIcontext *context,
+ int renderbuffer,
+ void *loaderPrivate,
+ unsigned *error);
};
__DRIextension base;
} __DRInoErrorExtension;
+/*
+ * Flush control driver extension.
+ *
+ * Existence of this extension means the driver can accept the
+ * \c __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR attribute in
+ * \c __DRIdri2ExtensionRec::createContextAttribs.
+ */
+#define __DRI2_FLUSH_CONTROL "DRI_FlushControl"
+#define __DRI2_FLUSH_CONTROL_VERSION 1
+
+typedef struct __DRI2flushControlExtensionRec __DRI2flushControlExtension;
+struct __DRI2flushControlExtensionRec {
+ __DRIextension base;
+};
+
/**
* DRI config options extension.
*
*/
#define __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB 0x000c
+/* Bitmaks of supported/available context priorities - must match
+ * __EGL_CONTEXT_PRIORITY_LOW_BIT et al
+ */
+#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY 0x000d
+#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_LOW (1 << 0)
+#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_MEDIUM (1 << 1)
+#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_HIGH (1 << 2)
+
typedef struct __DRI2rendererQueryExtensionRec __DRI2rendererQueryExtension;
struct __DRI2rendererQueryExtensionRec {
__DRIextension base;
* Image Loader extension. Drivers use this to allocate color buffers
*/
+/**
+ * See __DRIimageLoaderExtensionRec::getBuffers::buffer_mask.
+ */
enum __DRIimageBufferMask {
__DRI_IMAGE_BUFFER_BACK = (1 << 0),
- __DRI_IMAGE_BUFFER_FRONT = (1 << 1)
+ __DRI_IMAGE_BUFFER_FRONT = (1 << 1),
+
+ /**
+ * A buffer shared between application and compositor. The buffer may be
+ * simultaneously accessed by each.
+ *
+ * A shared buffer is equivalent to an EGLSurface whose EGLConfig contains
+ * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR and whose active EGL_RENDER_BUFFER (as
+ * opposed to any pending, requested change to EGL_RENDER_BUFFER) is
+ * EGL_SINGLE_BUFFER.
+ *
+ * If buffer_mask contains __DRI_IMAGE_BUFFER_SHARED, then must contains no
+ * other bits. As a corollary, a __DRIdrawable that has a "shared" buffer
+ * has no front nor back buffer.
+ *
+ * The loader returns __DRI_IMAGE_BUFFER_SHARED in buffer_mask if and only
+ * if:
+ * - The loader supports __DRI_MUTABLE_RENDER_BUFFER_LOADER.
+ * - The driver supports __DRI_MUTABLE_RENDER_BUFFER_DRIVER.
+ * - The EGLConfig of the drawable EGLSurface contains
+ * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR.
+ * - The EGLContext's EGL_RENDER_BUFFER is EGL_SINGLE_BUFFER.
+ * Equivalently, the EGLSurface's active EGL_RENDER_BUFFER (as
+ * opposed to any pending, requested change to EGL_RENDER_BUFFER) is
+ * EGL_SINGLE_BUFFER. (See the EGL 1.5 and
+ * EGL_KHR_mutable_render_buffer spec for details about "pending" vs
+ * "active" EGL_RENDER_BUFFER state).
+ *
+ * A shared buffer is similar to a front buffer in that all rendering to the
+ * buffer should appear promptly on the screen. It is different from
+ * a front buffer in that its behavior is independent from the
+ * GL_DRAW_BUFFER state. Specifically, if GL_DRAW_FRAMEBUFFER is 0 and the
+ * __DRIdrawable's buffer_mask is __DRI_IMAGE_BUFFER_SHARED, then all
+ * rendering should appear promptly on the screen if GL_DRAW_BUFFER is not
+ * GL_NONE.
+ *
+ * The difference between a shared buffer and a front buffer is motivated
+ * by the constraints of Android and OpenGL ES. OpenGL ES does not support
+ * front-buffer rendering. Android's SurfaceFlinger protocol provides the
+ * EGL driver only a back buffer and no front buffer. The shared buffer
+ * mode introduced by EGL_KHR_mutable_render_buffer is a backdoor though
+ * EGL that allows Android OpenGL ES applications to render to what is
+ * effectively the front buffer, a backdoor that required no change to the
+ * OpenGL ES API and little change to the SurfaceFlinger API.
+ */
+ __DRI_IMAGE_BUFFER_SHARED = (1 << 2),
};
struct __DRIimageList {
* \param stamp Address of variable to be updated when
* getBuffers must be called again
* \param loaderPrivate The loaderPrivate for driDrawable
- * \param buffer_mask Set of buffers to allocate
+ * \param buffer_mask Set of buffers to allocate. A bitmask of
+ * __DRIimageBufferMask.
* \param buffers Returned buffers
*/
int (*getBuffers)(__DRIdrawable *driDrawable,
GLboolean (*isThreadSafe)(void *loaderPrivate);
};
+/**
+ * The driver portion of EGL_KHR_mutable_render_buffer.
+ *
+ * If the driver creates a __DRIconfig with
+ * __DRI_ATTRIB_MUTABLE_RENDER_BUFFER, then it must support this extension.
+ *
+ * To support this extension:
+ *
+ * - The driver should create at least one __DRIconfig with
+ * __DRI_ATTRIB_MUTABLE_RENDER_BUFFER. This is strongly recommended but
+ * not required.
+ *
+ * - The driver must be able to handle __DRI_IMAGE_BUFFER_SHARED if
+ * returned by __DRIimageLoaderExtension:getBuffers().
+ *
+ * - When rendering to __DRI_IMAGE_BUFFER_SHARED, it must call
+ * __DRImutableRenderBufferLoaderExtension::displaySharedBuffer() in
+ * response to glFlush and glFinish. (This requirement is not documented
+ * in EGL_KHR_mutable_render_buffer, but is a de-facto requirement in the
+ * Android ecosystem. Android applications expect that glFlush will
+ * immediately display the buffer when in shared buffer mode, and Android
+ * drivers comply with this expectation). It :may: call
+ * displaySharedBuffer() more often than required.
+ *
+ * - When rendering to __DRI_IMAGE_BUFFER_SHARED, it must ensure that the
+ * buffer is always in a format compatible for display because the
+ * display engine (usually SurfaceFlinger or hwcomposer) may display the
+ * image at any time, even concurrently with 3D rendering. For example,
+ * display hardware and the GL hardware may be able to access the buffer
+ * simultaneously. In particular, if the buffer is compressed then take
+ * care that SurfaceFlinger and hwcomposer can consume the compression
+ * format.
+ *
+ * \see __DRI_IMAGE_BUFFER_SHARED
+ * \see __DRI_ATTRIB_MUTABLE_RENDER_BUFFER
+ * \see __DRI_MUTABLE_RENDER_BUFFER_LOADER
+ */
+#define __DRI_MUTABLE_RENDER_BUFFER_DRIVER "DRI_MutableRenderBufferDriver"
+#define __DRI_MUTABLE_RENDER_BUFFER_DRIVER_VERSION 1
+
+typedef struct __DRImutableRenderBufferDriverExtensionRec __DRImutableRenderBufferDriverExtension;
+struct __DRImutableRenderBufferDriverExtensionRec {
+ __DRIextension base;
+};
+
+/**
+ * The loader portion of EGL_KHR_mutable_render_buffer.
+ *
+ * Requires loader extension DRI_IMAGE_LOADER, through which the loader sends
+ * __DRI_IMAGE_BUFFER_SHARED to the driver.
+ *
+ * \see __DRI_MUTABLE_RENDER_BUFFER_DRIVER
+ */
+#define __DRI_MUTABLE_RENDER_BUFFER_LOADER "DRI_MutableRenderBufferLoader"
+#define __DRI_MUTABLE_RENDER_BUFFER_LOADER_VERSION 1
+
+typedef struct __DRImutableRenderBufferLoaderExtensionRec __DRImutableRenderBufferLoaderExtension;
+struct __DRImutableRenderBufferLoaderExtensionRec {
+ __DRIextension base;
+
+ /**
+ * Inform the display engine (that is, SurfaceFlinger and/or hwcomposer)
+ * that the __DRIdrawable has new content.
+ *
+ * The display engine may ignore this call, for example, if it continually
+ * refreshes and displays the buffer on every frame, as in
+ * EGL_ANDROID_front_buffer_auto_refresh. On the other extreme, the display
+ * engine may refresh and display the buffer only in frames in which the
+ * driver calls this.
+ *
+ * If the fence_fd is not -1, then the display engine will display the
+ * buffer only after the fence signals.
+ *
+ * The drawable's current __DRIimageBufferMask, as returned by
+ * __DRIimageLoaderExtension::getBuffers(), must be
+ * __DRI_IMAGE_BUFFER_SHARED.
+ */
+ void (*displaySharedBuffer)(__DRIdrawable *drawable, int fence_fd,
+ void *loaderPrivate);
+};
+
#endif