From 94438a64bf7e5cd37c56e954156d59e404d76f55 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 23 Apr 2020 14:16:43 +0200 Subject: [PATCH] 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 Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/spirv/spirv_to_nir.c | 37 ++++++++++++++++++++++++++----- 1 file 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); -- 2.30.2