summaryrefslogtreecommitdiffstats
path: root/src/compiler/spirv/vtn_variables.c
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <[email protected]>2019-09-10 13:21:08 -0700
committerCaio Marcelo de Oliveira Filho <[email protected]>2019-10-24 11:39:56 -0700
commitb8784fe65252f82ee528459ec876c43b8586cac3 (patch)
treed4890a9cdf9fd56771a5a72dbcbab54d471c08fc /src/compiler/spirv/vtn_variables.c
parent129c85c28b8da1801fae9c2b1ecac46b7c74a635 (diff)
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 <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/compiler/spirv/vtn_variables.c')
-rw-r--r--src/compiler/spirv/vtn_variables.c32
1 files changed, 32 insertions, 0 deletions
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;
}