Switch direction of FD passing for Sync Fences

Pass FD from client to server to avoid a round trip.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard 2013-06-04 13:28:29 -07:00
parent 58ece91dee
commit fbb449d411
2 changed files with 119 additions and 45 deletions

View file

@ -35,7 +35,7 @@
#define X_DRI3PixmapFromBuffer 2
#define X_DRI3BufferFromPixmap 3
#define X_DRI3SelectInput 4
#define X_DRI3GetSyncFenceFD 5
#define X_DRI3FenceFromFD 5
#define DRI3NumberRequests 6
@ -92,6 +92,7 @@ typedef struct {
CARD16 length B16;
CARD32 pixmap B32;
CARD32 drawable B32;
CARD32 size B32;
CARD16 width B16;
CARD16 height B16;
CARD16 stride B16;
@ -99,7 +100,7 @@ typedef struct {
CARD8 bpp;
} xDRI3PixmapFromBufferReq;
#define sz_xDRI3PixmapFromBufferReq 20
#define sz_xDRI3PixmapFromBufferReq 24
typedef struct {
CARD8 reqType;
@ -114,15 +115,15 @@ typedef struct {
CARD8 nfd; /* Number of file descriptors returned (1) */
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 size B32;
CARD16 width B16;
CARD16 height B16;
CARD16 stride B16;
CARD8 depth;
CARD8 bpp;
CARD32 size;
CARD32 pad20;
CARD32 pad24;
CARD32 pad28;
CARD32 pad20 B32;
CARD32 pad24 B32;
CARD32 pad28 B32;
} xDRI3BufferFromPixmapReply;
#define sz_xDRI3BufferFromPixmapReply 32
@ -142,25 +143,14 @@ typedef struct {
CARD8 reqType;
CARD8 dri3ReqType;
CARD16 length B16;
CARD32 syncFence B32;
CARD32 window B32;
} xDRI3GetSyncFenceFd;
CARD32 drawable B32;
CARD32 fence B32;
BOOL initially_triggered;
CARD8 pad13;
CARD16 pad14 B16;
} xDRI3FenceFromFDReq;
#define sz_xDRI3GetSyncFenceFd 12
typedef struct {
BYTE type; /* X_Reply */
CARD8 nfd; /* Number of file descriptors returned (1) */
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
CARD32 pad7 B32;
} xDRI3GetSyncFenceFdReply;
#define sz_xDRI3GetSyncFenceFdReply 32
#define sz_xDRI3FenceFromFDReq 16
/*
* Events

View file

@ -16,18 +16,32 @@ The direct rendered buffers are passed across the protocol via
standard POSIX file descriptor passing mechanisms. On Linux, these
buffers are DMA-BUF objects.
DRI3 also includes a mechanism to translate between Linux Futexes
and X Sync extension Fences. This provides a synchronization mechanism
which can be used to serialize access to shared render buffers.
1.1. Acknowledgments
Eric Anholt <eric@anholt.net>
Dave Airlie <airlied@redhat.com>
Kristian Høgsberg <krh@bitplanet.net>
James Jones <janomes@nvidia.com>
❄ ❄ ❄ ❄ ❄ ❄ ❄
2. Data Types
The DRI3 extension uses the RandR extension Provider to select among
multiple GPUs on a single screen.
DRI3EVENTID { XID }
Defines a unique event delivery target for DRI3
events. Multiple event IDs can be allocated to provide
multiple distinct event delivery contexts.
DRI3EVENTMASK { DRI3ConfigureNotifyMask }
The DRI3 extension also uses the RandR extension Provider data type to
select among multiple GPUs on a single screen and the Sync extension
fence object to provide graphics object synchronization.
❄ ❄ ❄ ❄ ❄ ❄ ❄
@ -39,7 +53,9 @@ No errors are defined by the DRI3 extension.
5. Events
No events are defined by the DRI3 extension.
DRI3 adds a ConfigureNotify event to inform clients about window
configuration changes which can affect the allocation of
window-related direct rendered buffers.
❄ ❄ ❄ ❄ ❄ ❄ ❄
@ -56,7 +72,7 @@ DRI3DRIVER { DRI3DriverDRI
7. Extension Initialization
The name of this extension is "DRI3" (third time is the charm?).
The name of this extension is "DRI3"
┌───
DRI3QueryVersion
@ -100,13 +116,17 @@ The name of this extension is "DRI3" (third time is the charm?).
provider. The provider must support SourceOutput or SourceOffload.
The direct rendering library used to implement the specified
driverType is returned in the driver value. The file
descriptor for the device is returned in FD.
'driverType' is returned in 'driver'. The file
descriptor for the device is returned in 'device'. 'nfd' will
be set to one (this is strictly a convenience for XCB which
otherwise would need request-specific information about how
many file descriptors were associated with this reply).
┌───
DRI3PixmapFromBuffer
pixmap: PIXMAP
drawable: DRAWABLE
size: CARD32
width, height, stride: CARD16
depth, bpp: CARD8
buffer: FD
@ -114,12 +134,19 @@ The name of this extension is "DRI3" (third time is the charm?).
Errors: Alloc, Drawable, IDChoice, Value, Match
Creates a pixmap for the direct rendering object associated
with buffer. width, height and stride specify the geometry (in
pixels) of the underlying buffer. The pixels within the buffer
may not be arranged in a simple linear fashion, but the total
byte size of the buffer must be height * stride * bpp /
8. Precisely how any additional information about the buffer
is shared is outside the scope of this extension.
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.
'size' specifies the total size of the buffer bytes. 'width',
'height' describe the geometry (in pixels) of the underlying
buffer. 'stride' specifies the number of bytes per scanline in
the buffer. The pixels within the buffer may not be arranged
in a simple linear fashion, but 'size' will be at least
'height' * 'stride'.
Precisely how any additional information about the buffer is
shared is outside the scope of this extension.
If buffer cannot be used with the screen associated with
drawable, a Match error is returned.
@ -132,6 +159,7 @@ The name of this extension is "DRI3" (third time is the charm?).
pixmap: PIXMAP
depth: CARD8
size: CARD32
width, height, stride: CARD16
depth, bpp: CARD8
buffer: FD
@ -139,12 +167,45 @@ The name of this extension is "DRI3" (third time is the charm?).
Errors: Pixmap, Match
Pass back a direct rendering object associated with
pixmap. Future changes to pixmap will be visible in that
direct rendered object.
pixmap. Changes to pixmap will be visible in that
direct rendered object and changes to the direct rendered
object will be visible in the pixmap.
The pixel format and geometry of the buffer are returned along
with a file descriptor referencing the underlying direct
rendering object.
'size' specifies the total size of the buffer bytes. 'width',
'height' describe the geometry (in pixels) of the underlying
buffer. 'stride' specifies the number of bytes per scanline in
the buffer. The pixels within the buffer may not be arranged
in a simple linear fashion, but 'size' will be at least
'height' * 'stride'.
Precisely how any additional information about the buffer is
shared is outside the scope of this extension.
If buffer cannot be used with the screen associated with
drawable, a Match error is returned.
┌───
DRI3SelectInput
eventContext: DRI3EVENTID
window: WINDOW
eventMask: SETofDRI3EVENT
└───
Errors: Window, Value, Match, IDchoice
Selects the set of DRI3 events to be delivered for the
specified window and event context. DRI3SelectInput can
create, modifiy or delete event contexts. An event context is
associated with a specific window; using an existing event
context with a different window generates a Match error.
If eventContext specifies an existing event context, then if
eventMask is empty, DRI3SelectInput deletes the specified
context, otherwise the specified event context is changed to
select a different set of events.
If eventContext is an unused XID, then if eventMask is empty
no operation is performed. Otherwise, a new event context is
created selecting the specified events.
┌───
DRI3GetSyncFenceFd
@ -156,16 +217,39 @@ The name of this extension is "DRI3" (third time is the charm?).
└───
Errors: Fence, Match
Pass back a shared memory segment associated with a sync fence
object. Pass this fd to the XShmFence library to map and
manipulate the fence.
Pass back a device-specific file descriptor associated with an
X Sync extension fence object. Details about the mechanism
used with this file are outside the scope of the DRI3 extension.
❄ ❄ ❄ ❄ ❄ ❄ ❄
9. Extension Events
The DRI3 extension defines no events
DRI3ConfigureNotify is sent if DRI3SelectInput has requested it.
DRI3ConfigureNotify events are XGE events and so do not have a unique
event ID.
┌───
DRI3ConfigureNotify
type: CARD8 XGE event type (35)
extension: CARD8 DRI3 extension request number
length: CARD16 2
evtype: CARD16 DRI3_ConfigureNotify
eventID: DRI3EVENTID
window: WINDOW
x: INT16
y: INT16
width: CARD16
height: CARD16
off_x: INT16
off_y: INT16
pixmap_width: CARD16
pixmap_height: CARD16
pixmap_flags: CARD32
└───
'x' and 'y' are the parent-relative location of 'window'.
❄ ❄ ❄ ❄ ❄ ❄ ❄