diff options
author | Timur Kristóf <timur.kristof@gmail.com> | 2022-01-21 18:08:34 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-02-25 06:31:33 +0000 |
commit | d2d6eca0817972a9d08f348f3a22354ce572c15b (patch) | |
tree | 0795439174f94d41c90c1bdb410772369a6114a4 | |
parent | bf519a7d4778b9d678f312dfbe7d6758cd09676e (diff) |
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 <timur.kristof@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15034>
-rw-r--r-- | src/amd/vulkan/radv_cmd_buffer.c | 48 | ||||
-rw-r--r-- | 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, @@ -6173,6 +6174,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, uint32_t drawCount, const VkMultiDrawIndexedInfoEXT *minfo, @@ -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); } |