zink: Switch to scoped barriers
Rather than translate piles of discrete memory_barrier/control_barrier instructions, translate the unified scoped_barrier which maps almost directly to SPIR-V's barrier. Yes, this means I cheated off vtn for the implementation. v2: Use existing scope translation. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23186>
This commit is contained in:
committed by
Marge Bot
parent
ee62454fe3
commit
b6e40edae6
@@ -3526,6 +3526,40 @@ emit_is_helper_invocation(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
store_dest(ctx, &intr->dest, result, nir_type_bool);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_barrier(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
{
|
||||
SpvScope scope = get_scope(nir_intrinsic_execution_scope(intr));
|
||||
SpvScope mem_scope = get_scope(nir_intrinsic_memory_scope(intr));
|
||||
SpvMemorySemanticsMask semantics = 0;
|
||||
|
||||
if (nir_intrinsic_memory_scope(intr) != NIR_SCOPE_NONE) {
|
||||
nir_variable_mode modes = nir_intrinsic_memory_modes(intr);
|
||||
|
||||
if (modes & nir_var_image)
|
||||
semantics |= SpvMemorySemanticsImageMemoryMask;
|
||||
|
||||
if (modes & nir_var_mem_shared)
|
||||
semantics |= SpvMemorySemanticsWorkgroupMemoryMask;
|
||||
|
||||
if (modes & (nir_var_mem_ssbo | nir_var_mem_global))
|
||||
semantics |= SpvMemorySemanticsUniformMemoryMask;
|
||||
|
||||
if (modes & nir_var_mem_global)
|
||||
semantics |= SpvMemorySemanticsCrossWorkgroupMemoryMask;
|
||||
|
||||
if (modes & (nir_var_shader_out | nir_var_mem_task_payload))
|
||||
semantics |= SpvMemorySemanticsOutputMemoryMask;
|
||||
|
||||
semantics |= SpvMemorySemanticsAcquireReleaseMask;
|
||||
}
|
||||
|
||||
if (nir_intrinsic_execution_scope(intr) != NIR_SCOPE_NONE)
|
||||
spirv_builder_emit_control_barrier(&ctx->builder, scope, mem_scope, semantics);
|
||||
else
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder, mem_scope, semantics);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
{
|
||||
@@ -3638,52 +3672,8 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
SpvBuiltInTessCoord, nir_type_float);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||
/* handled by subsequent nir_intrinsic_control_barrier */
|
||||
break;
|
||||
|
||||
case nir_intrinsic_memory_barrier:
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder,
|
||||
ctx->sinfo->have_vulkan_memory_model ? SpvScopeQueueFamily : SpvScopeDevice,
|
||||
SpvMemorySemanticsImageMemoryMask |
|
||||
SpvMemorySemanticsUniformMemoryMask |
|
||||
SpvMemorySemanticsWorkgroupMemoryMask |
|
||||
SpvMemorySemanticsAtomicCounterMemoryMask |
|
||||
SpvMemorySemanticsAcquireReleaseMask);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_memory_barrier_image:
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder, SpvScopeDevice,
|
||||
SpvMemorySemanticsImageMemoryMask |
|
||||
SpvMemorySemanticsAcquireReleaseMask);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_group_memory_barrier:
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder, SpvScopeWorkgroup,
|
||||
SpvMemorySemanticsImageMemoryMask |
|
||||
SpvMemorySemanticsUniformMemoryMask |
|
||||
SpvMemorySemanticsWorkgroupMemoryMask |
|
||||
SpvMemorySemanticsAtomicCounterMemoryMask |
|
||||
SpvMemorySemanticsAcquireReleaseMask);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_memory_barrier_shared:
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder, SpvScopeWorkgroup,
|
||||
SpvMemorySemanticsWorkgroupMemoryMask |
|
||||
SpvMemorySemanticsAcquireReleaseMask);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_control_barrier:
|
||||
if (gl_shader_stage_is_compute(ctx->stage))
|
||||
spirv_builder_emit_control_barrier(&ctx->builder, SpvScopeWorkgroup,
|
||||
SpvScopeWorkgroup,
|
||||
SpvMemorySemanticsWorkgroupMemoryMask | SpvMemorySemanticsAcquireReleaseMask);
|
||||
else if (ctx->sinfo->have_vulkan_memory_model)
|
||||
spirv_builder_emit_control_barrier(&ctx->builder, SpvScopeWorkgroup,
|
||||
SpvScopeWorkgroup,
|
||||
SpvMemorySemanticsOutputMemoryMask | SpvMemorySemanticsAcquireReleaseMask);
|
||||
else
|
||||
spirv_builder_emit_control_barrier(&ctx->builder, SpvScopeWorkgroup, SpvScopeInvocation, 0);
|
||||
case nir_intrinsic_scoped_barrier:
|
||||
emit_barrier(ctx, intr);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_interp_deref_at_centroid:
|
||||
@@ -3692,12 +3682,6 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
emit_interpolate(ctx, intr);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_memory_barrier_buffer:
|
||||
spirv_builder_emit_memory_barrier(&ctx->builder, SpvScopeDevice,
|
||||
SpvMemorySemanticsUniformMemoryMask |
|
||||
SpvMemorySemanticsAcquireReleaseMask);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_deref_atomic:
|
||||
case nir_intrinsic_deref_atomic_swap:
|
||||
emit_deref_atomic_intrinsic(ctx, intr);
|
||||
|
||||
@@ -1377,6 +1377,7 @@ zink_screen_init_compiler(struct zink_screen *screen)
|
||||
.has_isub = true,
|
||||
.has_txs = true,
|
||||
.lower_mul_2x32_64 = true,
|
||||
.use_scoped_barrier = true,
|
||||
.support_16bit_alu = true, /* not quite what it sounds like */
|
||||
.max_unroll_iterations = 0,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user