From 7a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Wed, 20 Jan 2010 03:01:14 +0000 Subject: [PATCH] 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 --- 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 82b0f221146..fd53964ea06 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 36ee3665dfd..50740dd29db 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 2cb5d3463af..832935a3ba0 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 ded4f5a434a..e0b286b6883 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -41,6 +41,7 @@ #define NEED_EVENTS #include #include +#include #define GLX_GLXEXT_PROTOTYPES #include #include @@ -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 fe65216c411..09bb8503196 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 */ -- 2.30.2