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>
This commit is contained in:
Adam Jackson 2017-03-20 13:08:19 -04:00
parent e2e50c5097
commit f4b78286ea

View File

@ -560,19 +560,14 @@ DoMakeCurrent(__GLXclientState * cl,
__GLXdrawable *drawPriv = NULL; __GLXdrawable *drawPriv = NULL;
__GLXdrawable *readPriv = NULL; __GLXdrawable *readPriv = NULL;
int error; int error;
GLuint mask;
/* /* Drawables but no context makes no sense */
** If one is None and the other isn't, it's a bad match. if (!contextId && (drawId || readId))
*/ return BadMatch;
mask = (drawId == None) ? (1 << 0) : 0; /* If either drawable is null, the other must be too */
mask |= (readId == None) ? (1 << 1) : 0; if ((drawId == None) != (readId == None))
mask |= (contextId == None) ? (1 << 2) : 0;
if ((mask != 0x00) && (mask != 0x07)) {
return BadMatch; return BadMatch;
}
/* /*
** Lookup old context. If we have one, it must be in a usable state. ** Lookup old context. If we have one, it must be in a usable state.
@ -608,20 +603,20 @@ DoMakeCurrent(__GLXclientState * cl,
return BadAccess; return BadAccess;
} }
assert(drawId != None); if (drawId) {
assert(readId != None); drawPriv = __glXGetDrawable(glxc, drawId, client, &status);
if (drawPriv == NULL)
return status;
}
drawPriv = __glXGetDrawable(glxc, drawId, client, &status); if (readId) {
if (drawPriv == NULL) readPriv = __glXGetDrawable(glxc, readId, client, &status);
return status; if (readPriv == NULL)
return status;
readPriv = __glXGetDrawable(glxc, readId, client, &status); }
if (readPriv == NULL) } else {
return status;
}
else {
/* Switching to no context. Ignore new drawable. */ /* Switching to no context. Ignore new drawable. */
glxc = 0; glxc = 0;
drawPriv = 0; drawPriv = 0;
readPriv = 0; readPriv = 0;