From: Mike Blumenkrantz Date: Mon, 27 Feb 2023 21:41:14 +0000 (-0500) Subject: zink: track the last write access for resources X-Git-Tag: upstream/23.3.3~11982 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=54f3c589d535c5f024abc9c785531a02029423d3;p=platform%2Fupstream%2Fmesa.git zink: track the last write access for resources this enables some optimization Part-of: --- diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 76d66a1..97f876a 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -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); diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index e964552..d04f0df 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -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; } diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 09353d6..c0ef489 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -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) { diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index e59a8fc..1d1f0bf 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -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;