Mesa (master): mesa: misc GLX_INTEL_swap_event fixes

Jesse Barnes jbarnes at kemper.freedesktop.org
Mon Jan 25 23:41:15 UTC 2010


Module: Mesa
Branch: master
Commit: 7a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72

Author: Robert Bragg <robert at linux.intel.com>
Date:   Wed Jan 20 03:01:14 2010 +0000

mesa: misc GLX_INTEL_swap_event fixes

Fixup a few issues found through testing:
  - update GLX names to match glproto
  - register DRI2WireToEvent so it actually gets called

Signed-off-by: Robert Bragg <robert at linux.intel.com>

---

 include/GL/glx.h        |    6 +++++-
 include/GL/glxext.h     |    8 ++++----
 src/glx/x11/dri2.c      |   20 ++++++++++++++------
 src/glx/x11/glxclient.h |    5 +++++
 src/glx/x11/glxext.c    |    7 +++----
 5 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/include/GL/glx.h b/include/GL/glx.h
index 82b0f22..fd53964 100644
--- a/include/GL/glx.h
+++ b/include/GL/glx.h
@@ -518,8 +518,12 @@ typedef struct {
 } GLXPbufferClobberEvent;
 
 typedef struct {
+    int type;
+    unsigned long serial;	/* # of last request processed by server */
+    Bool send_event;		/* true if this came from a SendEvent request */
+    Display *display;		/* Display the event was read from */
+    GLXDrawable drawable;	/* drawable on which event was requested in event mask */
     int event_type;
-    GLXDrawable drawable;
     int64_t ust;
     int64_t msc;
     int64_t sbc;
diff --git a/include/GL/glxext.h b/include/GL/glxext.h
index 36ee366..50740dd 100644
--- a/include/GL/glxext.h
+++ b/include/GL/glxext.h
@@ -698,10 +698,10 @@ typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawabl
 
 #ifndef GLX_INTEL_swap_event
 #define GLX_INTEL_swap_event
-#define GLX_BUFFER_SWAP_COMPLETE_MASK      0x10000000
-#define GLX_EXCHANGE_COMPLETE              0x8024
-#define GLX_BLIT_COMPLETE                  0x8025
-#define GLX_FLIP_COMPLETE                  0x8026
+#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x10000000
+#define GLX_EXCHANGE_COMPLETE_INTEL	    0x8024
+#define GLX_BLIT_COMPLETE_INTEL		    0x8025
+#define GLX_FLIP_COMPLETE_INTEL		    0x8026
 #endif
 
 #ifndef GLX_SGIX_swap_barrier
diff --git a/src/glx/x11/dri2.c b/src/glx/x11/dri2.c
index 2cb5d34..832935a 100644
--- a/src/glx/x11/dri2.c
+++ b/src/glx/x11/dri2.c
@@ -81,12 +81,15 @@ static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
                                    dri2Info,
                                    dri2ExtensionName,
                                    &dri2ExtensionHooks,
-                                   0, NULL)
+                                   1, NULL)
 
 static Bool
 DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
 {
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   XExtDisplayInfo *glx_info = __glXFindDisplay(dpy);
+   static int glx_event_base;
+   static Bool found_glx_info = False;
 
    XextCheckExtension(dpy, info, dri2ExtensionName, False);
 
@@ -95,21 +98,26 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
    {
       GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
       xDRI2BufferSwapComplete *awire = (xDRI2BufferSwapComplete *)wire;
-      switch (awire->type) {
+      aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire);
+      aevent->type =
+	  (glx_info->codes->first_event + GLX_BufferSwapComplete) & 0x75;
+      aevent->send_event = (awire->type & 0x80) != 0;
+      aevent->display = dpy;
+      aevent->drawable = awire->drawable;
+      switch (awire->event_type) {
       case DRI2_EXCHANGE_COMPLETE:
-	 aevent->event_type = GLX_EXCHANGE_COMPLETE;
+	 aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL;
 	 break;
       case DRI2_BLIT_COMPLETE:
-	 aevent->event_type = GLX_BLIT_COMPLETE;
+	 aevent->event_type = GLX_BLIT_COMPLETE_INTEL;
 	 break;
       case DRI2_FLIP_COMPLETE:
-	 aevent->event_type = GLX_FLIP_COMPLETE;
+	 aevent->event_type = GLX_FLIP_COMPLETE_INTEL;
 	 break;
       default:
 	 /* unknown swap completion type */
 	 return False;
       }
-      aevent->drawable = awire->drawable;
       aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
       aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
       aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo;
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index ded4f5a..e0b286b 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -41,6 +41,7 @@
 #define NEED_EVENTS
 #include <X11/Xproto.h>
 #include <X11/Xlibint.h>
+#include <X11/extensions/extutil.h>
 #define GLX_GLXEXT_PROTOTYPES
 #include <GL/glx.h>
 #include <GL/glxext.h>
@@ -793,6 +794,10 @@ extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
 GLboolean
 __driGetMscRateOML(__DRIdrawable * draw,
                    int32_t * numerator, int32_t * denominator, void *private);
+
+/* So that dri2.c:DRI2WireToEvent() can access
+ * glx_info->codes->first_event */
+XExtDisplayInfo *__glXFindDisplay (Display *dpy);
 #endif
 
 #endif /* !__GLX_client_h__ */
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index fe65216..09bb850 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -120,7 +120,6 @@ static /* const */ XExtensionHooks __glXExtensionHooks = {
   __glXErrorString,       /* error_string */
 };
 
-static
 XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,
                            __glXExtensionName, &__glXExtensionHooks,
                            __GLX_NUMBER_EVENTS, NULL)
@@ -194,11 +193,11 @@ __glXEventToWire(Display *dpy, XEvent *event, xEvent *wire)
       break;
    case GLX_SAVED:
       break;
-   case GLX_EXCHANGE_COMPLETE:
+   case GLX_EXCHANGE_COMPLETE_INTEL:
       break;
-   case GLX_BLIT_COMPLETE:
+   case GLX_BLIT_COMPLETE_INTEL:
       break;
-   case GLX_FLIP_COMPLETE:
+   case GLX_FLIP_COMPLETE_INTEL:
       break;
    default:
       /* client doesn't support server event */




More information about the mesa-commit mailing list