glx: Bind to our context before __glXSetCurrentContext
authorJeremy Huddleston <jeremyhu@apple.com>
Fri, 17 Jun 2011 19:24:55 +0000 (12:24 -0700)
committerJeremy Huddleston <jeremyhu@apple.com>
Mon, 20 Jun 2011 23:54:58 +0000 (16:54 -0700)
We want to bind to our context before calling __glXSetCurrentContext or
messing with the gc rect in order to properly handle error conditions.

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
src/glx/glxcurrent.c

index 0f39ee507373094018b1e35926cb3e4df31a3efe..6f048ae571cc995102b8ce427964d878d5397ad1 100644 (file)
@@ -212,7 +212,6 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
 {
    struct glx_context *gc = (struct glx_context *) gc_user;
    struct glx_context *oldGC = __glXGetCurrentContext();
-   int ret = Success;
 
    /* XXX: If this is left out, then libGL ends up not having this
     * symbol, and drivers using it fail to load.  Compare the
@@ -259,15 +258,28 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
    }
 
    if (gc) {
+      /* Attempt to bind the context.  We do this before mucking with
+       * gc and __glXSetCurrentContext to properly handle our state in
+       * case of an error.
+       *
+       * If an error occurs, set the Null context since we've already
+       * blown away our old context.  The caller is responsible for
+       * figuring out how to handle setting a valid context.
+       */
+      if (gc->vtable->bind(gc, oldGC, draw, read) != Success) {
+         __glXSetCurrentContextNull();
+         __glXUnlock();
+         __glXGenerateError(dpy, None, GLXBadContext, X_GLXMakeContextCurrent);
+         return GL_FALSE;
+      }
+
       if (gc->thread_refcount == 0)
          gc->currentDpy = dpy;
-      __glXSetCurrentContext(gc);
-      ret = gc->vtable->bind(gc, oldGC, draw, read);
-      if (gc->thread_refcount == 0) {
          gc->currentDrawable = draw;
          gc->currentReadable = read;
       }
       gc->thread_refcount++;
+      __glXSetCurrentContext(gc);
    } else {
       __glXSetCurrentContextNull();
    }
@@ -281,11 +293,6 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
 
    __glXUnlock();
 
-   if (ret) {
-      __glXGenerateError(dpy, None, ret, X_GLXMakeContextCurrent);
-      return GL_FALSE;
-   }
-
    return GL_TRUE;
 }