Mesa (main): zink: use tracked barrier info for generated barriers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 24 02:14:48 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon Jun 20 11:25:43 2022 -0400

zink: use tracked barrier info for generated barriers

this should be simpler to read through and maintain while providing
the same results as well as some possible perf and compile time improvements

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17192>

---

 src/gallium/drivers/zink/zink_draw.cpp | 80 ++--------------------------------
 1 file changed, 3 insertions(+), 77 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index eca1b2a7d83..dff057dc5c2 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -323,31 +323,6 @@ 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]) {
-         pipeline |= zink_pipeline_flags_from_pipe_stage((enum pipe_shader_type)i);
-      }
-   }
-   return pipeline;
-}
-
 static void
 update_barriers(struct zink_context *ctx, bool is_compute,
                 struct pipe_resource *index, struct pipe_resource *indirect, struct pipe_resource *indirect_draw_count)
@@ -359,63 +334,14 @@ update_barriers(struct zink_context *ctx, bool is_compute,
    ctx->need_barriers[is_compute] = &ctx->update_barriers[is_compute][ctx->barrier_set_idx[is_compute]];
    set_foreach(need_barriers, he) {
       struct zink_resource *res = (struct zink_resource *)he->key;
-      bool is_buffer = res->obj->is_buffer;
-      VkPipelineStageFlags pipeline = 0;
-      VkAccessFlags access = 0;
-
-      if (res == zink_resource(index)) {
-         access |= VK_ACCESS_INDEX_READ_BIT;
-         pipeline |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
-      } else if (res == zink_resource(indirect) || res == zink_resource(indirect_draw_count)) {
-         access |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
-         pipeline |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
-      }
       if (res->bind_count[is_compute]) {
-         if (res->write_bind_count[is_compute])
-            access |= VK_ACCESS_SHADER_WRITE_BIT;
-         if (is_buffer) {
-            unsigned bind_count = res->bind_count[is_compute];
-            if (res->ubo_bind_count[is_compute])
-               access |= VK_ACCESS_UNIFORM_READ_BIT;
-            bind_count -= res->ubo_bind_count[is_compute];
-            if (!is_compute && res->vbo_bind_mask) {
-               access |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
-               pipeline |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
-               bind_count -= res->vbo_bind_count;
-            }
-            if (bind_count)
-               access |= VK_ACCESS_SHADER_READ_BIT;
-            if (!is_compute) {
-               pipeline |= find_pipeline_bits(res->ssbo_bind_mask);
-
-               if (res->ubo_bind_count[0] && (pipeline & GFX_SHADER_BITS) != GFX_SHADER_BITS)
-                  pipeline |= find_pipeline_bits(res->ubo_bind_mask);
-            }
-         } else {
-            if (res->bind_count[is_compute] != res->write_bind_count[is_compute])
-               access |= VK_ACCESS_SHADER_READ_BIT;
-            if (res->write_bind_count[is_compute])
-               access |= VK_ACCESS_SHADER_WRITE_BIT;
-         }
-         if (is_compute)
-            pipeline = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
-         else {
-            VkPipelineStageFlags gfx_stages = pipeline & ~(VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT);
-            /* images always need gfx stages, and buffers need gfx stages if non-vbo binds exist */
-            bool needs_stages = !is_buffer || (res->bind_count[0] - res->vbo_bind_count > 0);
-            if (gfx_stages != GFX_SHADER_BITS && needs_stages) {
-               gfx_stages |= find_pipeline_bits(res->sampler_binds);
-               if (gfx_stages != GFX_SHADER_BITS) //must be a shader image
-                  gfx_stages |= find_pipeline_bits(res->image_binds);
-               pipeline |= gfx_stages;
-            }
-         }
+         VkPipelineStageFlagBits pipeline = is_compute ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : res->gfx_barrier;
          if (res->base.b.target == PIPE_BUFFER)
-            zink_resource_buffer_barrier(ctx, res, access, pipeline);
+            zink_resource_buffer_barrier(ctx, res, res->barrier_access[is_compute], pipeline);
          else {
             VkImageLayout layout = zink_descriptor_util_image_layout_eval(ctx, res, is_compute);
             if (layout != res->layout)
-               zink_resource_image_barrier(ctx, res, layout, access, pipeline);
+               zink_resource_image_barrier(ctx, res, layout, res->barrier_access[is_compute], pipeline);
          }
          /* always barrier on draw if this resource has either multiple image write binds or
           * image write binds and image read binds



More information about the mesa-commit mailing list