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

Author: Mike Blumenkrantz <[email protected]>
Date:   Sat Mar 18 10:14:41 2023 -0400

zink: add a function for applying u_blitter barriers

this handles transitions for a sampler_view src -> framebuffer dst
operation

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

---

 src/gallium/drivers/zink/zink_blit.c    | 48 +++++++++++++++++++++++++++++++++
 src/gallium/drivers/zink/zink_context.h |  2 ++
 2 files changed, 50 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_blit.c 
b/src/gallium/drivers/zink/zink_blit.c
index 1dd40dd71d2..83a35738a5a 100644
--- a/src/gallium/drivers/zink/zink_blit.c
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -437,6 +437,54 @@ zink_blit_begin(struct zink_context *ctx, enum 
zink_blit_flags flags)
       zink_stop_conditional_render(ctx);
 }
 
+void
+zink_blit_barriers(struct zink_context *ctx, struct zink_resource *src, struct 
zink_resource *dst, bool whole_dst)
+{
+   struct zink_screen *screen = zink_screen(ctx->base.screen);
+   if (src && zink_is_swapchain(src)) {
+      if (!zink_kopper_acquire(ctx, src, UINT64_MAX))
+         return;
+   } else if (dst && zink_is_swapchain(dst)) {
+      if (!zink_kopper_acquire(ctx, dst, UINT64_MAX))
+         return;
+   }
+
+   VkAccessFlagBits flags;
+   VkPipelineStageFlagBits pipeline;
+   if (util_format_is_depth_or_stencil(dst->base.b.format)) {
+      flags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+      if (!whole_dst)
+         flags |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+      pipeline = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | 
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
+   } else {
+      flags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+      if (!whole_dst)
+         flags |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+      pipeline = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+   }
+   if (src == dst) {
+      VkImageLayout layout = 
zink_screen(ctx->base.screen)->info.have_EXT_attachment_feedback_loop_layout ?
+                             
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT :
+                             VK_IMAGE_LAYOUT_GENERAL;
+      screen->image_barrier(ctx, src, layout, VK_ACCESS_SHADER_READ_BIT | 
flags, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | pipeline);
+   } else {
+      if (src) {
+         VkImageLayout layout = 
util_format_is_depth_or_stencil(src->base.b.format) &&
+                                src->obj->vkusage & 
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ?
+                                
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL :
+                                VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+         screen->image_barrier(ctx, src, layout,
+                              VK_ACCESS_SHADER_READ_BIT, 
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
+         src->obj->unordered_read = false;
+      }
+      VkImageLayout layout = 
util_format_is_depth_or_stencil(dst->base.b.format) ?
+                           VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
+                           VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+      screen->image_barrier(ctx, dst, layout, flags, pipeline);
+   }
+   dst->obj->unordered_read = dst->obj->unordered_write = false;
+}
+
 bool
 zink_blit_region_fills(struct u_rect region, unsigned width, unsigned height)
 {
diff --git a/src/gallium/drivers/zink/zink_context.h 
b/src/gallium/drivers/zink/zink_context.h
index 25cd1d6fa28..065e85f4ebe 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -199,6 +199,8 @@ zink_context_query_init(struct pipe_context *ctx);
 
 void
 zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags);
+void
+zink_blit_barriers(struct zink_context *ctx, struct zink_resource *src, struct 
zink_resource *dst, bool whole_dst);
 
 void
 zink_blit(struct pipe_context *pctx,

Reply via email to