diff options
-rw-r--r-- | src/glx/dri2_glx.c | 3 | ||||
-rw-r--r-- | src/glx/dri_glx.c | 3 | ||||
-rw-r--r-- | src/glx/drisw_glx.c | 3 | ||||
-rw-r--r-- | src/glx/glxclient.h | 3 | ||||
-rw-r--r-- | src/glx/glxcmds.c | 42 | ||||
-rw-r--r-- | src/glx/indirect_glx.c | 3 |
6 files changed, 31 insertions, 26 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index f929fdd..a9bcebf 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -120,9 +120,6 @@ dri2_destroy_context(struct glx_context *context) driReleaseDrawables(&pcp->base); - if (context->xid) - glx_send_destroy_context(psc->base.dpy, context->xid); - if (context->extensions) XFree((char *) context->extensions); diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c index 9365224..3c14ef0 100644 --- a/src/glx/dri_glx.c +++ b/src/glx/dri_glx.c @@ -516,9 +516,6 @@ dri_destroy_context(struct glx_context * context) driReleaseDrawables(&pcp->base); - if (context->xid) - glx_send_destroy_context(psc->base.dpy, context->xid); - if (context->extensions) XFree((char *) context->extensions); diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 801ac7d..204879e 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -253,9 +253,6 @@ drisw_destroy_context(struct glx_context *context) driReleaseDrawables(&pcp->base); - if (context->xid) - glx_send_destroy_context(psc->base.dpy, context->xid); - if (context->extensions) XFree((char *) context->extensions); diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index f915426..109206f 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -227,9 +227,6 @@ struct glx_context_vtable { void * (*get_proc_address)(const char *symbol); }; -extern void -glx_send_destroy_context(Display *dpy, XID xid); - /** * GLX state that needs to be kept on the client. One of these records * exist for each context that has been made current by this client. diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index f2c1884..4f99023 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -381,7 +381,7 @@ glXCreateContext(Display * dpy, XVisualInfo * vis, X_GLXCreateContext, renderType, vis->screen); } -_X_HIDDEN void +static void glx_send_destroy_context(Display *dpy, XID xid) { CARD8 opcode = __glXSetupForCommand(dpy); @@ -405,25 +405,24 @@ glXDestroyContext(Display * dpy, GLXContext ctx) { struct glx_context *gc = (struct glx_context *) ctx; - if (!gc) + if (gc == NULL || gc->xid == None) return; __glXLock(); + if (!gc->imported) + glx_send_destroy_context(dpy, gc->xid); + if (gc->currentDpy) { /* This context is bound to some thread. According to the man page, * we should not actually delete the context until it's unbound. * Note that we set gc->xid = None above. In MakeContextCurrent() * we check for that and delete the context there. */ - if (!gc->imported) - glx_send_destroy_context(dpy, gc->xid); gc->xid = None; - __glXUnlock(); - return; + } else { + gc->vtable->destroy(gc); } __glXUnlock(); - - gc->vtable->destroy(gc); } /* @@ -1566,9 +1565,30 @@ _X_EXPORT GLXContextID glXGetContextIDEXT(const GLXContext ctx_user) return (ctx == NULL) ? None : ctx->xid; } -_X_EXPORT -GLX_ALIAS_VOID(glXFreeContextEXT, (Display *dpy, GLXContext ctx), (dpy, ctx), - glXDestroyContext); +_X_EXPORT void +glXFreeContextEXT(Display *dpy, GLXContext ctx) +{ + struct glx_context *gc = (struct glx_context *) ctx; + + if (gc == NULL || gc->xid == None) + return; + + /* The GLX_EXT_import_context spec says: + * + * "glXFreeContext does not free the server-side context information or + * the XID associated with the server-side context." + * + * Don't send any protocol. Just destroy the client-side tracking of the + * context. Also, only release the context structure if it's not current. + */ + __glXLock(); + if (gc->currentDpy) { + gc->xid = None; + } else { + gc->vtable->destroy(gc); + } + __glXUnlock(); +} _X_EXPORT GLXFBConfig * glXChooseFBConfig(Display * dpy, int screen, diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c index 7b542dd..17689d4 100644 --- a/src/glx/indirect_glx.c +++ b/src/glx/indirect_glx.c @@ -43,9 +43,6 @@ static struct _glapi_table *IndirectAPI = NULL; static void indirect_destroy_context(struct glx_context *gc) { - if (!gc->imported && gc->xid) - glx_send_destroy_context(gc->psc->dpy, gc->xid); - __glXFreeVertexArrayState(gc); if (gc->vendor) |