#define __DRI_ATTRIB_GREEN_SHIFT               51
 #define __DRI_ATTRIB_BLUE_SHIFT                        52
 #define __DRI_ATTRIB_ALPHA_SHIFT               53
-#define __DRI_ATTRIB_MAX                       54
+#define __DRI_ATTRIB_CONFIG_SELECT_GROUP       54
+#define __DRI_ATTRIB_MAX                       55
 
 /* __DRI_ATTRIB_RENDER_TYPE */
 #define __DRI_ATTRIB_RGBA_BIT                  0x01    
 
    [__DRI_ATTRIB_MAX_SWAP_INTERVAL]     = EGL_MAX_SWAP_INTERVAL,
    [__DRI_ATTRIB_MIN_SWAP_INTERVAL]     = EGL_MIN_SWAP_INTERVAL,
    [__DRI_ATTRIB_YINVERTED]             = EGL_Y_INVERTED_NOK,
+   [__DRI_ATTRIB_CONFIG_SELECT_GROUP]   = EGL_CONFIG_SELECT_GROUP_MESA,
 };
 
 const __DRIconfig *
 static EGLBoolean
 dri2_match_config(const _EGLConfig *conf, const _EGLConfig *criteria)
 {
+   if (conf->NativeVisualID != criteria->NativeVisualID)
+      return EGL_FALSE;
+
    if (_eglCompareConfigs(conf, criteria, NULL, EGL_FALSE) != 0)
       return EGL_FALSE;
 
 
                if (dri2_conf->base.ConfigID == config_count + 1)
                   config_count++;
 
-            /* Allow a 24-bit RGB visual to match a 32-bit RGBA EGLConfig.
-             * Ditto for 30-bit RGB visuals to match a 32-bit RGBA EGLConfig.
+            /* Allows RGB visuals to match a 32-bit RGBA EGLConfig.
              * Otherwise it will only match a 32-bit RGBA visual.  On a
              * composited window manager on X11, this will make all of the
              * EGLConfigs with destination alpha get blended by the
              * compositor.  This is probably not what the application
              * wants... especially on drivers that only have 32-bit RGBA
              * EGLConfigs! */
-            if (d.data->depth == 24 || d.data->depth == 30) {
-               unsigned int rgba_mask = ~(visuals[i].red_mask |
-                                          visuals[i].green_mask |
-                                          visuals[i].blue_mask);
-               rgba_shifts[3] = ffs(rgba_mask) - 1;
-               rgba_sizes[3] = util_bitcount(rgba_mask);
-               dri2_conf = dri2_add_config(disp, config, config_count + 1,
-                                           surface_type, config_attrs,
-                                           rgba_shifts, rgba_sizes);
-               if (dri2_conf)
-                  if (dri2_conf->base.ConfigID == config_count + 1)
-                     config_count++;
-            }
-        }
+            unsigned int rgba_mask = ~(visuals[i].red_mask |
+                                       visuals[i].green_mask |
+                                       visuals[i].blue_mask);
+            rgba_shifts[3] = ffs(rgba_mask) - 1;
+            rgba_sizes[3] = util_bitcount(rgba_mask);
+            dri2_conf = dri2_add_config(disp, config, config_count + 1,
+                                        surface_type, config_attrs,
+                                        rgba_shifts, rgba_sizes);
+            if (dri2_conf)
+               if (dri2_conf->base.ConfigID == config_count + 1)
+                  config_count++;
+         }
       }
 
       xcb_depth_next(&d);
 
    { EGL_COLOR_COMPONENT_TYPE_EXT,  ATTRIB_TYPE_ENUM,
                                     ATTRIB_CRITERION_EXACT,
                                     EGL_COLOR_COMPONENT_TYPE_FIXED_EXT },
+   { EGL_CONFIG_SELECT_GROUP_MESA,  ATTRIB_TYPE_INTEGER,
+                                    ATTRIB_CRITERION_IGNORE,
+                                    0 },
 };
 
 
             if (val > 1 || val < 0)
                valid = EGL_FALSE;
             break;
+         case EGL_CONFIG_SELECT_GROUP_MESA:
+            break;
          default:
             if (val < 0)
                valid = EGL_FALSE;
    if (conf1 == conf2)
       return 0;
 
+   val1 = conf1->ConfigSelectGroup - conf2->ConfigSelectGroup;
+   if (val1)
+      return val1;
+
    /* the enum values have the desired ordering */
    STATIC_ASSERT(EGL_NONE < EGL_SLOW_CONFIG);
    STATIC_ASSERT(EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG);
 
    EGLint FramebufferTargetAndroid;
    EGLint RecordableAndroid;
    EGLint ComponentType;
+   EGLint ConfigSelectGroup;
 };
 
 
    ATTRIB_MAP(EGL_FRAMEBUFFER_TARGET_ANDROID, FramebufferTargetAndroid);
    ATTRIB_MAP(EGL_RECORDABLE_ANDROID,        RecordableAndroid);
    ATTRIB_MAP(EGL_COLOR_COMPONENT_TYPE_EXT,  ComponentType);
+   ATTRIB_MAP(EGL_CONFIG_SELECT_GROUP_MESA,  ConfigSelectGroup);
 #undef ATTRIB_MAP
    default:
       return -1;
 
    " EGL_EXT_device_query"
    " EGL_EXT_platform_base"
    " EGL_KHR_client_get_all_proc_addresses"
-   " EGL_KHR_debug",
+   " EGL_KHR_debug"
+   " EGL_MESA_config_select_group",
 
    .PlatformExtensionString =
 #ifdef HAVE_WAYLAND_PLATFORM
 
                    modes->yInverted = GL_TRUE;
                    modes->sRGBCapable = is_srgb;
                    modes->mutableRenderBuffer = mutable_render_buffer;
+                   modes->configSelectGroup = 0;
                }
            }
        }
     __ATTRIB(__DRI_ATTRIB_YINVERTED,                   yInverted),
     __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE,    sRGBCapable),
     __ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER,       mutableRenderBuffer),
+    __ATTRIB(__DRI_ATTRIB_CONFIG_SELECT_GROUP, configSelectGroup),
 
     /* The struct field doesn't matter here, these are handled by the
      * switch in driGetConfigAttribIndex.  We need them in the array
 
 
    /* EGL_KHR_mutable_render_buffer */
    GLuint mutableRenderBuffer; /* bool */
+
+   /* EGL_MESA_config_select_group */
+   GLint configSelectGroup;
 };