diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index a7228f0ae64..0a0ac758fc3 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -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) && diff --git a/src/asahi/compiler/agx_validate.c b/src/asahi/compiler/agx_validate.c index d2b34f5f70c..31b17a223b4 100644 --- a/src/asahi/compiler/agx_validate.c +++ b/src/asahi/compiler/agx_validate.c @@ -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; diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 71f359db449..b8d4395b177 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -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; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 02e6653e64a..91b8e29f845 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -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])