From 74181ffcc5ebed79916d3374455ccfa9e4efa05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Fri, 6 Aug 2021 11:07:54 +0200 Subject: [PATCH] radv: Write RSRC2_GS for NGGC when pipeline is dirty but not emitted. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The radv_emit_ngg_culling_state function won't write the SPI_SHADER_PGM_RSRC2_GS register when it knows in advance that radv_emit_graphics_pipeline will overwrite it anyway. However, there is an unhandled case: radv_emit_graphics_pipeline will not emit anything (including this register) when the pipeline is already emitted. Hence, improve the check in radv_emit_ngg_culling_state to consider this. Fixes: 9a95f5487f5ab83fa44bea12afa30cf1a25fc9db Signed-off-by: Timur Kristóf Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 31ee233c84e..1fda5e270f8 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -5853,8 +5853,11 @@ radv_emit_ngg_culling_state(struct radv_cmd_buffer *cmd_buffer, const struct rad rsrc2 = (rsrc2 & C_00B22C_LDS_SIZE) | S_00B22C_LDS_SIZE(v->info.num_lds_blocks_when_not_culling); } - /* When the pipeline is dirty, radv_emit_graphics_pipeline will write this register. */ - if (!(cmd_buffer->state.dirty & RADV_CMD_DIRTY_PIPELINE)) { + /* When the pipeline is dirty and not yet emitted, don't write it here + * because radv_emit_graphics_pipeline will overwrite this register. + */ + if (!(cmd_buffer->state.dirty & RADV_CMD_DIRTY_PIPELINE) || + cmd_buffer->state.emitted_pipeline == pipeline) { radeon_set_sh_reg(cmd_buffer->cs, R_00B22C_SPI_SHADER_PGM_RSRC2_GS, rsrc2); } }