diff options
Diffstat (limited to 'GL/glx/glxscreens.c')
-rw-r--r-- | GL/glx/glxscreens.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/GL/glx/glxscreens.c b/GL/glx/glxscreens.c index 31514002b..d6002532d 100644 --- a/GL/glx/glxscreens.c +++ b/GL/glx/glxscreens.c @@ -396,38 +396,61 @@ initGlxVisual(VisualPtr visual, __GLcontextModes *config) visual->offsetBlue = findFirstSet(config->blueMask); } -static void -addMinimalSet(__GLXscreen *pGlxScreen) +typedef struct { + GLboolean doubleBuffer; + GLboolean depthBuffer; +} FBConfigTemplateRec, *FBConfigTemplatePtr; + +static __GLcontextModes * +pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class) { __GLcontextModes *config; - VisualPtr visuals; - int depth; for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) { if (config->visualRating != GLX_NONE) continue; - if (config->doubleBufferMode && config->depthBits > 0) - break; + if (_gl_convert_to_x_visual_type(config->visualType) != class) + continue; + if ((config->doubleBufferMode > 0) != template->doubleBuffer) + continue; + if ((config->depthBits > 0) != template->depthBuffer) + continue; + + return config; } - if (config == NULL) - config = pGlxScreen->fbconfigs; - pGlxScreen->visuals = xcalloc(1, sizeof (__GLcontextModes *)); + return NULL; +} + +static void +addMinimalSet(__GLXscreen *pGlxScreen) +{ + __GLcontextModes *config; + VisualPtr visuals; + int i; + FBConfigTemplateRec best = { GL_TRUE, GL_TRUE }; + FBConfigTemplateRec minimal = { GL_FALSE, GL_FALSE }; + + pGlxScreen->visuals = xcalloc(pGlxScreen->pScreen->numVisuals, + sizeof (__GLcontextModes *)); if (pGlxScreen->visuals == NULL) { ErrorF("Failed to allocate for minimal set of GLX visuals\n"); return; } - depth = config->redBits + config->greenBits + config->blueBits; - visuals = AddScreenVisuals(pGlxScreen->pScreen, 1, depth); - if (visuals == NULL) { - xfree(pGlxScreen->visuals); - return; + pGlxScreen->numVisuals = pGlxScreen->pScreen->numVisuals; + visuals = pGlxScreen->pScreen->visuals; + for (i = 0; i < pGlxScreen->numVisuals; i++) { + if (visuals[i].nplanes == 32) + config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class); + else + config = pickFBConfig(pGlxScreen, &best, visuals[i].class); + if (config == NULL) + config = pGlxScreen->fbconfigs; + pGlxScreen->visuals[i] = config; + config->visualID = visuals[i].vid; } - pGlxScreen->numVisuals = 1; - pGlxScreen->visuals[0] = config; - initGlxVisual(&visuals[0], config); } static void |