Home | History | Annotate | Download | only in vulkan
      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 
     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 
     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 
     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 
     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 
     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 
    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 
    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 
    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 
    139 VkMemoryRequirements getBufferMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkBuffer buffer)
    140 {
    141 	VkMemoryRequirements req;
    142 	vk.getBufferMemoryRequirements(device, buffer, &req);
    143 	return req;
    144 }
    145 
    146 VkMemoryRequirements getImageMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image)
    147 {
    148 	VkMemoryRequirements req;
    149 	vk.getImageMemoryRequirements(device, image, &req);
    150 	return req;
    151 }
    152 
    153 vector<VkLayerProperties> enumerateInstanceLayerProperties (const PlatformInterface& vkp)
    154 {
    155 	vector<VkLayerProperties>	properties;
    156 	deUint32					numLayers	= 0;
    157 
    158 	VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, DE_NULL));
    159 
    160 	if (numLayers > 0)
    161 	{
    162 		properties.resize(numLayers);
    163 		VK_CHECK(vkp.enumerateInstanceLayerProperties(&numLayers, &properties[0]));
    164 		TCU_CHECK((size_t)numLayers == properties.size());
    165 	}
    166 
    167 	return properties;
    168 }
    169 
    170 vector<VkExtensionProperties> enumerateInstanceExtensionProperties (const PlatformInterface& vkp, const char* layerName)
    171 {
    172 	vector<VkExtensionProperties>	properties;
    173 	deUint32						numExtensions	= 0;
    174 
    175 	VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, DE_NULL));
    176 
    177 	if (numExtensions > 0)
    178 	{
    179 		properties.resize(numExtensions);
    180 		VK_CHECK(vkp.enumerateInstanceExtensionProperties(layerName, &numExtensions, &properties[0]));
    181 		TCU_CHECK((size_t)numExtensions == properties.size());
    182 	}
    183 
    184 	return properties;
    185 }
    186 
    187 vector<VkLayerProperties> enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
    188 {
    189 	vector<VkLayerProperties>	properties;
    190 	deUint32					numLayers	= 0;
    191 
    192 	VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, DE_NULL));
    193 
    194 	if (numLayers > 0)
    195 	{
    196 		properties.resize(numLayers);
    197 		VK_CHECK(vki.enumerateDeviceLayerProperties(physicalDevice, &numLayers, &properties[0]));
    198 		TCU_CHECK((size_t)numLayers == properties.size());
    199 	}
    200 
    201 	return properties;
    202 }
    203 
    204 vector<VkExtensionProperties> enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName)
    205 {
    206 	vector<VkExtensionProperties>	properties;
    207 	deUint32						numExtensions	= 0;
    208 
    209 	VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, DE_NULL));
    210 
    211 	if (numExtensions > 0)
    212 	{
    213 		properties.resize(numExtensions);
    214 		VK_CHECK(vki.enumerateDeviceExtensionProperties(physicalDevice, layerName, &numExtensions, &properties[0]));
    215 		TCU_CHECK((size_t)numExtensions == properties.size());
    216 	}
    217 
    218 	return properties;
    219 }
    220 
    221 bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage)
    222 {
    223 	if (stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
    224 		return deviceFeatures.tessellationShader == VK_TRUE;
    225 	else if (stage == VK_SHADER_STAGE_GEOMETRY_BIT)
    226 		return deviceFeatures.geometryShader == VK_TRUE;
    227 	else
    228 		return true;
    229 }
    230 
    231 bool isCompatible (const VkExtensionProperties& extensionProperties, const RequiredExtension& required)
    232 {
    233 	if (required.name != extensionProperties.extensionName)
    234 		return false;
    235 
    236 	if (required.minVersion && required.minVersion.get() > extensionProperties.specVersion)
    237 		return false;
    238 
    239 	if (required.maxVersion && required.maxVersion.get() < extensionProperties.specVersion)
    240 		return false;
    241 
    242 	return true;
    243 }
    244 
    245 bool isCompatible (const VkLayerProperties& layerProperties, const RequiredLayer& required)
    246 {
    247 	if (required.name != layerProperties.layerName)
    248 		return false;
    249 
    250 	if (required.minSpecVersion && required.minSpecVersion.get() > layerProperties.specVersion)
    251 		return false;
    252 
    253 	if (required.maxSpecVersion && required.maxSpecVersion.get() < layerProperties.specVersion)
    254 		return false;
    255 
    256 	if (required.minImplVersion && required.minImplVersion.get() > layerProperties.implementationVersion)
    257 		return false;
    258 
    259 	if (required.maxImplVersion && required.maxImplVersion.get() < layerProperties.implementationVersion)
    260 		return false;
    261 
    262 	return true;
    263 }
    264 
    265 bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required)
    266 {
    267 	return isExtensionSupported(extensions.begin(), extensions.end(), required);
    268 }
    269 
    270 bool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required)
    271 {
    272 	return isLayerSupported(layers.begin(), layers.end(), required);
    273 }
    274 
    275 } // vk
    276