mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 15:10:10 +01:00
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:
parent
689acc7398
commit
3ed2123d77
1 changed files with 28 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue