summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-02-02 10:13:46 -0800
committerKeith Packard <keithp@keithp.com>2009-02-17 19:00:30 -0800
commit8b967b24690cb072fc37c463eceb2b886cef80c4 (patch)
tree6cf25129ea0773a5ee577505b5e8c5c9ad42f90f
parent7fdaca64463951ab9199dc12910379c90dba3fac (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. (cherry picked from commit 5100d829a4d71ce4a9fbc2b81694a1fb90066ccf) Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--glx/glxscreens.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 0c76cfdab..33a8d5856 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -394,14 +394,20 @@ typedef struct {
} FBConfigTemplateRec, *FBConfigTemplatePtr;
static __GLXconfig *
-pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class)
+pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template,
+ VisualPtr visual)
{
__GLXconfig *config;
for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) {
+ if (config->redMask != visual->redMask ||
+ config->greenMask != visual->greenMask ||
+ config->blueMask != visual->blueMask ||
+ config->rgbBits != visual->nplanes)
+ continue;
if (config->visualRating != GLX_NONE)
continue;
- if (glxConvertToXVisualType(config->visualType) != class)
+ if (glxConvertToXVisualType(config->visualType) != visual->class)
continue;
if ((config->doubleBufferMode > 0) != template->doubleBuffer)
continue;
@@ -436,11 +442,11 @@ addMinimalSet(__GLXscreen *pGlxScreen)
visuals = pGlxScreen->pScreen->visuals;
for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) {
if (visuals[i].nplanes == 32)
- config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class);
+ config = pickFBConfig(pGlxScreen, &minimal, &visuals[i]);
else {
- config = pickFBConfig(pGlxScreen, &best, visuals[i].class);
+ config = pickFBConfig(pGlxScreen, &best, &visuals[i]);
if (config == NULL)
- config = pickFBConfig(pGlxScreen, &good, visuals[i].class);
+ config = pickFBConfig(pGlxScreen, &good, &visuals[i]);
}
if (config == NULL)
config = pGlxScreen->fbconfigs;