From 5f2cf2f7139c2f603a02fe3c284921dd9152dee3 Mon Sep 17 00:00:00 2001 From: Kantoch Date: Tue, 19 Jul 2016 13:37:33 +0200 Subject: [PATCH] Sparse resources fixes 1. Do not allow to request more queues than available 2. Allow to reuse queue if it supports more than one type of operations --- .../sparse_resources/vktSparseResourcesBase.cpp | 68 +++++++++++++--------- .../sparse_resources/vktSparseResourcesBase.hpp | 4 +- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp index 775baeb..497e5a6 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp @@ -35,10 +35,9 @@ namespace sparse struct QueueFamilyQueuesCount { - QueueFamilyQueuesCount() : queueCount(0u), counter(0u) {}; + QueueFamilyQueuesCount() : queueCount(0u) {}; - deUint32 queueCount; - deUint32 counter; + deUint32 queueCount; }; SparseResourcesBaseInstance::SparseResourcesBaseInstance (Context &context) @@ -75,16 +74,33 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir for (deUint32 queueReqNdx = 0; queueReqNdx < queueRequirements.size(); ++queueReqNdx) { const QueueRequirements queueRequirement = queueRequirements[queueReqNdx]; - const deUint32 queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags); - if (queueFamilyIndex == NO_MATCH_FOUND) - TCU_THROW(NotSupportedError, "No match found for queue requirements"); - - selectedQueueFamilies[queueFamilyIndex].queueCount += queueRequirement.queueCount; - for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx) + deUint32 queueFamilyIndex = 0u; + deUint32 queuesFoundCount = 0u; + do { - queuePriorities[queueFamilyIndex].push_back(1.0f); - } + queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags, queueFamilyIndex); + + if (queueFamilyIndex == NO_MATCH_FOUND) + TCU_THROW(NotSupportedError, "No match found for queue requirements"); + + const deUint32 queuesPerFamilyCount = deMin32(queueFamilyProperties[queueFamilyIndex].queueCount, queueRequirement.queueCount - queuesFoundCount); + + selectedQueueFamilies[queueFamilyIndex].queueCount = deMax32(queuesPerFamilyCount, selectedQueueFamilies[queueFamilyIndex].queueCount); + + for (deUint32 queueNdx = 0; queueNdx < queuesPerFamilyCount; ++queueNdx) + { + Queue queue; + queue.queueFamilyIndex = queueFamilyIndex; + queue.queueIndex = queueNdx; + + m_queues[queueRequirement.queueFlags].push_back(queue); + } + + queuesFoundCount += queuesPerFamilyCount; + + ++queueFamilyIndex; + } while (queuesFoundCount < queueRequirement.queueCount); } std::vector queueInfos; @@ -94,6 +110,11 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir VkDeviceQueueCreateInfo queueInfo; deMemset(&queueInfo, 0, sizeof(queueInfo)); + for (deUint32 queueNdx = 0; queueNdx < queueFamilyIter->second.queueCount; ++queueNdx) + { + queuePriorities[queueFamilyIter->first].push_back(1.0f); + } + queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queueInfo.pNext = DE_NULL; queueInfo.flags = (VkDeviceQueueCreateFlags)0u; @@ -122,24 +143,16 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir m_logicalDevice = vk::createDevice(instance, physicalDevice, &deviceInfo); - for (deUint32 queueReqNdx = 0; queueReqNdx < queueRequirements.size(); ++queueReqNdx) + for (QueuesMap::iterator queuesIter = m_queues.begin(); queuesIter != m_queues.end(); ++queuesIter) { - const QueueRequirements queueRequirement = queueRequirements[queueReqNdx]; - const deUint32 queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags); - - if (queueFamilyIndex == NO_MATCH_FOUND) - TCU_THROW(NotSupportedError, "No match found for queue requirements"); - - for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx) + for (deUint32 queueNdx = 0u; queueNdx < queuesIter->second.size(); ++queueNdx) { - VkQueue queueHandle = 0; - deviceInterface.getDeviceQueue(*m_logicalDevice, queueFamilyIndex, selectedQueueFamilies[queueFamilyIndex].counter++, &queueHandle); + Queue& queue = queuesIter->second[queueNdx]; - Queue queue; - queue.queueHandle = queueHandle; - queue.queueFamilyIndex = queueFamilyIndex; + VkQueue queueHandle = 0; + deviceInterface.getDeviceQueue(*m_logicalDevice, queue.queueFamilyIndex, queue.queueIndex, &queueHandle); - m_queues[queueRequirement.queueFlags].push_back(queue); + queue.queueHandle = queueHandle; } } } @@ -224,9 +237,10 @@ deUint32 SparseResourcesBaseInstance::getSparseAspectRequirementsIndex (const st } deUint32 SparseResourcesBaseInstance::findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties, - const VkQueueFlags queueFlags) const + const VkQueueFlags queueFlags, + const deUint32 startIndex) const { - for (deUint32 queueNdx = 0; queueNdx < queueFamilyProperties.size(); ++queueNdx) + for (deUint32 queueNdx = startIndex; queueNdx < queueFamilyProperties.size(); ++queueNdx) { if ((queueFamilyProperties[queueNdx].queueFlags & queueFlags) == queueFlags) { diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp index 1c33042..94ab2d8 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp @@ -55,6 +55,7 @@ struct Queue { vk::VkQueue queueHandle; deUint32 queueFamilyIndex; + deUint32 queueIndex; }; struct QueueRequirements @@ -113,7 +114,8 @@ protected: private: deUint32 findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties, - const vk::VkQueueFlags queueFlags) const; + const vk::VkQueueFlags queueFlags, + const deUint32 startIndex) const; QueuesMap m_queues; }; -- 2.7.4