agx: Implement compute ID intrinsics

These NIR intrinsics map to vectors of special registers.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21062>
This commit is contained in:
Alyssa Rosenzweig
2022-12-02 21:32:14 -05:00
committed by Marge Bot
parent da91a78ab7
commit 251f6fb224

View File

@@ -670,6 +670,23 @@ agx_emit_discard(agx_builder *b)
return agx_sample_mask(b, agx_immediate(0));
}
static agx_instr *
agx_load_compute_dimension(agx_builder *b, agx_index dst,
nir_intrinsic_instr *instr, enum agx_sr base)
{
unsigned dim = nir_dest_num_components(instr->dest);
unsigned size = nir_dest_bit_size(instr->dest);
assert(size == 16 || size == 32);
agx_index srcs[] = {
agx_get_sr(b, size, base + 0),
agx_get_sr(b, size, base + 1),
agx_get_sr(b, size, base + 2),
};
return agx_emit_collect_to(b, dst, dim, srcs);
}
static agx_instr *
agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr)
{
@@ -747,6 +764,18 @@ agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr)
case nir_intrinsic_block_image_store_agx:
return agx_emit_block_image_store(b, instr);
case nir_intrinsic_load_workgroup_id:
return agx_load_compute_dimension(b, dst, instr,
AGX_SR_THREADGROUP_POSITION_IN_GRID_X);
case nir_intrinsic_load_global_invocation_id:
return agx_load_compute_dimension(b, dst, instr,
AGX_SR_THREAD_POSITION_IN_GRID_X);
case nir_intrinsic_load_local_invocation_id:
return agx_load_compute_dimension(
b, dst, instr, AGX_SR_THREAD_POSITION_IN_THREADGROUP_X);
default:
fprintf(stderr, "Unhandled intrinsic %s\n",
nir_intrinsic_infos[instr->intrinsic].name);