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