Mesa (master): spirv: Use scoped barriers for SpvOpControlBarrier

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 3 08:04:15 UTC 2020


Module: Mesa
Branch: master
Commit: 3ed2123d77d50ccb984fccdcc1cfa936a18819bf
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ed2123d77d50ccb984fccdcc1cfa936a18819bf

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Tue May  5 10:31:02 2020 +0200

spirv: Use scoped barriers for SpvOpControlBarrier

If use_scoped_barrier is set to true, we don't have to split the control
and memory barriers.

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4900>

---

 src/compiler/spirv/spirv_to_nir.c | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 7f8b1f07e02..92ccc10654c 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -2125,6 +2125,26 @@ vtn_scope_to_nir_scope(struct vtn_builder *b, SpvScope scope)
    return nir_scope;
 }
 
+static void
+vtn_emit_scoped_control_barrier(struct vtn_builder *b, SpvScope exec_scope,
+                                SpvScope mem_scope,
+                                SpvMemorySemanticsMask semantics)
+{
+   nir_memory_semantics nir_semantics;
+   nir_variable_mode modes;
+
+   nir_semantics = vtn_mem_semantics_to_nir_mem_semantics(b, semantics);
+   modes = vtn_mem_sematics_to_nir_var_modes(b, semantics);
+
+   /* No barrier to add. */
+   if (nir_semantics == 0 || modes == 0)
+      return;
+
+   nir_scope nir_exec_scope = vtn_scope_to_nir_scope(b, exec_scope);
+   nir_scope nir_mem_scope = vtn_scope_to_nir_scope(b, mem_scope);
+   nir_scoped_barrier(&b->nb, nir_exec_scope, nir_mem_scope, nir_semantics, modes);
+}
+
 static void
 vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
                                SpvMemorySemanticsMask semantics)
@@ -3673,10 +3693,15 @@ vtn_handle_barrier(struct vtn_builder *b, SpvOp opcode,
                              SpvMemorySemanticsOutputMemoryMask;
       }
 
-      vtn_emit_memory_barrier(b, memory_scope, memory_semantics);
+      if (b->shader->options->use_scoped_barrier) {
+         vtn_emit_scoped_control_barrier(b, execution_scope, memory_scope,
+                                         memory_semantics);
+      } else {
+         vtn_emit_memory_barrier(b, memory_scope, memory_semantics);
 
-      if (execution_scope == SpvScopeWorkgroup)
-         vtn_emit_barrier(b, nir_intrinsic_control_barrier);
+         if (execution_scope == SpvScopeWorkgroup)
+            vtn_emit_barrier(b, nir_intrinsic_control_barrier);
+      }
       break;
    }
 



More information about the mesa-commit mailing list