diff options
author | Adam Jackson <ajax@redhat.com> | 2017-03-20 13:08:19 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2017-03-24 11:49:14 -0400 |
commit | f4b78286ea8d4c94a913a02a3579cbe55e8f1f6b (patch) | |
tree | cb8b9c440cc9f8856fce4688aa27980d81db13d5 | |
parent | e2e50c509718ea8c7f4684dc18f5ce66e526792b (diff) |
glx: Fix MakeCurrent with no drawables
GLX_ARB_create_context, which we aspire to support, allows making GL 3.0
or newer contexts current with null current drawables. Strictly this
might not be legal for pre-3.0 contexts, but there's no harm in allowing
it anyway.
Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r-- | glx/glxcmds.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 67f950967..af36cf154 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -560,19 +560,14 @@ DoMakeCurrent(__GLXclientState * cl, __GLXdrawable *drawPriv = NULL; __GLXdrawable *readPriv = NULL; int error; - GLuint mask; - /* - ** If one is None and the other isn't, it's a bad match. - */ - - mask = (drawId == None) ? (1 << 0) : 0; - mask |= (readId == None) ? (1 << 1) : 0; - mask |= (contextId == None) ? (1 << 2) : 0; + /* Drawables but no context makes no sense */ + if (!contextId && (drawId || readId)) + return BadMatch; - if ((mask != 0x00) && (mask != 0x07)) { + /* If either drawable is null, the other must be too */ + if ((drawId == None) != (readId == None)) return BadMatch; - } /* ** Lookup old context. If we have one, it must be in a usable state. @@ -608,20 +603,20 @@ DoMakeCurrent(__GLXclientState * cl, return BadAccess; } - assert(drawId != None); - assert(readId != None); - - drawPriv = __glXGetDrawable(glxc, drawId, client, &status); - if (drawPriv == NULL) - return status; - - readPriv = __glXGetDrawable(glxc, readId, client, &status); - if (readPriv == NULL) - return status; + if (drawId) { + drawPriv = __glXGetDrawable(glxc, drawId, client, &status); + if (drawPriv == NULL) + return status; + } - } - else { + if (readId) { + readPriv = __glXGetDrawable(glxc, readId, client, &status); + if (readPriv == NULL) + return status; + } + } else { /* Switching to no context. Ignore new drawable. */ + glxc = 0; drawPriv = 0; readPriv = 0; |