radv: Reserve space for indirect descriptor set address writes.

Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20152>
(cherry picked from commit 17a7c55ea7)
This commit is contained in:
Bas Nieuwenhuizen 2023-04-24 02:32:17 +02:00 committed by Eric Engestrom
parent ec208bcb48
commit cd65f4b40a
2 changed files with 9 additions and 2 deletions

View file

@ -31,7 +31,7 @@
"description": "radv: Reserve space for indirect descriptor set address writes.",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -4606,6 +4606,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))
@ -4618,11 +4621,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]
@ -4631,6 +4636,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