zink: add helper for image resource barriers and avoid unnecessary barriers

same as buffer barriers now

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8945>
This commit is contained in:
Mike Blumenkrantz 2020-08-19 11:28:58 -04:00 committed by Marge Bot
parent b00f407996
commit 03030f87a1
2 changed files with 14 additions and 0 deletions

View file

@ -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,

View file

@ -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);