From 1701837c161d553eac9594a032969e2f24fb5ff0 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 24 Oct 2024 16:43:05 +0200 Subject: [PATCH] radv: fix emitting NGG culling state for ESO It's possible to enable NGG culling with ESO if shaders are linked, or if the VS doesn't need a prolog or if TES is used. This wasn't supposed to be enabled but I think it worked just by luck because the user SGPR value was probably zero and NGGC was disabled at draw time. Found by inspection. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: (cherry picked from commit 62efebfd7019bb5762ec5a9905281eaee3464e0c) --- .pick_status.json | 2 +- src/amd/vulkan/radv_cmd_buffer.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 4321912471b..31000012b79 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -904,7 +904,7 @@ "description": "radv: fix emitting NGG culling state for ESO", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 7c08dc47648..f62e5c9d3d9 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -10751,7 +10751,7 @@ radv_emit_all_graphics_states(struct radv_cmd_buffer *cmd_buffer, const struct r (cmd_buffer->state.dirty_dynamic & (RADV_DYNAMIC_RASTERIZATION_SAMPLES | RADV_DYNAMIC_PRIMITIVE_TOPOLOGY))) radv_flush_occlusion_query_state(cmd_buffer); - if (((cmd_buffer->state.dirty & RADV_CMD_DIRTY_PIPELINE) || + if (((cmd_buffer->state.dirty & (RADV_CMD_DIRTY_PIPELINE | RADV_CMD_DIRTY_GRAPHICS_SHADERS)) || (cmd_buffer->state.dirty_dynamic & (RADV_DYNAMIC_CULL_MODE | RADV_DYNAMIC_FRONT_FACE | RADV_DYNAMIC_RASTERIZER_DISCARD_ENABLE | RADV_DYNAMIC_VIEWPORT | RADV_DYNAMIC_CONSERVATIVE_RAST_MODE | RADV_DYNAMIC_RASTERIZATION_SAMPLES | @@ -10873,6 +10873,8 @@ radv_bind_graphics_shaders(struct radv_cmd_buffer *cmd_buffer) cmd_buffer->state.last_vgt_shader = cmd_buffer->state.shaders[last_vgt_api_stage]; + cmd_buffer->state.has_nggc = cmd_buffer->state.last_vgt_shader->info.has_ngg_culling; + struct radv_shader *gs_copy_shader = cmd_buffer->state.shader_objs[MESA_SHADER_GEOMETRY] ? cmd_buffer->state.shader_objs[MESA_SHADER_GEOMETRY]->gs.copy_shader : NULL; @@ -13670,7 +13672,6 @@ radv_reset_pipeline_state(struct radv_cmd_buffer *cmd_buffer, VkPipelineBindPoin cmd_buffer->state.gs_copy_shader = NULL; cmd_buffer->state.last_vgt_shader = NULL; - cmd_buffer->state.has_nggc = false; cmd_buffer->state.emitted_vs_prolog = NULL; cmd_buffer->state.spi_shader_col_format = 0; cmd_buffer->state.cb_shader_mask = 0;