From eb6f591fd6f47fe217c8b99bdbcc8e4b1af00e5c Mon Sep 17 00:00:00 2001 From: Christoph Pillmayer Date: Wed, 7 May 2025 10:54:29 +0000 Subject: [PATCH] panvk: Pull CSF barrier logic into separate function This makes it easier to implement internal syncs between subqueues later in this MR. Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_cmd_buffer.h | 2 + src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 41 +++++++++++-------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h index 42e3968d26a..68f7f0cfb34 100644 --- a/src/panfrost/vulkan/csf/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/csf/panvk_cmd_buffer.h @@ -481,4 +481,6 @@ panvk_per_arch(calculate_task_axis_and_increment)( assert(*task_increment > 0); } +void panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, + struct panvk_cs_deps deps); #endif /* PANVK_CMD_BUFFER_H */ diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 7dd57ffbcfd..118bd94de6d 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -536,24 +536,10 @@ panvk_per_arch(get_cs_deps)(struct panvk_cmd_buffer *cmdbuf, } } -VKAPI_ATTR void VKAPI_CALL -panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, - const VkDependencyInfo *pDependencyInfo) +void +panvk_per_arch(emit_barrier)(struct panvk_cmd_buffer *cmdbuf, + struct panvk_cs_deps deps) { - VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - struct panvk_cs_deps deps; - - /* Intra render pass barriers can be skipped iff we're inside a render - * pass. */ - if ((cmdbuf->state.gfx.render.tiler || inherits_render_ctx(cmdbuf)) && - (pDependencyInfo->dependencyFlags & VK_DEPENDENCY_BY_REGION_BIT)) - return; - - panvk_per_arch(get_cs_deps)(cmdbuf, pDependencyInfo, &deps); - - if (deps.needs_draw_flush) - panvk_per_arch(cmd_flush_draws)(cmdbuf); - uint32_t wait_subqueue_mask = 0; for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { /* no need to perform both types of waits on the same subqueue */ @@ -620,6 +606,27 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, } } +VKAPI_ATTR void VKAPI_CALL +panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, + const VkDependencyInfo *pDependencyInfo) +{ + VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); + struct panvk_cs_deps deps; + + /* Intra render pass barriers can be skipped iff we're inside a render + * pass. */ + if ((cmdbuf->state.gfx.render.tiler || inherits_render_ctx(cmdbuf)) && + (pDependencyInfo->dependencyFlags & VK_DEPENDENCY_BY_REGION_BIT)) + return; + + panvk_per_arch(get_cs_deps)(cmdbuf, pDependencyInfo, &deps); + + if (deps.needs_draw_flush) + panvk_per_arch(cmd_flush_draws)(cmdbuf); + + panvk_per_arch(emit_barrier)(cmdbuf, deps); +} + #if PAN_ARCH >= 11 void panvk_per_arch(cs_next_iter_sb)(struct panvk_cmd_buffer *cmdbuf,