1 /*-------------------------------------------------------------------------
5 * Copyright (c) 2015 Google Inc.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Vulkan query utilities.
22 *//*--------------------------------------------------------------------*/
24 #include "vkQueryUtil.hpp"
32 vector<VkPhysicalDevice> enumeratePhysicalDevices (const InstanceInterface& vk, VkInstance instance)
34 deUint32 numDevices = 0;
35 vector<VkPhysicalDevice> devices;
37 VK_CHECK(vk.enumeratePhysicalDevices(instance, &numDevices, DE_NULL));
41 devices.resize(numDevices);
42 VK_CHECK(vk.enumeratePhysicalDevices(instance, &numDevices, &devices[0]));
44 if ((size_t)numDevices != devices.size())
45 TCU_FAIL("Returned device count changed between queries");
51 vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
53 deUint32 numQueues = 0;
54 vector<VkQueueFamilyProperties> properties;
56 vk.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numQueues, DE_NULL);
60 properties.resize(numQueues);
61 vk.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numQueues, &properties[0]);
63 if ((size_t)numQueues != properties.size())
64 TCU_FAIL("Returned queue family count changes between queries");
70 VkPhysicalDeviceFeatures getPhysicalDeviceFeatures (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
72 VkPhysicalDeviceFeatures features;
74 deMemset(&features, 0, sizeof(features));
76 vk.getPhysicalDeviceFeatures(physicalDevice, &features);
80 VkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
82 VkPhysicalDeviceProperties properties;
84 deMemset(&properties, 0, sizeof(properties));
86 vk.getPhysicalDeviceProperties(physicalDevice, &properties);
90 VkPhysicalDeviceMemoryProperties getPhysicalDeviceMemoryProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
92 VkPhysicalDeviceMemoryProperties properties;
94 deMemset(&properties, 0, sizeof(properties));
96 vk.getPhysicalDeviceMemoryProperties(physicalDevice, &properties);
100 VkFormatProperties getPhysicalDeviceFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format)
102 VkFormatProperties properties;
104 deMemset(&properties, 0, sizeof(properties));
106 vk.getPhysicalDeviceFormatProperties(physicalDevice, format, &properties);
110 VkImageFormatProperties getPhysicalDeviceImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags)
112 VkImageFormatProperties properties;
114 deMemset(&properties, 0, sizeof(properties));
116 VK_CHECK(vk.getPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, &properties));
120 std::vector<VkSparseImageFormatProperties> getPhysicalDeviceSparseImageFormatProperties(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling)
122 deUint32 numProp = 0;
123 vector<VkSparseImageFormatProperties> properties;
125 vk.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, &numProp, DE_NULL);
129 properties.resize(numProp);
130 vk.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, &numProp, &properties[0]);
132 if ((size_t)numProp != properties.size())
133 TCU_FAIL("Returned sparse image properties count changes between queries");
139 std::vector<VkSparseImageMemoryRequirements> getImageSparseMemoryRequirements(const DeviceInterface& vk, VkDevice device, VkImage image)
141 deUint32 requirementsCount = 0;
142 vector<VkSparseImageMemoryRequirements> requirements;
144 vk.getImageSparseMemoryRequirements(device, image, &requirementsCount, DE_NULL);
146 if (requirementsCount > 0)
148 requirements.resize(requirementsCount);
149 vk.getImageSparseMemoryRequirements(device, image, &requirementsCount, &requirements[0]);
151 if ((size_t)requirementsCount != requirements.size())
152 TCU_FAIL("Returned sparse image memory requirements count changes between queries");
158 VkMemoryRequirements getBufferMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkBuffer buffer)
160 VkMemoryRequirements req;
161 vk.getBufferMemoryRequirements(device, buffer, &req);
165 VkMemoryRequirements getImageMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image)
167 VkMemoryRequirements req;
168 vk.getImageMemoryRequirements(device, image, &req);
172 vector<VkLayerProperties> enumerateInstanceLayerProperties (const PlatformInterface& vkp)
174 vector<VkLayerProperties> properties;
175 deUint32 numLayers = 0;
177 VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, DE_NULL));
181 properties.resize(numLayers);
182 VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, &properties[0]));
183 TCU_CHECK((size_t)numLayers == properties.size());
189 vector<VkExtensionProperties> enumerateInstanceExtensionProperties (const PlatformInterface& vkp, const char* layerName)
191 vector<VkExtensionProperties> properties;
192 deUint32 numExtensions = 0;
194 VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, DE_NULL));
196 if (numExtensions > 0)
198 properties.resize(numExtensions);
199 VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, &properties[0]));
200 TCU_CHECK((size_t)numExtensions == properties.size());
206 vector<VkLayerProperties> enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
208 vector<VkLayerProperties> properties;
209 deUint32 numLayers = 0;
211 VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, DE_NULL));
215 properties.resize(numLayers);
216 VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, &properties[0]));
217 TCU_CHECK((size_t)numLayers == properties.size());
223 vector<VkExtensionProperties> enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName)
225 vector<VkExtensionProperties> properties;
226 deUint32 numExtensions = 0;
228 VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, DE_NULL));
230 if (numExtensions > 0)
232 properties.resize(numExtensions);
233 VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, &properties[0]));
234 TCU_CHECK((size_t)numExtensions == properties.size());
240 bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage)
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;
250 bool isCompatible (const VkExtensionProperties& extensionProperties, const RequiredExtension& required)
252 if (required.name != extensionProperties.extensionName)
255 if (required.minVersion && required.minVersion.get() > extensionProperties.specVersion)
258 if (required.maxVersion && required.maxVersion.get() < extensionProperties.specVersion)
264 bool isCompatible (const VkLayerProperties& layerProperties, const RequiredLayer& required)
266 if (required.name != layerProperties.layerName)
269 if (required.minSpecVersion && required.minSpecVersion.get() > layerProperties.specVersion)
272 if (required.maxSpecVersion && required.maxSpecVersion.get() < layerProperties.specVersion)
275 if (required.minImplVersion && required.minImplVersion.get() > layerProperties.implementationVersion)
278 if (required.maxImplVersion && required.maxImplVersion.get() < layerProperties.implementationVersion)
284 bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
286 return isExtensionSupported(extensions.begin(), extensions.end(), required);
289 bool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required)
291 return isLayerSupported(layers.begin(), layers.end(), required);
294 VkQueue getDeviceQueue (const DeviceInterface& vkd, VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex)
298 vkd.getDeviceQueue(device, queueFamilyIndex, queueIndex, &queue);