Module: Mesa
Branch: main
Commit: 564519dc84c527a4f6e952a5f0374008d26c5ec0
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=564519dc84c527a4f6e952a5f0374008d26c5ec0

Author: Mike Blumenkrantz <michael.blumenkra...@gmail.com>
Date:   Wed Apr  7 11:00:06 2021 -0400

zink: rework memory_barrier hook again (third time's the charm)

this improves granularity for the barriers and is more in line with the
spec for glMemoryBarrier

Reviewed-by: Dave Airlie <airl...@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10706>

---

 src/gallium/drivers/zink/zink_context.c | 47 +++++++++++++++------------------
 1 file changed, 22 insertions(+), 25 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index 5b4b7dadbb9..6b180d932fb 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1978,14 +1978,14 @@ zink_texture_barrier(struct pipe_context *pctx, 
unsigned flags)
 }
 
 static inline void
-mem_barrier(struct zink_batch *batch, VkPipelineStageFlags stage, 
VkAccessFlags src, VkAccessFlags dst)
+mem_barrier(struct zink_batch *batch, VkPipelineStageFlags src_stage, 
VkPipelineStageFlags dst_stage, VkAccessFlags src, VkAccessFlags dst)
 {
    VkMemoryBarrier mb;
    mb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
    mb.pNext = NULL;
    mb.srcAccessMask = src;
    mb.dstAccessMask = dst;
-   vkCmdPipelineBarrier(batch->state->cmdbuf, stage, stage, 0, 1, &mb, 0, 
NULL, 0, NULL);
+   vkCmdPipelineBarrier(batch->state->cmdbuf, src_stage, dst_stage, 0, 1, &mb, 
0, NULL, 0, NULL);
 }
 
 static void
@@ -2010,47 +2010,44 @@ zink_memory_barrier(struct pipe_context *pctx, unsigned 
flags)
       /* TODO: this should flush all persistent buffers in use as I think */
    }
 
-   if (flags & (PIPE_BARRIER_SHADER_BUFFER | PIPE_BARRIER_TEXTURE |
-                PIPE_BARRIER_IMAGE | PIPE_BARRIER_GLOBAL_BUFFER))
-      mem_barrier(batch, all_flags, VK_ACCESS_SHADER_READ_BIT | 
VK_ACCESS_SHADER_WRITE_BIT,
-                                    VK_ACCESS_SHADER_READ_BIT | 
VK_ACCESS_SHADER_WRITE_BIT);
+   if (flags & (PIPE_BARRIER_TEXTURE | PIPE_BARRIER_SHADER_BUFFER | 
PIPE_BARRIER_IMAGE))
+      mem_barrier(batch, all_flags, all_flags, VK_ACCESS_SHADER_WRITE_BIT, 
VK_ACCESS_SHADER_READ_BIT);
 
-   if (flags & (PIPE_BARRIER_QUERY_BUFFER | PIPE_BARRIER_IMAGE))
-      mem_barrier(batch, VK_PIPELINE_STAGE_TRANSFER_BIT,
-                  VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
-                  VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT);
+   if (flags & PIPE_BARRIER_QUERY_BUFFER)
+      mem_barrier(batch, all_flags, VK_PIPELINE_STAGE_TRANSFER_BIT,
+                  VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT | 
VK_ACCESS_TRANSFER_READ_BIT);
 
    if (flags & PIPE_BARRIER_VERTEX_BUFFER)
-      mem_barrier(batch, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
-                  VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
+      mem_barrier(batch, all_flags, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
+                  VK_ACCESS_SHADER_WRITE_BIT,
                   VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT);
 
    if (flags & PIPE_BARRIER_INDEX_BUFFER)
-      mem_barrier(batch, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
-                  VK_ACCESS_INDEX_READ_BIT,
+      mem_barrier(batch, all_flags, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
+                  VK_ACCESS_SHADER_WRITE_BIT,
                   VK_ACCESS_INDEX_READ_BIT);
 
-   if (flags & (PIPE_BARRIER_CONSTANT_BUFFER | PIPE_BARRIER_IMAGE))
-      mem_barrier(batch, all_flags,
-                  VK_ACCESS_UNIFORM_READ_BIT,
+   if (flags & PIPE_BARRIER_CONSTANT_BUFFER)
+      mem_barrier(batch, all_flags, all_flags,
+                  VK_ACCESS_SHADER_WRITE_BIT,
                   VK_ACCESS_UNIFORM_READ_BIT);
 
    if (flags & PIPE_BARRIER_INDIRECT_BUFFER)
-      mem_barrier(batch, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
-                  VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
+      mem_barrier(batch, all_flags, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
+                  VK_ACCESS_SHADER_WRITE_BIT,
                   VK_ACCESS_INDIRECT_COMMAND_READ_BIT);
 
    if (flags & PIPE_BARRIER_FRAMEBUFFER) {
-      mem_barrier(batch, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-                  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-                  VK_ACCESS_COLOR_ATTACHMENT_READ_BIT);
-      mem_barrier(batch, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
+      mem_barrier(batch, all_flags, 
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+                  VK_ACCESS_SHADER_WRITE_BIT,
+                  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | 
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT);
+      mem_barrier(batch, all_flags, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
                   VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
                   VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT);
    }
    if (flags & PIPE_BARRIER_STREAMOUT_BUFFER)
-      mem_barrier(batch, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
-                  VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
+      mem_barrier(batch, all_flags,
+                  VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | 
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
                   VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT |
                   VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
                   VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to