1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and/or associated documentation files (the
9 * "Materials"), to deal in the Materials without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Materials, and to
12 * permit persons to whom the Materials are furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice(s) and this permission notice shall be included
16 * in all copies or substantial portions of the Materials.
18 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
27 * \file vktSparseResourcesBase.cpp
28 * \brief Sparse Resources Base Instance
29 *//*--------------------------------------------------------------------*/
31 #include "vktSparseResourcesBase.hpp"
32 #include "vkRefUtil.hpp"
33 #include "vkQueryUtil.hpp"
42 struct QueueFamilyQueuesCount
44 QueueFamilyQueuesCount() : queueCount(0u), counter(0u) {};
50 SparseResourcesBaseInstance::SparseResourcesBaseInstance (Context &context)
51 : TestInstance(context)
55 bool SparseResourcesBaseInstance::createDeviceSupportingQueues (const QueueRequirementsVec& queueRequirements)
57 const InstanceInterface& instance = m_context.getInstanceInterface();
58 const DeviceInterface& deviceInterface = m_context.getDeviceInterface();
59 const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
61 deUint32 queueFamilyPropertiesCount = 0u;
62 instance.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyPropertiesCount, DE_NULL);
64 if (queueFamilyPropertiesCount == 0u)
69 std::vector<VkQueueFamilyProperties> queueFamilyProperties;
70 queueFamilyProperties.resize(queueFamilyPropertiesCount);
72 instance.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyPropertiesCount, &queueFamilyProperties[0]);
74 typedef std::map<deUint32, QueueFamilyQueuesCount> SelectedQueuesMap;
75 typedef std::map<deUint32, std::vector<float> > QueuePrioritiesMap;
77 SelectedQueuesMap selectedQueueFamilies;
78 QueuePrioritiesMap queuePriorities;
80 for (deUint32 queueReqNdx = 0; queueReqNdx < queueRequirements.size(); ++queueReqNdx)
82 const QueueRequirements queueRequirement = queueRequirements[queueReqNdx];
83 const deUint32 queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags);
85 if (queueFamilyIndex == NO_MATCH_FOUND)
90 selectedQueueFamilies[queueFamilyIndex].queueCount += queueRequirement.queueCount;
91 for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx)
93 queuePriorities[queueFamilyIndex].push_back(1.0f);
97 std::vector<VkDeviceQueueCreateInfo> queueInfos;
99 for (SelectedQueuesMap::iterator queueFamilyIter = selectedQueueFamilies.begin(); queueFamilyIter != selectedQueueFamilies.end(); ++queueFamilyIter)
101 VkDeviceQueueCreateInfo queueInfo;
102 deMemset(&queueInfo, 0, sizeof(queueInfo));
104 queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
105 queueInfo.pNext = DE_NULL;
106 queueInfo.flags = (VkDeviceQueueCreateFlags)0u;
107 queueInfo.queueFamilyIndex = queueFamilyIter->first;
108 queueInfo.queueCount = queueFamilyIter->second.queueCount;
109 queueInfo.pQueuePriorities = &queuePriorities[queueFamilyIter->first][0];
111 queueInfos.push_back(queueInfo);
114 VkDeviceCreateInfo deviceInfo;
115 deMemset(&deviceInfo, 0, sizeof(deviceInfo));
117 VkPhysicalDeviceFeatures deviceFeatures;
118 instance.getPhysicalDeviceFeatures(physicalDevice, &deviceFeatures);
120 deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
121 deviceInfo.pNext = DE_NULL;
122 deviceInfo.enabledExtensionCount = 0u;
123 deviceInfo.ppEnabledExtensionNames = DE_NULL;
124 deviceInfo.enabledLayerCount = 0u;
125 deviceInfo.ppEnabledLayerNames = DE_NULL;
126 deviceInfo.pEnabledFeatures = &deviceFeatures;
127 deviceInfo.queueCreateInfoCount = (deUint32)selectedQueueFamilies.size();
128 deviceInfo.pQueueCreateInfos = &queueInfos[0];
130 m_logicalDevice = vk::createDevice(instance, physicalDevice, &deviceInfo);
132 for (deUint32 queueReqNdx = 0; queueReqNdx < queueRequirements.size(); ++queueReqNdx)
134 const QueueRequirements queueRequirement = queueRequirements[queueReqNdx];
135 const deUint32 queueFamilyIndex = findMatchingQueueFamilyIndex(queueFamilyProperties, queueRequirement.queueFlags);
137 if (queueFamilyIndex == NO_MATCH_FOUND)
142 for (deUint32 queueNdx = 0; queueNdx < queueRequirement.queueCount; ++queueNdx)
144 VkQueue queueHandle = 0;
145 deviceInterface.getDeviceQueue(*m_logicalDevice, queueFamilyIndex, selectedQueueFamilies[queueFamilyIndex].counter++, &queueHandle);
148 queue.queueHandle = queueHandle;
149 queue.queueFamilyIndex = queueFamilyIndex;
151 m_queues[queueRequirement.queueFlags].push_back(queue);
158 const Queue& SparseResourcesBaseInstance::getQueue (const VkQueueFlags queueFlags, const deUint32 queueIndex)
160 return m_queues[queueFlags][queueIndex];
163 deUint32 SparseResourcesBaseInstance::findMatchingMemoryType (const VkPhysicalDeviceMemoryProperties& deviceMemoryProperties,
164 const VkMemoryRequirements& objectMemoryRequirements,
165 const MemoryRequirement& memoryRequirement) const
167 for (deUint32 memoryTypeNdx = 0; memoryTypeNdx < deviceMemoryProperties.memoryTypeCount; ++memoryTypeNdx)
169 if ((objectMemoryRequirements.memoryTypeBits & (1u << memoryTypeNdx)) != 0 &&
170 memoryRequirement.matchesHeap(deviceMemoryProperties.memoryTypes[memoryTypeNdx].propertyFlags))
172 return memoryTypeNdx;
176 return NO_MATCH_FOUND;
179 deUint32 SparseResourcesBaseInstance::findMatchingQueueFamilyIndex (const QueueFamilyPropertiesVec& queueFamilyProperties,
180 const VkQueueFlags queueFlags) const
182 for (deUint32 queueNdx = 0; queueNdx < queueFamilyProperties.size(); ++queueNdx)
184 if ((queueFamilyProperties[queueNdx].queueFlags & queueFlags) == queueFlags)
190 return NO_MATCH_FOUND;