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:
Alyssa Rosenzweig
2023-05-23 12:22:57 -04:00
committed by Marge Bot
parent ee62454fe3
commit b6e40edae6
2 changed files with 37 additions and 52 deletions

View File

@@ -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);

View File

@@ -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,
};