From a2439e766ff4fa6f68c50224e83d4b2d7b56ef38 Mon Sep 17 00:00:00 2001 From: Derek Lesho Date: Tue, 19 Jul 2022 18:49:52 -0400 Subject: [PATCH] vkd3d: Flush queued waiters before waiting for the sparse binding semaphore. Fixes a bug in the logic trying to combine the waits by simplifying the code. Problem discovered by HK. Signed-off-by: Derek Lesho --- libs/vkd3d/command.c | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 473451e9..dcf9f2ac 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -12322,7 +12322,6 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_ { const VkPipelineStageFlags wait_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; struct vkd3d_sparse_memory_bind_range *bind_ranges = NULL; - VkTimelineSemaphoreSubmitInfoKHR timeline_submit_info; unsigned int first_packed_tile, processed_tiles; VkSparseImageOpaqueMemoryBindInfo opaque_info; const struct vkd3d_vk_device_procs *vk_procs; @@ -12513,6 +12512,9 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_ else queue_sparse = queue; + /* If there are pending waiters, we have to handle that since the signal must come after waiters. */ + vkd3d_queue_flush_waiters(queue, &command_queue->fence_worker, &command_queue->device->vk_procs); + if (!(vk_queue = vkd3d_queue_acquire(queue))) { ERR("Failed to acquire queue %p.\n", queue); @@ -12529,26 +12531,6 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_ submit_info.pWaitDstStageMask = NULL; submit_info.pWaitSemaphores = NULL; - /* If there are pending waiters, we have to handle that since the signal must come after waiters. */ - if (queue->wait_count) - { - memset(&timeline_submit_info, 0, sizeof(timeline_submit_info)); - timeline_submit_info.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR; - submit_info.pNext = &timeline_submit_info; - - submit_info.waitSemaphoreCount = queue->wait_count; - submit_info.pWaitSemaphores = queue->wait_semaphores; - submit_info.pWaitDstStageMask = queue->wait_stages; - timeline_submit_info.waitSemaphoreValueCount = queue->wait_count; - timeline_submit_info.pWaitSemaphoreValues = queue->wait_values; - - queue->submission_timeline_count++; - submit_info.signalSemaphoreCount = 1; - timeline_submit_info.signalSemaphoreValueCount = 1; - submit_info.pSignalSemaphores = &queue->submission_timeline; - timeline_submit_info.pSignalSemaphoreValues = &queue->submission_timeline_count; - } - /* We need to serialize sparse bind operations. * Create a roundtrip with binary semaphores. */ if ((vr = VK_CALL(vkQueueSubmit(vk_queue, 1, &submit_info, VK_NULL_HANDLE))) < 0) @@ -12556,10 +12538,6 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_ VKD3D_DEVICE_REPORT_BREADCRUMB_IF(command_queue->device, vr == VK_ERROR_DEVICE_LOST); - vkd3d_queue_push_waiters_to_worker_locked(queue, &command_queue->fence_worker, - queue->submission_timeline, queue->submission_timeline_count); - vkd3d_queue_reset_wait_count_locked(queue); - if (queue != queue_sparse) { if (!(vk_queue_sparse = vkd3d_queue_acquire(queue_sparse)))