Module: Mesa Branch: main Commit: 17a7c55ea7e0f458aa5e7f103f3801a016a16ba1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=17a7c55ea7e0f458aa5e7f103f3801a016a16ba1
Author: Bas Nieuwenhuizen <[email protected]> Date: Mon Apr 24 02:32:17 2023 +0200 radv: Reserve space for indirect descriptor set address writes. Cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20152> --- src/amd/vulkan/radv_cmd_buffer.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 0b6e98c4748..1a0c3ff2fb1 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -4607,6 +4607,9 @@ radv_flush_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer, uint64_t va = radv_buffer_get_va(cmd_buffer->upload.upload_bo); va += offset; + ASSERTED unsigned cdw_max = + radeon_check_space(device->ws, cs, MESA_VULKAN_SHADER_STAGES * 3); + if (bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) { for (unsigned s = MESA_SHADER_VERTEX; s <= MESA_SHADER_FRAGMENT; s++) if (radv_cmdbuf_has_stage(cmd_buffer, s)) @@ -4619,11 +4622,13 @@ radv_flush_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer, cmd_buffer->state.shaders[MESA_SHADER_MESH]->info.user_data_0, AC_UD_INDIRECT_DESCRIPTOR_SETS, va); - if (radv_cmdbuf_has_stage(cmd_buffer, MESA_SHADER_TASK)) + if (radv_cmdbuf_has_stage(cmd_buffer, MESA_SHADER_TASK)) { + radeon_check_space(device->ws, cmd_buffer->ace_internal.cs, 3); radv_emit_userdata_address(device, cmd_buffer->ace_internal.cs, cmd_buffer->state.shaders[MESA_SHADER_TASK], cmd_buffer->state.shaders[MESA_SHADER_TASK]->info.user_data_0, AC_UD_INDIRECT_DESCRIPTOR_SETS, va); + } } else { struct radv_shader *compute_shader = bind_point == VK_PIPELINE_BIND_POINT_COMPUTE ? cmd_buffer->state.shaders[MESA_SHADER_COMPUTE] @@ -4632,6 +4637,8 @@ radv_flush_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer, radv_emit_userdata_address(device, cs, compute_shader, compute_shader->info.user_data_0, AC_UD_INDIRECT_DESCRIPTOR_SETS, va); } + + assert(cmd_buffer->cs->cdw <= cdw_max); } ALWAYS_INLINE static void
