From f3728a16c9c6a02fc1f44b8069b0060e2358f22e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 2 Jun 2015 13:40:37 +0100 Subject: [PATCH] Match swrast modes more loosely. https://bugs.freedesktop.org/show_bug.cgi?id=90817 Reviewed-by: Jose Fonseca --- src/glx/dri_common.c | 59 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c index 63c8de38c7c..1a62ee29e7b 100644 --- a/src/glx/dri_common.c +++ b/src/glx/dri_common.c @@ -265,6 +265,36 @@ scalarEqual(struct glx_config *mode, unsigned int attrib, unsigned int value) return GL_TRUE; /* Is a non-existing attribute equal to value? */ } +static int +scalarGreaterEqual(struct glx_config *mode, unsigned int attrib, unsigned int value) +{ + unsigned int glxValue; + int i; + + for (i = 0; i < ARRAY_SIZE(attribMap); i++) + if (attribMap[i].attrib == attrib) { + glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset); + return glxValue == GLX_DONT_CARE || glxValue >= value; + } + + return GL_TRUE; /* Is a non-existing attribute greater than or equal to value? */ +} + +static int +booleanSupported(struct glx_config *mode, unsigned int attrib, unsigned int value) +{ + unsigned int glxValue; + int i; + + for (i = 0; i < ARRAY_SIZE(attribMap); i++) + if (attribMap[i].attrib == attrib) { + glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset); + return glxValue == GLX_DONT_CARE || glxValue; + } + + return GL_TRUE; /* Is a non-existing attribute supported? */ +} + static int driConfigEqual(const __DRIcoreExtension *core, struct glx_config *config, const __DRIconfig *driConfig) @@ -313,10 +343,37 @@ driConfigEqual(const __DRIcoreExtension *core, if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT) glxValue |= GLX_TEXTURE_RECTANGLE_BIT_EXT; if (config->bindToTextureTargets != GLX_DONT_CARE && - glxValue != config->bindToTextureTargets) + glxValue != (config->bindToTextureTargets & glxValue)) + return GL_FALSE; + break; + + case __DRI_ATTRIB_STENCIL_SIZE: + case __DRI_ATTRIB_ACCUM_RED_SIZE: + case __DRI_ATTRIB_ACCUM_GREEN_SIZE: + case __DRI_ATTRIB_ACCUM_BLUE_SIZE: + case __DRI_ATTRIB_ACCUM_ALPHA_SIZE: + if (value != 0 && !scalarEqual(config, attrib, value)) return GL_FALSE; break; + case __DRI_ATTRIB_DOUBLE_BUFFER: + case __DRI_ATTRIB_BIND_TO_TEXTURE_RGB: + case __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA: + case __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE: + case __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE: + if (value && !booleanSupported(config, attrib, value)) + return GL_FALSE; + break; + + case __DRI_ATTRIB_SAMPLE_BUFFERS: + case __DRI_ATTRIB_SAMPLES: + case __DRI_ATTRIB_AUX_BUFFERS: + case __DRI_ATTRIB_MAX_PBUFFER_WIDTH: + case __DRI_ATTRIB_MAX_PBUFFER_HEIGHT: + case __DRI_ATTRIB_MAX_PBUFFER_PIXELS: + if (!scalarGreaterEqual(config, attrib, value)) + return GL_FALSE; + default: if (!scalarEqual(config, attrib, value)) return GL_FALSE; -- 2.30.2