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:
@@ -558,7 +558,7 @@ formats = [("pseudo", [Format.PSEUDO], list(itertools.product(range(5), range(6)
|
|||||||
("sopp", [Format.SOPP], itertools.product([0, 1], [0, 1])),
|
("sopp", [Format.SOPP], itertools.product([0, 1], [0, 1])),
|
||||||
("sopc", [Format.SOPC], [(1, 2)]),
|
("sopc", [Format.SOPC], [(1, 2)]),
|
||||||
("smem", [Format.SMEM], [(0, 4), (0, 3), (1, 0), (1, 3), (1, 2), (1, 1), (0, 0)]),
|
("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)]),
|
("ldsdir", [Format.LDSDIR], [(1, 1)]),
|
||||||
("mubuf", [Format.MUBUF], [(0, 4), (1, 3), (1, 4)]),
|
("mubuf", [Format.MUBUF], [(0, 4), (1, 3), (1, 4)]),
|
||||||
("mtbuf", [Format.MTBUF], [(0, 4), (1, 3)]),
|
("mtbuf", [Format.MTBUF], [(0, 4), (1, 3)]),
|
||||||
|
@@ -7572,6 +7572,32 @@ visit_shared_atomic(isel_context* ctx, nir_intrinsic_instr* instr)
|
|||||||
ctx->block->instructions.emplace_back(std::move(ds));
|
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
|
void
|
||||||
visit_access_shared2_amd(isel_context* ctx, nir_intrinsic_instr* instr)
|
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_store_shared: visit_store_shared(ctx, instr); break;
|
||||||
case nir_intrinsic_shared_atomic:
|
case nir_intrinsic_shared_atomic:
|
||||||
case nir_intrinsic_shared_atomic_swap: visit_shared_atomic(ctx, instr); break;
|
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_load_shared2_amd:
|
||||||
case nir_intrinsic_store_shared2_amd: visit_access_shared2_amd(ctx, instr); break;
|
case nir_intrinsic_store_shared2_amd: visit_access_shared2_amd(ctx, instr); break;
|
||||||
case nir_intrinsic_bindless_image_load:
|
case nir_intrinsic_bindless_image_load:
|
||||||
|
Reference in New Issue
Block a user