aco: implement as_uniform and ballot_relaxed

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27116>
This commit is contained in:
Georg Lehmann
2024-01-17 12:14:05 +01:00
committed by Marge Bot
parent 1cb5bf7009
commit 6b031daf16
2 changed files with 16 additions and 1 deletions

View File

@@ -8348,6 +8348,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
emit_mbcnt(ctx, get_ssa_temp(ctx, &instr->def));
break;
}
case nir_intrinsic_ballot_relaxed:
case nir_intrinsic_ballot: {
Temp src = get_ssa_temp(ctx, instr->src[0].ssa);
Temp dst = get_ssa_temp(ctx, &instr->def);
@@ -8365,7 +8366,10 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
/* Make sure that all inactive lanes return zero.
* Value-numbering might remove the comparison above */
Definition def = dst.size() == bld.lm.size() ? Definition(dst) : bld.def(bld.lm);
src = bld.sop2(Builder::s_and, def, bld.def(s1, scc), src, Operand(exec, bld.lm));
if (instr->intrinsic == nir_intrinsic_ballot_relaxed)
src = bld.copy(def, src);
else
src = bld.sop2(Builder::s_and, def, bld.def(s1, scc), src, Operand(exec, bld.lm));
if (dst.size() != bld.lm.size()) {
/* Wave32 with ballot size set to 64 */
bld.pseudo(aco_opcode::p_create_vector, Definition(dst), src, Operand::zero());
@@ -8463,6 +8467,15 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
set_wqm(ctx);
break;
}
case nir_intrinsic_as_uniform: {
Temp src = get_ssa_temp(ctx, instr->src[0].ssa);
Temp dst = get_ssa_temp(ctx, &instr->def);
if (src.type() == RegType::vgpr)
bld.pseudo(aco_opcode::p_as_uniform, Definition(dst), src);
else
bld.copy(Definition(dst), src);
break;
}
case nir_intrinsic_vote_all: {
Temp src = get_ssa_temp(ctx, instr->src[0].ssa);
Temp dst = get_ssa_temp(ctx, &instr->def);

View File

@@ -478,9 +478,11 @@ init_context(isel_context* ctx, nir_shader* shader)
case nir_intrinsic_vote_all:
case nir_intrinsic_vote_any:
case nir_intrinsic_read_first_invocation:
case nir_intrinsic_as_uniform:
case nir_intrinsic_read_invocation:
case nir_intrinsic_first_invocation:
case nir_intrinsic_ballot:
case nir_intrinsic_ballot_relaxed:
case nir_intrinsic_bindless_image_samples:
case nir_intrinsic_load_scalar_arg_amd:
case nir_intrinsic_load_lds_ngg_scratch_base_amd: