radv: bind and emit mesh/task shaders with ESO

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27237>
This commit is contained in:
Samuel Pitoiset
2024-01-19 14:21:00 +01:00
committed by Marge Bot
parent 29491d36aa
commit f23efd7093
3 changed files with 24 additions and 2 deletions

View File

@@ -9069,6 +9069,13 @@ radv_emit_shaders(struct radv_cmd_buffer *cmd_buffer)
radv_emit_fragment_shader(device, cs, cs, cmd_buffer->state.shaders[MESA_SHADER_FRAGMENT]);
radv_emit_ps_inputs(device, cs, last_vgt_shader, cmd_buffer->state.shaders[MESA_SHADER_FRAGMENT]);
break;
case MESA_SHADER_MESH:
radv_emit_mesh_shader(device, cs, cs, cmd_buffer->state.shaders[MESA_SHADER_MESH]);
break;
case MESA_SHADER_TASK:
radv_emit_compute_shader(device->physical_device, cmd_buffer->gang.cs,
cmd_buffer->state.shaders[MESA_SHADER_TASK]);
break;
default:
unreachable("invalid bind stage");
}
@@ -9083,6 +9090,11 @@ radv_emit_shaders(struct radv_cmd_buffer *cmd_buffer)
.ngg_passthrough = last_vgt_shader->info.is_ngg_passthrough,
};
if (cmd_buffer->state.shaders[MESA_SHADER_MESH]) {
vgt_shader_cfg_key.mesh = 1;
vgt_shader_cfg_key.mesh_scratch_ring = cmd_buffer->state.shaders[MESA_SHADER_MESH]->info.ms.needs_ms_scratch_ring;
}
radv_emit_vgt_gs_mode(device, cs, last_vgt_shader);
radv_emit_vgt_vertex_reuse(device, cs, radv_get_shader(cmd_buffer->state.shaders, MESA_SHADER_TESS_EVAL));
radv_emit_vgt_shader_config(device, cs, &vgt_shader_cfg_key);
@@ -9224,9 +9236,12 @@ radv_bind_graphics_shaders(struct radv_cmd_buffer *cmd_buffer)
if (cmd_buffer->state.graphics_pipeline)
return;
for (unsigned s = 0; s < MESA_SHADER_COMPUTE; s++) {
for (unsigned s = 0; s <= MESA_SHADER_MESH; s++) {
const struct radv_shader_object *shader_obj = cmd_buffer->state.shader_objs[s];
if (s == MESA_SHADER_COMPUTE)
continue;
if (!shader_obj) {
radv_bind_shader(cmd_buffer, NULL, s);
continue;
@@ -9417,6 +9432,10 @@ radv_before_taskmesh_draw(struct radv_cmd_buffer *cmd_buffer, const struct radv_
if (unlikely(!info->count))
return false;
if (cmd_buffer->state.dirty & RADV_CMD_DIRTY_SHADERS) {
radv_bind_graphics_shaders(cmd_buffer);
}
struct radeon_cmdbuf *ace_cs = cmd_buffer->gang.cs;
struct radv_shader *task_shader = cmd_buffer->state.shaders[MESA_SHADER_TASK];

View File

@@ -3237,7 +3237,7 @@ radv_emit_geometry_shader(const struct radv_device *device, struct radeon_cmdbuf
radeon_set_context_reg(ctx_cs, R_028B38_VGT_GS_MAX_VERT_OUT, gs->info.gs.vertices_out);
}
static void
void
radv_emit_mesh_shader(const struct radv_device *device, struct radeon_cmdbuf *ctx_cs, struct radeon_cmdbuf *cs,
const struct radv_shader *ms)
{

View File

@@ -2375,6 +2375,9 @@ void radv_emit_geometry_shader(const struct radv_device *device, struct radeon_c
const struct radv_shader *gs, const struct radv_shader *es,
const struct radv_shader *gs_copy_shader);
void radv_emit_mesh_shader(const struct radv_device *device, struct radeon_cmdbuf *ctx_cs, struct radeon_cmdbuf *cs,
const struct radv_shader *ms);
void radv_graphics_shaders_compile(struct radv_device *device, struct vk_pipeline_cache *cache,
struct radv_shader_stage *stages, const struct radv_graphics_state_key *gfx_state,
bool keep_executable_info, bool keep_statistic_info, bool is_internal,