diff options
| author | Aksel Hjerpbakk <aksel.hjerpbakk@arm.com> | 2025-10-29 15:01:22 +0000 |
|---|---|---|
| committer | Marge Bot <marge-bot@fdo.invalid> | 2025-11-06 15:57:22 +0000 |
| commit | bbe6fff67760e70265998b68385ccb43377cedc9 (patch) | |
| tree | f16d82edb81809e11c9e7746d11a817b824bb35c | |
| parent | 60ad7e8da275a044577f9c60fff02812f0ebd9b4 (diff) | |
panvk: include cmd stages for semaphores on submit
CTS regressed due to c2a6fb64193 not considering cmd stages for
signaling and waiting. Before this patch panvk did consider cmd stages,
but not semaphore stage masks.
With this fix we consider both which is what the spec requires
Fixes: c2a6fb64193 ("panvk: cull semaphores in unrelated subqueues")
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38138>
| -rw-r--r-- | src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c index cbcace40c73..f7748f24008 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c @@ -782,6 +782,7 @@ panvk_queue_submit_init_storage( { MESA_TRACE_FUNC(); submit->utrace.first_subqueue = PANVK_SUBQUEUE_COUNT; + VkPipelineStageFlags2 cmd_stage_mask = VK_PIPELINE_STAGE_2_NONE; for (uint32_t i = 0; i < vk_submit->command_buffer_count; i++) { struct panvk_cmd_buffer *cmdbuf = container_of( vk_submit->command_buffers[i], struct panvk_cmd_buffer, vk); @@ -792,6 +793,7 @@ panvk_queue_submit_init_storage( if (cs_is_empty(b)) continue; + cmd_stage_mask |= panvk_get_subqueue_stages(j); submit->qsubmit_count++; struct panvk_subqueue *subq = &submit->queue->subqueues[j]; @@ -824,19 +826,37 @@ panvk_queue_submit_init_storage( /* wait_stages_mask is pipeline stages which limit * the second synchronization scope of a semaphore wait operation */ - VkPipelineStageFlags2 wait_stages_mask = VK_PIPELINE_STAGE_2_NONE; + VkPipelineStageFlags2 wait_stages_mask = cmd_stage_mask; for (uint32_t i = 0; i < vk_submit->wait_count; i++) { wait_stages_mask |= vk_submit->waits[i].stage_mask; } - submit->wait_queue_mask = - vk_stages_to_subqueue_mask(wait_stages_mask, SYNC_SCOPE_SECOND); /* signal_stages_mask is pipeline stages which limit * the first synchronization scope of a semaphore signal operation */ - VkPipelineStageFlags2 signal_stages_mask = VK_PIPELINE_STAGE_2_NONE; + VkPipelineStageFlags2 signal_stages_mask = cmd_stage_mask; for (uint32_t i = 0; i < vk_submit->signal_count; i++) { signal_stages_mask |= vk_submit->signals[i].stage_mask; } + + /* if there is no cs in any subqueue */ + if (cmd_stage_mask == VK_PIPELINE_STAGE_2_NONE) { + /* signal stage mask is TOP_OF_PIPE/NONE, signal immediately */ + if (signal_stages_mask == VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT || + signal_stages_mask == VK_PIPELINE_STAGE_2_NONE) { + signal_stages_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + } + + /* wait stage mask is BOTTOM_OF_PIPE/NONE, wait deferred */ + if (wait_stages_mask == VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT || + wait_stages_mask == VK_PIPELINE_STAGE_2_NONE) { + wait_stages_mask = panvk_get_subqueue_stages(PANVK_SUBQUEUE_FRAGMENT) | + panvk_get_subqueue_stages(PANVK_SUBQUEUE_COMPUTE); + } + } + + submit->wait_queue_mask = + vk_stages_to_subqueue_mask(wait_stages_mask, SYNC_SCOPE_SECOND); + submit->signal_queue_mask = vk_stages_to_subqueue_mask(signal_stages_mask, SYNC_SCOPE_FIRST) | submit->utrace.queue_mask; @@ -846,14 +866,6 @@ panvk_queue_submit_init_storage( submit->signal_queue_mask |= BITFIELD_MASK(PANVK_SUBQUEUE_COUNT); } - /* Synchronize all subqueues if we have no command buffer submitted. */ - if (!submit->qsubmit_count) { - submit->wait_queue_mask = - submit->wait_queue_mask ? BITFIELD_MASK(PANVK_SUBQUEUE_COUNT) : 0; - submit->signal_queue_mask = - submit->signal_queue_mask ? BITFIELD_MASK(PANVK_SUBQUEUE_COUNT) : 0; - } - uint32_t syncop_count = 0; /* We add sync-only queue submits to place our wait/signal operations. */ |