From 50e9a8f7c2f8f4ac059b0902ccba0170197db3b1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timur=20Krist=C3=B3f?= Date: Thu, 30 Mar 2023 20:08:35 +0200 Subject: [PATCH] radv: Use linear_dispatch info in GFX11 task/mesh draw packet. This helps the CP (command processor) optimize mesh shader dispatch when Y = Z = 1. Reviewed-by: Rhys Perry Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 5 ++++- src/amd/vulkan/radv_shader.h | 1 + src/amd/vulkan/radv_shader_info.c | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index ad71cd6..a511e4f 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -8167,11 +8167,14 @@ radv_cs_emit_dispatch_taskmesh_gfx_packet(struct radv_cmd_buffer *cmd_buffer) uint32_t ring_entry_reg = ((base_reg + ring_entry_loc->sgpr_idx * 4) - SI_SH_REG_OFFSET) >> 2; uint32_t xyz_dim_en = 1; /* TODO: disable XYZ_DIM when unneeded */ uint32_t mode1_en = 1; /* legacy fast launch mode */ + uint32_t linear_dispatch_en = + cmd_buffer->state.shaders[MESA_SHADER_TASK]->info.cs.linear_taskmesh_dispatch; radeon_emit(cs, PKT3(PKT3_DISPATCH_TASKMESH_GFX, 2, predicating)); radeon_emit(cs, S_4D0_RING_ENTRY_REG(ring_entry_reg) | S_4D0_XYZ_DIM_REG(xyz_dim_reg)); if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11) - radeon_emit(cs, S_4D1_XYZ_DIM_ENABLE(xyz_dim_en) | S_4D1_MODE1_ENABLE(mode1_en)); + radeon_emit(cs, S_4D1_XYZ_DIM_ENABLE(xyz_dim_en) | S_4D1_MODE1_ENABLE(mode1_en) | + S_4D1_LINEAR_DISPATCH_ENABLE(linear_dispatch_en)); else radeon_emit(cs, 0); radeon_emit(cs, V_0287F0_DI_SRC_SEL_AUTO_INDEX); diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 5355f5b..1f85673 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -373,6 +373,7 @@ struct radv_shader_info { bool uses_dynamic_rt_callable_stack; bool uses_rt; bool uses_full_subgroups; + bool linear_taskmesh_dispatch; bool regalloc_hang_bug; } cs; diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index 2db7b6d..3d5085c 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -721,6 +721,12 @@ gather_shader_info_task(const nir_shader *nir, struct radv_shader_info *info) /* Needed for storing draw ready only on the 1st thread. */ info->cs.uses_local_invocation_idx = true; + + /* Task->Mesh dispatch is linear when Y = Z = 1. + * GFX11 CP can optimize this case with a field in its draw packets. + */ + info->cs.linear_taskmesh_dispatch = nir->info.mesh.ts_mesh_dispatch_dimensions[1] == 1 && + nir->info.mesh.ts_mesh_dispatch_dimensions[2] == 1; } static uint32_t -- 2.7.4