From 18013e3281e436c81093ae261f15891a05009fd2 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Mon, 8 Dec 2025 15:48:40 +0100 Subject: [PATCH] radv: consider dual src blend for when epilog needs alpha Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 11 +++++++++-- src/amd/vulkan/radv_pipeline_graphics.c | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 957fe325849..6a8a5c6bcc2 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -6287,9 +6287,16 @@ lookup_ps_epilog(struct radv_cmd_buffer *cmd_buffer) state.color_attachment_formats[i] = render->color_att[i].format; + const uint32_t blend_src1_alpha = + pdev->info.gfx_level >= GFX11 ? V_028780_BLEND_SRC1_ALPHA_GFX11 : V_028780_BLEND_SRC1_ALPHA_GFX6; + const uint32_t blend_inv_src1_alpha = + pdev->info.gfx_level >= GFX11 ? V_028780_BLEND_INV_SRC1_ALPHA_GFX11 : V_028780_BLEND_INV_SRC1_ALPHA_GFX6; + if (src_blend == V_028780_BLEND_SRC_ALPHA || src_blend == V_028780_BLEND_ONE_MINUS_SRC_ALPHA || - src_blend == V_028780_BLEND_SRC_ALPHA_SATURATE || dst_blend == V_028780_BLEND_SRC_ALPHA || - dst_blend == V_028780_BLEND_ONE_MINUS_SRC_ALPHA || dst_blend == V_028780_BLEND_SRC_ALPHA_SATURATE) + src_blend == V_028780_BLEND_SRC_ALPHA_SATURATE || src_blend == blend_src1_alpha || + src_blend == blend_inv_src1_alpha || dst_blend == V_028780_BLEND_SRC_ALPHA || + dst_blend == V_028780_BLEND_ONE_MINUS_SRC_ALPHA || dst_blend == V_028780_BLEND_SRC_ALPHA_SATURATE || + dst_blend == blend_src1_alpha || dst_blend == blend_inv_src1_alpha) state.need_src_alpha |= 1 << i; state.color_attachment_mappings[i] = d->vk.cal.color_map[i]; diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 98a892eb6fc..ace60c654d6 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -1941,7 +1941,9 @@ radv_pipeline_generate_ps_epilog_key(const struct radv_device *device, const str if (srcRGB == VK_BLEND_FACTOR_SRC_ALPHA || dstRGB == VK_BLEND_FACTOR_SRC_ALPHA || srcRGB == VK_BLEND_FACTOR_SRC_ALPHA_SATURATE || dstRGB == VK_BLEND_FACTOR_SRC_ALPHA_SATURATE || - srcRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA || dstRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA) + srcRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA || dstRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA || + srcRGB == VK_BLEND_FACTOR_SRC1_ALPHA || dstRGB == VK_BLEND_FACTOR_SRC1_ALPHA || + srcRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA || dstRGB == VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA) ps_epilog.need_src_alpha |= 1 << i; } }