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