summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GL/glx/glxscreens.c57
-rw-r--r--hw/xfree86/common/xf86Config.c2
-rw-r--r--hw/xfree86/dri/xf86dri.c2
3 files changed, 41 insertions, 20 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
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 35b62a244..b8929c3dd 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1094,7 +1094,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
}
#ifdef GLXEXT
- xf86Info.glxVisuals = XF86_GlxVisualsAll;
+ xf86Info.glxVisuals = XF86_GlxVisualsTypical;
xf86Info.glxVisualsFrom = X_DEFAULT;
if ((s = xf86GetOptValString(FlagOptions, FLAG_GLX_VISUALS))) {
if (!xf86NameCmp(s, "minimal")) {
diff --git a/hw/xfree86/dri/xf86dri.c b/hw/xfree86/dri/xf86dri.c
index 130afdfa4..ea11b38ee 100644
--- a/hw/xfree86/dri/xf86dri.c
+++ b/hw/xfree86/dri/xf86dri.c
@@ -322,8 +322,6 @@ ProcXF86DRICreateContext(
{
xXF86DRICreateContextReply rep;
ScreenPtr pScreen;
- VisualPtr visual;
- int i;
REQUEST(xXF86DRICreateContextReq);
REQUEST_SIZE_MATCH(xXF86DRICreateContextReq);