spirv: Split the vtn_emit_scoped_memory_barrier() logic
We are about to add support for scoped control+memory barriers. Let's move the convert from SPIRV to NIR enums logic in helpers so we can easily re-use them. 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:

committed by
Marge Bot

parent
d3c937c0e4
commit
94438a64bf
@@ -1991,8 +1991,8 @@ vtn_split_barrier_semantics(struct vtn_builder *b,
|
|||||||
*after |= SpvMemorySemanticsMakeAvailableMask | storage_semantics;
|
*after |= SpvMemorySemanticsMakeAvailableMask | storage_semantics;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static nir_memory_semantics
|
||||||
vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
|
vtn_mem_semantics_to_nir_mem_semantics(struct vtn_builder *b,
|
||||||
SpvMemorySemanticsMask semantics)
|
SpvMemorySemanticsMask semantics)
|
||||||
{
|
{
|
||||||
nir_memory_semantics nir_semantics = 0;
|
nir_memory_semantics nir_semantics = 0;
|
||||||
@@ -2050,6 +2050,13 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
|
|||||||
nir_semantics |= NIR_MEMORY_MAKE_VISIBLE;
|
nir_semantics |= NIR_MEMORY_MAKE_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nir_semantics;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nir_variable_mode
|
||||||
|
vtn_mem_sematics_to_nir_var_modes(struct vtn_builder *b,
|
||||||
|
SpvMemorySemanticsMask semantics)
|
||||||
|
{
|
||||||
/* Vulkan Environment for SPIR-V says "SubgroupMemory, CrossWorkgroupMemory,
|
/* Vulkan Environment for SPIR-V says "SubgroupMemory, CrossWorkgroupMemory,
|
||||||
* and AtomicCounterMemory are ignored".
|
* and AtomicCounterMemory are ignored".
|
||||||
*/
|
*/
|
||||||
@@ -2075,10 +2082,12 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
|
|||||||
modes |= nir_var_shader_out;
|
modes |= nir_var_shader_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No barrier to add. */
|
return modes;
|
||||||
if (nir_semantics == 0 || modes == 0)
|
}
|
||||||
return;
|
|
||||||
|
|
||||||
|
static nir_scope
|
||||||
|
vtn_scope_to_nir_scope(struct vtn_builder *b, SpvScope scope)
|
||||||
|
{
|
||||||
nir_scope nir_scope;
|
nir_scope nir_scope;
|
||||||
switch (scope) {
|
switch (scope) {
|
||||||
case SpvScopeDevice:
|
case SpvScopeDevice:
|
||||||
@@ -2113,6 +2122,22 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
|
|||||||
vtn_fail("Invalid memory scope");
|
vtn_fail("Invalid memory scope");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nir_scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
|
||||||
|
SpvMemorySemanticsMask semantics)
|
||||||
|
{
|
||||||
|
nir_variable_mode modes = vtn_mem_sematics_to_nir_var_modes(b, semantics);
|
||||||
|
nir_memory_semantics nir_semantics =
|
||||||
|
vtn_mem_semantics_to_nir_mem_semantics(b, semantics);
|
||||||
|
|
||||||
|
/* No barrier to add. */
|
||||||
|
if (nir_semantics == 0 || modes == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nir_scope nir_scope = vtn_scope_to_nir_scope(b, scope);
|
||||||
nir_intrinsic_instr *intrin =
|
nir_intrinsic_instr *intrin =
|
||||||
nir_intrinsic_instr_create(b->shader, nir_intrinsic_scoped_memory_barrier);
|
nir_intrinsic_instr_create(b->shader, nir_intrinsic_scoped_memory_barrier);
|
||||||
nir_intrinsic_set_memory_semantics(intrin, nir_semantics);
|
nir_intrinsic_set_memory_semantics(intrin, nir_semantics);
|
||||||
|
Reference in New Issue
Block a user