summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimur Kristóf <timur.kristof@gmail.com>2022-01-21 18:08:34 +0100
committerMarge Bot <emma+marge@anholt.net>2022-02-25 06:31:33 +0000
commitd2d6eca0817972a9d08f348f3a22354ce572c15b (patch)
tree0795439174f94d41c90c1bdb410772369a6114a4
parentbf519a7d4778b9d678f312dfbe7d6758cd09676e (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.c48
-rw-r--r--src/amd/vulkan/radv_shader_args.c6
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);
}