[PATCH dri3proto v2] Add modifier/multi-plane requests, bump to v1.1
Daniel Stone
daniels at collabora.com
Thu Jul 20 17:08:13 UTC 2017
DRI3 version 1.1 adds support for explicit format modifiers, including
multi-planar buffers.
Signed-off-by: Daniel Stone <daniels at collabora.com>
---
dri3proto.h | 142 ++++++++++++++++++++++++++-
dri3proto.txt | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 438 insertions(+), 4 deletions(-)
Sorry, this was supposed to get sent out with the revised patchset.
Now with actual descriptive text.
diff --git a/dri3proto.h b/dri3proto.h
index ceddee8..442b714 100644
--- a/dri3proto.h
+++ b/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,15 @@
#define X_DRI3FenceFromFD 4
#define X_DRI3FDFromFence 5
-#define DRI3NumberRequests 6
+/* v1.1 */
+#define xDRI3GetSupportedFormats 6
+#define xDRI3GetSupportedModifiers 7
+#define xDRI3PixmapFromBuffers 8
+#define xDRI3BuffersFromPixmap 9
+#define xDRI3FenceFromDMAFenceFD 10
+#define xDRI3DMAFenceFDFromFrence 11
+
+#define DRI3NumberRequests 12
typedef struct {
CARD8 reqType;
@@ -164,4 +172,134 @@ typedef struct {
#define sz_xDRI3FDFromFenceReply 32
+/* v1.1 */
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 dri3ReqType;
+ CARD16 length B16;
+ CARD32 window B32;
+} xDRI3GetSupportedFormatsReq;
+#define sz_xDRI3GetSupportedFormatsReq 8
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ CARD8 pad1;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 numFormats B32;
+ CARD32 pad12 B32;
+ CARD32 pad16 B32;
+ CARD32 pad20 B32;
+ CARD32 pad24 B32;
+ CARD32 pad28 B32;
+} xDRI3GetSupportedFormatsReply;
+#define sz_xDRI3GetSupportedFormatsReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 dri3ReqType;
+ CARD16 length B16;
+ CARD32 window B32;
+ CARD32 format B32;
+} xDRI3GetSupportedModifiersReq;
+#define sz_xDRI3GetSupportedModifiersReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ CARD8 pad1;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 format B32;
+ CARD32 numModifiers 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;
+ CARD32 format B32;
+ CARD32 modifier_hi B32;
+ CARD32 modifier_lo B32;
+} 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 format B32;
+ CARD32 modifier_hi B32;
+ CARD32 modifier_lo B32;
+ CARD32 pad24 B32;
+ CARD32 pad28 B32;
+} xDRI3BuffersFromPixmapReply;
+#define sz_xDRI3BuffersFromPixmapReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 dri3ReqType;
+ CARD16 length B16;
+ CARD32 drawable B32;
+ CARD32 fence B32;
+} xDRI3FenceFromDMAFenceFDReq;
+
+#define sz_xDRI3FenceFromDMAFenceFDReq 12
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 dri3ReqType;
+ CARD16 length B16;
+ CARD32 drawable B32;
+ CARD32 fence B32;
+} xDRI3DMAFenceFDFromFenceReq;
+
+#define sz_xDRI3DMAFenceFDFromFenceReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ CARD8 nfd; /* Number of file descriptors returned (1) */
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 pad08 B32;
+ CARD32 pad12 B32;
+ CARD32 pad16 B32;
+ CARD32 pad20 B32;
+ CARD32 pad24 B32;
+ CARD32 pad28 B32;
+} xDRI3DMAFenceFDFromFenceReply;
+
+#define sz_xDRI3DMAFenceFDFromFenceReply 32
+
#endif
diff --git a/dri3proto.txt b/dri3proto.txt
index dac11d3..e906419 100644
--- a/dri3proto.txt
+++ b/dri3proto.txt
@@ -1,11 +1,12 @@
The DRI3 Extension
- Version 1.0
- 2013-6-4
+ Version 1.1
+ 2017-06-27
Keith Packard
keithp at keithp.com
Intel Corporation
+
1. Introduction
The DRI3 extension provides mechanisms to translate between direct
@@ -27,6 +28,8 @@ Dave Airlie <airlied at redhat.com>
Kristian Høgsberg <krh at bitplanet.net>
James Jones <janomes at nvidia.com>
Arthur Huillet <arthur.huillet at free.fr>
+Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
+Daniel Stone <daniels at collabora.com>
❄ ❄ ❄ ❄ ❄ ❄ ❄
@@ -199,6 +202,182 @@ The name of this extension is "DRI3"
associated with a direct rendering device that 'fence' can
work with, otherwise a Match error results.
+┌───
+ DRI3GetSupportedFormats
+ window: WINDOW
+ ▶
+ num_formats: CARD32
+ formats: ListOfCARD32
+└───
+ Errors: Window, Match
+
+ For the Screen associated with 'window', return a list of
+ supported DRM FourCC formats, as defined in drm_fourcc.h,
+ supported as formats for DRI3 pixmap/buffer interchange.
+ The length of the list, in number of CARD32 elements,
+ is returned in 'num_formats'.
+
+┌───
+ DRI3GetSupportedModifiers
+ window: WINDOW
+ format: CARD32
+ ▶
+ num_modifiers: CARD32
+ modifiers: ListOfCARD32
+└───
+ Errors: Window, Match
+
+ For the Screen associated with 'window', return a list of
+ supported DRM FourCC modifiers, as defined in drm_fourcc.h,
+ supported as formats for DRI3 pixmap/buffer interchange.
+ Each modifier is returned as returned as a CARD32
+ containing the most significant 32 bits, followed by a
+ CARD32 containing the least significant 32 bits. The hi/lo
+ pattern repeats 'num_modifiers' times, thus there are
+ '2 * num_modifiers' CARD32 elements returned.
+
+┌───
+ DRI3PixmapFromBuffers
+ pixmap: PIXMAP
+ drawable: DRAWABLE
+ num_buffers: CARD8
+ width, height: CARD16
+ stride0, offset0: CARD32
+ stride1, offset1: CARD32
+ stride2, offset2: CARD32
+ stride3, offset3: CARD32
+ format, modifier_hi, modifier_lo: CARD32
+ buffers: ListOfFD
+└───
+ Errors: Alloc, Drawable, IDChoice, Value, Match
+
+ Creates a pixmap for the direct rendering object associated
+ with 'buffers'. 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 PixmapFromBuffers, 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.
+
+ The exact configuration of the buffer is specified by 'format',
+ a DRM FourCC format token as defined in that project's
+ drm_fourcc.h header, in combination with the modifier.
+
+ Modifiers allow explicit specification of non-linear sources,
+ such as tiled or compressed buffers. 'modifier_hi' (the most
+ significant 32 bits of a 64-bit value) and 'modifier_lo' are
+ combined to produce a single DRM format modifier token, again
+ as defined in drm_fourcc.h. The combination of format 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 is
+ shared is outside the scope of this extension.
+
+ If the buffer(s) cannot be used with the screen associated with
+ 'pixmap', a Match error is returned.
+
+ If the format and modifier combination is not supported by the
+ screen, a Value error is returned.
+
+┌───
+ DRI3BuffersFromPixmap
+ pixmap: PIXMAP
+ ▶
+ nfd: CARD8
+ width, height: CARD16
+ format, modifier_hi, modifier_lo: CARD32
+ strides: ListOfCARD32
+ offsets: ListOfCARD32
+ buffers: ListOfFD
+└───
+ Errors: Pixmap, Match
+
+ Pass back 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.
+
+ 'width' and 'height' describe the geometry (in pixels) of the
+ logical pixel-sample source from combining the direct rendering
+ objects.
+
+ 'format' describes a DRM FourCC format token, with
+ 'modifier_hi' (most significant 32 bits) and 'modifier_lo'
+ (least significant 32 bits) being combined together to produce
+ a single unsigned 64-bit 'modifier' token. See
+ PixmapFromBuffers for more details on DRM format definitions.
+
+ 'nfd' describes the number of buffers returned for the pixmap,
+ which must be combined together according to 'format' 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.
+
+┌───
+ DRI3FenceFromDMAFenceFD
+ drawable: DRAWABLE
+ fence: FENCE
+ fd: FD
+└───
+ Errors: IDChoice, Drawable
+
+ Creates a Sync extension Fence that provides the regular Sync
+ extension semantics. The Fence will begin untriggered, and
+ become triggered when the underlying dma-fence FD signals.
+ The resulting Sync Fence is a one-shot, and may not be
+ manually triggered, reset, or reused until it is destroyed.
+ Details about the mechanism used with this file descriptor are
+ outside the scope of the DRI3 extension.
+
+┌───
+ DRI3DMAFenceFDFromFence
+ drawable: DRAWABLE
+ fence: FENCE
+ ▶
+ fd: FD
+└───
+ Errors: IDChoice, Drawable, Match
+
+ Given a Sync extension Fence originally created by the
+ DRI3FenceFromDMAFenceFD request, return the underlying
+ dma-fence FD to the client. Details about the mechanism used
+ with this file descriptor are outside the scope of the DRI3
+ extension. 'drawable' must be associated with a direct
+ rendering device that 'fence' can work with, otherwise a Match
+ error results. NB: it is quite likely this will be forever
+ unused, and may be removed in later revisions.
+
❄ ❄ ❄ ❄ ❄ ❄ ❄
@@ -214,6 +393,10 @@ The DRI3 extension is adapted from the DRI2 extension.
1.0: First published version
+ 1.1: Add GetSupportedFormats, GetSupportedModifiers,
+ PixmapFromBuffers, BuffersFromPixmap,
+ FenceFromDMAFenceFD, and DMAFenceFDFromFence requests.
+
❄ ❄ ❄ ❄ ❄ ❄ ❄
@@ -367,6 +550,119 @@ A.2 Protocol Requests
0 FD fence fd
└───
+┌───
+ DRI3GetSupportedFormats
+ 1 CARD8 major opcode
+ 1 6 DRI3 opcode
+ 2 2 length
+ 4 Window window
+ ▶
+ 1 1 Reply
+ 1 0 unused
+ 2 CARD16 sequence number
+ 4 CARD32 reply length
+ 4 CARD32 num_formats
+ 20 unused
+
+ 4 ListOfCARD32 formats[num_formats]
+└───
+
+┌───
+ DRI3GetSupportedModifiers
+ 1 CARD8 major opcode
+ 1 7 DRI3 opcode
+ 2 3 length
+ 4 Window window
+ 4 CARD32 format
+ ▶
+ 1 1 Reply
+ 1 0 unused
+ 2 CARD16 sequence number
+ 4 CARD32 reply length
+ 4 CARD32 num_modifiers
+ 20 unused
+
+ 4 ListOfCARD32 formats[2*num_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
+ 4 CARD32 format
+ 4 CARD32 modifier_hi
+ 4 CARD32 modifier_lo
+
+ 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 CARD32 format
+ 4 CARD32 modifier_hi
+ 4 CARD32 modifier_lo
+ 8 unused
+
+ 0 ListOfFD buffer[num_buffers]
+ 4 ListOfCARD32 strides[num_buffers]
+ 4 ListOfCARD32 offsets[num_buffers]
+└───
+
+┌───
+ DRI3FenceFromDMAFenceFD
+ 1 CARD8 major opcode
+ 1 10 DRI3 opcode
+ 2 4 length
+ 4 Drawable drawable
+ 4 Fence fence
+ 4 unused
+
+ 0 FD fence fd
+└───
+
+┌───
+ DRI3DMAFenceFDFromFence
+ 1 CARD8 major opcode
+ 1 11 DRI3 opcode
+ 2 3 length
+ 4 Drawable drawable
+ 4 Fence fence
+ ▶
+ 1 1 Reply
+ 1 1 nfd
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 24 unused
+
+ 0 FD fence fd
+└───
+
A.3 Protocol Events
The DRI3 extension defines no events.
--
2.13.3
More information about the xorg-devel
mailing list