aco: implement nir_shared_append/consume_amd

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31075>
This commit is contained in:
Georg Lehmann
2024-09-07 15:05:25 +02:00
committed by Marge Bot
parent 970503a0b9
commit 45e935800a
2 changed files with 29 additions and 1 deletions

View File

@@ -558,7 +558,7 @@ formats = [("pseudo", [Format.PSEUDO], list(itertools.product(range(5), range(6)
("sopp", [Format.SOPP], itertools.product([0, 1], [0, 1])),
("sopc", [Format.SOPC], [(1, 2)]),
("smem", [Format.SMEM], [(0, 4), (0, 3), (1, 0), (1, 3), (1, 2), (1, 1), (0, 0)]),
("ds", [Format.DS], [(1, 1), (1, 2), (1, 3), (0, 3), (0, 4)]),
("ds", [Format.DS], [(1, 0), (1, 1), (1, 2), (1, 3), (0, 3), (0, 4)]),
("ldsdir", [Format.LDSDIR], [(1, 1)]),
("mubuf", [Format.MUBUF], [(0, 4), (1, 3), (1, 4)]),
("mtbuf", [Format.MTBUF], [(0, 4), (1, 3)]),

View File

@@ -7572,6 +7572,32 @@ visit_shared_atomic(isel_context* ctx, nir_intrinsic_instr* instr)
ctx->block->instructions.emplace_back(std::move(ds));
}
void
visit_shared_append(isel_context* ctx, nir_intrinsic_instr* instr)
{
Builder bld(ctx->program, ctx->block);
unsigned address = nir_intrinsic_base(instr);
assert(address <= 65535 && (address % 4 == 0));
aco_opcode op;
switch (instr->intrinsic) {
case nir_intrinsic_shared_append_amd: op = aco_opcode::ds_append; break;
case nir_intrinsic_shared_consume_amd: op = aco_opcode::ds_consume; break;
default: unreachable("not shared_append/consume");
}
Temp tmp = bld.tmp(v1);
Instruction *ds;
Operand m = load_lds_size_m0(bld);
if (m.isUndefined())
ds = bld.ds(op, Definition(tmp), address);
else
ds = bld.ds(op, Definition(tmp), m, address);
ds->ds().sync = memory_sync_info(storage_shared, semantic_atomicrmw);
bld.pseudo(aco_opcode::p_as_uniform, Definition(get_ssa_temp(ctx, &instr->def)), tmp);
}
void
visit_access_shared2_amd(isel_context* ctx, nir_intrinsic_instr* instr)
{
@@ -8324,6 +8350,8 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
case nir_intrinsic_store_shared: visit_store_shared(ctx, instr); break;
case nir_intrinsic_shared_atomic:
case nir_intrinsic_shared_atomic_swap: visit_shared_atomic(ctx, instr); break;
case nir_intrinsic_shared_append_amd:
case nir_intrinsic_shared_consume_amd: visit_shared_append(ctx, instr); break;
case nir_intrinsic_load_shared2_amd:
case nir_intrinsic_store_shared2_amd: visit_access_shared2_amd(ctx, instr); break;
case nir_intrinsic_bindless_image_load: