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 <dlesho@codeweavers.com>
This commit is contained in:
parent
21799b202b
commit
a2439e766f
|
@ -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)))
|
||||
|
|
Loading…
Reference in New Issue