diff options
author | Jeremy Huddleston <[email protected]> | 2011-06-17 12:24:55 -0700 |
---|---|---|
committer | Jeremy Huddleston <[email protected]> | 2011-06-20 16:54:58 -0700 |
commit | 4fbdde889ce5875243c588e4c7c9f4b775d0d7a5 (patch) | |
tree | 2b681c3f7bc1c34afada19587f299ce1004cfc28 /src/glx | |
parent | 517614141be2a1f392a4ea87c1077911ccadf35f (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.c | 25 |
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; } |