From 4147dbdb7e9f5d094d6fbd060d18a817a36b8a30 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 21 Mar 2023 10:54:16 -0400 Subject: [PATCH] zink: use c++ template to deduplicate image barrier functions Part-of: --- src/gallium/drivers/zink/zink_screen.c | 5 - src/gallium/drivers/zink/zink_synchronization.cpp | 130 +++++++++------------- 2 files changed, 53 insertions(+), 82 deletions(-) diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 44ce9cc..063ee27 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -3032,11 +3032,6 @@ zink_internal_create_screen(const struct pipe_screen_config *config) glsl_type_singleton_init_or_ref(); zink_synchronization_init(screen); - if (screen->info.have_vulkan13 || screen->info.have_KHR_synchronization2) { - screen->image_barrier = zink_resource_image_barrier2; - } else { - screen->image_barrier = zink_resource_image_barrier; - } zink_init_screen_pipeline_libs(screen); diff --git a/src/gallium/drivers/zink/zink_synchronization.cpp b/src/gallium/drivers/zink/zink_synchronization.cpp index 8a11a39..a75f197 100644 --- a/src/gallium/drivers/zink/zink_synchronization.cpp +++ b/src/gallium/drivers/zink/zink_synchronization.cpp @@ -312,11 +312,10 @@ resource_check_defer_image_barrier(struct zink_context *ctx, struct zink_resourc _mesa_set_add(ctx->need_barriers[is_compute], res); } +template void -zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res, - VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline) +zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline) { - VkImageMemoryBarrier imb; if (!pipeline) pipeline = pipeline_dst_stage(new_layout); if (!flags) @@ -324,92 +323,67 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res, if (!res->obj->needs_zs_evaluate && !zink_resource_image_needs_barrier(res, new_layout, flags, pipeline)) return; - zink_resource_image_barrier_init(&imb, res, new_layout, flags, pipeline); 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); assert(new_layout); - enum zink_resource_access rw = is_write ? ZINK_RESOURCE_ACCESS_RW : ZINK_RESOURCE_ACCESS_WRITE; - if (!res->obj->access_stage || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw)) - imb.srcAccessMask = 0; - if (res->obj->needs_zs_evaluate) - imb.pNext = &res->obj->zs_evaluate; - res->obj->needs_zs_evaluate = false; - if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { - imb.srcQueueFamilyIndex = res->queue; - imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; - res->queue = VK_QUEUE_FAMILY_IGNORED; - } bool marker = zink_cmd_debug_marker_begin(ctx, cmdbuf, "image_barrier(%s->%s)", vk_ImageLayout_to_str(res->layout), vk_ImageLayout_to_str(new_layout)); - VKCTX(CmdPipelineBarrier)( - cmdbuf, - res->obj->access_stage ? res->obj->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - pipeline, - 0, - 0, NULL, - 0, NULL, - 1, &imb - ); - zink_cmd_debug_marker_end(ctx, cmdbuf, marker); - - resource_check_defer_image_barrier(ctx, res, new_layout, pipeline); - - if (is_write) - res->obj->last_write = (VkAccessFlags)imb.dstAccessMask; - - res->obj->access = (VkAccessFlags)imb.dstAccessMask; - res->obj->access_stage = pipeline; - res->layout = new_layout; - if (new_layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) - zink_resource_copies_reset(res); -} - -void -zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res, VkImageLayout new_layout, VkAccessFlags flags, VkPipelineStageFlags pipeline) -{ - VkImageMemoryBarrier2 imb; - if (!pipeline) - pipeline = pipeline_dst_stage(new_layout); - if (!flags) - flags = access_dst_flags(new_layout); - - if (!res->obj->needs_zs_evaluate && !zink_resource_image_needs_barrier(res, new_layout, flags, pipeline)) - return; - zink_resource_image_barrier2_init(&imb, res, new_layout, flags, pipeline); - 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); - assert(new_layout); enum zink_resource_access rw = is_write ? ZINK_RESOURCE_ACCESS_RW : ZINK_RESOURCE_ACCESS_WRITE; - if (!res->obj->access_stage || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw)) - imb.srcAccessMask = 0; - if (res->obj->needs_zs_evaluate) - imb.pNext = &res->obj->zs_evaluate; - res->obj->needs_zs_evaluate = false; - if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { - imb.srcQueueFamilyIndex = res->queue; - imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; - res->queue = VK_QUEUE_FAMILY_IGNORED; + if (HAS_SYNC2) { + VkImageMemoryBarrier2 imb; + zink_resource_image_barrier2_init(&imb, res, new_layout, flags, pipeline); + if (!res->obj->access_stage || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw)) + imb.srcAccessMask = 0; + if (res->obj->needs_zs_evaluate) + imb.pNext = &res->obj->zs_evaluate; + res->obj->needs_zs_evaluate = false; + if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { + imb.srcQueueFamilyIndex = res->queue; + imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; + res->queue = VK_QUEUE_FAMILY_IGNORED; + } + VkDependencyInfo dep = { + VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + NULL, + 0, + 0, + NULL, + 0, + NULL, + 1, + &imb + }; + VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep); + } else { + VkImageMemoryBarrier imb; + zink_resource_image_barrier_init(&imb, res, new_layout, flags, pipeline); + if (!res->obj->access_stage || zink_resource_usage_check_completion_fast(zink_screen(ctx->base.screen), res, rw)) + imb.srcAccessMask = 0; + if (res->obj->needs_zs_evaluate) + imb.pNext = &res->obj->zs_evaluate; + res->obj->needs_zs_evaluate = false; + if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { + imb.srcQueueFamilyIndex = res->queue; + imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; + res->queue = VK_QUEUE_FAMILY_IGNORED; + } + VKCTX(CmdPipelineBarrier)( + cmdbuf, + res->obj->access_stage ? res->obj->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + pipeline, + 0, + 0, NULL, + 0, NULL, + 1, &imb + ); } - VkDependencyInfo dep = { - VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - NULL, - 0, - 0, - NULL, - 0, - NULL, - 1, - &imb - }; - bool marker = zink_cmd_debug_marker_begin(ctx, cmdbuf, "image_barrier(%s->%s)", vk_ImageLayout_to_str(res->layout), vk_ImageLayout_to_str(new_layout)); - VKCTX(CmdPipelineBarrier2)(cmdbuf, &dep); zink_cmd_debug_marker_end(ctx, cmdbuf, marker); resource_check_defer_image_barrier(ctx, res, new_layout, pipeline); if (is_write) - res->obj->last_write = (VkAccessFlags)imb.dstAccessMask; + res->obj->last_write = flags; - res->obj->access = (VkAccessFlags)imb.dstAccessMask; + res->obj->access = flags; res->obj->access_stage = pipeline; res->layout = new_layout; if (new_layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) @@ -669,7 +643,9 @@ zink_synchronization_init(struct zink_screen *screen) { if (screen->info.have_vulkan13 || screen->info.have_KHR_synchronization2) { screen->buffer_barrier = zink_resource_buffer_barrier; + screen->image_barrier = zink_resource_image_barrier; } else { screen->buffer_barrier = zink_resource_buffer_barrier; + screen->image_barrier = zink_resource_image_barrier; } } -- 2.7.4