From b8784fe65252f82ee528459ec876c43b8586cac3 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Tue, 10 Sep 2019 13:21:08 -0700 Subject: [PATCH] spirv: Handle MakePointerAvailable/Visible Emit barriers with semantics matching the access operand and the storage class of the pointer. v2: Fix order of visible / available emission relative to the operations. (Bas) Reviewed-by: Jason Ekstrand Reviewed-by: Bas Nieuwenhuizen --- src/compiler/spirv/vtn_variables.c | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 52802ba5162..188931ec77b 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -2533,6 +2533,22 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, return; } + 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); + } + } + vtn_push_ssa(b, w[2], res_type, vtn_variable_load(b, src)); break; } @@ -2582,6 +2598,22 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, 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); + } + } break; } -- 2.30.2