zink: don't short-circuit gfx stage finding during barrier generation
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Sat, 18 Jun 2022 13:48:51 +0000 (09:48 -0400)
committerMarge Bot <emma+marge@anholt.net>
Mon, 20 Jun 2022 00:50:48 +0000 (00:50 +0000)
according to spec, all stages must be specified, not just the first one

Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-By: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17111>

src/gallium/drivers/zink/zink_draw.cpp

index a8cbd84..eca1b2a 100644 (file)
@@ -323,15 +323,29 @@ draw(struct zink_context *ctx,
    }
 }
 
+/*
+   If a synchronization command includes a source stage mask, its first synchronization scope only
+   includes execution of the pipeline stages specified in that mask, and its first access scope only
+   includes memory accesses performed by pipeline stages specified in that mask.
+
+   If a synchronization command includes a destination stage mask, its second synchronization scope
+   only includes execution of the pipeline stages specified in that mask, and its second access scope
+   only includes memory access performed by pipeline stages specified in that mask.
+
+   - Chapter 7. Synchronization and Cache Control
+
+ * thus, all stages must be added to ensure accurate synchronization
+ */
 ALWAYS_INLINE static VkPipelineStageFlags
 find_pipeline_bits(uint32_t *mask)
 {
+   VkPipelineStageFlags pipeline = 0;
    for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++) {
       if (mask[i]) {
-         return zink_pipeline_flags_from_pipe_stage((enum pipe_shader_type)i);
+         pipeline |= zink_pipeline_flags_from_pipe_stage((enum pipe_shader_type)i);
       }
    }
-   return 0;
+   return pipeline;
 }
 
 static void