hw/xwin/glx: Handle failure to get any fbconfigs more gracefully.

Handle failure to get any useful pixel formats for GLX fbconfigs
more gracefully:  If we didn't get any useful pixel formats from
wglGetPixelFormatAttribivARB(), fall back to using DescribePixelFormat().
If that doesn't give us any useful pixel formats, fallback to software
rendering.

This works around a problem with Intel 845G drivers, where
wglGetPixelFormatAttribivARB() doesn't seem to work as we expect it to...

Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
This commit is contained in:
Jon TURNEY 2011-01-24 18:41:05 +00:00
parent 9915b16923
commit b67e80c84e

View File

@ -668,17 +668,37 @@ glxWinScreenProbe(ScreenPtr pScreen)
screen->base.swapInterval = glxWinScreenSwapInterval;
screen->base.pScreen = pScreen;
// Creating the fbConfigs initializes screen->base.fbconfigs and screen->base.numFBConfigs
if (strstr(wgl_extensions, "WGL_ARB_pixel_format"))
{
glxWinCreateConfigsExt(hdc, screen);
screen->has_WGL_ARB_pixel_format = TRUE;
/*
Some graphics drivers appear to advertise WGL_ARB_pixel_format,
but it doesn't work usefully, so we have to be prepared for it
to fail and fall back to using DescribePixelFormat()
*/
if (screen->base.numFBConfigs > 0)
{
screen->has_WGL_ARB_pixel_format = TRUE;
}
}
else
if (screen->base.numFBConfigs <= 0)
{
glxWinCreateConfigs(hdc, screen);
screen->has_WGL_ARB_pixel_format = FALSE;
}
// Initializes screen->base.fbconfigs and screen->base.numFBConfigs
/*
If we still didn't get any fbConfigs, we can't provide GLX for this screen
*/
if (screen->base.numFBConfigs <= 0)
{
free(screen);
LogMessage(X_ERROR,"AIGLX: No fbConfigs could be made from native OpenGL pixel formats\n");
return NULL;
}
/* These will be set by __glXScreenInit */
screen->base.visuals = NULL;