From f889bece4637928ae07d518fba3dd211de07d41e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 18 Jun 2022 09:48:51 -0400 Subject: [PATCH] zink: don't short-circuit gfx stage finding during barrier generation according to spec, all stages must be specified, not just the first one Acked-by: Dave Airlie Reviewed-By: Tatsuyuki Ishi Part-of: --- src/gallium/drivers/zink/zink_draw.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index a8cbd848d51..eca1b2a7d83 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -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