summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-02-02 10:13:46 -0800
committerEric Anholt <eric@anholt.net>2009-02-02 11:07:09 -0800
commit5100d829a4d71ce4a9fbc2b81694a1fb90066ccf (patch)
treeee405cdabb3c53b970d0e5fcde4ae6ab8953bde3
parent4475ae036c3d5a06a6ce88a359ce2a9a8ae9b4f1 (diff)
glx: Don't match fbconfigs to visuals with mismatched channel masks.
This fixes at least one known bug, where the depth 32 visual would end up with a depth 24 fbconfig attached, angering compiz.
-rw-r--r--glx/glxscreens.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 988a59d65..2c8432e6e 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -394,14 +394,20 @@ typedef struct {
394} FBConfigTemplateRec, *FBConfigTemplatePtr; 394} FBConfigTemplateRec, *FBConfigTemplatePtr;
395 395
396static __GLXconfig * 396static __GLXconfig *
397pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class) 397pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template,
398 VisualPtr visual)
398{ 399{
399 __GLXconfig *config; 400 __GLXconfig *config;
400 401
401 for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) { 402 for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) {
403 if (config->redMask != visual->redMask ||
404 config->greenMask != visual->greenMask ||
405 config->blueMask != visual->blueMask ||
406 config->rgbBits != visual->nplanes)
407 continue;
402 if (config->visualRating != GLX_NONE) 408 if (config->visualRating != GLX_NONE)
403 continue; 409 continue;
404 if (glxConvertToXVisualType(config->visualType) != class) 410 if (glxConvertToXVisualType(config->visualType) != visual->class)
405 continue; 411 continue;
406 if ((config->doubleBufferMode > 0) != template->doubleBuffer) 412 if ((config->doubleBufferMode > 0) != template->doubleBuffer)
407 continue; 413 continue;
@@ -436,11 +442,11 @@ addMinimalSet(__GLXscreen *pGlxScreen)
436 visuals = pGlxScreen->pScreen->visuals; 442 visuals = pGlxScreen->pScreen->visuals;
437 for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) { 443 for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) {
438 if (visuals[i].nplanes == 32) 444 if (visuals[i].nplanes == 32)
439 config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class); 445 config = pickFBConfig(pGlxScreen, &minimal, &visuals[i]);
440 else { 446 else {
441 config = pickFBConfig(pGlxScreen, &best, visuals[i].class); 447 config = pickFBConfig(pGlxScreen, &best, &visuals[i]);
442 if (config == NULL) 448 if (config == NULL)
443 config = pickFBConfig(pGlxScreen, &good, visuals[i].class); 449 config = pickFBConfig(pGlxScreen, &good, &visuals[i]);
444 } 450 }
445 if (config == NULL) 451 if (config == NULL)
446 config = pGlxScreen->fbconfigs; 452 config = pGlxScreen->fbconfigs;