From a4bdf2de0f8bbef2536f6450ec0d1cc64b153b7a Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Mon, 17 Jul 2023 10:47:11 +0100 Subject: [PATCH] pvr: Fix occlusion query unaccounted for user fences User provided fences can never have a source stage for occlusion queries as the occlusion query job is internal to the driver. So at vkQueueSubmit the user's VkFence could be signalled before the queries had completed. Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_queue.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/imagination/vulkan/pvr_queue.c b/src/imagination/vulkan/pvr_queue.c index 724e358871c..472fc9db983 100644 --- a/src/imagination/vulkan/pvr_queue.c +++ b/src/imagination/vulkan/pvr_queue.c @@ -847,8 +847,14 @@ static VkResult pvr_process_queue_signals(struct pvr_queue *queue, uint32_t wait_count = 0; for (uint32_t i = 0; i < PVR_JOB_TYPE_MAX; i++) { - if (!(signal_stage_src & BITFIELD_BIT(i)) || - !queue->last_job_signal_sync[i]) + /* Exception for occlusion query jobs since that's something internal, + * so the user provided syncs won't ever have it as a source stage. + */ + if (!(signal_stage_src & BITFIELD_BIT(i)) && + i != PVR_JOB_TYPE_OCCLUSION_QUERY) + continue; + + if (!queue->last_job_signal_sync[i]) continue; signal_waits[wait_count++] = (struct vk_sync_wait){