[RFC xserver v3 05/11] dri3: Add DMA fences requests

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Mon Nov 6 21:42:54 UTC 2017


Bump DRI3 version to v1.2 that adds requests:

    * FenceFromDMAFenceFD is used to create a sync fence
      from a sync file fence.
    * DMAFenceFDFromFence is used to retrieve the sync
      file fd from a fence.

Drivers need to check the SyncFence type to make use of it
when possible.

Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
---
 dri3/dri3_request.c         | 94 +++++++++++++++++++++++++++++++++++++++++++++
 include/protocol-versions.h |  2 +-
 2 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/dri3/dri3_request.c b/dri3/dri3_request.c
index 37ffa1753..5c9b57199 100644
--- a/dri3/dri3_request.c
+++ b/dri3/dri3_request.c
@@ -522,6 +522,72 @@ proc_dri3_buffers_from_pixmap(ClientPtr client)
     return Success;
 }
 
+static int
+proc_dri3_fence_from_dma_fence_fd(ClientPtr client)
+{
+    REQUEST(xDRI3FenceFromDMAFenceFDReq);
+    DrawablePtr drawable;
+    int fd;
+    int status;
+
+    SetReqFds(client, 1);
+    REQUEST_SIZE_MATCH(xDRI3FenceFromDMAFenceFDReq);
+    LEGAL_NEW_RESOURCE(stuff->fence, client);
+
+    status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess);
+    if (status != Success)
+        return status;
+
+    fd = ReadFdFromClient(client);
+    if (fd < 0)
+        return BadValue;
+
+    status = SyncCreateFenceFromDMAFenceFD(client, drawable, stuff->fence, fd);
+    close(fd);
+
+    return status;
+}
+
+static int
+proc_dri3_dma_fence_fd_from_fence(ClientPtr client)
+{
+    REQUEST(xDRI3DMAFenceFDFromFenceReq);
+    xDRI3DMAFenceFDFromFenceReply rep = {
+        .type = X_Reply,
+        .nfd = 1,
+        .sequenceNumber = client->sequence,
+        .length = 0,
+    };
+    DrawablePtr drawable;
+    int fd;
+    int status;
+    SyncFence *fence;
+
+    REQUEST_SIZE_MATCH(xDRI3DMAFenceFDFromFenceReq);
+
+    status = dixLookupDrawable(&drawable, stuff->drawable, client, M_ANY, DixGetAttrAccess);
+    if (status != Success)
+        return status;
+    status = SyncVerifyFence(&fence, stuff->fence, client, DixWriteAccess);
+    if (status != Success)
+        return status;
+
+    fd = SyncDMAFenceFDFromFence(client, drawable, fence);
+    if (fd < 0)
+        return BadMatch;
+
+    if (client->swapped) {
+        swaps(&rep.sequenceNumber);
+        swapl(&rep.length);
+    }
+    if (WriteFdToClient(client, fd, FALSE) < 0)
+        return BadAlloc;
+
+    WriteToClient(client, sizeof(rep), &rep);
+
+    return Success;
+}
+
 int (*proc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
     proc_dri3_query_version,            /* 0 */
     proc_dri3_open,                     /* 1 */
@@ -532,6 +598,8 @@ int (*proc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
     proc_dri3_get_supported_modifiers,  /* 6 */
     proc_dri3_pixmap_from_buffers,      /* 7 */
     proc_dri3_buffers_from_pixmap,      /* 8 */
+    proc_dri3_fence_from_dma_fence_fd,  /* 9 */
+    proc_dri3_dma_fence_fd_from_fence,  /* 10 */
 };
 
 int
@@ -665,6 +733,30 @@ sproc_dri3_buffers_from_pixmap(ClientPtr client)
     return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
 }
 
+static int _X_COLD
+sproc_dri3_dma_fence_fd_from_fence(ClientPtr client)
+{
+    REQUEST(xDRI3DMAFenceFDFromFenceReq);
+    REQUEST_SIZE_MATCH(xDRI3DMAFenceFDFromFenceReq);
+
+    swaps(&stuff->length);
+    swapl(&stuff->drawable);
+    swapl(&stuff->fence);
+    return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
+}
+
+static int _X_COLD
+sproc_dri3_fence_from_dma_fence_fd(ClientPtr client)
+{
+    REQUEST(xDRI3FenceFromDMAFenceFDReq);
+    REQUEST_SIZE_MATCH(xDRI3FenceFromDMAFenceFDReq);
+
+    swaps(&stuff->length);
+    swapl(&stuff->drawable);
+    swapl(&stuff->fence);
+    return (*proc_dri3_vector[stuff->dri3ReqType]) (client);
+}
+
 int (*sproc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
     sproc_dri3_query_version,           /* 0 */
     sproc_dri3_open,                    /* 1 */
@@ -675,6 +767,8 @@ int (*sproc_dri3_vector[DRI3NumberRequests]) (ClientPtr) = {
     sproc_dri3_get_supported_modifiers, /* 6 */
     sproc_dri3_pixmap_from_buffers,     /* 7 */
     sproc_dri3_buffers_from_pixmap,     /* 8 */
+    sproc_dri3_fence_from_dma_fence_fd, /* 9 */
+    sproc_dri3_dma_fence_fd_from_fence, /* 10 */
 };
 
 int _X_COLD
diff --git a/include/protocol-versions.h b/include/protocol-versions.h
index 3912ed5c7..524a630e8 100644
--- a/include/protocol-versions.h
+++ b/include/protocol-versions.h
@@ -48,7 +48,7 @@
 
 /* DRI3 */
 #define SERVER_DRI3_MAJOR_VERSION               1
-#define SERVER_DRI3_MINOR_VERSION               1
+#define SERVER_DRI3_MINOR_VERSION               2
 
 /* DMX */
 #define SERVER_DMX_MAJOR_VERSION		2
-- 
2.13.0



More information about the xorg-devel mailing list