From ae793c389b17b802bd94b36e06e046232d6b686e Mon Sep 17 00:00:00 2001 From: Kantoch Date: Tue, 19 Jul 2016 13:37:33 +0200 Subject: [PATCH] DO NOT MERGE: 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 (cherry picked from VK-GL-CTS commit 5f2cf2f7139c2f603a02fe3c284921dd9152dee3) Bug: b/72734354 Change-Id: Ia063df59c2220a082ea5a73a0fc968cfb97fda2c --- .../sparse_resources/vktSparseResourcesBase.cpp | 68 +++++++++++++--------- .../sparse_resources/vktSparseResourcesBase.hpp | 6 +- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp index 4082578..2149754 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp @@ -34,10 +34,9 @@ namespace sparse struct QueueFamilyQueuesCount { - QueueFamilyQueuesCount() : queueCount(0u), counter(0u) {}; + QueueFamilyQueuesCount() : queueCount(0u) {}; - deUint32 queueCount; - deUint32 counter; + deUint32 queueCount; }; SparseResourcesBaseInstance::SparseResourcesBaseInstance (Context &context) @@ -73,18 +72,33 @@ bool SparseResourcesBaseInstance::createDeviceSupportingQueues (const QueueRequi 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) + deUint32 queueFamilyIndex = 0u; + deUint32 queuesFoundCount = 0u; + do { - return false; - } + queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags, queueFamilyIndex); - selectedQueueFamilies[queueFamilyIndex].queueCount += queueRequirement.queueCount; - for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx) - { - queuePriorities[queueFamilyIndex].push_back(1.0f); - } + if (queueFamilyIndex == NO_MATCH_FOUND) + return false; + + 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 +108,11 @@ bool SparseResourcesBaseInstance::createDeviceSupportingQueues (const QueueRequi 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,26 +141,16 @@ bool SparseResourcesBaseInstance::createDeviceSupportingQueues (const QueueRequi 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) + for (deUint32 queueNdx = 0u; queueNdx < queuesIter->second.size(); ++queueNdx) { - return false; - } + Queue& queue = queuesIter->second[queueNdx]; - for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx) - { VkQueue queueHandle = 0; - deviceInterface.getDeviceQueue(*m_logicalDevice, queueFamilyIndex, selectedQueueFamilies[queueFamilyIndex].counter++, &queueHandle); - - Queue queue; - queue.queueHandle = queueHandle; - queue.queueFamilyIndex = queueFamilyIndex; + deviceInterface.getDeviceQueue(*m_logicalDevice, queue.queueFamilyIndex, queue.queueIndex, &queueHandle); - m_queues[queueRequirement.queueFlags].push_back(queue); + queue.queueHandle = queueHandle; } } @@ -170,9 +179,10 @@ deUint32 SparseResourcesBaseInstance::findMatchingMemoryType (const VkPhysicalDe } 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 55a3fae..526ada3 100644 --- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp +++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp @@ -53,6 +53,7 @@ struct Queue { vk::VkQueue queueHandle; deUint32 queueFamilyIndex; + deUint32 queueIndex; }; struct QueueRequirements @@ -91,8 +92,9 @@ protected: private: - deUint32 findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties, - const vk::VkQueueFlags queueFlags) const; + deUint32 findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties, + const vk::VkQueueFlags queueFlags, + const deUint32 startIndex) const; QueuesMap m_queues; }; -- 2.7.4