summaryrefslogtreecommitdiff
path: root/GL/glx/glxscreens.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2007-10-29 18:13:58 -0400
committerKristian Høgsberg <krh@redhat.com>2007-10-29 18:14:18 -0400
commit692654b4300e61a9481e6fa588bcb44a3c3ca150 (patch)
tree26f06fce2d0f271c6d9cb078138de612d13aa20c /GL/glx/glxscreens.c
parenta5546a99ac4da61aee0d49c55bcb38bbce9a96aa (diff)
Set up visuals for the existing X visuals.
This makes the root visual a GLX capable visual again and adds a GLX visual for the COMPOSITE ARGB visual cleanly (as opposed to the hack we had before).
Diffstat (limited to 'GL/glx/glxscreens.c')
-rw-r--r--GL/glx/glxscreens.c57
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