From f5fe8d4f5cfaaaa22ec24395c85eba381bb70b04 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 27 Mar 2023 09:19:38 -0400 Subject: [PATCH] zink: break out a src region barrier check for reuse Part-of: --- src/gallium/drivers/zink/zink_context.c | 8 +++++++- src/gallium/drivers/zink/zink_context.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index ce11a44..c0410fa 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3935,6 +3935,12 @@ zink_check_unordered_transfer_access(struct zink_resource *res, unsigned level, return non_transfer_write || transfer_clobber; } +bool +zink_check_valid_buffer_src_access(struct zink_context *ctx, struct zink_resource *res, unsigned offset, unsigned size) +{ + return res->obj->access && util_ranges_intersect(&res->valid_buffer_range, offset, offset + size) && !unordered_res_exec(ctx, res, false); +} + void zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box) { @@ -4896,7 +4902,7 @@ zink_copy_buffer(struct zink_context *ctx, struct zink_resource *dst, struct zin struct pipe_box box = {(int)src_offset, 0, 0, (int)size, 0, 0}; /* must barrier if something wrote the valid buffer range */ - bool valid_write = src->obj->access && util_ranges_intersect(&src->valid_buffer_range, src_offset, src_offset + size) && !unordered_res_exec(ctx, src, false); + bool valid_write = zink_check_valid_buffer_src_access(ctx, src, src_offset, size); bool unordered_src = !valid_write && !zink_check_unordered_transfer_access(src, 0, &box); zink_screen(ctx->base.screen)->buffer_barrier(ctx, src, VK_ACCESS_TRANSFER_READ_BIT, 0); bool unordered_dst = zink_resource_buffer_transfer_dst_barrier(ctx, dst, dst_offset, size); diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 7ad99a5..d29296f 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -123,6 +123,8 @@ void zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline); bool zink_check_unordered_transfer_access(struct zink_resource *res, unsigned level, const struct pipe_box *box); +bool +zink_check_valid_buffer_src_access(struct zink_context *ctx, struct zink_resource *res, unsigned offset, unsigned size); void zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box); bool -- 2.7.4