diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index db7ce2023b6..c49a37cfadf 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -1676,6 +1676,9 @@ static void visit_intrinsic(struct lp_build_nir_context *bld_base, case nir_intrinsic_load_sample_pos: case nir_intrinsic_load_sample_mask_in: case nir_intrinsic_load_view_index: + case nir_intrinsic_load_subgroup_invocation: + case nir_intrinsic_load_subgroup_id: + case nir_intrinsic_load_num_subgroups: bld_base->sysval_intrin(bld_base, instr, result); break; case nir_intrinsic_load_helper_invocation: diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c index 347a70b2a12..4847f5c49b0 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c @@ -1590,6 +1590,19 @@ static void emit_sysval_intrin(struct lp_build_nir_context *bld_base, case nir_intrinsic_load_view_index: result[0] = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.view_index); break; + case nir_intrinsic_load_subgroup_invocation: { + LLVMValueRef elems[LP_MAX_VECTOR_LENGTH]; + for(unsigned i = 0; i < bld->bld_base.base.type.length; ++i) + elems[i] = lp_build_const_int32(gallivm, i); + result[0] = LLVMConstVector(elems, bld->bld_base.base.type.length); + break; + } + case nir_intrinsic_load_subgroup_id: + result[0] = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.subgroup_id); + break; + case nir_intrinsic_load_num_subgroups: + result[0] = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.num_subgroups); + break; } } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h index c3696ba29e1..5f6d278aa1b 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h @@ -188,6 +188,8 @@ struct lp_bld_tgsi_system_values { LLVMValueRef sample_pos; LLVMValueRef sample_mask_in; LLVMValueRef view_index; + LLVMValueRef subgroup_id; + LLVMValueRef num_subgroups; };