From c1418dcb3d6996029bdfb5a6e1e7f450183bc290 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 20 Feb 2024 17:53:52 +0100 Subject: [PATCH] radv: re-emit more states when a shader compiled separately is bound Shader configs are combined and they need to be re-emitted. Doesn't fix anything known but this was obviously incorrect. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 1faabe86fc3..552488e0c20 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -6476,6 +6476,14 @@ radv_bind_vertex_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv_sh { radv_bind_pre_rast_shader(cmd_buffer, vs); + /* Re-emit states that need to be updated when the vertex shader is compiled separately + * because shader configs are combined. + */ + if (vs->info.merged_shader_compiled_separately && vs->info.next_stage == MESA_SHADER_TESS_CTRL) { + cmd_buffer->state.emitted_tcs_epilog = NULL; + cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_PATCH_CONTROL_POINTS; + } + /* Can't put anything else here due to merged shaders */ } @@ -6494,6 +6502,12 @@ radv_bind_tess_ctrl_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv /* Re-emit the TCS epilog when a new tessellation control shader is bound. */ if (tcs->info.has_epilog) cmd_buffer->state.emitted_tcs_epilog = NULL; + + /* Re-emit the VS prolog when the tessellation control shader is compiled separately because + * shader configs are combined and need to be updated. + */ + if (tcs->info.merged_shader_compiled_separately) + cmd_buffer->state.emitted_vs_prolog = NULL; } static void @@ -6511,6 +6525,12 @@ radv_bind_geometry_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv_ cmd_buffer->esgs_ring_size_needed = MAX2(cmd_buffer->esgs_ring_size_needed, gs->info.gs_ring_info.esgs_ring_size); cmd_buffer->gsvs_ring_size_needed = MAX2(cmd_buffer->gsvs_ring_size_needed, gs->info.gs_ring_info.gsvs_ring_size); + + /* Re-emit the VS prolog when the geometry shader is compiled separately because shader configs + * are combined and need to be updated. + */ + if (gs->info.merged_shader_compiled_separately) + cmd_buffer->state.emitted_vs_prolog = NULL; } static void