diff options
author | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-09-10 13:21:08 -0700 |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-10-24 11:39:56 -0700 |
commit | b8784fe65252f82ee528459ec876c43b8586cac3 (patch) | |
tree | d4890a9cdf9fd56771a5a72dbcbab54d471c08fc /src/compiler | |
parent | 129c85c28b8da1801fae9c2b1ecac46b7c74a635 (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')
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 32 |
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; } |