From: Boris Brezillon Date: Mon, 17 Aug 2020 17:38:47 +0000 (+0200) Subject: spirv: Add a vtn_get_mem_operands() helper X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=857b9c50276141c874c0dba2475afe73ce62a013;p=mesa.git spirv: Add a vtn_get_mem_operands() helper Add a vtn_get_mem_operands() helper to extract memory operand attached to load/store operations. Signed-off-by: Boris Brezillon Reviewed-by: Jason Ekstrand Part-of: --- diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 535db712b37..712c3db7415 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -2447,6 +2447,37 @@ nir_sloppy_bitcast(nir_builder *b, nir_ssa_def *val, return nir_shrink_zero_pad_vec(b, val, num_components); } +static bool +vtn_get_mem_operands(struct vtn_builder *b, const uint32_t *w, unsigned count, + unsigned *idx, SpvMemoryAccessMask *access, unsigned *alignment, + SpvScope *dest_scope, SpvScope *src_scope) +{ + *access = 0; + *alignment = 0; + if (*idx >= count) + return false; + + *access = w[(*idx)++]; + if (*access & SpvMemoryAccessAlignedMask) { + vtn_assert(*idx < count); + *alignment = w[(*idx)++]; + } + + if (*access & SpvMemoryAccessMakePointerAvailableMask) { + vtn_assert(*idx < count); + vtn_assert(dest_scope); + *dest_scope = vtn_constant_uint(b, w[(*idx)++]); + } + + if (*access & SpvMemoryAccessMakePointerVisibleMask) { + vtn_assert(*idx < count); + vtn_assert(src_scope); + *src_scope = vtn_constant_uint(b, w[(*idx)++]); + } + + return true; +} + void vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count) @@ -2560,20 +2591,15 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, vtn_assert_types_equal(b, opcode, res_type, src_val->type->deref); - if (count > 4) { - unsigned idx = 5; - SpvMemoryAccessMask access = w[4]; - if (access & SpvMemoryAccessAlignedMask) - idx++; - - if (access & SpvMemoryAccessMakePointerVisibleMask) { - SpvMemorySemanticsMask semantics = - SpvMemorySemanticsMakeVisibleMask | - vtn_storage_class_to_memory_semantics(src->ptr_type->storage_class); - - SpvScope scope = vtn_constant_uint(b, w[idx]); - vtn_emit_memory_barrier(b, scope, semantics); - } + unsigned idx = 4, alignment; + SpvMemoryAccessMask access; + SpvScope scope; + vtn_get_mem_operands(b, w, count, &idx, &access, &alignment, NULL, &scope); + if (access & SpvMemoryAccessMakePointerVisibleMask) { + SpvMemorySemanticsMask semantics = + SpvMemorySemanticsMakeVisibleMask | + vtn_storage_class_to_memory_semantics(src->ptr_type->storage_class); + vtn_emit_memory_barrier(b, scope, semantics); } vtn_push_ssa_value(b, w[2], vtn_variable_load(b, src)); @@ -2610,23 +2636,19 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, vtn_assert_types_equal(b, opcode, dest_val->type->deref, src_val->type); + unsigned idx = 3, alignment; + SpvMemoryAccessMask access; + SpvScope scope; + vtn_get_mem_operands(b, w, count, &idx, &access, &alignment, &scope, NULL); + struct vtn_ssa_value *src = vtn_ssa_value(b, w[2]); vtn_variable_store(b, src, dest); - if (count > 3) { - unsigned idx = 4; - SpvMemoryAccessMask access = w[3]; - - if (access & SpvMemoryAccessAlignedMask) - idx++; - - if (access & SpvMemoryAccessMakePointerAvailableMask) { - SpvMemorySemanticsMask semantics = - SpvMemorySemanticsMakeAvailableMask | - vtn_storage_class_to_memory_semantics(dest->ptr_type->storage_class); - SpvScope scope = vtn_constant_uint(b, w[idx]); - vtn_emit_memory_barrier(b, scope, semantics); - } + if (access & SpvMemoryAccessMakePointerAvailableMask) { + SpvMemorySemanticsMask semantics = + SpvMemorySemanticsMakeAvailableMask | + vtn_storage_class_to_memory_semantics(dest->ptr_type->storage_class); + vtn_emit_memory_barrier(b, scope, semantics); } break; }