Module: Mesa Branch: main Commit: ab6cf1592fc5c83a45709e68bceee9eb0e7d7870 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ab6cf1592fc5c83a45709e68bceee9eb0e7d7870
Author: Samuel Pitoiset <samuel.pitoi...@gmail.com> Date: Thu Nov 30 11:06:55 2023 +0100 radv: fix bogus interaction between DGC and RT with descriptor bindings pipeline_is_dirty was never TRUE because it's emitted in the before helper. This might fix bad interactions between DGC and RT because they both use compute shaders and descriptor bindings need to be re-emitted. Found by inspection. Cc: mesa-stable Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26417> --- src/amd/vulkan/radv_cmd_buffer.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 610c9db083f..eedef604d1e 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -9779,6 +9779,7 @@ radv_dgc_before_dispatch(struct radv_cmd_buffer *cmd_buffer) { struct radv_compute_pipeline *pipeline = cmd_buffer->state.compute_pipeline; struct radv_shader *compute_shader = cmd_buffer->state.shaders[MESA_SHADER_COMPUTE]; + bool pipeline_is_dirty = pipeline != cmd_buffer->state.emitted_compute_pipeline; /* We will have run the DGC patch shaders before, so we can assume that there is something to * flush. Otherwise, we just split radv_dispatch in two. One pre-dispatch and another one @@ -9791,6 +9792,17 @@ radv_dgc_before_dispatch(struct radv_cmd_buffer *cmd_buffer) si_emit_cache_flush(cmd_buffer); radv_upload_compute_shader_descriptors(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE); + + if (pipeline_is_dirty) { + /* Raytracing uses compute shaders but has separate bind points and pipelines. + * So if we set compute userdata & shader registers we should dirty the raytracing + * ones and the other way around. + * + * We only need to do this when the pipeline is dirty because when we switch between + * the two we always need to switch pipelines. + */ + radv_mark_descriptor_sets_dirty(cmd_buffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); + } } static void @@ -9805,17 +9817,6 @@ radv_dgc_after_dispatch(struct radv_cmd_buffer *cmd_buffer) radv_emit_shader_prefetch(cmd_buffer, compute_shader); } - if (pipeline_is_dirty) { - /* Raytracing uses compute shaders but has separate bind points and pipelines. - * So if we set compute userdata & shader registers we should dirty the raytracing - * ones and the other way around. - * - * We only need to do this when the pipeline is dirty because when we switch between - * the two we always need to switch pipelines. - */ - radv_mark_descriptor_sets_dirty(cmd_buffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); - } - if (compute_shader->info.cs.regalloc_hang_bug) cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH;