diff --git a/glx/glxcontext.h b/glx/glxcontext.h index 70a14115d..79bc083a8 100644 --- a/glx/glxcontext.h +++ b/glx/glxcontext.h @@ -55,6 +55,10 @@ struct __GLXcontext { unsigned long mask); int (*forceCurrent) (__GLXcontext *context); + Bool (*wait) (__GLXcontext *context, + __GLXclientState *cl, + int *error); + __GLXtextureFromPixmap *textureFromPixmap; /* diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 63462a54c..42335926b 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -245,6 +245,18 @@ __glXDRIcontextForceCurrent(__GLXcontext *baseContext) read->driDrawable); } +static Bool +__glXDRIcontextWait(__GLXcontext *baseContext, + __GLXclientState *cl, int *error) +{ + if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) { + *error = cl->client->noClientException; + return TRUE; + } + + return FALSE; +} + #ifdef __DRI_TEX_BUFFER static int @@ -350,6 +362,7 @@ __glXDRIscreenCreateContext(__GLXscreen *baseScreen, context->base.copy = __glXDRIcontextCopy; context->base.forceCurrent = __glXDRIcontextForceCurrent; context->base.textureFromPixmap = &__glXDRItextureFromPixmap; + context->base.wait = __glXDRIcontextWait; context->driContext = (*screen->dri2->createNewContext)(screen->driScreen, diff --git a/glx/glxext.c b/glx/glxext.c index 9f9c0ed1f..e7a049687 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -445,6 +445,9 @@ __GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag, } } + if (cx->wait && (*cx->wait)(cx, cl, error)) + return NULL; + if (cx == __glXLastContext) { /* No need to re-bind */ return cx; diff --git a/glx/glxserver.h b/glx/glxserver.h index 80f1b28f9..10c4889e1 100644 --- a/glx/glxserver.h +++ b/glx/glxserver.h @@ -56,7 +56,14 @@ #include #include -/* For glxscreens.h */ +/* +** GLX resources. +*/ +typedef XID GLXContextID; +typedef XID GLXPixmap; +typedef XID GLXDrawable; + +typedef struct __GLXclientStateRec __GLXclientState; typedef struct __GLXdrawable __GLXdrawable; typedef struct __GLXcontext __GLXcontext; @@ -71,15 +78,6 @@ typedef struct __GLXcontext __GLXcontext; #define False 0 #endif -/* -** GLX resources. -*/ -typedef XID GLXContextID; -typedef XID GLXPixmap; -typedef XID GLXDrawable; - -typedef struct __GLXclientStateRec __GLXclientState; - extern __GLXscreen *glxGetScreen(ScreenPtr pScreen); extern __GLXclientState *glxGetClient(ClientPtr pClient);