summaryrefslogtreecommitdiff
path: root/xserver/glx/glxdricommon.c
diff options
context:
space:
mode:
Diffstat (limited to 'xserver/glx/glxdricommon.c')
-rw-r--r--xserver/glx/glxdricommon.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/xserver/glx/glxdricommon.c b/xserver/glx/glxdricommon.c
index 2e00bab03..35a539629 100644
--- a/xserver/glx/glxdricommon.c
+++ b/xserver/glx/glxdricommon.c
@@ -115,6 +115,16 @@ render_type_is_pbuffer_only(unsigned renderType)
| __DRI_ATTRIB_FLOAT_BIT));
}
+static int
+server_has_depth(int depth)
+{
+ int i;
+ for (i = 0; i < screenInfo.numPixmapFormats; i++)
+ if (screenInfo.formats[i].depth == depth)
+ return 1;
+ return 0;
+}
+
static __GLXconfig *
createModeFromConfig(const __DRIcoreExtension * core,
const __DRIconfig * driConfig,
@@ -178,6 +188,16 @@ createModeFromConfig(const __DRIcoreExtension * core,
if (!render_type_is_pbuffer_only(renderType))
drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT;
+ /* Make sure we don't advertise things the server isn't configured for */
+ if ((drawableType & (GLX_PBUFFER_BIT | GLX_PIXMAP_BIT)) &&
+ !server_has_depth(config->config.rgbBits)) {
+ drawableType &= ~(GLX_PBUFFER_BIT | GLX_PIXMAP_BIT);
+ if (!drawableType) {
+ free(config);
+ return NULL;
+ }
+ }
+
config->config.next = NULL;
config->config.visualType = visualType;
config->config.renderType = renderType;