From bba08fdb8faad9f65b3ea2133676b9f6263aef37 Mon Sep 17 00:00:00 2001 From: marha Date: Mon, 7 Mar 2011 08:25:39 +0000 Subject: Handle failure to get any fbconfigs more gracefully --- xorg-server/hw/xwin/glx/indirect.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'xorg-server/hw') diff --git a/xorg-server/hw/xwin/glx/indirect.c b/xorg-server/hw/xwin/glx/indirect.c index 9660dc151..4367d6990 100644 --- a/xorg-server/hw/xwin/glx/indirect.c +++ b/xorg-server/hw/xwin/glx/indirect.c @@ -717,17 +717,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; -- cgit v1.2.3