Module: Mesa Branch: main Commit: 4ad64552b8904a1c0fe0754ab771efd2bb860149 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4ad64552b8904a1c0fe0754ab771efd2bb860149
Author: Mike Blumenkrantz <[email protected]> Date: Thu Feb 23 08:30:09 2023 -0500 zink: add a util function for optimizing TRANSFER_DST image barriers Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21397> --- src/gallium/drivers/zink/zink_context.c | 9 +++++++++ src/gallium/drivers/zink/zink_context.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 0eee4da136b..a1fe7eecf39 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3742,6 +3742,15 @@ zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res zink_resource_copies_reset(res); } +void +zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box) +{ + /* skip TRANSFER_DST barrier if no intersection from previous copies */ + if (res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || zink_resource_copy_box_intersects(res, level, box)) + 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); + zink_resource_copy_box_add(res, level, box); + +} VkPipelineStageFlags zink_pipeline_flags_from_stage(VkShaderStageFlagBits stage) diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 3f2f16bb2b9..0adaa4887e9 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -115,6 +115,8 @@ zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res bool zink_resource_needs_barrier(struct zink_resource *res, VkImageLayout layout, VkAccessFlags flags, VkPipelineStageFlags pipeline); void +zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box); +void zink_update_descriptor_refs(struct zink_context *ctx, bool compute); void zink_init_vk_sample_locations(struct zink_context *ctx, VkSampleLocationsInfoEXT *loc);
