zink: track the last write access for resources
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 27 Feb 2023 21:41:14 +0000 (16:41 -0500)
committerMarge Bot <emma+marge@anholt.net>
Wed, 8 Mar 2023 03:50:33 +0000 (03:50 +0000)
this enables some optimization

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

src/gallium/drivers/zink/zink_batch.c
src/gallium/drivers/zink/zink_context.c
src/gallium/drivers/zink/zink_resource.c
src/gallium/drivers/zink/zink_types.h

index 76d66a1..97f876a 100644 (file)
@@ -31,6 +31,7 @@ reset_obj(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_r
       obj->unordered_read = true;
       obj->unordered_write = true;
       obj->access = 0;
+      obj->last_write = 0;
       obj->access_stage = 0;
       /* also prune dead view objects */
       simple_mtx_lock(&obj->view_lock);
index e964552..d04f0df 100644 (file)
@@ -3761,6 +3761,9 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res,
 
    resource_check_defer_image_barrier(ctx, res, new_layout, pipeline);
 
+   if (is_write)
+      res->obj->last_write = imb.dstAccessMask;
+
    res->obj->access = imb.dstAccessMask;
    res->obj->access_stage = pipeline;
    res->layout = new_layout;
@@ -3808,6 +3811,9 @@ zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res
 
    resource_check_defer_image_barrier(ctx, res, new_layout, pipeline);
 
+   if (is_write)
+      res->obj->last_write = imb.dstAccessMask;
+
    res->obj->access = imb.dstAccessMask;
    res->obj->access_stage = pipeline;
    res->layout = new_layout;
@@ -3823,6 +3829,7 @@ zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_r
       zink_screen(ctx->base.screen)->image_barrier(ctx, res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
    } else {
       res->obj->access = VK_ACCESS_TRANSFER_WRITE_BIT;
+      res->obj->last_write = VK_ACCESS_TRANSFER_WRITE_BIT;
       res->obj->access_stage = VK_PIPELINE_STAGE_TRANSFER_BIT;
    }
    zink_resource_copy_box_add(res, level, box);
@@ -3927,6 +3934,9 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res
 
    resource_check_defer_buffer_barrier(ctx, res, pipeline);
 
+   if (is_write)
+      res->obj->last_write = flags;
+
    res->obj->access = flags;
    res->obj->access_stage = pipeline;
 }
@@ -3981,6 +3991,9 @@ zink_resource_buffer_barrier2(struct zink_context *ctx, struct zink_resource *re
 
    resource_check_defer_buffer_barrier(ctx, res, pipeline);
 
+   if (is_write)
+      res->obj->last_write = flags;
+
    res->obj->access = flags;
    res->obj->access_stage = pipeline;
 }
index 09353d6..c0ef489 100644 (file)
@@ -1938,6 +1938,7 @@ overwrite:
          zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE);
       res->obj->access = 0;
       res->obj->access_stage = 0;
+      res->obj->last_write = 0;
    }
 
    if (!ptr) {
index e59a8fc..1d1f0bf 100644 (file)
@@ -1114,7 +1114,9 @@ struct zink_resource_object {
    struct pipe_reference reference;
 
    VkPipelineStageFlagBits access_stage;
-   VkAccessFlags access;
+   VkAccessFlagBits access;
+   VkAccessFlagBits last_write;
+
    bool unordered_read;
    bool unordered_write;
    bool copies_valid;