1 #ifndef _VKQUERYUTIL_HPP 2 #define _VKQUERYUTIL_HPP 3 /*------------------------------------------------------------------------- 4 * Vulkan CTS Framework 5 * -------------------- 6 * 7 * Copyright (c) 2015 Google Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Vulkan query utilities. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "vkDefs.hpp" 27 #include "tcuMaybe.hpp" 28 #include "deMemory.h" 29 30 #include <vector> 31 #include <string> 32 33 namespace vk 34 { 35 36 // API version introspection 37 38 void getCoreInstanceExtensions (deUint32 apiVersion, std::vector<const char*>& dst); 39 void getCoreDeviceExtensions (deUint32 apiVersion, std::vector<const char*>& dst); 40 bool isCoreInstanceExtension (const deUint32 apiVersion, const std::string& extension); 41 bool isCoreDeviceExtension (const deUint32 apiVersion, const std::string& extension); 42 43 // API queries 44 45 std::vector<VkPhysicalDevice> enumeratePhysicalDevices (const InstanceInterface& vk, VkInstance instance); 46 std::vector<VkPhysicalDeviceGroupProperties> enumeratePhysicalDeviceGroups (const InstanceInterface& vk, VkInstance instance); 47 std::vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 48 VkPhysicalDeviceFeatures getPhysicalDeviceFeatures (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 49 VkPhysicalDeviceFeatures2 getPhysicalDeviceFeatures2 (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 50 VkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 51 VkPhysicalDeviceMemoryProperties getPhysicalDeviceMemoryProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 52 VkFormatProperties getPhysicalDeviceFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format); 53 VkImageFormatProperties getPhysicalDeviceImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags); 54 std::vector<VkSparseImageFormatProperties> getPhysicalDeviceSparseImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling); 55 56 VkMemoryRequirements getBufferMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkBuffer buffer); 57 VkMemoryRequirements getImageMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image); 58 VkMemoryRequirements getImagePlaneMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image, VkImageAspectFlagBits planeAspect); 59 std::vector<VkSparseImageMemoryRequirements> getImageSparseMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image); 60 61 std::vector<VkLayerProperties> enumerateInstanceLayerProperties (const PlatformInterface& vkp); 62 std::vector<VkExtensionProperties> enumerateInstanceExtensionProperties (const PlatformInterface& vkp, const char* layerName); 63 std::vector<VkLayerProperties> enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice); 64 std::vector<VkExtensionProperties> enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName); 65 66 VkQueue getDeviceQueue (const DeviceInterface& vkd, VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex); 67 VkQueue getDeviceQueue2 (const DeviceInterface& vkd, VkDevice device, const VkDeviceQueueInfo2 *queueInfo); 68 69 // Feature / extension support 70 71 bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage); 72 73 struct RequiredExtension 74 { 75 std::string name; 76 tcu::Maybe<deUint32> minVersion; 77 tcu::Maybe<deUint32> maxVersion; 78 79 explicit RequiredExtension (const std::string& name_, 80 tcu::Maybe<deUint32> minVersion_ = tcu::nothing<deUint32>(), 81 tcu::Maybe<deUint32> maxVersion_ = tcu::nothing<deUint32>()) 82 : name (name_) 83 , minVersion (minVersion_) 84 , maxVersion (maxVersion_) 85 {} 86 }; 87 88 struct RequiredLayer 89 { 90 std::string name; 91 tcu::Maybe<deUint32> minSpecVersion; 92 tcu::Maybe<deUint32> maxSpecVersion; 93 tcu::Maybe<deUint32> minImplVersion; 94 tcu::Maybe<deUint32> maxImplVersion; 95 96 explicit RequiredLayer (const std::string& name_, 97 tcu::Maybe<deUint32> minSpecVersion_ = tcu::nothing<deUint32>(), 98 tcu::Maybe<deUint32> maxSpecVersion_ = tcu::nothing<deUint32>(), 99 tcu::Maybe<deUint32> minImplVersion_ = tcu::nothing<deUint32>(), 100 tcu::Maybe<deUint32> maxImplVersion_ = tcu::nothing<deUint32>()) 101 : name (name_) 102 , minSpecVersion(minSpecVersion_) 103 , maxSpecVersion(maxSpecVersion_) 104 , minImplVersion(minImplVersion_) 105 , maxImplVersion(maxImplVersion_) 106 {} 107 }; 108 109 bool isCompatible (const VkExtensionProperties& extensionProperties, const RequiredExtension& required); 110 bool isCompatible (const VkLayerProperties& layerProperties, const RequiredLayer& required); 111 112 template<typename ExtensionIterator> 113 bool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required); 114 bool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required); 115 bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<std::string>& extensions, const std::string& required); 116 bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<std::string>& extensions, const std::string& required); 117 bool isDeviceExtensionSupported (const deUint32 deviceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required); 118 bool isInstanceExtensionSupported (const deUint32 instanceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required); 119 120 template<typename LayerIterator> 121 bool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required); 122 bool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required); 123 124 const void* findStructureInChain (const void* first, VkStructureType type); 125 void* findStructureInChain (void* first, VkStructureType type); 126 127 template<typename StructType> 128 VkStructureType getStructureType (void); 129 130 template<typename StructType> 131 const StructType* findStructure (const void* first) 132 { 133 return reinterpret_cast<const StructType*>(findStructureInChain(first, getStructureType<StructType>())); 134 } 135 136 template<typename StructType> 137 StructType* findStructure (void* first) 138 { 139 return reinterpret_cast<StructType*>(findStructureInChain(first, getStructureType<StructType>())); 140 } 141 142 namespace ValidateQueryBits 143 { 144 145 typedef struct 146 { 147 size_t offset; 148 size_t size; 149 } QueryMemberTableEntry; 150 151 template <typename Context, typename Interface, typename Type> 152 //!< Return variable initialization validation 153 bool validateInitComplete(Context context, void (Interface::*Function)(Context, Type*)const, const Interface& interface, const QueryMemberTableEntry* queryMemberTableEntry) 154 { 155 const QueryMemberTableEntry *iterator; 156 Type vec[2]; 157 deMemset(&vec[0], 0x00, sizeof(Type)); 158 deMemset(&vec[1], 0xFF, sizeof(Type)); 159 160 (interface.*Function)(context, &vec[0]); 161 (interface.*Function)(context, &vec[1]); 162 163 for (iterator = queryMemberTableEntry; iterator->size != 0; iterator++) 164 { 165 if (deMemCmp(((deUint8*)(&vec[0]))+iterator->offset, ((deUint8*)(&vec[1]))+iterator->offset, iterator->size) != 0) 166 return false; 167 } 168 169 return true; 170 } 171 172 template<typename IterT> 173 //! Overwrite a range of objects with an 8-bit pattern. 174 inline void fillBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu) 175 { 176 for (; beg < end; ++beg) 177 deMemset(&(*beg), static_cast<int>(pattern), sizeof(*beg)); 178 } 179 180 template<typename IterT> 181 //! Verify that each byte of a range of objects is equal to an 8-bit pattern. 182 bool checkBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu) 183 { 184 for (; beg < end; ++beg) 185 { 186 const deUint8* elementBytes = reinterpret_cast<const deUint8*>(&(*beg)); 187 for (std::size_t i = 0u; i < sizeof(*beg); ++i) 188 { 189 if (elementBytes[i] != pattern) 190 return false; 191 } 192 } 193 return true; 194 } 195 196 } // ValidateQueryBits 197 198 // Template implementations 199 200 template<typename ExtensionIterator> 201 bool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required) 202 { 203 for (ExtensionIterator cur = begin; cur != end; ++cur) 204 { 205 if (isCompatible(*cur, required)) 206 return true; 207 } 208 return false; 209 } 210 211 template<typename LayerIterator> 212 bool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required) 213 { 214 for (LayerIterator cur = begin; cur != end; ++cur) 215 { 216 if (isCompatible(*cur, required)) 217 return true; 218 } 219 return false; 220 } 221 222 } // vk 223 224 #endif // _VKQUERYUTIL_HPP 225