Module: Mesa Branch: main Commit: d2d6eca0817972a9d08f348f3a22354ce572c15b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d2d6eca0817972a9d08f348f3a22354ce572c15b
Author: Timur Kristóf <[email protected]> Date: Fri Jan 21 18:08:34 2022 +0100 radv: Refactor mesh shader draws and add num_workgroups. Several of the new draw packets need this argument including all of the taskmesh commands, so it's best to always declare it. Signed-off-by: Timur Kristóf <[email protected]> Reviewed-by: Rhys Perry <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15034> --- src/amd/vulkan/radv_cmd_buffer.c | 48 ++++++++++++++++++++++++++++++++++++--- src/amd/vulkan/radv_shader_args.c | 6 +++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 9c4c3e9fd46..0585be30418 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -6077,6 +6077,7 @@ radv_cs_emit_indirect_draw_packet(struct radv_cmd_buffer *cmd_buffer, bool index uint32_t base_reg = cmd_buffer->state.pipeline->graphics.vtx_base_sgpr; uint32_t vertex_offset_reg, start_instance_reg = 0, draw_id_reg = 0; bool predicating = cmd_buffer->state.predicating; + bool mesh = cmd_buffer->state.mesh_shading; assert(base_reg); /* just reset draw state for vertex data */ @@ -6089,7 +6090,7 @@ radv_cs_emit_indirect_draw_packet(struct radv_cmd_buffer *cmd_buffer, bool index if (cmd_buffer->state.pipeline->graphics.uses_baseinstance) start_instance_reg = ((base_reg + (draw_id_enable ? 8 : 4)) - SI_SH_REG_OFFSET) >> 2; if (draw_id_enable) - draw_id_reg = ((base_reg + 4) - SI_SH_REG_OFFSET) >> 2; + draw_id_reg = ((base_reg + mesh * 12 + 4) - SI_SH_REG_OFFSET) >> 2; if (draw_count == 1 && !count_va && !draw_id_enable) { radeon_emit(cs, @@ -6172,6 +6173,28 @@ radv_emit_userdata_vertex_drawid(struct radv_cmd_buffer *cmd_buffer, uint32_t ve } +ALWAYS_INLINE static void +radv_emit_userdata_mesh(struct radv_cmd_buffer *cmd_buffer, + const uint32_t x, const uint32_t y, const uint32_t z, + const uint32_t first_task) +{ + struct radv_cmd_state *state = &cmd_buffer->state; + struct radeon_cmdbuf *cs = cmd_buffer->cs; + const bool uses_drawid = state->pipeline->graphics.uses_drawid; + + radeon_set_sh_reg_seq(cs, state->pipeline->graphics.vtx_base_sgpr, + state->pipeline->graphics.vtx_emit_num); + radeon_emit(cs, first_task); + radeon_emit(cs, x); + radeon_emit(cs, y); + radeon_emit(cs, z); + + if (uses_drawid) { + radeon_emit(cs, 0); + state->last_drawid = 0; + } +} + ALWAYS_INLINE static void radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer, const struct radv_draw_info *info, @@ -6347,6 +6370,26 @@ radv_emit_direct_draw_packets(struct radv_cmd_buffer *cmd_buffer, const struct r } } +ALWAYS_INLINE static void +radv_emit_direct_mesh_draw_packet(struct radv_cmd_buffer *cmd_buffer, + uint32_t x, uint32_t y, uint32_t z, + uint32_t first_task) +{ + const uint32_t view_mask = cmd_buffer->state.subpass->view_mask; + const uint32_t count = x * y * z; + + radv_emit_userdata_mesh(cmd_buffer, x, y, z, first_task); + + if (!view_mask) { + radv_cs_emit_draw_packet(cmd_buffer, count, 0); + } else { + u_foreach_bit(view, view_mask) { + radv_emit_view_index(cmd_buffer, view); + radv_cs_emit_draw_packet(cmd_buffer, count, 0); + } + } +} + static void radv_emit_indirect_draw_packets(struct radv_cmd_buffer *cmd_buffer, const struct radv_draw_info *info) @@ -7093,8 +7136,7 @@ radv_CmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint3 if (!radv_before_draw(cmd_buffer, &info, 1)) return; - const VkMultiDrawInfoEXT minfo = { firstTask, taskCount }; - radv_emit_direct_draw_packets(cmd_buffer, &info, 1, &minfo, 0, 0); + radv_emit_direct_mesh_draw_packet(cmd_buffer, taskCount, 1, 1, firstTask); radv_after_draw(cmd_buffer); } diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c index eadbae79152..c3677bc6c0d 100644 --- a/src/amd/vulkan/radv_shader_args.c +++ b/src/amd/vulkan/radv_shader_args.c @@ -127,7 +127,7 @@ count_vs_user_sgprs(const struct radv_shader_info *info) static uint8_t count_ms_user_sgprs(const struct radv_shader_info *info) { - uint8_t count = 1; /* vertex offset */ + uint8_t count = 1 + 3; /* firstTask + num_work_groups[3] */ if (info->vs.needs_draw_id) count++; @@ -412,6 +412,7 @@ static void declare_ms_input_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args) { ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.base_vertex); + ac_add_arg(&args->ac, AC_ARG_SGPR, 3, AC_ARG_INT, &args->ac.num_work_groups); if (info->vs.needs_draw_id) { ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.draw_id); } @@ -546,7 +547,8 @@ set_vs_specific_input_locs(struct radv_shader_args *args, gl_shader_stage stage, static void set_ms_input_locs(struct radv_shader_args *args, uint8_t *user_sgpr_idx) { - unsigned vs_num = args->ac.base_vertex.used + args->ac.draw_id.used; + unsigned vs_num = + args->ac.base_vertex.used + 3 * args->ac.num_work_groups.used + args->ac.draw_id.used; set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num); }
