From 03030f87a175cdcbda64c87c8860d3effdbe71c7 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Aug 2020 11:28:58 -0400 Subject: [PATCH] zink: add helper for image resource barriers and avoid unnecessary barriers same as buffer barriers now Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/gallium/drivers/zink/zink_context.c | 12 ++++++++++++ src/gallium/drivers/zink/zink_context.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 2748062..0d1df53 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1075,12 +1075,24 @@ zink_resource_access_is_write(VkAccessFlags flags) return (flags & ALL_READ_ACCESS_FLAGS) != flags; } +bool +zink_resource_image_needs_barrier(struct zink_resource *res, VkImageLayout new_layout, VkPipelineStageFlags pipeline) +{ + if (!pipeline) + pipeline = pipeline_dst_stage(new_layout); + return res->layout != new_layout || (res->access_stage & pipeline) != pipeline || + (access_src_flags(res->layout) & access_dst_flags(new_layout)) != access_dst_flags(new_layout) || + (zink_resource_access_is_write(access_dst_flags(new_layout)) && util_bitcount(access_dst_flags(new_layout)) > 1); +} + void zink_resource_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkImageLayout new_layout, VkPipelineStageFlags pipeline) { if (!pipeline) pipeline = pipeline_dst_stage(new_layout); + if (!zink_resource_image_needs_barrier(res, new_layout, pipeline)) + return; VkImageSubresourceRange isr = { res->aspect, 0, VK_REMAINING_MIP_LEVELS, diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 22880e4..8a8142a 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -217,6 +217,8 @@ zink_resource_buffer_needs_barrier(struct zink_resource *res, VkAccessFlags flag void zink_resource_buffer_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline); +bool +zink_resource_image_needs_barrier(struct zink_resource *res, VkImageLayout new_layout, VkPipelineStageFlags pipeline); void zink_resource_barrier(VkCommandBuffer cmdbuf, struct zink_resource *res, VkImageLayout new_layout, VkPipelineStageFlags pipeline); -- 2.7.4