aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <[email protected]>2020-04-23 14:16:43 +0200
committerMarge Bot <[email protected]>2020-06-03 07:39:52 +0000
commit94438a64bf7e5cd37c56e954156d59e404d76f55 (patch)
tree2b493006c9eb4eda016ee22f284d7a287fcc761d
parentd3c937c0e4d1dd05072d9a7169532517ef7d0c7f (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.c37
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);