Re: [Mesa3d-dev] DRI2 flush extension

2009-02-20 Thread Kristian Høgsberg
On Thu, Feb 19, 2009 at 8:46 PM, Alan Hourihane al...@fairlite.co.uk wrote:
 Attached is a new DRI2 flush extension that allows the driver to perform
 a real flush before dispatching a swap or Xserver copy operation.

 Currently we do this before a DRI2CopyRegion() call.

 This allows drivers a real end of scene flush to ensure rendering is
 complete prior to a swap.

 I've committed this already to the gallium-mesa-7.4 branch, but any
 comments appreciated before I push to the master branch?

Hi Alan,

A couple of comments below.

commit b163d4f9ee2ab4d54daf7c17c097cae51c9c6db2
Author: Alan Hourihane al...@vmware.com
Date:   Thu Feb 19 18:39:08 2009 +

glx: add support for a reallyFlush() function before swap occurs.

diff --git a/include/GL/internal/dri_interface.h
b/include/GL/internal/dri_interface.h
index 27cc1be..a726b93 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -78,6 +78,7 @@ typedef struct __DRIswrastExtensionRec
__DRIswrastExtension;
 typedef struct __DRIbufferRec  __DRIbuffer;
 typedef struct __DRIdri2ExtensionRec   __DRIdri2Extension;
 typedef struct __DRIdri2LoaderExtensionRec __DRIdri2LoaderExtension;
+typedef struct __DRI2flushExtensionRec __DRI2flushExtension;

 /*...@}*/

@@ -245,6 +246,16 @@ struct __DRItexBufferExtensionRec {
 __DRIdrawable *pDraw);
 };

+/**
+ * Used by drivers that implement DRI2
+ */
+#define __DRI2_FLUSH DRI2_Flush
+#define __DRI2_FLUSH_VERSION 1
+struct __DRI2flushExtensionRec {
+__DRIextension base;
+void (*flush)(__DRIdrawable *drawable);
+};
+

 /**
  * XML document describing the configuration options supported by the
diff --git a/src/glx/x11/dri2_glx.c b/src/glx/x11/dri2_glx.c
index 639aa19..fdda852 100644
--- a/src/glx/x11/dri2_glx.c
+++ b/src/glx/x11/dri2_glx.c
@@ -207,7 +207,13 @@ static void dri2CopySubBuffer(__GLXDRIdrawable *pdraw,
 xrect.width = width;
 xrect.height = height;

+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+   (*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+
 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
+/* should get a fence ID back from here at some point */
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
   DRI2BufferFrontLeft, DRI2BufferBackLeft);
 XFixesDestroyRegion(pdraw-psc-dpy, region);
@@ -235,6 +241,11 @@ static void dri2WaitX(__GLXDRIdrawable *pdraw)
 xrect.width = priv-width;
 xrect.height = priv-height;

+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+   (*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+

This flush call isn't necessary - glXWaitX() is called to wait for X
rendering to the drawable to finish so there can't be any unflushed
DRI driver activity.

 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
@@ -255,6 +266,11 @@ static void dri2WaitGL(__GLXDRIdrawable *pdraw)
 xrect.width = priv-width;
 xrect.height = priv-height;

+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+   (*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+
 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
diff --git a/src/glx/x11/dri_common.c b/src/glx/x11/dri_common.c
index 4fda649..90c3d8c 100644
--- a/src/glx/x11/dri_common.c
+++ b/src/glx/x11/dri_common.c
@@ -392,6 +392,13 @@ driBindExtensions(__GLXscreenConfigs *psc, int dri2)
}
 #endif

+#ifdef __DRI2_FLUSH
+   if ((strcmp(extensions[i]-name, __DRI2_FLUSH) == 0)  dri2) {
+   psc-f = (__DRI2flushExtension *) extensions[i];
+   /* internal driver extension, no GL extension exposed */
+   }
+#endif

The driver needs to know whether the loader is new enough that it
supports the flush extension so that it can enable the lazy glFlush()
optiomization.  An older loader will just ignore the flush extension
and thus never call that entry point, in which case the driver must
flush on every glFlush() call.  The only way to do this I can think of
right now is to add an 'enable()' entrypoint to the extension to tell
the driver that the loader will call -flush() and it's ok to ignore
glFlush().

/* Ignore unknown extensions */
 }
 }
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index 3e70759..caf58bb 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -519,6 +519,10 @@ struct __GLXscreenConfigsRec {
 const __DRItexBufferExtension *texBuffer;
 #endif

+#ifdef __DRI2_FLUSH
+const __DRI2flushExtension *f;
+#endif
+
 #endif

 /**

--
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing

DRI2 flush extension

2009-02-19 Thread Alan Hourihane
Attached is a new DRI2 flush extension that allows the driver to perform
a real flush before dispatching a swap or Xserver copy operation.

Currently we do this before a DRI2CopyRegion() call.

This allows drivers a real end of scene flush to ensure rendering is
complete prior to a swap.

I've committed this already to the gallium-mesa-7.4 branch, but any
comments appreciated before I push to the master branch?

Thanks,

Alan.
commit b163d4f9ee2ab4d54daf7c17c097cae51c9c6db2
Author: Alan Hourihane al...@vmware.com
Date:   Thu Feb 19 18:39:08 2009 +

glx: add support for a reallyFlush() function before swap occurs.

diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 27cc1be..a726b93 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -78,6 +78,7 @@ typedef struct __DRIswrastExtensionRec		__DRIswrastExtension;
 typedef struct __DRIbufferRec			__DRIbuffer;
 typedef struct __DRIdri2ExtensionRec		__DRIdri2Extension;
 typedef struct __DRIdri2LoaderExtensionRec	__DRIdri2LoaderExtension;
+typedef struct __DRI2flushExtensionRec	__DRI2flushExtension;
 
 /*...@}*/
 
@@ -245,6 +246,16 @@ struct __DRItexBufferExtensionRec {
 			 __DRIdrawable *pDraw);
 };
 
+/**
+ * Used by drivers that implement DRI2
+ */
+#define __DRI2_FLUSH DRI2_Flush
+#define __DRI2_FLUSH_VERSION 1
+struct __DRI2flushExtensionRec {
+__DRIextension base;
+void (*flush)(__DRIdrawable *drawable);
+};
+
 
 /**
  * XML document describing the configuration options supported by the
diff --git a/src/glx/x11/dri2_glx.c b/src/glx/x11/dri2_glx.c
index 639aa19..fdda852 100644
--- a/src/glx/x11/dri2_glx.c
+++ b/src/glx/x11/dri2_glx.c
@@ -207,7 +207,13 @@ static void dri2CopySubBuffer(__GLXDRIdrawable *pdraw,
 xrect.width = width;
 xrect.height = height;
 
+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+	(*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+
 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
+/* should get a fence ID back from here at some point */
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
 		   DRI2BufferFrontLeft, DRI2BufferBackLeft);
 XFixesDestroyRegion(pdraw-psc-dpy, region);
@@ -235,6 +241,11 @@ static void dri2WaitX(__GLXDRIdrawable *pdraw)
 xrect.width = priv-width;
 xrect.height = priv-height;
 
+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+	(*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+
 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
 		   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
@@ -255,6 +266,11 @@ static void dri2WaitGL(__GLXDRIdrawable *pdraw)
 xrect.width = priv-width;
 xrect.height = priv-height;
 
+#ifdef __DRI2_FLUSH
+if (pdraw-psc-f)
+	(*pdraw-psc-f-flush)(pdraw-driDrawable);
+#endif
+
 region = XFixesCreateRegion(pdraw-psc-dpy, xrect, 1);
 DRI2CopyRegion(pdraw-psc-dpy, pdraw-drawable, region,
 		   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
diff --git a/src/glx/x11/dri_common.c b/src/glx/x11/dri_common.c
index 4fda649..90c3d8c 100644
--- a/src/glx/x11/dri_common.c
+++ b/src/glx/x11/dri_common.c
@@ -392,6 +392,13 @@ driBindExtensions(__GLXscreenConfigs *psc, int dri2)
 	}
 #endif
 
+#ifdef __DRI2_FLUSH
+	if ((strcmp(extensions[i]-name, __DRI2_FLUSH) == 0)  dri2) {
+	psc-f = (__DRI2flushExtension *) extensions[i];
+	/* internal driver extension, no GL extension exposed */
+	}
+#endif
+
 	/* Ignore unknown extensions */
 }
 }
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index 3e70759..caf58bb 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -519,6 +519,10 @@ struct __GLXscreenConfigsRec {
 const __DRItexBufferExtension *texBuffer;
 #endif
 
+#ifdef __DRI2_FLUSH
+const __DRI2flushExtension *f;
+#endif
+
 #endif
 
 /**
--
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H--
___
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel