summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hughes <tom@compton.nu>2015-06-02 13:40:37 +0100
committerJose Fonseca <jfonseca@vmware.com>2015-07-23 15:57:53 +0100
commitf3728a16c9c6a02fc1f44b8069b0060e2358f22e (patch)
tree9d5e24a4d820e8e10d734289b77c4f3cd5bf49c9
parentb469cf10efd4734038dcab294f23ca38e9fc7a97 (diff)
Match swrast modes more loosely.
https://bugs.freedesktop.org/show_bug.cgi?id=90817 Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
-rw-r--r--src/glx/dri_common.c59
1 files changed, 58 insertions, 1 deletions
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
@@ -266,6 +266,36 @@ scalarEqual(struct glx_config *mode, unsigned int attrib, unsigned int 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;