[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

@ -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"));
}
}

View File

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

View File

@ -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 };
}

View File

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