diff options
Diffstat (limited to 'xserver/glx/glxdricommon.c')
-rw-r--r-- | xserver/glx/glxdricommon.c | 20 |
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; |