From b148d47c3eea366087094be48253fe3aec0fc46b Mon Sep 17 00:00:00 2001 From: Sviatoslav Peleshko Date: Tue, 2 Sep 2025 05:34:37 +0300 Subject: [PATCH] anv: Always disable Color Blending for unused Render Targets Commit d2f7b6d5 changed the BLEND_STATE update process so that only the used render targets will be updated. This mostly works fine, but in cases when the Dual Source Blending was used previously, we still must turn it off to avoid the undefined behavior that leads to hangs. Fixes: d2f7b6d5 ("anv: implement VK_KHR_dynamic_rendering_local_read") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13675 Signed-off-by: Sviatoslav Peleshko Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/genX_gfx_state.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/intel/vulkan/genX_gfx_state.c b/src/intel/vulkan/genX_gfx_state.c index 15a9f2d4c3b..8e698a323a0 100644 --- a/src/intel/vulkan/genX_gfx_state.c +++ b/src/intel/vulkan/genX_gfx_state.c @@ -1708,8 +1708,19 @@ update_blend_state(struct anv_gfx_dynamic_state *hw_state, bool alpha_blend_zero = false; uint32_t rt_0 = MESA_VK_ATTACHMENT_UNUSED; for (uint32_t rt = 0; rt < MAX_RTS; rt++) { - if (gfx->color_output_mapping[rt] >= gfx->color_att_count) + if (gfx->color_output_mapping[rt] >= gfx->color_att_count) { + /* The Dual Source Blending documentation says: + * + * "If SRC1 is included in a src/dst blend factor and a DualSource RT + * Write message is not used, results are UNDEFINED." + * + * In practice, this results in hangs if we leave the Dual Source + * Blending enabled for the unused render targets. The easiest way to + * avoid it altogether is to completely disable the blending for them. + */ + SET(BLEND_STATE, blend.rts[rt].ColorBufferBlendEnable, false); continue; + } uint32_t att = gfx->color_output_mapping[rt]; if (att == 0)