nir,agx: add "active threads in subgroup" intrinsic

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30633>
This commit is contained in:
Alyssa Rosenzweig 2024-08-01 22:45:59 -04:00
parent 4dbce4a6a3
commit f04ae930d9
4 changed files with 11 additions and 0 deletions

View file

@ -1489,6 +1489,10 @@ agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr)
return agx_get_sr_coverage_to(b, dst,
AGX_SR_ACTIVE_THREAD_INDEX_IN_SUBGROUP);
case nir_intrinsic_load_active_subgroup_count_agx:
return agx_get_sr_coverage_to(b, dst,
AGX_SR_TOTAL_ACTIVE_THREADS_IN_SUBGROUP);
case nir_intrinsic_reduce: {
assert((instr->def.bit_size == 1 || instr->def.bit_size == 16 ||
instr->def.bit_size == 32) &&

View file

@ -423,6 +423,8 @@ agx_validate_sr(const agx_instr *I)
switch (I->sr) {
case AGX_SR_ACTIVE_THREAD_INDEX_IN_QUAD:
case AGX_SR_ACTIVE_THREAD_INDEX_IN_SUBGROUP:
case AGX_SR_TOTAL_ACTIVE_THREADS_IN_QUAD:
case AGX_SR_TOTAL_ACTIVE_THREADS_IN_SUBGROUP:
case AGX_SR_COVERAGE_MASK:
case AGX_SR_IS_ACTIVE_THREAD:
return coverage;

View file

@ -270,6 +270,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
case nir_intrinsic_load_printf_base_identifier:
case nir_intrinsic_load_core_id_agx:
case nir_intrinsic_load_samples_log2_agx:
case nir_intrinsic_load_active_subgroup_count_agx:
is_divergent = false;
break;

View file

@ -1850,6 +1850,10 @@ intrinsic("load_fep_w_v3d", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER])
# Equivalent to popcount(ballot(true) & ((1 << subgroup_invocation) - 1))
intrinsic("load_active_subgroup_invocation_agx", dest_comp=1, flags=[CAN_ELIMINATE])
# Total active invocations within the subgroup.
# Equivalent to popcount(ballot(true))
intrinsic("load_active_subgroup_count_agx", dest_comp=1, flags=[CAN_ELIMINATE])
# Like ballot() but only within a quad.
intrinsic("quad_ballot_agx", src_comp=[1], dest_comp=1, flags=[CAN_ELIMINATE])