From 7e7f49d2dd313710d203256bfbd1b3c2ec762154 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 24 Aug 2024 19:07:39 +0200 Subject: [PATCH] vkd3d: Stagger submissions in single-queue scenarios. Dramatically improves performance in HZD with single_queue. Might be useful for Intel devices which only expose one queue family. Signed-off-by: Philip Rebohle --- libs/vkd3d/command.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 2c88d642e0..49cadcbda4 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -18299,7 +18299,7 @@ static bool d3d12_command_queue_needs_staggered_submissions_locked(struct d3d12_ vkd3d_atomic_uint64_store_explicit(&command_queue->last_submission_time_ns, current_time_ns, vkd3d_memory_order_relaxed); - /* Never stagger submissions for the highest-priority active queue. */ + /* Do not stagger submissions for the highest-priority active queue. */ max_priority = command_queue->desc.Priority; for (i = 0; i < command_queue->vkd3d_queue->command_queue_count; i++) @@ -18309,7 +18309,16 @@ static bool d3d12_command_queue_needs_staggered_submissions_locked(struct d3d12_ queue_submit_time_ns = vkd3d_atomic_uint64_load_explicit(&q->last_submission_time_ns, vkd3d_memory_order_relaxed); if (queue_submit_time_ns + VKD3D_QUEUE_INACTIVE_THRESHOLD_NS > current_time_ns) + { max_priority = max(max_priority, q->desc.Priority); + + /* Enable staggered submission logic if graphics and non-graphics + * queues are active at the same time. This should only happen on + * devices with one queue family, or when setting single_queue. */ + if (q->desc.Type != command_queue->desc.Type && + (q->desc.Type == D3D12_COMMAND_LIST_TYPE_DIRECT || command_queue->desc.Type == D3D12_COMMAND_LIST_TYPE_DIRECT)) + return true; + } } if (command_queue->desc.Priority == max_priority)