DO NOT MERGE: Sparse resources fixes
authorKantoch <marcin.kantoch@mobica.com>
Tue, 19 Jul 2016 11:37:33 +0000 (13:37 +0200)
committerChris Forbes <chrisforbes@google.com>
Wed, 7 Feb 2018 20:13:31 +0000 (20:13 +0000)
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

external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp

index 4082578..2149754 100644 (file)
@@ -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<VkDeviceQueueCreateInfo> 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)
                {
index 55a3fae..526ada3 100644 (file)
@@ -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;
 };