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@linux.intel.com>
This commit is contained in:
Robert Bragg 2010-01-20 03:01:14 +00:00 committed by Jesse Barnes
parent 9b22427911
commit 7a9329ba99
5 changed files with 31 additions and 15 deletions

View File

@ -518,8 +518,12 @@ typedef struct {
} GLXPbufferClobberEvent; } GLXPbufferClobberEvent;
typedef struct { 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; int event_type;
GLXDrawable drawable;
int64_t ust; int64_t ust;
int64_t msc; int64_t msc;
int64_t sbc; int64_t sbc;

View File

@ -698,10 +698,10 @@ typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawabl
#ifndef GLX_INTEL_swap_event #ifndef GLX_INTEL_swap_event
#define GLX_INTEL_swap_event #define GLX_INTEL_swap_event
#define GLX_BUFFER_SWAP_COMPLETE_MASK 0x10000000 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x10000000
#define GLX_EXCHANGE_COMPLETE 0x8024 #define GLX_EXCHANGE_COMPLETE_INTEL 0x8024
#define GLX_BLIT_COMPLETE 0x8025 #define GLX_BLIT_COMPLETE_INTEL 0x8025
#define GLX_FLIP_COMPLETE 0x8026 #define GLX_FLIP_COMPLETE_INTEL 0x8026
#endif #endif
#ifndef GLX_SGIX_swap_barrier #ifndef GLX_SGIX_swap_barrier

View File

@ -81,12 +81,15 @@ static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
dri2Info, dri2Info,
dri2ExtensionName, dri2ExtensionName,
&dri2ExtensionHooks, &dri2ExtensionHooks,
0, NULL) 1, NULL)
static Bool static Bool
DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire) DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
{ {
XExtDisplayInfo *info = DRI2FindDisplay(dpy); 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); XextCheckExtension(dpy, info, dri2ExtensionName, False);
@ -95,21 +98,26 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
{ {
GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
xDRI2BufferSwapComplete *awire = (xDRI2BufferSwapComplete *)wire; 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: case DRI2_EXCHANGE_COMPLETE:
aevent->event_type = GLX_EXCHANGE_COMPLETE; aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL;
break; break;
case DRI2_BLIT_COMPLETE: case DRI2_BLIT_COMPLETE:
aevent->event_type = GLX_BLIT_COMPLETE; aevent->event_type = GLX_BLIT_COMPLETE_INTEL;
break; break;
case DRI2_FLIP_COMPLETE: case DRI2_FLIP_COMPLETE:
aevent->event_type = GLX_FLIP_COMPLETE; aevent->event_type = GLX_FLIP_COMPLETE_INTEL;
break; break;
default: default:
/* unknown swap completion type */ /* unknown swap completion type */
return False; return False;
} }
aevent->drawable = awire->drawable;
aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo; aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo;

View File

@ -41,6 +41,7 @@
#define NEED_EVENTS #define NEED_EVENTS
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/Xlibint.h> #include <X11/Xlibint.h>
#include <X11/extensions/extutil.h>
#define GLX_GLXEXT_PROTOTYPES #define GLX_GLXEXT_PROTOTYPES
#include <GL/glx.h> #include <GL/glx.h>
#include <GL/glxext.h> #include <GL/glxext.h>
@ -793,6 +794,10 @@ extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
GLboolean GLboolean
__driGetMscRateOML(__DRIdrawable * draw, __driGetMscRateOML(__DRIdrawable * draw,
int32_t * numerator, int32_t * denominator, void *private); 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
#endif /* !__GLX_client_h__ */ #endif /* !__GLX_client_h__ */

View File

@ -120,7 +120,6 @@ static /* const */ XExtensionHooks __glXExtensionHooks = {
__glXErrorString, /* error_string */ __glXErrorString, /* error_string */
}; };
static
XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo, XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,
__glXExtensionName, &__glXExtensionHooks, __glXExtensionName, &__glXExtensionHooks,
__GLX_NUMBER_EVENTS, NULL) __GLX_NUMBER_EVENTS, NULL)
@ -194,11 +193,11 @@ __glXEventToWire(Display *dpy, XEvent *event, xEvent *wire)
break; break;
case GLX_SAVED: case GLX_SAVED:
break; break;
case GLX_EXCHANGE_COMPLETE: case GLX_EXCHANGE_COMPLETE_INTEL:
break; break;
case GLX_BLIT_COMPLETE: case GLX_BLIT_COMPLETE_INTEL:
break; break;
case GLX_FLIP_COMPLETE: case GLX_FLIP_COMPLETE_INTEL:
break; break;
default: default:
/* client doesn't support server event */ /* client doesn't support server event */