• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * Vulkan CTS Framework
3  * --------------------
4  *
5  * Copyright (c) 2015 Google Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Vulkan query utilities.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "vkQueryUtil.hpp"
25 #include "deMemory.h"
26 
27 namespace vk
28 {
29 
30 using std::vector;
31 
enumeratePhysicalDevices(const InstanceInterface & vk,VkInstance instance)32 vector<VkPhysicalDevice> enumeratePhysicalDevices (const InstanceInterface& vk, VkInstance instance)
33 {
34 	deUint32					numDevices	= 0;
35 	vector<VkPhysicalDevice>	devices;
36 
37 	VK_CHECK(vk.enumeratePhysicalDevices(instance, &numDevices, DE_NULL));
38 
39 	if (numDevices > 0)
40 	{
41 		devices.resize(numDevices);
42 		VK_CHECK(vk.enumeratePhysicalDevices(instance, &numDevices, &devices[0]));
43 
44 		if ((size_t)numDevices != devices.size())
45 			TCU_FAIL("Returned device count changed between queries");
46 	}
47 
48 	return devices;
49 }
50 
getPhysicalDeviceQueueFamilyProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice)51 vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
52 {
53 	deUint32						numQueues	= 0;
54 	vector<VkQueueFamilyProperties>	properties;
55 
56 	vk.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numQueues, DE_NULL);
57 
58 	if (numQueues > 0)
59 	{
60 		properties.resize(numQueues);
61 		vk.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numQueues, &properties[0]);
62 
63 		if ((size_t)numQueues != properties.size())
64 			TCU_FAIL("Returned queue family count changes between queries");
65 	}
66 
67 	return properties;
68 }
69 
getPhysicalDeviceFeatures(const InstanceInterface & vk,VkPhysicalDevice physicalDevice)70 VkPhysicalDeviceFeatures getPhysicalDeviceFeatures (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
71 {
72 	VkPhysicalDeviceFeatures	features;
73 
74 	deMemset(&features, 0, sizeof(features));
75 
76 	vk.getPhysicalDeviceFeatures(physicalDevice, &features);
77 	return features;
78 }
79 
getPhysicalDeviceProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice)80 VkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
81 {
82 	VkPhysicalDeviceProperties	properties;
83 
84 	deMemset(&properties, 0, sizeof(properties));
85 
86 	vk.getPhysicalDeviceProperties(physicalDevice, &properties);
87 	return properties;
88 }
89 
getPhysicalDeviceMemoryProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice)90 VkPhysicalDeviceMemoryProperties getPhysicalDeviceMemoryProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
91 {
92 	VkPhysicalDeviceMemoryProperties	properties;
93 
94 	deMemset(&properties, 0, sizeof(properties));
95 
96 	vk.getPhysicalDeviceMemoryProperties(physicalDevice, &properties);
97 	return properties;
98 }
99 
getPhysicalDeviceFormatProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice,VkFormat format)100 VkFormatProperties getPhysicalDeviceFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format)
101 {
102 	VkFormatProperties	properties;
103 
104 	deMemset(&properties, 0, sizeof(properties));
105 
106 	vk.getPhysicalDeviceFormatProperties(physicalDevice, format, &properties);
107 	return properties;
108 }
109 
getPhysicalDeviceImageFormatProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkImageTiling tiling,VkImageUsageFlags usage,VkImageCreateFlags flags)110 VkImageFormatProperties getPhysicalDeviceImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags)
111 {
112 	VkImageFormatProperties	properties;
113 
114 	deMemset(&properties, 0, sizeof(properties));
115 
116 	VK_CHECK(vk.getPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, &properties));
117 	return properties;
118 }
119 
getPhysicalDeviceSparseImageFormatProperties(const InstanceInterface & vk,VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkSampleCountFlagBits samples,VkImageUsageFlags usage,VkImageTiling tiling)120 std::vector<VkSparseImageFormatProperties> getPhysicalDeviceSparseImageFormatProperties(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling)
121 {
122 	deUint32								numProp = 0;
123 	vector<VkSparseImageFormatProperties>	properties;
124 
125 	vk.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, &numProp, DE_NULL);
126 
127 	if (numProp > 0)
128 	{
129 		properties.resize(numProp);
130 		vk.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, &numProp, &properties[0]);
131 
132 		if ((size_t)numProp != properties.size())
133 			TCU_FAIL("Returned sparse image properties count changes between queries");
134 	}
135 
136 	return properties;
137 }
138 
getImageSparseMemoryRequirements(const DeviceInterface & vk,VkDevice device,VkImage image)139 std::vector<VkSparseImageMemoryRequirements> getImageSparseMemoryRequirements(const DeviceInterface& vk, VkDevice device, VkImage image)
140 {
141 	deUint32								requirementsCount = 0;
142 	vector<VkSparseImageMemoryRequirements> requirements;
143 
144 	vk.getImageSparseMemoryRequirements(device, image, &requirementsCount, DE_NULL);
145 
146 	if (requirementsCount > 0)
147 	{
148 		requirements.resize(requirementsCount);
149 		vk.getImageSparseMemoryRequirements(device, image, &requirementsCount, &requirements[0]);
150 
151 		if ((size_t)requirementsCount != requirements.size())
152 			TCU_FAIL("Returned sparse image memory requirements count changes between queries");
153 	}
154 
155 	return requirements;
156 }
157 
getBufferMemoryRequirements(const DeviceInterface & vk,VkDevice device,VkBuffer buffer)158 VkMemoryRequirements getBufferMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkBuffer buffer)
159 {
160 	VkMemoryRequirements req;
161 	vk.getBufferMemoryRequirements(device, buffer, &req);
162 	return req;
163 }
164 
getImageMemoryRequirements(const DeviceInterface & vk,VkDevice device,VkImage image)165 VkMemoryRequirements getImageMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image)
166 {
167 	VkMemoryRequirements req;
168 	vk.getImageMemoryRequirements(device, image, &req);
169 	return req;
170 }
171 
enumerateInstanceLayerProperties(const PlatformInterface & vkp)172 vector<VkLayerProperties> enumerateInstanceLayerProperties (const PlatformInterface& vkp)
173 {
174 	vector<VkLayerProperties>	properties;
175 	deUint32					numLayers	= 0;
176 
177 	VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, DE_NULL));
178 
179 	if (numLayers > 0)
180 	{
181 		properties.resize(numLayers);
182 		VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, &properties[0]));
183 		TCU_CHECK((size_t)numLayers == properties.size());
184 	}
185 
186 	return properties;
187 }
188 
enumerateInstanceExtensionProperties(const PlatformInterface & vkp,const char * layerName)189 vector<VkExtensionProperties> enumerateInstanceExtensionProperties (const PlatformInterface& vkp, const char* layerName)
190 {
191 	vector<VkExtensionProperties>	properties;
192 	deUint32						numExtensions	= 0;
193 
194 	VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, DE_NULL));
195 
196 	if (numExtensions > 0)
197 	{
198 		properties.resize(numExtensions);
199 		VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, &properties[0]));
200 		TCU_CHECK((size_t)numExtensions == properties.size());
201 	}
202 
203 	return properties;
204 }
205 
enumerateDeviceLayerProperties(const InstanceInterface & vki,VkPhysicalDevice physicalDevice)206 vector<VkLayerProperties> enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
207 {
208 	vector<VkLayerProperties>	properties;
209 	deUint32					numLayers	= 0;
210 
211 	VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, DE_NULL));
212 
213 	if (numLayers > 0)
214 	{
215 		properties.resize(numLayers);
216 		VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, &properties[0]));
217 		TCU_CHECK((size_t)numLayers == properties.size());
218 	}
219 
220 	return properties;
221 }
222 
enumerateDeviceExtensionProperties(const InstanceInterface & vki,VkPhysicalDevice physicalDevice,const char * layerName)223 vector<VkExtensionProperties> enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName)
224 {
225 	vector<VkExtensionProperties>	properties;
226 	deUint32						numExtensions	= 0;
227 
228 	VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, DE_NULL));
229 
230 	if (numExtensions > 0)
231 	{
232 		properties.resize(numExtensions);
233 		VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, &properties[0]));
234 		TCU_CHECK((size_t)numExtensions == properties.size());
235 	}
236 
237 	return properties;
238 }
239 
isShaderStageSupported(const VkPhysicalDeviceFeatures & deviceFeatures,VkShaderStageFlagBits stage)240 bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage)
241 {
242 	if (stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
243 		return deviceFeatures.tessellationShader == VK_TRUE;
244 	else if (stage == VK_SHADER_STAGE_GEOMETRY_BIT)
245 		return deviceFeatures.geometryShader == VK_TRUE;
246 	else
247 		return true;
248 }
249 
isCompatible(const VkExtensionProperties & extensionProperties,const RequiredExtension & required)250 bool isCompatible (const VkExtensionProperties& extensionProperties, const RequiredExtension& required)
251 {
252 	if (required.name != extensionProperties.extensionName)
253 		return false;
254 
255 	if (required.minVersion && required.minVersion.get() > extensionProperties.specVersion)
256 		return false;
257 
258 	if (required.maxVersion && required.maxVersion.get() < extensionProperties.specVersion)
259 		return false;
260 
261 	return true;
262 }
263 
isCompatible(const VkLayerProperties & layerProperties,const RequiredLayer & required)264 bool isCompatible (const VkLayerProperties& layerProperties, const RequiredLayer& required)
265 {
266 	if (required.name != layerProperties.layerName)
267 		return false;
268 
269 	if (required.minSpecVersion && required.minSpecVersion.get() > layerProperties.specVersion)
270 		return false;
271 
272 	if (required.maxSpecVersion && required.maxSpecVersion.get() < layerProperties.specVersion)
273 		return false;
274 
275 	if (required.minImplVersion && required.minImplVersion.get() > layerProperties.implementationVersion)
276 		return false;
277 
278 	if (required.maxImplVersion && required.maxImplVersion.get() < layerProperties.implementationVersion)
279 		return false;
280 
281 	return true;
282 }
283 
isExtensionSupported(const std::vector<VkExtensionProperties> & extensions,const RequiredExtension & required)284 bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
285 {
286 	return isExtensionSupported(extensions.begin(), extensions.end(), required);
287 }
288 
isLayerSupported(const std::vector<VkLayerProperties> & layers,const RequiredLayer & required)289 bool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required)
290 {
291 	return isLayerSupported(layers.begin(), layers.end(), required);
292 }
293 
294 } // vk
295