spirv: Use scoped barriers for SpvOpControlBarrier
authorBoris Brezillon <boris.brezillon@collabora.com>
Tue, 5 May 2020 08:31:02 +0000 (10:31 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 3 Jun 2020 07:39:52 +0000 (07:39 +0000)
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@collabora.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4900>

src/compiler/spirv/spirv_to_nir.c

index 7f8b1f07e0292c5db8606f61829d5743fe899189..92ccc10654cde4d0fcf9d6db7993cd3f258db29b 100644 (file)
@@ -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;
    }