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>
This commit is contained in:
Timur Kristóf 2022-01-21 18:08:34 +01:00 committed by Marge Bot
parent bf519a7d47
commit d2d6eca081
2 changed files with 49 additions and 5 deletions

View file

@ -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);
}

View file

@ -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);
}