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
This commit is contained in:
Michel Dänzer 2023-09-12 16:57:16 +02:00 committed by Michel Dänzer
parent 8cce7f5d64
commit d1f142891e
2 changed files with 14 additions and 1 deletions

View File

@ -111,6 +111,7 @@ enum shader_mask {
enum shader_dest_swizzle { enum shader_dest_swizzle {
SHADER_DEST_SWIZZLE_DEFAULT, SHADER_DEST_SWIZZLE_DEFAULT,
SHADER_DEST_SWIZZLE_ALPHA_TO_RED, SHADER_DEST_SWIZZLE_ALPHA_TO_RED,
SHADER_DEST_SWIZZLE_IGNORE_ALPHA,
SHADER_DEST_SWIZZLE_COUNT, SHADER_DEST_SWIZZLE_COUNT,
}; };

View File

@ -197,6 +197,11 @@ glamor_create_composite_fs(glamor_screen_private *glamor_priv, struct shader_key
" float undef;\n" " float undef;\n"
" return vec4(color.a, undef, undef, undef);" " 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 = const char *in_normal =
"void main()\n" "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: case SHADER_DEST_SWIZZLE_ALPHA_TO_RED:
dest_swizzle = dest_swizzle_alpha_to_red; dest_swizzle = dest_swizzle_alpha_to_red;
break; break;
case SHADER_DEST_SWIZZLE_IGNORE_ALPHA:
dest_swizzle = dest_swizzle_ignore_alpha;
break;
default: default:
FatalError("Bad composite shader dest swizzle"); FatalError("Bad composite shader dest swizzle");
} }
@ -938,6 +946,10 @@ glamor_composite_choose_shader(CARD8 op,
glamor_priv->formats[8].format == GL_RED) { glamor_priv->formats[8].format == GL_RED) {
key.dest_swizzle = SHADER_DEST_SWIZZLE_ALPHA_TO_RED; key.dest_swizzle = SHADER_DEST_SWIZZLE_ALPHA_TO_RED;
} else { } else {
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; key.dest_swizzle = SHADER_DEST_SWIZZLE_DEFAULT;
} }