struct QueueFamilyQueuesCount
{
- QueueFamilyQueuesCount() : queueCount(0u), counter(0u) {};
+ QueueFamilyQueuesCount() : queueCount(0u) {};
- deUint32 queueCount;
- deUint32 counter;
+ deUint32 queueCount;
};
SparseResourcesBaseInstance::SparseResourcesBaseInstance (Context &context)
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;
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;
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;
}
}
}
}
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)
{