From 1a25782bd57e4a4d4329eae138c136be7c6f0532 Mon Sep 17 00:00:00 2001
From: Erik Kurzinger <ekurzinger@nvidia.com>
Date: Tue, 16 Aug 2022 11:54:48 -0700
Subject: [PATCH 1/2] DRI3: add DRI3ImportSyncobj and DRI3FreeSyncobj

Adds new protocol to the DRI3 extension for importing DRM
synchronization objects provided by clients. These can be used to enable
explicit synchronization between the client, the direct rendering
device, and the server.

Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
---
 dri3proto.pc.in                    |  2 +-
 dri3proto.txt                      | 52 ++++++++++++++++++++++++++++--
 include/X11/extensions/dri3proto.h | 28 ++++++++++++++--
 3 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/dri3proto.pc.in b/dri3proto.pc.in
index 7725bc5..be6ccb9 100644
--- a/dri3proto.pc.in
+++ b/dri3proto.pc.in
@@ -3,5 +3,5 @@ includedir=@includedir@
  
 Name: DRI3Proto
 Description: DRI3 extension headers
-Version: 1.3
+Version: 1.4
 Cflags: -I${includedir}
diff --git a/dri3proto.txt b/dri3proto.txt
index 3f92756..07d1152 100644
--- a/dri3proto.txt
+++ b/dri3proto.txt
@@ -1,5 +1,5 @@
 			  The DRI3 Extension
-			     Version 1.3
+			     Version 1.4
 			      2021-11-30
 
 			    Keith Packard
@@ -60,7 +60,7 @@ DRI3 defines no events.
 
 6. Protocol Types
 
-DRI3 defines no new protocol types.
+SYNCOBJ { XID }
 
 			     ❄ ❄ ❄  ❄  ❄ ❄ ❄ 
 
@@ -395,6 +395,36 @@ The name of this extension is "DRI3"
 	If the window specified was not found, a Window error will
 	be returned.
 
+
+┌───
+    DRI3ImportSyncobj
+	syncobj: SYNCOBJ
+	drawable: DRAWABLE
+	fd: FD
+└───
+	Errors: IDchoice, Drawable
+
+	Imports the DRM synchronization object bound to the given 'fd'.  This
+	may then be used to enable explicit synchronization with the the
+	server-side direct rendering device associated with 'drawable'.
+
+	The provided syncobj must be a timeline syncobj.
+
+	If 'drawable' is not found, a Drawable error will be returned.
+
+
+┌───
+    DRI3FreeSyncobj
+	syncobj: SYNCOBJ
+└───
+	Errors: Value
+
+	Indicates that any resources associated with the given 'syncobj' should
+	be released by the server. The actual release may be deferred until any
+	pending operations that depend on the object have completed.
+
+	If 'syncobj' is not found, a Value error will be returned.
+
 			     ❄ ❄ ❄  ❄  ❄ ❄ ❄
 
 9. Extension Events
@@ -703,6 +733,24 @@ A.2 Protocol Requests
 	4	CARD32			drmMinor
 └───
 
+┌───
+    DRI3ImportSyncobj
+	1	CARD8			major opcode
+	1	11			DRI3 opcode
+	2	3			length
+	4	SYNCOBJ			syncobj
+	4	Drawable		drawable
+	0	FD			syncobj fd
+└───
+
+┌───
+    DRI3FreeSyncobj
+	1	CARD8			major opcode
+	1	12			DRI3 opcode
+	2	2			length
+	4	SYNCOBJ			syncobj
+└───
+
 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 9cba105..d941860 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			3
+#define DRI3_MINOR			4
 
 #define DRI3NumberErrors		0
 #define DRI3NumberEvents		0
@@ -45,7 +45,13 @@
 /* v1.3 */
 #define xDRI3SetDRMDeviceInUse  9
 
-#define DRI3NumberRequests		10
+/* v1.4 */
+#define xDRI3ImportSyncobj	10
+#define xDRI3FreeSyncobj	11
+
+#define DRI3NumberRequests		12
+
+#define DRI3Syncobj CARD32
 
 typedef struct {
     CARD8   reqType;
@@ -261,4 +267,22 @@ typedef struct {
 } xDRI3SetDRMDeviceInUseReq;
 #define sz_xDRI3SetDRMDeviceInUseReq    16
 
+/* v1.4 */
+typedef struct {
+    CARD8        reqType;
+    CARD8        dri3ReqType;
+    CARD16       length;
+    DRI3Syncobj  syncobj;
+    CARD32       drawable;
+} xDRI3ImportSyncobjReq;
+#define sz_xDRI3ImportSyncobjReq 12
+
+typedef struct {
+    CARD8        reqType;
+    CARD8        dri3ReqType;
+    CARD16       length;
+    DRI3Syncobj  syncobj;
+} xDRI3FreeSyncobjReq;
+#define sz_xDRI3FreeSyncobjReq 8
+
 #endif
-- 
GitLab


From 08c729e70b565508f36ad0df086b13b8bb6b0813 Mon Sep 17 00:00:00 2001
From: Erik Kurzinger <ekurzinger@nvidia.com>
Date: Tue, 16 Aug 2022 11:55:43 -0700
Subject: [PATCH 2/2] Present: add PresentPixmapSynced

Adds an augmented version of PresentPixmap supporting explicit
synchronization with a direct rendering device. This takes the form of a
timeline DRM synchronization object, along with acquire and release
points on that timeline. Implementations advertising
PresentCapabilitySyncobj will wait for the acquire point to be signaled
before executing the PresentPixmap request, and signal the release point
after any GPU operations on the pixmap have completed.

Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
---
 include/X11/extensions/presentproto.h  | 32 +++++++++
 include/X11/extensions/presenttokens.h |  7 +-
 presentproto.txt                       | 89 +++++++++++++++++++++++++-
 3 files changed, 124 insertions(+), 4 deletions(-)

diff --git a/include/X11/extensions/presentproto.h b/include/X11/extensions/presentproto.h
index d8dc6d2..ea80863 100644
--- a/include/X11/extensions/presentproto.h
+++ b/include/X11/extensions/presentproto.h
@@ -24,6 +24,7 @@
 #define _PRESENT_PROTO_H_
 
 #include <X11/extensions/presenttokens.h>
+#include <X11/extensions/dri3proto.h>
 
 #define Window CARD32
 #define Pixmap CARD32
@@ -136,6 +137,37 @@ typedef struct {
 } xPresentQueryCapabilitiesReply;
 #define sz_xPresentQueryCapabilitiesReply       32
 
+typedef struct {
+    CARD8   reqType;
+    CARD8   presentReqType;
+    CARD16  length;
+    Window  window;
+
+    Pixmap  pixmap;
+    CARD32  serial;
+
+    Region  valid;
+    Region  update;
+
+    INT16   x_off;
+    INT16   y_off;
+    CARD32  target_crtc;
+
+    DRI3Syncobj acquire_syncobj;
+    DRI3Syncobj release_syncobj;
+    CARD64 acquire_point;
+    CARD64 release_point;
+
+    CARD32  options;
+    CARD32  pad1;
+
+    CARD64  target_msc;
+    CARD64  divisor;
+    CARD64  remainder;
+    /* followed by a LISTofPRESENTNOTIFY */
+} xPresentPixmapSyncedReq;
+#define sz_xPresentPixmapSyncedReq	88
+
 /*
  * Events
  *
diff --git a/include/X11/extensions/presenttokens.h b/include/X11/extensions/presenttokens.h
index 400e84d..fae10fd 100644
--- a/include/X11/extensions/presenttokens.h
+++ b/include/X11/extensions/presenttokens.h
@@ -36,8 +36,9 @@
 #define X_PresentNotifyMSC		2
 #define X_PresentSelectInput		3
 #define X_PresentQueryCapabilities      4
+#define X_PresentPixmapSynced		5
 
-#define PresentNumberRequests		5
+#define PresentNumberRequests		6
 
 /* Present operation options */
 #define PresentOptionNone               0
@@ -62,11 +63,13 @@
 #define PresentCapabilityFence          2
 #define PresentCapabilityUST            4
 #define PresentCapabilityAsyncMayTear   8
+#define PresentCapabilitySyncobj        16
 
 #define PresentAllCapabilities  (PresentCapabilityAsync | \
                                  PresentCapabilityFence | \
                                  PresentCapabilityUST | \
-                                 PresentCapabilityAsyncMayTear)
+                                 PresentCapabilityAsyncMayTear | \
+                                 PresentCapabilitySyncobj)
 
 #define PresentAllAsyncCapabilities (PresentCapabilityAsync | PresentCapabilityAsyncMayTear)
 
diff --git a/presentproto.txt b/presentproto.txt
index b474093..c2f717e 100644
--- a/presentproto.txt
+++ b/presentproto.txt
@@ -1,5 +1,5 @@
 			The Present Extension
-			     Version 1.3
+			     Version 1.4
 			      2023-06-13
       
 			    Keith Packard
@@ -63,7 +63,8 @@ PRESENTOPTION { PresentOptionAsync,
 PRESENTCAPABILITY { PresentCapabilityAsync,
 		    PresentCapabilityFence,
 		    PresentCapabilityUST,
-		    PresentCapabilityAsyncMayTear }
+		    PresentCapabilityAsyncMayTear,
+		    PresentCapabilitySyncobj }
 
 PRESENTCOMPLETEKIND { PresentCompleteKindPixmap,
 		      PresentCompleteKindMSCNotify }
@@ -359,6 +360,65 @@ The name of this extension is "Present"
 	defined by the extension, but is expected to be on the order
 	of milliseconds or less.
 
+	PresentCapabilitySyncobj means that the target device supports
+	explicit synchronization using timeline DRM synchronization
+	objects. See the PresentPixmapSynced request for details.
+
+┌───
+    PresentPixmapSynced
+	window: WINDOW
+	pixmap: PIXMAP
+	serial: CARD32
+	valid-area: REGION or None
+	update-area: REGION or None
+	x-off, y-off: INT16
+	target-crtc: CRTC or None
+	acquire-syncobj: SYNCOBJ or None
+	release-syncobj: SYNCOBJ or None
+	acquire-point: CARD64
+	release-point: CARD64
+	options: SETofPRESENTOPTION
+	target-msc: CARD64
+	divisor: CARD64
+	remainder: CARD64
+	notifies: LISTofPRESENTNOTIFY
+└───
+	Errors: Window, Pixmap, Match, Value
+
+	Identical to the PresentPixmap request, except that instead of the
+	'wait-fence' and 'idle-fence' arguments it accepts mandatory
+	'acquire-syncobj' and 'release-syncobj' arguments, along with
+	corresponding acquire and release points, to be used for explicit
+	timeline-based GPU synchronization. The 'acquire-point' and
+	'release-point' are assumed to correspond to timeline points on the
+	respective DRM syncobjs.
+
+	The contents of the Pixmap will not be accessed by the server until the
+	'acquire-point' on the acquire timeline has been signaled by the
+	client. The fence need not be submitted at the time the
+	PresentPixmapSynced request is issued.
+
+	Once the 'release-point' on the release timeline has been signaled, the
+	client may assume that no further GPU or CPU access to the Pixmap by
+	the server will occur as part of the originating PresentPixmapSynced
+	request.  Note that this is a stronger guarantee than what is provided
+	by the 'idle-fence' argument of the PresentPixmap request or the
+	delivery of a PresentIdleNotify event, as those do not necessarily
+	imply that the Pixmap is idle on the GPU.
+
+	The server may wait for the acquire point and signal the release point
+	itself, as will typically happen if the request is executed by copying
+	the Pixmap's contents. Alternatively, it may forward the timelines,
+	acquire, and release points to an output sink directly, provided that
+	sink also supports explicit synchronization using DRM syncobjs.
+
+	If the server does not support PresentCapabilitySyncobj, a Value error
+	is generated.
+
+	If either 'acquire-syncobj' or 'release-syncobj' are None or do not
+	refer to previously imported syncobjs or 'acquire-point' or
+	'release-point' is zero, a Value error is generated.
+
 
 7.1 Requests proposed for a later Present extension version
 
@@ -729,6 +789,31 @@ A.2 Protocol Requests
 	4	SETofPRESENTCAPABILITY	capabilities
 └───
 
+┌───
+    PresentPixmapSynced
+	1	CARD8			major opcode
+	1	5			Present opcode
+	2	22+2n			length
+	4	Window			window
+	4	Pixmap			pixmap
+	4	CARD32			serial
+	4	Region			valid-area
+	4	Region			update-area
+	2	INT16			x-off
+	2	INT16			y-off
+	4	CRTC			target-crtc
+	4	SYNCOBJ			acquire-syncobj
+	4	SYNCOBJ			release-syncobj
+	8	CARD64			acquire-point
+	8	CARD64			release-point
+	4	CARD32			options
+	4				unused
+	8	CARD64			target-msc
+	8	CARD64			divisor
+	8	CARD64			remainder
+	8n	LISTofPresentNotify	notifies
+└───
+
 A.3 Protocol Events
 
 ┌───
-- 
GitLab

