summaryrefslogtreecommitdiffstats
path: root/src/glx
diff options
context:
space:
mode:
authorJeremy Huddleston <[email protected]>2011-06-17 12:24:55 -0700
committerJeremy Huddleston <[email protected]>2011-06-20 16:54:58 -0700
commit4fbdde889ce5875243c588e4c7c9f4b775d0d7a5 (patch)
tree2b681c3f7bc1c34afada19587f299ce1004cfc28 /src/glx
parent517614141be2a1f392a4ea87c1077911ccadf35f (diff)
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 <[email protected]>
Diffstat (limited to 'src/glx')
-rw-r--r--src/glx/glxcurrent.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c
index 0f39ee50737..6f048ae571c 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;
}