xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Sep 18 09:24:12 UTC 2023


 glamor/glamor_priv.h   |    1 +
 glamor/glamor_render.c |   14 +++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

New commits:
commit d1f142891ef346e90c36a7393009ffaac2aa8b38
Author: Michel Dänzer <mdaenzer at redhat.com>
Date:   Tue Sep 12 16:57:16 2023 +0200

    glamor: Ignore destination alpha as necessary for composite operation
    
    If the destination drawable is a window with effective depth 24 backed
    by a depth 32 pixmap.
    
    Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1575

diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 898380d82..71aaeb8c2 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -111,6 +111,7 @@ enum shader_mask {
 enum shader_dest_swizzle {
     SHADER_DEST_SWIZZLE_DEFAULT,
     SHADER_DEST_SWIZZLE_ALPHA_TO_RED,
+    SHADER_DEST_SWIZZLE_IGNORE_ALPHA,
     SHADER_DEST_SWIZZLE_COUNT,
 };
 
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index ed1222621..0d233f27b 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -197,6 +197,11 @@ glamor_create_composite_fs(glamor_screen_private *glamor_priv, struct shader_key
         "	float undef;\n"
         "	return vec4(color.a, undef, undef, undef);"
         "}";
+    const char *dest_swizzle_ignore_alpha =
+        "vec4 dest_swizzle(vec4 color)\n"
+        "{"
+        "	return vec4(color.xyz, 1.0);"
+        "}";
 
     const char *in_normal =
         "void main()\n"
@@ -286,6 +291,9 @@ glamor_create_composite_fs(glamor_screen_private *glamor_priv, struct shader_key
     case SHADER_DEST_SWIZZLE_ALPHA_TO_RED:
         dest_swizzle = dest_swizzle_alpha_to_red;
         break;
+    case SHADER_DEST_SWIZZLE_IGNORE_ALPHA:
+        dest_swizzle = dest_swizzle_ignore_alpha;
+        break;
     default:
         FatalError("Bad composite shader dest swizzle");
     }
@@ -938,7 +946,11 @@ glamor_composite_choose_shader(CARD8 op,
         glamor_priv->formats[8].format == GL_RED) {
         key.dest_swizzle = SHADER_DEST_SWIZZLE_ALPHA_TO_RED;
     } else {
-        key.dest_swizzle = SHADER_DEST_SWIZZLE_DEFAULT;
+        if (dest_pixmap->drawable.depth == 32 &&
+            glamor_drawable_effective_depth(dest->pDrawable) == 24)
+            key.dest_swizzle = SHADER_DEST_SWIZZLE_IGNORE_ALPHA;
+        else
+            key.dest_swizzle = SHADER_DEST_SWIZZLE_DEFAULT;
     }
 
     if (source && source->alphaMap) {


More information about the xorg-commit mailing list