diff options
author | Boris Brezillon <[email protected]> | 2020-04-23 14:16:43 +0200 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-06-03 07:39:52 +0000 |
commit | 94438a64bf7e5cd37c56e954156d59e404d76f55 (patch) | |
tree | 2b493006c9eb4eda016ee22f284d7a287fcc761d | |
parent | d3c937c0e4d1dd05072d9a7169532517ef7d0c7f (diff) |
spirv: Split the vtn_emit_scoped_memory_barrier() logic
We are about to add support for scoped control+memory barriers. Let's
move the convert from SPIRV to NIR enums logic in helpers so we can
easily re-use them.
Signed-off-by: Boris Brezillon <[email protected]>
Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4900>
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 7bb9489aaeb..fd3674b04e8 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -1991,9 +1991,9 @@ vtn_split_barrier_semantics(struct vtn_builder *b, *after |= SpvMemorySemanticsMakeAvailableMask | storage_semantics; } -static void -vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope, - SpvMemorySemanticsMask semantics) +static nir_memory_semantics +vtn_mem_semantics_to_nir_mem_semantics(struct vtn_builder *b, + SpvMemorySemanticsMask semantics) { nir_memory_semantics nir_semantics = 0; @@ -2050,6 +2050,13 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope, nir_semantics |= NIR_MEMORY_MAKE_VISIBLE; } + return nir_semantics; +} + +static nir_variable_mode +vtn_mem_sematics_to_nir_var_modes(struct vtn_builder *b, + SpvMemorySemanticsMask semantics) +{ /* Vulkan Environment for SPIR-V says "SubgroupMemory, CrossWorkgroupMemory, * and AtomicCounterMemory are ignored". */ @@ -2075,10 +2082,12 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope, modes |= nir_var_shader_out; } - /* No barrier to add. */ - if (nir_semantics == 0 || modes == 0) - return; + return modes; +} +static nir_scope +vtn_scope_to_nir_scope(struct vtn_builder *b, SpvScope scope) +{ nir_scope nir_scope; switch (scope) { case SpvScopeDevice: @@ -2113,6 +2122,22 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope, vtn_fail("Invalid memory scope"); } + return nir_scope; +} + +static void +vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope, + SpvMemorySemanticsMask semantics) +{ + nir_variable_mode modes = vtn_mem_sematics_to_nir_var_modes(b, semantics); + nir_memory_semantics nir_semantics = + vtn_mem_semantics_to_nir_mem_semantics(b, semantics); + + /* No barrier to add. */ + if (nir_semantics == 0 || modes == 0) + return; + + nir_scope nir_scope = vtn_scope_to_nir_scope(b, scope); nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(b->shader, nir_intrinsic_scoped_memory_barrier); nir_intrinsic_set_memory_semantics(intrin, nir_semantics); |