From b6e40edae6f1eee70924902e564fcd116500763d Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 23 May 2023 12:22:57 -0400 Subject: [PATCH] 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 Reviewed-by: Mike Blumenkrantz Part-of: --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 88 +++++++++------------- src/gallium/drivers/zink/zink_compiler.c | 1 + 2 files changed, 37 insertions(+), 52 deletions(-) diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index bbabdd1..a3d41d9 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -3527,6 +3527,40 @@ emit_is_helper_invocation(struct ntv_context *ctx, nir_intrinsic_instr *intr) } 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) { switch (intr->intrinsic) { @@ -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); diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 114b3ea..806b40c 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -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, }; -- 2.7.4