Mesa (main): pan/bi: Support atomics on Valhall
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 11 22:15:08 UTC 2022
Module: Mesa
Branch: main
Commit: 6d41a28a40ba82610313112c276e2e874ccac6e9
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d41a28a40ba82610313112c276e2e874ccac6e9
Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date: Tue Mar 22 21:53:20 2022 -0400
pan/bi: Support atomics on Valhall
Atomics on Valhall work basically the same as on Bifrost, however the
instruction selection is simplified as there are no clauses. Support the
simplified set of atomic instructions.
Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16410>
---
src/panfrost/bifrost/bifrost_compile.c | 45 +++++++++++++++++++++++-----------
1 file changed, 31 insertions(+), 14 deletions(-)
diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c
index 4871162ccc0..c76d2a1f6f2 100644
--- a/src/panfrost/bifrost/bifrost_compile.c
+++ b/src/panfrost/bifrost/bifrost_compile.c
@@ -952,7 +952,7 @@ bi_handle_segment(bi_builder *b, bi_index *addr, bi_index *addr_hi, enum bi_seg
bi_index base = bi_fau(wls ? BIR_FAU_WLS_PTR : BIR_FAU_TLS_PTR, false);
- if (addr->type == BI_INDEX_CONSTANT) {
+ if (offset && addr->type == BI_INDEX_CONSTANT) {
int value = addr->value;
if (value == (int16_t) value) {
@@ -1303,25 +1303,36 @@ static void
bi_emit_atomic_i32_to(bi_builder *b, bi_index dst,
bi_index addr, bi_index arg, nir_intrinsic_op intrinsic)
{
- /* ATOM_C.i32 takes a vector with {arg, coalesced}, ATOM_C1.i32 doesn't
- * take any vector but can still output in RETURN mode */
- bi_index sr = bi_temp_reg(b->shader);
-
enum bi_atom_opc opc = bi_atom_opc_for_nir(intrinsic);
enum bi_atom_opc post_opc = opc;
+ bool bifrost = b->shader->arch <= 8;
+
+ /* ATOM_C.i32 takes a vector with {arg, coalesced}, ATOM_C1.i32 doesn't
+ * take any vector but can still output in RETURN mode */
+ bi_index sr = bifrost ? bi_temp_reg(b->shader) : bi_null();
+ bi_index tmp_dest = bifrost ? sr : dst;
+ unsigned sr_count = bifrost ? 2 : 1;
/* Generate either ATOM or ATOM1 as required */
if (bi_promote_atom_c1(opc, arg, &opc)) {
- bi_atom1_return_i32_to(b, sr, bi_word(addr, 0),
- bi_word(addr, 1), opc, 2);
+ bi_atom1_return_i32_to(b, tmp_dest, bi_word(addr, 0),
+ bi_word(addr, 1), opc, sr_count);
} else {
- bi_mov_i32_to(b, sr, arg);
- bi_atom_return_i32_to(b, sr, sr, bi_word(addr, 0),
- bi_word(addr, 1), opc, 2);
+ bi_index src = arg;
+
+ if (bifrost) {
+ bi_mov_i32_to(b, sr, arg);
+ src = sr;
+ }
+
+ bi_atom_return_i32_to(b, tmp_dest, src, bi_word(addr, 0),
+ bi_word(addr, 1), opc, sr_count);
}
- /* Post-process it */
- bi_atom_post_i32_to(b, dst, bi_word(sr, 0), bi_word(sr, 1), post_opc);
+ if (bifrost) {
+ /* Post-process it */
+ bi_atom_post_i32_to(b, dst, bi_word(sr, 0), bi_word(sr, 1), post_opc);
+ }
}
/* gl_FragCoord.xy = u16_to_f32(R59.xy) + 0.5
@@ -1481,8 +1492,14 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr)
case nir_intrinsic_shared_atomic_xor: {
assert(nir_src_bit_size(instr->src[1]) == 32);
- bi_index addr = bi_seg_add_i64(b, bi_src_index(&instr->src[0]),
- bi_zero(), false, BI_SEG_WLS);
+ bi_index addr = bi_src_index(&instr->src[0]);
+ bi_index addr_hi;
+
+ if (b->shader->arch >= 9) {
+ bi_handle_segment(b, &addr, &addr_hi, BI_SEG_WLS, NULL);
+ } else {
+ addr = bi_seg_add_i64(b, addr, bi_zero(), false, BI_SEG_WLS);
+ }
bi_emit_atomic_i32_to(b, dst, addr, bi_src_index(&instr->src[1]),
instr->intrinsic);
More information about the mesa-commit
mailing list