egl: Fixes transparency with EGL and X11.
authorHal Gentz <zegentzy@protonmail.com>
Fri, 11 Oct 2019 00:35:50 +0000 (18:35 -0600)
committerAdam Jackson <ajax@nwnk.net>
Fri, 11 Oct 2019 21:57:21 +0000 (21:57 +0000)
This commit does this by allowing both RGB and RGBA visuals to match with
EGL configs. We also expose the `EGL_MESA_config_select_group` egl
extension, which is similar to GLX's visual select group extension, to
allow the RGBA visuals to get less priority.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67676
Fixes: 049f343e8ac "egl: Allow 24-bit visuals for 32-bit RGBA8888 configs"
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Hal Gentz <zegentzy@protonmail.com>
include/GL/internal/dri_interface.h
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/dri2/platform_x11.c
src/egl/main/eglconfig.c
src/egl/main/eglconfig.h
src/egl/main/eglglobals.c
src/mesa/drivers/dri/common/utils.c
src/mesa/main/mtypes.h

index f19ec5168a52a1726b0aa2729c9233f5097b98c8..718b7dde87c7133be2f9b8c99edbada5686bd836 100644 (file)
@@ -813,7 +813,8 @@ struct __DRIuseInvalidateExtensionRec {
 #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    
index 23d0e469427db25301ea3f0d45be00ede0de14b0..63864346594bd6ead832d92ffe970d97b006a6a2 100644 (file)
@@ -187,6 +187,7 @@ static const EGLint dri2_to_egl_attribute_map[__DRI_ATTRIB_MAX] = {
    [__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 *
@@ -202,6 +203,9 @@ dri2_get_dri_config(struct dri2_egl_config *conf, EGLint surface_type,
 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;
 
index 5a1e2f31890aaa24c606671516da47051a7d37c5..414d5f74c5db0759ca77872699714d982565d5b1 100644 (file)
@@ -816,28 +816,25 @@ dri2_x11_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy,
                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);
index 0a95e8ee05da9edc0989d8852a5f353b0dd7c74f..b3362363664916f8dd3ba35469f87e106fbe9141 100644 (file)
@@ -258,6 +258,9 @@ static const struct {
    { 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 },
 };
 
 
@@ -296,6 +299,8 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching)
             if (val > 1 || val < 0)
                valid = EGL_FALSE;
             break;
+         case EGL_CONFIG_SELECT_GROUP_MESA:
+            break;
          default:
             if (val < 0)
                valid = EGL_FALSE;
@@ -608,6 +613,10 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
    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);
index 605289de53650acf9d9e4053d2bea897ff97eca9..064187ff1dd063d6ce4b9f9b831b4aa800b21460 100644 (file)
@@ -89,6 +89,7 @@ struct _egl_config
    EGLint FramebufferTargetAndroid;
    EGLint RecordableAndroid;
    EGLint ComponentType;
+   EGLint ConfigSelectGroup;
 };
 
 
@@ -139,6 +140,7 @@ _eglOffsetOfConfig(EGLint attr)
    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;
index 0d7270333ec0bbb8600ffe9a00efb439916c6763..71d1fccf75fb879f960696990563298b69985b0c 100644 (file)
@@ -70,7 +70,8 @@ struct _egl_global _eglGlobal =
    " 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
index 0fdca2d9d84dc9b49c92328ef7f0b7541bfd7ac6..2d57aef18f2734fd382f0d6aa168e0708595bcb2 100644 (file)
@@ -379,6 +379,7 @@ driCreateConfigs(mesa_format format,
                    modes->yInverted = GL_TRUE;
                    modes->sRGBCapable = is_srgb;
                    modes->mutableRenderBuffer = mutable_render_buffer;
+                   modes->configSelectGroup = 0;
                }
            }
        }
@@ -468,6 +469,7 @@ static const struct { unsigned int attrib, offset; } attribMap[] = {
     __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
index ae93dff40dac496798b2bef85394ceafca066604..2397ca6b74f8e4e0f7b98bcccfaf23d103f6fcbc 100644 (file)
@@ -211,6 +211,9 @@ struct gl_config
 
    /* EGL_KHR_mutable_render_buffer */
    GLuint mutableRenderBuffer; /* bool */
+
+   /* EGL_MESA_config_select_group */
+   GLint configSelectGroup;
 };