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@collabora.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4900>
This commit is contained in:
Boris Brezillon 2020-05-05 10:31:02 +02:00 committed by Marge Bot
parent 689acc7398
commit 3ed2123d77

View 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;
}