Module: Mesa Branch: main Commit: 4c978d54458c04d9eaa49fc03183d70785bde694 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4c978d54458c04d9eaa49fc03183d70785bde694
Author: Mike Blumenkrantz <[email protected]> Date: Mon Feb 20 11:40:00 2023 -0500 zink: skip buffer barriers for ACCESS_NONE -> ACCESS_READ / ACCESS_WRITE these do nothing and may cause unnecessary driver flushing Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21427> --- src/gallium/drivers/zink/zink_context.c | 92 +++++++++++++++++---------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index bcc7910bac1..ef9473a847b 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3851,72 +3851,74 @@ zink_resource_buffer_needs_barrier(struct zink_resource *res, VkAccessFlags flag void zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline) { - VkMemoryBarrier bmb; if (!pipeline) pipeline = pipeline_access_stage(flags); if (!zink_resource_buffer_needs_barrier(res, flags, pipeline)) return; - bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - bmb.pNext = NULL; - bmb.srcAccessMask = res->obj->access; - bmb.dstAccessMask = flags; - if (!res->obj->access_stage) - bmb.srcAccessMask = 0; - bool is_write = zink_resource_access_is_write(flags); - VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : zink_get_cmdbuf(ctx, res, NULL); - /* only barrier if we're changing layout or doing something besides read -> read */ - VKCTX(CmdPipelineBarrier)( - cmdbuf, - res->obj->access_stage ? res->obj->access_stage : pipeline_access_stage(res->obj->access), - pipeline, - 0, - 1, &bmb, - 0, NULL, - 0, NULL - ); + if (res->obj->access) { + VkMemoryBarrier bmb; + bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + bmb.pNext = NULL; + bmb.srcAccessMask = res->obj->access; + bmb.dstAccessMask = flags; + assert(res->obj->access_stage); + bool is_write = zink_resource_access_is_write(flags); + VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : zink_get_cmdbuf(ctx, res, NULL); + + VKCTX(CmdPipelineBarrier)( + cmdbuf, + res->obj->access_stage ? res->obj->access_stage : pipeline_access_stage(res->obj->access), + pipeline, + 0, + 1, &bmb, + 0, NULL, + 0, NULL + ); + } resource_check_defer_buffer_barrier(ctx, res, pipeline); - res->obj->access = bmb.dstAccessMask; + res->obj->access = flags; res->obj->access_stage = pipeline; } void zink_resource_buffer_barrier2(struct zink_context *ctx, struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline) { - VkMemoryBarrier2 bmb; if (!pipeline) pipeline = pipeline_access_stage(flags); if (!zink_resource_buffer_needs_barrier(res, flags, pipeline)) return; - bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2; - bmb.pNext = NULL; - bmb.srcStageMask = res->obj->access_stage ? res->obj->access_stage : pipeline_access_stage(res->obj->access); - bmb.srcAccessMask = res->obj->access; - bmb.dstStageMask = pipeline; - bmb.dstAccessMask = flags; - if (!res->obj->access_stage) - bmb.srcAccessMask = 0; - bool is_write = zink_resource_access_is_write(flags); - VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : zink_get_cmdbuf(ctx, res, NULL); - VkDependencyInfo dep = { - VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - NULL, - 0, - 1, - &bmb, - 0, - NULL, - 0, - NULL - }; - /* only barrier if we're changing layout or doing something besides read -> read */ - VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep); + + if (res->obj->access) { + VkMemoryBarrier2 bmb; + bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2; + bmb.pNext = NULL; + bmb.srcStageMask = res->obj->access_stage ? res->obj->access_stage : pipeline_access_stage(res->obj->access); + bmb.srcAccessMask = res->obj->access; + bmb.dstStageMask = pipeline; + bmb.dstAccessMask = flags; + assert(res->obj->access_stage); + bool is_write = zink_resource_access_is_write(flags); + VkCommandBuffer cmdbuf = is_write ? zink_get_cmdbuf(ctx, NULL, res) : zink_get_cmdbuf(ctx, res, NULL); + VkDependencyInfo dep = { + VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + NULL, + 0, + 1, + &bmb, + 0, + NULL, + 0, + NULL + }; + VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep); + } resource_check_defer_buffer_barrier(ctx, res, pipeline); - res->obj->access = bmb.dstAccessMask; + res->obj->access = flags; res->obj->access_stage = pipeline; }
