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

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Sep  8 15:25:01 2021 -0400

zink: move barrier info to resource object struct

this is a bit more accurate

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12845>

---

 src/gallium/drivers/zink/zink_batch.c    |  2 +-
 src/gallium/drivers/zink/zink_context.c  | 55 +++++++++++++++-----------------
 src/gallium/drivers/zink/zink_resource.c |  7 ++--
 src/gallium/drivers/zink/zink_resource.h |  8 ++---
 4 files changed, 33 insertions(+), 39 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_batch.c 
b/src/gallium/drivers/zink/zink_batch.c
index c3a559d0b37..10a165b93c2 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -489,7 +489,7 @@ copy_scanout(struct zink_batch_state *bs, struct 
zink_resource *res)
    zink_resource_image_barrier_init(&imb1, res, 
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, 
VK_PIPELINE_STAGE_TRANSFER_BIT);
    VKCTX(CmdPipelineBarrier)(
       bs->cmdbuf,
-      res->access_stage ? res->access_stage : 
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+      res->obj->access_stage ? res->obj->access_stage : 
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
       VK_PIPELINE_STAGE_TRANSFER_BIT,
       0,
       0, NULL,
diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index 31de0c61a5a..d00c47de64d 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -2254,9 +2254,9 @@ zink_resource_image_needs_barrier(struct zink_resource 
*res, VkImageLayout new_l
       pipeline = pipeline_dst_stage(new_layout);
    if (!flags)
       flags = access_dst_flags(new_layout);
-   return res->layout != new_layout || (res->access_stage & pipeline) != 
pipeline ||
-          (res->access & flags) != flags ||
-          zink_resource_access_is_write(res->access) ||
+   return res->layout != new_layout || (res->obj->access_stage & pipeline) != 
pipeline ||
+          (res->obj->access & flags) != flags ||
+          zink_resource_access_is_write(res->obj->access) ||
           zink_resource_access_is_write(flags);
 }
 
@@ -2276,7 +2276,7 @@ zink_resource_image_barrier_init(VkImageMemoryBarrier 
*imb, struct zink_resource
    *imb = (VkImageMemoryBarrier){
       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
       NULL,
-      res->access ? res->access : access_src_flags(res->layout),
+      res->obj->access ? res->obj->access : access_src_flags(res->layout),
       flags,
       res->layout,
       new_layout,
@@ -2316,12 +2316,12 @@ resource_check_defer_buffer_barrier(struct zink_context 
*ctx, struct zink_resour
 static inline VkCommandBuffer
 get_cmdbuf(struct zink_context *ctx, struct zink_resource *res)
 {
-   if ((res->access && !res->unordered_barrier) || !ctx->batch.in_rp) {
+   if ((res->obj->access && !res->obj->unordered_barrier) || 
!ctx->batch.in_rp) {
       zink_batch_no_rp(ctx);
-      res->unordered_barrier = false;
+      res->obj->unordered_barrier = false;
       return ctx->batch.state->cmdbuf;
    }
-   res->unordered_barrier = true;
+   res->obj->unordered_barrier = true;
    ctx->batch.state->has_barriers = true;
    return ctx->batch.state->barrier_cmdbuf;
 }
@@ -2375,7 +2375,7 @@ zink_resource_image_barrier(struct zink_context *ctx, 
struct zink_resource *res,
    }
    VKCTX(CmdPipelineBarrier)(
       cmdbuf,
-      res->access_stage ? res->access_stage : 
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+      res->obj->access_stage ? res->obj->access_stage : 
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
       pipeline,
       0,
       0, NULL,
@@ -2385,12 +2385,12 @@ zink_resource_image_barrier(struct zink_context *ctx, 
struct zink_resource *res,
 
    resource_check_defer_image_barrier(ctx, res, new_layout, pipeline);
 
-   if (res->unordered_barrier) {
-      res->access |= imb.dstAccessMask;
-      res->access_stage |= pipeline;
+   if (res->obj->unordered_barrier) {
+      res->obj->access |= imb.dstAccessMask;
+      res->obj->access_stage |= pipeline;
    } else {
-      res->access = imb.dstAccessMask;
-      res->access_stage = pipeline;
+      res->obj->access = imb.dstAccessMask;
+      res->obj->access_stage = pipeline;
    }
    res->layout = new_layout;
 }
@@ -2438,21 +2438,21 @@ pipeline_access_stage(VkAccessFlags flags)
 ALWAYS_INLINE static bool
 zink_resource_buffer_needs_barrier(struct zink_resource *res, VkAccessFlags 
flags, VkPipelineStageFlags pipeline)
 {
-   if (!res->access || !res->access_stage)
+   if (!res->obj->access || !res->obj->access_stage)
       return true;
    if (!pipeline)
       pipeline = pipeline_access_stage(flags);
-   return zink_resource_access_is_write(res->access) ||
+   return zink_resource_access_is_write(res->obj->access) ||
           zink_resource_access_is_write(flags) ||
-          ((res->access_stage & pipeline) != pipeline && !(res->access_stage & 
(pipeline - 1))) ||
-          (res->access & flags) != flags;
+          ((res->obj->access_stage & pipeline) != pipeline && 
!(res->obj->access_stage & (pipeline - 1))) ||
+          (res->obj->access & flags) != flags;
 }
 
 void
 zink_fake_buffer_barrier(struct zink_resource *res, VkAccessFlags flags, 
VkPipelineStageFlags pipeline)
 {
-   res->access = flags;
-   res->access_stage = pipeline;
+   res->obj->access = flags;
+   res->obj->access_stage = pipeline;
 }
 
 void
@@ -2466,13 +2466,13 @@ zink_resource_buffer_barrier(struct zink_context *ctx, 
struct zink_resource *res
 
    bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
    bmb.pNext = NULL;
-   bmb.srcAccessMask = res->access;
+   bmb.srcAccessMask = res->obj->access;
    bmb.dstAccessMask = flags;
    VkCommandBuffer cmdbuf = get_cmdbuf(ctx, res);
    /* only barrier if we're changing layout or doing something besides read -> 
read */
    VKCTX(CmdPipelineBarrier)(
       cmdbuf,
-      res->access_stage ? res->access_stage : 
pipeline_access_stage(res->access),
+      res->obj->access_stage ? res->obj->access_stage : 
pipeline_access_stage(res->obj->access),
       pipeline,
       0,
       1, &bmb,
@@ -2482,12 +2482,12 @@ zink_resource_buffer_barrier(struct zink_context *ctx, 
struct zink_resource *res
 
    resource_check_defer_buffer_barrier(ctx, res, pipeline);
 
-   if (res->unordered_barrier) {
-      res->access |= bmb.dstAccessMask;
-      res->access_stage |= pipeline;
+   if (res->obj->unordered_barrier) {
+      res->obj->access |= bmb.dstAccessMask;
+      res->obj->access_stage |= pipeline;
    } else {
-      res->access = bmb.dstAccessMask;
-      res->access_stage = pipeline;
+      res->obj->access = bmb.dstAccessMask;
+      res->obj->access_stage = pipeline;
    }
 }
 
@@ -3448,9 +3448,6 @@ zink_context_replace_buffer_storage(struct pipe_context 
*pctx, struct pipe_resou
    else
       zink_resource_object_reference(screen, &d->obj, NULL);
    d->obj = s->obj;
-   d->access = s->access;
-   d->access_stage = s->access_stage;
-   d->unordered_barrier = s->unordered_barrier;
    /* force counter buffer reset */
    d->so_valid = false;
    if (num_rebinds && rebind_buffer(ctx, d, rebind_mask, num_rebinds) != 
num_rebinds)
diff --git a/src/gallium/drivers/zink/zink_resource.c 
b/src/gallium/drivers/zink/zink_resource.c
index 460f946c5c0..9a1d55e23a1 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -988,9 +988,6 @@ invalidate_buffer(struct zink_context *ctx, struct 
zink_resource *res)
    /* this ref must be transferred before rebind or else BOOM */
    zink_batch_reference_resource_move(&ctx->batch, res);
    res->obj = new_obj;
-   res->access_stage = 0;
-   res->access = 0;
-   res->unordered_barrier = false;
    zink_resource_rebind(ctx, res);
    zink_descriptor_set_refs_clear(&old_obj->desc_set_refs, old_obj);
    return true;
@@ -1227,8 +1224,8 @@ zink_buffer_map(struct pipe_context *pctx,
          zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_RW);
       else
          zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE);
-      res->access = 0;
-      res->access_stage = 0;
+      res->obj->access = 0;
+      res->obj->access_stage = 0;
    }
 
    if (!ptr) {
diff --git a/src/gallium/drivers/zink/zink_resource.h 
b/src/gallium/drivers/zink/zink_resource.h
index c39f6d08deb..98bc71129bb 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -54,6 +54,10 @@ struct mem_key {
 struct zink_resource_object {
    struct pipe_reference reference;
 
+   VkPipelineStageFlagBits access_stage;
+   VkAccessFlags access;
+   bool unordered_barrier;
+
    unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges 
during batch use
    struct zink_descriptor_refs desc_set_refs;
 
@@ -89,10 +93,6 @@ struct zink_resource {
 
    enum pipe_format internal_format:16;
 
-   VkPipelineStageFlagBits access_stage;
-   VkAccessFlags access;
-   bool unordered_barrier;
-
    struct zink_resource_object *obj;
    struct zink_resource_object *scanout_obj; //TODO: remove for wsi
    bool scanout_obj_init;

Reply via email to