Mesa (master): glx: Bind to our context before __glXSetCurrentContext

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Mon Jun 20 23:56:05 UTC 2011


Module: Mesa
Branch: master
Commit: 4fbdde889ce5875243c588e4c7c9f4b775d0d7a5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4fbdde889ce5875243c588e4c7c9f4b775d0d7a5

Author: Jeremy Huddleston <jeremyhu at apple.com>
Date:   Fri Jun 17 12:24:55 2011 -0700

glx: Bind to our context before __glXSetCurrentContext

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 at apple.com>

---

 src/glx/glxcurrent.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c
index 0f39ee5..6f048ae 100644
--- a/src/glx/glxcurrent.c
+++ b/src/glx/glxcurrent.c
@@ -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;
 }
 




More information about the mesa-commit mailing list