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:
parent
8cce7f5d64
commit
d1f142891e
|
@ -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,
|
||||
};
|
||||
|
||||
|
|
|
@ -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,6 +946,10 @@ glamor_composite_choose_shader(CARD8 op,
|
|||
glamor_priv->formats[8].format == GL_RED) {
|
||||
key.dest_swizzle = SHADER_DEST_SWIZZLE_ALPHA_TO_RED;
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue