1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Find a sparse binding queue

This commit is contained in:
Philip Rebohle 2022-08-19 17:08:55 +02:00
parent 71c9c4a5cc
commit 388288114a
4 changed files with 23 additions and 3 deletions

View File

@ -92,9 +92,21 @@ namespace dxvk {
if (transferQueue == VK_QUEUE_FAMILY_IGNORED) if (transferQueue == VK_QUEUE_FAMILY_IGNORED)
transferQueue = computeQueue; 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; DxvkAdapterQueueIndices queues;
queues.graphics = graphicsQueue; queues.graphics = graphicsQueue;
queues.transfer = transferQueue; queues.transfer = transferQueue;
queues.sparse = sparseQueue;
return queues; return queues;
} }
@ -465,6 +477,7 @@ namespace dxvk {
DxvkAdapterQueueIndices queueFamilies = findQueueFamilies(); DxvkAdapterQueueIndices queueFamilies = findQueueFamilies();
queueFamiliySet.insert(queueFamilies.graphics); queueFamiliySet.insert(queueFamilies.graphics);
queueFamiliySet.insert(queueFamilies.transfer); queueFamiliySet.insert(queueFamilies.transfer);
queueFamiliySet.insert(queueFamilies.sparse);
this->logQueueFamilies(queueFamilies); this->logQueueFamilies(queueFamilies);
for (uint32_t family : queueFamiliySet) { for (uint32_t family : queueFamiliySet) {
@ -855,7 +868,8 @@ namespace dxvk {
void DxvkAdapter::logQueueFamilies(const DxvkAdapterQueueIndices& queues) { void DxvkAdapter::logQueueFamilies(const DxvkAdapterQueueIndices& queues) {
Logger::info(str::format("Queue families:", Logger::info(str::format("Queue families:",
"\n Graphics : ", queues.graphics, "\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"));
} }
} }

View File

@ -49,6 +49,7 @@ namespace dxvk {
struct DxvkAdapterQueueIndices { struct DxvkAdapterQueueIndices {
uint32_t graphics; uint32_t graphics;
uint32_t transfer; uint32_t transfer;
uint32_t sparse;
}; };
/** /**

View File

@ -22,6 +22,7 @@ namespace dxvk {
auto queueFamilies = m_adapter->findQueueFamilies(); auto queueFamilies = m_adapter->findQueueFamilies();
m_queues.graphics = getQueue(queueFamilies.graphics, 0); m_queues.graphics = getQueue(queueFamilies.graphics, 0);
m_queues.transfer = getQueue(queueFamilies.transfer, 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 family,
uint32_t index) const { uint32_t index) const {
VkQueue queue = VK_NULL_HANDLE; VkQueue queue = VK_NULL_HANDLE;
if (family != VK_QUEUE_FAMILY_IGNORED)
m_vkd->vkGetDeviceQueue(m_vkd->device(), family, index, &queue); m_vkd->vkGetDeviceQueue(m_vkd->device(), family, index, &queue);
return DxvkDeviceQueue { queue, family, index }; return DxvkDeviceQueue { queue, family, index };
} }

View File

@ -66,6 +66,7 @@ namespace dxvk {
struct DxvkDeviceQueueSet { struct DxvkDeviceQueueSet {
DxvkDeviceQueue graphics; DxvkDeviceQueue graphics;
DxvkDeviceQueue transfer; DxvkDeviceQueue transfer;
DxvkDeviceQueue sparse;
}; };
/** /**