From 44b02b5cb1e2f35e9be7b271df5c93687e5833fc Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 22 Sep 2022 09:20:46 +0200 Subject: [PATCH] broadcom/compiler: handle shared stores with robust buffer access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For some reason we supported all shared intrinsics but this one. Reviewed-by: Alejandro PiƱeiro Part-of: --- .../compiler/v3d_nir_lower_robust_buffer_access.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/broadcom/compiler/v3d_nir_lower_robust_buffer_access.c b/src/broadcom/compiler/v3d_nir_lower_robust_buffer_access.c index 1e9f190c5e1..4c61d59eb70 100644 --- a/src/broadcom/compiler/v3d_nir_lower_robust_buffer_access.c +++ b/src/broadcom/compiler/v3d_nir_lower_robust_buffer_access.c @@ -103,26 +103,31 @@ lower_shared(struct v3d_compile *c, nir_builder *b, nir_intrinsic_instr *instr) { - uint32_t type_sz; + uint32_t type_sz, offset_src; if (instr->intrinsic == nir_intrinsic_load_shared) { + offset_src = 0; type_sz = nir_dest_bit_size(instr->dest) / 8; + } else if (instr->intrinsic == nir_intrinsic_store_shared) { + offset_src = 1; + type_sz = nir_src_bit_size(instr->src[0]) / 8; } else { /* atomic */ + offset_src = 0; type_sz = 4; } b->cursor = nir_before_instr(&instr->instr); const uint32_t access_size = instr->num_components * type_sz; nir_ssa_def *max_access_offset = - nir_iadd(b, instr->src[0].ssa, + nir_iadd(b, instr->src[offset_src].ssa, nir_imm_int(b, access_size - 1)); nir_ssa_def *offset = nir_bcsel(b, nir_uge(b, max_access_offset, nir_imm_int(b, c->s->info.shared_size)), nir_imm_int(b, 0), - instr->src[0].ssa); + instr->src[offset_src].ssa); - nir_instr_rewrite_src(&instr->instr, &instr->src[0], + nir_instr_rewrite_src(&instr->instr, &instr->src[offset_src], nir_src_for_ssa(offset)); } @@ -155,6 +160,7 @@ lower_instr(nir_builder *b, nir_instr *instr, void *_state) case nir_intrinsic_ssbo_atomic_comp_swap: lower_atomic(c, b, intr); return true; + case nir_intrinsic_store_shared: case nir_intrinsic_load_shared: case nir_intrinsic_shared_atomic_add: case nir_intrinsic_shared_atomic_imin: