From a3c4eec46d2f06fa672f915043bd82d95f982660 Mon Sep 17 00:00:00 2001 From: Lars-Ivar Hesselberg Simonsen Date: Wed, 11 Jun 2025 11:13:23 +0200 Subject: [PATCH] panvk: Skip barrier QFOT if src_qfi equals dst_qfi Do not perform a queue family ownership transfer during memory barriers if srcQueueFamilyIndex equals dstQueueFamilyIndex, as the Vulkan spec mandates that this should only happen if the two values are unequal. Reviewed-by: Erik Faye-Lund Reviewed-by: Chia-I Wu Reviewed-by: Yiwei Zhang Fixes: 715d6e740a3 ("panvk: improve VK_QUEUE_FAMILY_EXTERNAL support") Part-of: (cherry picked from commit 5d0465a2533d48b200d6ab50a80277f4a1016770) --- .pick_status.json | 2 +- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 61 ++++++++++--------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 2292e27002b..0ea0f433fd6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2854,7 +2854,7 @@ "description": "panvk: Skip barrier QFOT if src_qfi equals dst_qfi", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "715d6e740a35b2d2d46ff40179390a87b161b814", "notes": null diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 08db1b56469..805d3dc4194 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -444,36 +444,39 @@ normalize_dependency(VkPipelineStageFlags2 *src_stages, VkAccessFlags2 *src_access, VkAccessFlags2 *dst_access, uint32_t src_qfi, uint32_t dst_qfi) { - /* queue family acquire operation */ - switch (src_qfi) { - case VK_QUEUE_FAMILY_EXTERNAL: - /* no execution dependency and no availability operation */ - *src_stages = VK_PIPELINE_STAGE_2_NONE; - *src_access = VK_ACCESS_2_NONE; - break; - case VK_QUEUE_FAMILY_FOREIGN_EXT: - /* treat the foreign queue as the host */ - *src_stages = VK_PIPELINE_STAGE_2_HOST_BIT; - *src_access = VK_ACCESS_2_HOST_WRITE_BIT; - break; - default: - break; - } + /* Perform queue family ownership transfer if src and dst are unequal. */ + if (src_qfi != dst_qfi) { + /* queue family acquire operation */ + switch (src_qfi) { + case VK_QUEUE_FAMILY_EXTERNAL: + /* no execution dependency and no availability operation */ + *src_stages = VK_PIPELINE_STAGE_2_NONE; + *src_access = VK_ACCESS_2_NONE; + break; + case VK_QUEUE_FAMILY_FOREIGN_EXT: + /* treat the foreign queue as the host */ + *src_stages = VK_PIPELINE_STAGE_2_HOST_BIT; + *src_access = VK_ACCESS_2_HOST_WRITE_BIT; + break; + default: + break; + } - /* queue family release operation */ - switch (dst_qfi) { - case VK_QUEUE_FAMILY_EXTERNAL: - /* no execution dependency and no visibility operation */ - *dst_stages = VK_PIPELINE_STAGE_2_NONE; - *dst_access = VK_ACCESS_2_NONE; - break; - case VK_QUEUE_FAMILY_FOREIGN_EXT: - /* treat the foreign queue as the host */ - *dst_stages = VK_PIPELINE_STAGE_2_HOST_BIT; - *dst_access = VK_ACCESS_2_HOST_WRITE_BIT; - break; - default: - break; + /* queue family release operation */ + switch (dst_qfi) { + case VK_QUEUE_FAMILY_EXTERNAL: + /* no execution dependency and no visibility operation */ + *dst_stages = VK_PIPELINE_STAGE_2_NONE; + *dst_access = VK_ACCESS_2_NONE; + break; + case VK_QUEUE_FAMILY_FOREIGN_EXT: + /* treat the foreign queue as the host */ + *dst_stages = VK_PIPELINE_STAGE_2_HOST_BIT; + *dst_access = VK_ACCESS_2_HOST_WRITE_BIT; + break; + default: + break; + } } *src_stages = vk_expand_src_stage_flags2(*src_stages);