glx: Only clear the stored context tag when the context has been unbound
authorJon TURNEY <jon.turney@dronecode.org.uk>
Tue, 7 Sep 2010 10:36:07 +0000 (11:36 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 7 Sep 2010 13:07:23 +0000 (09:07 -0400)
The calling order of ->bind and ->unbind changed and then ->unbind would
clear the currentContextTag of the old context before ->bind could reuse
it in the make current request, in the indirect case.

Instead, clear the old currentContextTag if and only if we send a request
to the server to actually unbind it or reassign it to another context.

https://bugs.freedesktop.org/show_bug.cgi?id=29977

Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Signed-off-by: Kristian Høgsberg <krh@bitplanet.net>
src/glx/indirect_glx.c

index f059840..61ceed3 100644 (file)
@@ -137,10 +137,12 @@ indirect_bind_context(struct glx_context *gc, struct glx_context *old,
    Display *dpy = gc->psc->dpy;
    int opcode = __glXSetupForCommand(dpy);
 
-   if (old != &dummyContext && !old->isDirect && old->psc->dpy == dpy)
+   if (old != &dummyContext && !old->isDirect && old->psc->dpy == dpy) {
       tag = old->currentContextTag;
-   else
-      tag = None;
+      old->currentContextTag = 0;
+   } else {
+      tag = 0;
+   }
 
    SendMakeCurrentRequest(dpy, opcode, gc->xid, tag, draw, read, &reply);
 
@@ -170,10 +172,11 @@ indirect_unbind_context(struct glx_context *gc, struct glx_context *new)
     * context to a direct context or from one dpy to another and have
     * to send a request to the dpy to unbind the previous context.
     */
-   if (!new || new->isDirect || new->psc->dpy != dpy)
+   if (!new || new->isDirect || new->psc->dpy != dpy) {
       SendMakeCurrentRequest(dpy, opcode, None,
                             gc->currentContextTag, None, None, &reply);
-   gc->currentContextTag = 0;
+      gc->currentContextTag = 0;
+   }
 }
 
 static void