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