Sparse resources fixes
authorKantoch <marcin.kantoch@mobica.com>
Tue, 19 Jul 2016 11:37:33 +0000 (13:37 +0200)
committerPyry Haulos <phaulos@google.com>
Fri, 29 Jul 2016 16:32:21 +0000 (09:32 -0700)
1. Do not allow to request more queues than available
2. Allow to reuse queue if it supports more than one type of operations

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

index 775baeb..497e5a6 100644 (file)
@@ -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<VkDeviceQueueCreateInfo> 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)
                {
index 1c33042..94ab2d8 100644 (file)
@@ -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;
 };