radeonsi: implement nir_intrinsic_load_ring_mesh_scratch_amd

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38044>
This commit is contained in:
Qiang Yu
2025-06-12 10:59:04 +08:00
committed by Marge Bot
parent 5048216b43
commit c0f6e97d6c
@@ -217,6 +217,31 @@ static nir_def *build_task_ring_desc(nir_builder *b, struct lower_abi_state *s,
return nir_vec(b, comp, 4);
}
static nir_def *build_mesh_scratch_ring_desc(nir_builder *b, struct lower_abi_state *s)
{
struct si_screen *screen = s->shader->selector->screen;
const struct ac_buffer_state ac_state = {
.va = (uint64_t)screen->info.address32_hi << 32,
.size = AC_MESH_SCRATCH_NUM_ENTRIES * AC_MESH_SCRATCH_ENTRY_BYTES,
.format = PIPE_FORMAT_R32_FLOAT,
.swizzle = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W },
.gfx10_oob_select = V_008F0C_OOB_SELECT_DISABLED,
};
unsigned desc[4];
ac_build_buffer_descriptor(screen->info.gfx_level, &ac_state, desc);
nir_def *comp[] = {
ac_nir_load_arg(b, &s->args->ac, s->args->mesh_scratch_ring_addr),
nir_imm_int(b, desc[1]),
nir_imm_int(b, desc[2]),
nir_imm_int(b, desc[3]),
};
return nir_vec(b, comp, 4);
}
static bool preload_reusable_variables(nir_builder *b, struct lower_abi_state *s)
{
const struct si_shader_selector *sel = s->shader->selector;
@@ -667,6 +692,9 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s
case nir_intrinsic_load_ring_task_payload_amd:
replacement = build_task_ring_desc(b, s, true);
break;
case nir_intrinsic_load_ring_mesh_scratch_amd:
replacement = build_mesh_scratch_ring_desc(b, s);
break;
default:
return false;
}