diff options
author | Eric Anholt <eric@anholt.net> | 2009-02-02 10:13:46 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-02-02 11:07:09 -0800 |
commit | 5100d829a4d71ce4a9fbc2b81694a1fb90066ccf (patch) | |
tree | ee405cdabb3c53b970d0e5fcde4ae6ab8953bde3 | |
parent | 4475ae036c3d5a06a6ce88a359ce2a9a8ae9b4f1 (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.c | 16 |
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 | ||
396 | static __GLXconfig * | 396 | static __GLXconfig * |
397 | pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class) | 397 | pickFBConfig(__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; |