glx: Prepare __glXGetDrawable for no-config contexts
Any proper (GLX 1.3) drawable will already have a bound config, but if we're doing the GLX 1.2 thing of making a Window current, we need to infer the config from the window's Visual. Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
5d667df6ea
commit
f0fffa926a
|
@ -474,6 +474,18 @@ StartUsingContext(__GLXclientState * cl, __GLXcontext * glxc)
|
||||||
glxc->currentClient = cl->client;
|
glxc->currentClient = cl->client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __GLXconfig *
|
||||||
|
inferConfigForWindow(__GLXscreen *pGlxScreen, WindowPtr pWin)
|
||||||
|
{
|
||||||
|
int i, vid = wVisual(pWin);
|
||||||
|
|
||||||
|
for (i = 0; i < pGlxScreen->numVisuals; i++)
|
||||||
|
if (pGlxScreen->visuals[i]->visualID == vid)
|
||||||
|
return pGlxScreen->visuals[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper function to handle the legacy (pre GLX 1.3) cases
|
* This is a helper function to handle the legacy (pre GLX 1.3) cases
|
||||||
* where passing an X window to glXMakeCurrent is valid. Given a
|
* where passing an X window to glXMakeCurrent is valid. Given a
|
||||||
|
@ -486,11 +498,15 @@ __glXGetDrawable(__GLXcontext * glxc, GLXDrawable drawId, ClientPtr client,
|
||||||
{
|
{
|
||||||
DrawablePtr pDraw;
|
DrawablePtr pDraw;
|
||||||
__GLXdrawable *pGlxDraw;
|
__GLXdrawable *pGlxDraw;
|
||||||
|
__GLXconfig *config;
|
||||||
|
__GLXscreen *pGlxScreen;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
|
if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
|
||||||
DixWriteAccess, &pGlxDraw, &rc)) {
|
DixWriteAccess, &pGlxDraw, &rc)) {
|
||||||
if (glxc != NULL && pGlxDraw->config != glxc->config) {
|
if (glxc != NULL &&
|
||||||
|
glxc->config != NULL &&
|
||||||
|
glxc->config != pGlxDraw->config) {
|
||||||
client->errorValue = drawId;
|
client->errorValue = drawId;
|
||||||
*error = BadMatch;
|
*error = BadMatch;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -518,19 +534,35 @@ __glXGetDrawable(__GLXcontext * glxc, GLXDrawable drawId, ClientPtr client,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDraw->pScreen != glxc->pGlxScreen->pScreen) {
|
pGlxScreen = glxc->pGlxScreen;
|
||||||
|
if (pDraw->pScreen != pGlxScreen->pScreen) {
|
||||||
client->errorValue = pDraw->pScreen->myNum;
|
client->errorValue = pDraw->pScreen->myNum;
|
||||||
*error = BadMatch;
|
*error = BadMatch;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
|
config = glxc->config;
|
||||||
|
if (!config)
|
||||||
|
config = inferConfigForWindow(pGlxScreen, (WindowPtr)pDraw);
|
||||||
|
if (!config) {
|
||||||
|
/*
|
||||||
|
* If we get here, we've tried to bind a no-config context to a
|
||||||
|
* window without a corresponding fbconfig, presumably because
|
||||||
|
* we don't support GL on it (PseudoColor perhaps). From GLX Section
|
||||||
|
* 3.3.7 "Rendering Contexts":
|
||||||
|
*
|
||||||
|
* "If draw or read are not compatible with ctx a BadMatch error
|
||||||
|
* is generated."
|
||||||
|
*/
|
||||||
|
*error = BadMatch;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validGlxFBConfigForWindow(client, config, pDraw, error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pGlxDraw = glxc->pGlxScreen->createDrawable(client, glxc->pGlxScreen,
|
pGlxDraw = pGlxScreen->createDrawable(client, pGlxScreen, pDraw, drawId,
|
||||||
pDraw, drawId,
|
GLX_DRAWABLE_WINDOW, drawId, config);
|
||||||
GLX_DRAWABLE_WINDOW,
|
|
||||||
drawId, glxc->config);
|
|
||||||
if (!pGlxDraw) {
|
if (!pGlxDraw) {
|
||||||
*error = BadAlloc;
|
*error = BadAlloc;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user