From 388288114a6236a1a27aabb44996de71626033a3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 19 Aug 2022 17:08:55 +0200 Subject: [PATCH] [dxvk] Find a sparse binding queue --- src/dxvk/dxvk_adapter.cpp | 18 ++++++++++++++++-- src/dxvk/dxvk_adapter.h | 1 + src/dxvk/dxvk_device.cpp | 6 +++++- src/dxvk/dxvk_device.h | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 3974e6272..4479686fa 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -91,10 +91,22 @@ namespace dxvk { if (transferQueue == VK_QUEUE_FAMILY_IGNORED) transferQueue = computeQueue; - + + uint32_t sparseQueue = VK_QUEUE_FAMILY_IGNORED; + + if (m_queueFamilies[graphicsQueue].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { + // Prefer using the graphics queue as a sparse binding queue + sparseQueue = graphicsQueue; + } else { + sparseQueue = findQueueFamily( + VK_QUEUE_SPARSE_BINDING_BIT, + VK_QUEUE_SPARSE_BINDING_BIT); + } + DxvkAdapterQueueIndices queues; queues.graphics = graphicsQueue; queues.transfer = transferQueue; + queues.sparse = sparseQueue; return queues; } @@ -465,6 +477,7 @@ namespace dxvk { DxvkAdapterQueueIndices queueFamilies = findQueueFamilies(); queueFamiliySet.insert(queueFamilies.graphics); queueFamiliySet.insert(queueFamilies.transfer); + queueFamiliySet.insert(queueFamilies.sparse); this->logQueueFamilies(queueFamilies); for (uint32_t family : queueFamiliySet) { @@ -855,7 +868,8 @@ namespace dxvk { void DxvkAdapter::logQueueFamilies(const DxvkAdapterQueueIndices& queues) { Logger::info(str::format("Queue families:", "\n Graphics : ", queues.graphics, - "\n Transfer : ", queues.transfer)); + "\n Transfer : ", queues.transfer, + "\n Sparse : ", queues.sparse != VK_QUEUE_FAMILY_IGNORED ? str::format(queues.sparse) : "n/a")); } } diff --git a/src/dxvk/dxvk_adapter.h b/src/dxvk/dxvk_adapter.h index c35fc47c5..52cebcab9 100644 --- a/src/dxvk/dxvk_adapter.h +++ b/src/dxvk/dxvk_adapter.h @@ -49,6 +49,7 @@ namespace dxvk { struct DxvkAdapterQueueIndices { uint32_t graphics; uint32_t transfer; + uint32_t sparse; }; /** diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index 6bdaaac37..3608a66ce 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -22,6 +22,7 @@ namespace dxvk { auto queueFamilies = m_adapter->findQueueFamilies(); m_queues.graphics = getQueue(queueFamilies.graphics, 0); m_queues.transfer = getQueue(queueFamilies.transfer, 0); + m_queues.sparse = getQueue(queueFamilies.sparse, 0); } @@ -337,7 +338,10 @@ namespace dxvk { uint32_t family, uint32_t index) const { VkQueue queue = VK_NULL_HANDLE; - m_vkd->vkGetDeviceQueue(m_vkd->device(), family, index, &queue); + + if (family != VK_QUEUE_FAMILY_IGNORED) + m_vkd->vkGetDeviceQueue(m_vkd->device(), family, index, &queue); + return DxvkDeviceQueue { queue, family, index }; } diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 2899f8137..af89f1a17 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -66,6 +66,7 @@ namespace dxvk { struct DxvkDeviceQueueSet { DxvkDeviceQueue graphics; DxvkDeviceQueue transfer; + DxvkDeviceQueue sparse; }; /**