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

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Feb 20 11:40:00 2023 -0500

zink: skip buffer barriers for ACCESS_NONE -> ACCESS_READ / ACCESS_WRITE

these do nothing and may cause unnecessary driver flushing

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21427>

---

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

diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index bcc7910bac1..ef9473a847b 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -3851,72 +3851,74 @@ zink_resource_buffer_needs_barrier(struct zink_resource 
*res, VkAccessFlags flag
 void
 zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource 
*res, VkAccessFlags flags, VkPipelineStageFlags pipeline)
 {
-   VkMemoryBarrier bmb;
    if (!pipeline)
       pipeline = pipeline_access_stage(flags);
    if (!zink_resource_buffer_needs_barrier(res, flags, pipeline))
       return;
 
-   bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
-   bmb.pNext = NULL;
-   bmb.srcAccessMask = res->obj->access;
-   bmb.dstAccessMask = flags;
-   if (!res->obj->access_stage)
-      bmb.srcAccessMask = 0;
-   bool is_write = zink_resource_access_is_write(flags);
-   VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : 
zink_get_cmdbuf(ctx, res, NULL);
-   /* only barrier if we're changing layout or doing something besides read -> 
read */
-   VKCTX(CmdPipelineBarrier)(
-      cmdbuf,
-      res->obj->access_stage ? res->obj->access_stage : 
pipeline_access_stage(res->obj->access),
-      pipeline,
-      0,
-      1, &bmb,
-      0, NULL,
-      0, NULL
-   );
+   if (res->obj->access) {
+      VkMemoryBarrier bmb;
+      bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+      bmb.pNext = NULL;
+      bmb.srcAccessMask = res->obj->access;
+      bmb.dstAccessMask = flags;
+      assert(res->obj->access_stage);
+      bool is_write = zink_resource_access_is_write(flags);
+      VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : 
zink_get_cmdbuf(ctx, res, NULL);
+
+      VKCTX(CmdPipelineBarrier)(
+         cmdbuf,
+         res->obj->access_stage ? res->obj->access_stage : 
pipeline_access_stage(res->obj->access),
+         pipeline,
+         0,
+         1, &bmb,
+         0, NULL,
+         0, NULL
+      );
+   }
 
    resource_check_defer_buffer_barrier(ctx, res, pipeline);
 
-   res->obj->access = bmb.dstAccessMask;
+   res->obj->access = flags;
    res->obj->access_stage = pipeline;
 }
 
 void
 zink_resource_buffer_barrier2(struct zink_context *ctx, struct zink_resource 
*res, VkAccessFlags flags, VkPipelineStageFlags pipeline)
 {
-   VkMemoryBarrier2 bmb;
    if (!pipeline)
       pipeline = pipeline_access_stage(flags);
    if (!zink_resource_buffer_needs_barrier(res, flags, pipeline))
       return;
-   bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
-   bmb.pNext = NULL;
-   bmb.srcStageMask = res->obj->access_stage ? res->obj->access_stage : 
pipeline_access_stage(res->obj->access);
-   bmb.srcAccessMask = res->obj->access;
-   bmb.dstStageMask = pipeline;
-   bmb.dstAccessMask = flags;
-   if (!res->obj->access_stage)
-      bmb.srcAccessMask = 0;
-   bool is_write = zink_resource_access_is_write(flags);
-   VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : 
zink_get_cmdbuf(ctx, res, NULL);
-   VkDependencyInfo dep = {
-      VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
-      NULL,
-      0,
-      1,
-      &bmb,
-      0,
-      NULL,
-      0,
-      NULL
-   };
-   /* only barrier if we're changing layout or doing something besides read -> 
read */
-   VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep);
+
+   if (res->obj->access) {
+      VkMemoryBarrier2 bmb;
+      bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
+      bmb.pNext = NULL;
+      bmb.srcStageMask = res->obj->access_stage ? res->obj->access_stage : 
pipeline_access_stage(res->obj->access);
+      bmb.srcAccessMask = res->obj->access;
+      bmb.dstStageMask = pipeline;
+      bmb.dstAccessMask = flags;
+      assert(res->obj->access_stage);
+      bool is_write = zink_resource_access_is_write(flags);
+      VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : 
zink_get_cmdbuf(ctx, res, NULL);
+      VkDependencyInfo dep = {
+         VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
+         NULL,
+         0,
+         1,
+         &bmb,
+         0,
+         NULL,
+         0,
+         NULL
+      };
+      VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep);
+   }
 
    resource_check_defer_buffer_barrier(ctx, res, pipeline);
 
-   res->obj->access = bmb.dstAccessMask;
+   res->obj->access = flags;
    res->obj->access_stage = pipeline;
 }
 

Reply via email to