From 7e737500bd13fca868bd98e949d45c5f4b7b3f5e Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 6 Nov 2024 15:31:26 -0800 Subject: [PATCH] panvk: fix missing same-subqueue wait for CmdWaitEvents2 CmdSetEvent2 does not call cs_wait_slots. CmdWaitEvents2 should wait for the syncobj even on the same subqueue. To that goal, update collect_cs_deps to not clear self from wait_subqueue_mask. Signed-off-by: Chia-I Wu Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index dbda37de016..dc00ad57127 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -349,7 +349,7 @@ collect_cs_deps(struct panvk_cmd_buffer *cmdbuf, if (!stages_cover_subqueue(i, dst_stages)) continue; - deps->dst[i].wait_subqueue_mask |= wait_subqueue_mask & ~BITFIELD_BIT(i); + deps->dst[i].wait_subqueue_mask |= wait_subqueue_mask; } } @@ -425,8 +425,14 @@ panvk_per_arch(CmdPipelineBarrier2)(VkCommandBuffer commandBuffer, panvk_per_arch(cmd_flush_draws)(cmdbuf); uint32_t wait_subqueue_mask = 0; - for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) + for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { + /* no need to perform both types of waits on the same subqueue */ + if (deps.src[i].wait_sb_mask) + deps.dst[i].wait_subqueue_mask &= ~BITFIELD_BIT(i); + assert(!(deps.dst[i].wait_subqueue_mask & BITFIELD_BIT(i))); + wait_subqueue_mask |= deps.dst[i].wait_subqueue_mask; + } for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { if (!deps.src[i].wait_sb_mask)