DRI3 version 1.1 adds support for explicit format modifiers, including multi-planar buffers.
Signed-off-by: Daniel Stone <dani...@collabora.com> Signed-off-by: Louis-Francis Ratté-Boulianne <l...@collabora.com> --- dri3proto.pc.in | 2 +- dri3proto.txt | 243 ++++++++++++++++++++++++++++++++++++- include/X11/extensions/dri3proto.h | 86 ++++++++++++- meson.build | 2 +- 4 files changed, 324 insertions(+), 9 deletions(-) diff --git a/dri3proto.pc.in b/dri3proto.pc.in index 6d81d07..c59aa1c 100644 --- a/dri3proto.pc.in +++ b/dri3proto.pc.in @@ -5,5 +5,5 @@ includedir=@includedir@ Name: DRI3Proto Description: DRI3 extension headers -Version: 1.0 +Version: 1.1 Cflags: -I${includedir} diff --git a/dri3proto.txt b/dri3proto.txt index dac11d3..76cdbb8 100644 --- a/dri3proto.txt +++ b/dri3proto.txt @@ -1,11 +1,16 @@ The DRI3 Extension - Version 1.0 - 2013-6-4 + Version 1.1 + 2018-02-26 Keith Packard kei...@keithp.com Intel Corporation + Daniel Stone + dani...@collabora.com + Collabora + + 1. Introduction The DRI3 extension provides mechanisms to translate between direct @@ -27,6 +32,7 @@ Dave Airlie <airl...@redhat.com> Kristian Høgsberg <k...@bitplanet.net> James Jones <jano...@nvidia.com> Arthur Huillet <arthur.huil...@free.fr> +Louis-Francis Ratté-Boulianne <l...@collabora.com> ❄ ❄ ❄ ❄ ❄ ❄ ❄ @@ -117,9 +123,10 @@ The name of this extension is "DRI3" Errors: Alloc, Drawable, IDChoice, Value, Match Creates a pixmap for the direct rendering object associated - with 'buffer'. Changes to pixmap will be visible in that - direct rendered object and changes to the direct rendered - object will be visible in the pixmap. + with 'buffer' and the screen associated with 'drawable'. + Changes to pixmap will be visible in that direct rendered + object and changes to the direct rendered object will be + visible in the pixmap. 'size' specifies the total size of the buffer bytes. 'width', 'height' describe the geometry (in pixels) of the underlying @@ -199,6 +206,156 @@ The name of this extension is "DRI3" associated with a direct rendering device that 'fence' can work with, otherwise a Match error results. +┌─── + DRI3GetSupportedModifiers + window: WINDOW + depth: CARD8 + bpp: CARD8 + ▶ + num_drawable_modifiers: CARD32 + num_screen_modifiers: CARD32 + drawable_modifiers: ListOfCARD64 + screen_modifiers: ListOfCARD64 +└─── + Errors: Window, Match + + Return supported DRM FourCC modifiers for the specified + 'window'. + + The first list of 'drawable_modifiers' contains a set of + modifiers which the server considers optimal for the window's + current configuration. Using these modifiers to allocate, even + if locally suboptimal to the client driver, may result in a + more optimal display pipeline, e.g. by avoiding composition. + + The second list of 'screen_modifiers', is the total set of + modifiers which are acceptable for use on the Screen associated + with 'window'. This set of modifiers will not change over the + lifetime of the client. Using this set of modifiers to allocate + may not result in a globally optimal pipeline, if separate + 'drawable_modifiers' are available. + + The meaning of any modifier is canonically defined in + drm_fourcc.h. + +┌─── + DRI3PixmapFromBuffers + pixmap: PIXMAP + drawable: DRAWABLE + num_buffers: CARD8 + width, height: CARD16 + stride0, offset0: CARD32 + stride1, offset1: CARD32 + stride2, offset2: CARD32 + stride3, offset3: CARD32 + depth, bpp: CARD8 + modifier: CARD64 + buffers: ListOfFD +└─── + Errors: Alloc, Drawable, IDChoice, Value, Match + + Creates a pixmap for the direct rendering object associated + with 'buffers' and the screen associated with 'drawable'. + Changes to pixmap will be visible in that direct rendered + object and changes to the direct rendered object will be + visible in the pixmap. + + In contrast to PixmapFromBuffer, multiple buffers may be + combined to specify a single logical source for pixel + sampling: 'num_buffers' may be set from 1 (single buffer, + akin to PixmapFromBuffer) to 4. This is the number of file + descriptors which will be sent with this request; one per + buffer. + + Modifiers allow explicit specification of non-linear sources, + such as tiled or compressed buffers. The combination of bpp, + depth, and modifier allows unambiguous declaration of the + buffer layout in a manner defined by the DRM tokens. + + DRM_FORMAT_MOD_INVALID may be passed for 'modifier', in which + case the driver may make its own inference as to the exact + layout of the buffer(s). + + 'width' and 'height' describe the geometry (in pixels) of the + logical pixel-sample source. + + 'strideN' and 'offsetN' define the number of bytes per logical + scanline, and the distance in bytes from the beginning of the + buffer passed for that plane until the start of the sample + source for that plane, respectively for plane N. If the plane + is not used according to the format and modifier specification, + both values for that plane must be zero. + + Precisely how any additional information about the buffer (such + as memory placement) is shared is outside the scope of this + extension. + + If the buffer(s) cannot be used with the screen associated with + 'drawable', a Match error is returned. + + If the bpp, depth, and modifier combination is not supported by + the screen, a Value error is returned. + +┌─── + DRI3BuffersFromPixmap + pixmap: PIXMAP + ▶ + nfd: CARD8 + width, height: CARD16 + depth, bpp: CARD8 + modifier: CARD64 + strides: ListOfCARD32 + offsets: ListOfCARD32 + buffers: ListOfFD +└─── + Errors: Pixmap, Match + + Returns direct rendering objects associated with 'pixmap'. + Changes to 'pixmap' will be visible in the direct rendered + objects and changes to the direct rendered objects will be + visible in 'pixmap' after flushing and synchronization. + + Synchronization of access to buffers shared between processes + is not defined by this protocol. Without the use of additional + extensions not defined by the DRI3 protocol as of version 1.1, + synchronization between multiple processes and contexts is + considered to follow the implicit model. + + In this model, the underlying driver is responsible for + enforcing a strict ordering such that any reads requested by + one process or context are fulfilled before any writes requested + by another process or context, as long as that read was + definitively submitted before the write (e.g. a through a + blocking read command such as glReadPixels or explicitly + flushing the command stream through glFlush). A similar + dependency exists for reads submitted after writes: the driver + must ensure that the write is fully visible and coherent to the + read request. + + 'width' and 'height' describe the geometry (in pixels) of the + logical pixel-sample source from combining the direct rendering + objects. + + See PixmapFromBuffers for more details on DRM modifiers usage. + + 'nfd' describes the number of buffers returned for the pixmap, + which must be combined together according to 'depth', 'bpp', and + 'modifier'. + + For each buffer, there is an entry in the 'strides', + 'offsets', and 'buffers' list. 'buffer' contains a single file + descriptor referring to the buffer. 'stride' specifies the + number of bytes per logical scanline for this plane, and + 'offset' specifies the distance in bytes from the beginning + of 'buffer' until the start of the sample source for that + plane. + + Precisely how any additional information about the buffer is + shared is outside the scope of this extension. + + If buffers cannot be exported from the the screen associated + with 'pixmap', a Match error is returned. + ❄ ❄ ❄ ❄ ❄ ❄ ❄ @@ -214,6 +371,9 @@ The DRI3 extension is adapted from the DRI2 extension. 1.0: First published version + 1.1: Add GetSupportedModifiers, + PixmapFromBuffers, and BuffersFromPixmap requests. + ❄ ❄ ❄ ❄ ❄ ❄ ❄ @@ -367,6 +527,79 @@ A.2 Protocol Requests 0 FD fence fd └─── +┌─── + DRI3GetSupportedModifiers + 1 CARD8 major opcode + 1 7 DRI3 opcode + 2 3 length + 4 Window window + 1 CARD8 depth + 1 CARD8 bpp + 2 unused + ▶ + 1 1 Reply + 1 0 unused + 2 CARD16 sequence number + 4 CARD32 reply length + 4 CARD32 num_drawable_modifiers + 4 CARD32 num_screen_modifiers + 16 unused + + 4 ListOfCARD64 drawable_modifiers[num_drawable_modifiers] + 4 ListOfCARD64 screen_modifiers[num_screen_modifiers] +└─── + +┌─── + DRI3PixmapFromBuffers + 1 CARD8 major opcode + 1 8 DRI3 opcode + 2 8 length + 4 Pixmap pixmap + 4 Drawable drawable + 1 CARD8 num_buffers + 3 unused + 2 CARD16 width + 2 CARD16 height + 4 CARD32 stride0 + 4 CARD32 offset0 + 4 CARD32 stride1 + 4 CARD32 offset1 + 4 CARD32 stride2 + 4 CARD32 offset2 + 4 CARD32 stride3 + 4 CARD32 offset3 + 1 CARD8 depth + 1 CARD8 bpp + 2 unused + 8 CARD64 modifier + + 0 ListOfFD buffers[num_buffers] +└─── + +┌─── + DRI3BuffersFromPixmap + 1 CARD8 major opcode + 1 9 DRI3 opcode + 2 2 length + 4 Pixmap pixmap + ▶ + 1 1 Reply + 1 CARD8 nfd + 2 CARD16 sequence number + 4 CARD32 reply length + 2 CARD16 width + 2 CARD16 height + 4 CARD8 unused + 8 CARD64 modifier + 1 CARD8 depth + 1 CARD8 bpp + 6 unused + + 0 ListOfFD buffer[num_buffers] + 4 ListOfCARD32 strides[num_buffers] + 4 ListOfCARD32 offsets[num_buffers] +└─── + A.3 Protocol Events The DRI3 extension defines no events. diff --git a/include/X11/extensions/dri3proto.h b/include/X11/extensions/dri3proto.h index ceddee8..1a77301 100644 --- a/include/X11/extensions/dri3proto.h +++ b/include/X11/extensions/dri3proto.h @@ -25,7 +25,7 @@ #define DRI3_NAME "DRI3" #define DRI3_MAJOR 1 -#define DRI3_MINOR 0 +#define DRI3_MINOR 1 #define DRI3NumberErrors 0 #define DRI3NumberEvents 0 @@ -37,7 +37,12 @@ #define X_DRI3FenceFromFD 4 #define X_DRI3FDFromFence 5 -#define DRI3NumberRequests 6 +/* v1.1 */ +#define xDRI3GetSupportedModifiers 6 +#define xDRI3PixmapFromBuffers 7 +#define xDRI3BuffersFromPixmap 8 + +#define DRI3NumberRequests 9 typedef struct { CARD8 reqType; @@ -164,4 +169,81 @@ typedef struct { #define sz_xDRI3FDFromFenceReply 32 +/* v1.1 */ + +typedef struct { + CARD8 reqType; + CARD8 dri3ReqType; + CARD16 length B16; + CARD32 window B32; + CARD8 depth; + CARD8 bpp; + CARD16 pad10 B16; +} xDRI3GetSupportedModifiersReq; +#define sz_xDRI3GetSupportedModifiersReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 numDrawableModifiers B32; + CARD32 numScreenModifiers B32; + CARD32 pad16 B32; + CARD32 pad20 B32; + CARD32 pad24 B32; + CARD32 pad28 B32; +} xDRI3GetSupportedModifiersReply; +#define sz_xDRI3GetSupportedModifiersReply 32 + +typedef struct { + CARD8 reqType; + CARD8 dri3ReqType; + CARD16 length B16; + CARD32 pixmap B32; + CARD32 drawable B32; + CARD8 num_buffers; /* Number of file descriptors passed */ + CARD8 pad13; + CARD16 pad14 B16; + CARD16 width B16; + CARD16 height B16; + CARD32 stride0 B32; + CARD32 offset0 B32; + CARD32 stride1 B32; + CARD32 offset1 B32; + CARD32 stride2 B32; + CARD32 offset2 B32; + CARD32 stride3 B32; + CARD32 offset3 B32; + CARD8 depth; + CARD8 bpp; + CARD16 pad54 B16; + CARD64 modifier; +} xDRI3PixmapFromBuffersReq; +#define sz_xDRI3PixmapFromBuffersReq 64 + +typedef struct { + CARD8 reqType; + CARD8 dri3ReqType; + CARD16 length B16; + CARD32 pixmap B32; +} xDRI3BuffersFromPixmapReq; +#define sz_xDRI3BuffersFromPixmapReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 nfd; /* Number of file descriptors returned */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 width B16; + CARD16 height B16; + CARD32 pad12 B32; + CARD64 modifier; + CARD8 depth; + CARD8 bpp; + CARD16 pad26 B16; + CARD32 pad28 B32; +} xDRI3BuffersFromPixmapReply; +#define sz_xDRI3BuffersFromPixmapReply 32 + #endif diff --git a/meson.build b/meson.build index 9511029..6507db2 100644 --- a/meson.build +++ b/meson.build @@ -30,7 +30,7 @@ pcs = [ ['damageproto', '1.2.1'], ['dmxproto', '2.3.1'], ['dri2proto', '2.8'], - ['dri3proto', '1.0'], + ['dri3proto', '1.1'], ['fixesproto', '5.0'], ['fontsproto', '2.1.3'], ['glproto', '1.4.17'], -- 2.14.3 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel