zink: Switch to scoped barriers
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 23 May 2023 16:22:57 +0000 (12:22 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 25 May 2023 11:43:39 +0000 (11:43 +0000)
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>

src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
src/gallium/drivers/zink/zink_compiler.c

index bbabdd1..a3d41d9 100644 (file)
@@ -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);
index 114b3ea..806b40c 100644 (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,
    };