1c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos#ifndef _VKQUERYUTIL_HPP 2c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos#define _VKQUERYUTIL_HPP 3c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos/*------------------------------------------------------------------------- 4846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Vulkan CTS Framework 5846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * -------------------- 6c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * 7846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos * Copyright (c) 2015 Google Inc. 8c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 12c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 14c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 20c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * 21c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos *//*! 22c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * \file 23c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos * \brief Vulkan query utilities. 24c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos *//*--------------------------------------------------------------------*/ 25c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 26c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos#include "vkDefs.hpp" 2712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "tcuMaybe.hpp" 282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "deMemory.h" 29c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 30c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos#include <vector> 31c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 32c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulosnamespace vk 33c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos{ 34c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 3512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos// API queries 3612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 37199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkPhysicalDevice> enumeratePhysicalDevices (const InstanceInterface& vk, VkInstance instance); 38199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 39199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkPhysicalDeviceFeatures getPhysicalDeviceFeatures (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 40199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkPhysicalDeviceProperties getPhysicalDeviceProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 41199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkPhysicalDeviceMemoryProperties getPhysicalDeviceMemoryProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice); 42199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkFormatProperties getPhysicalDeviceFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format); 43199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkImageFormatProperties getPhysicalDeviceImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags); 44199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkSparseImageFormatProperties> getPhysicalDeviceSparseImageFormatProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling); 45c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 46199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkMemoryRequirements getBufferMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkBuffer buffer); 47199c73a9eb28e6ef553e30bdf6b766198a65e796KantochVkMemoryRequirements getImageMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image); 48199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkSparseImageMemoryRequirements> getImageSparseMemoryRequirements (const DeviceInterface& vk, VkDevice device, VkImage image); 4986d1db68ad14c497f9df4adc4d3b830e1485618bPyry Haulos 50199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkLayerProperties> enumerateInstanceLayerProperties (const PlatformInterface& vkp); 51199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkExtensionProperties> enumerateInstanceExtensionProperties (const PlatformInterface& vkp, const char* layerName); 52199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkLayerProperties> enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice); 53199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochstd::vector<VkExtensionProperties> enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName); 549592b13888f95f049ff05c20cfd6fbefda823ff5Pyry Haulos 5512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos// Feature / extension support 5612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 57199c73a9eb28e6ef553e30bdf6b766198a65e796Kantochbool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage); 58624101c33dc0b50a2293e4148907781bca0e4cb7Pyry Haulos 5912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosstruct RequiredExtension 6012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{ 6112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos std::string name; 6212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos tcu::Maybe<deUint32> minVersion; 6312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos tcu::Maybe<deUint32> maxVersion; 6412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 6512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos explicit RequiredExtension (const std::string& name_, 6612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos tcu::Maybe<deUint32> minVersion_ = tcu::nothing<deUint32>(), 6712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos tcu::Maybe<deUint32> maxVersion_ = tcu::nothing<deUint32>()) 6812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos : name (name_) 6912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos , minVersion (minVersion_) 7012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos , maxVersion (maxVersion_) 7112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos {} 7212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}; 7312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 74501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosstruct RequiredLayer 75501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 76501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos std::string name; 77501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> minSpecVersion; 78501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> maxSpecVersion; 79501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> minImplVersion; 80501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> maxImplVersion; 81501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 82501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos explicit RequiredLayer (const std::string& name_, 83501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> minSpecVersion_ = tcu::nothing<deUint32>(), 84501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> maxSpecVersion_ = tcu::nothing<deUint32>(), 85501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> minImplVersion_ = tcu::nothing<deUint32>(), 86501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos tcu::Maybe<deUint32> maxImplVersion_ = tcu::nothing<deUint32>()) 87501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos : name (name_) 88501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos , minSpecVersion(minSpecVersion_) 89501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos , maxSpecVersion(maxSpecVersion_) 90501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos , minImplVersion(minImplVersion_) 91501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos , maxImplVersion(maxImplVersion_) 92501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos {} 93501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos}; 94501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 950d43d3bda2ad68814af517904aa2aecfd1067303Pyry Haulosbool isCompatible (const VkExtensionProperties& extensionProperties, const RequiredExtension& required); 96501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosbool isCompatible (const VkLayerProperties& layerProperties, const RequiredLayer& required); 9712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 9812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulostemplate<typename ExtensionIterator> 990d43d3bda2ad68814af517904aa2aecfd1067303Pyry Haulosbool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required); 1000d43d3bda2ad68814af517904aa2aecfd1067303Pyry Haulosbool isExtensionSupported (const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required); 10112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 102501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulostemplate<typename LayerIterator> 103501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosbool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required); 104501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosbool isLayerSupported (const std::vector<VkLayerProperties>& layers, const RequiredLayer& required); 105501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 1064d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskinamespace ValidateQueryBits 1074d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 10812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 1098c9532417c5504b010aadcf6b20669d901dd76abDavid Sodmantypedef struct 1108c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman{ 1118c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman size_t offset; 1128c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman size_t size; 1138c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman} QueryMemberTableEntry; 114501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 1152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantemplate <typename Context, typename Interface, typename Type> 1164d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski//!< Return variable initialization validation 1178c9532417c5504b010aadcf6b20669d901dd76abDavid Sodmanbool validateInitComplete(Context context, void (Interface::*Function)(Context, Type*)const, const Interface& interface, const QueryMemberTableEntry* queryMemberTableEntry) 1182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 1198c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman const QueryMemberTableEntry *iterator; 1202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman Type vec[2]; 1212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deMemset(&vec[0], 0x00, sizeof(Type)); 1222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deMemset(&vec[1], 0xFF, sizeof(Type)); 1232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman (interface.*Function)(context, &vec[0]); 1252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman (interface.*Function)(context, &vec[1]); 1262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1278c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman for (iterator = queryMemberTableEntry; iterator->size != 0; iterator++) 1282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 1298c9532417c5504b010aadcf6b20669d901dd76abDavid Sodman if (deMemCmp(((deUint8*)(&vec[0]))+iterator->offset, ((deUint8*)(&vec[1]))+iterator->offset, iterator->size) != 0) 1302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return false; 1312cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 1322cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return true; 1342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 1352cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1364d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskitemplate<typename IterT> 1374d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski//! Overwrite a range of objects with an 8-bit pattern. 1384d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskiinline void fillBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu) 1394d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 1404d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski for (; beg < end; ++beg) 1414d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski deMemset(&(*beg), static_cast<int>(pattern), sizeof(*beg)); 1424d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski} 1434d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 1444d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskitemplate<typename IterT> 1454d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski//! Verify that each byte of a range of objects is equal to an 8-bit pattern. 1464d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskibool checkBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu) 1474d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 1484d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski for (; beg < end; ++beg) 1494d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 1504d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const deUint8* elementBytes = reinterpret_cast<const deUint8*>(&(*beg)); 1514d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski for (std::size_t i = 0u; i < sizeof(*beg); ++i) 1524d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 1534d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski if (elementBytes[i] != pattern) 1544d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski return false; 1554d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 1564d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 1574d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski return true; 1584d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski} 1594d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 1604d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski} // ValidateQueryBits 1614d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 16212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos// Template implementations 16312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 16412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulostemplate<typename ExtensionIterator> 16512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosbool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required) 16612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{ 16712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos for (ExtensionIterator cur = begin; cur != end; ++cur) 16812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos { 16912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos if (isCompatible(*cur, required)) 17012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos return true; 17112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos } 17212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos return false; 17312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos} 17412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 175501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulostemplate<typename LayerIterator> 176501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulosbool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required) 177501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos{ 178501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos for (LayerIterator cur = begin; cur != end; ++cur) 179501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos { 180501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos if (isCompatible(*cur, required)) 181501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return true; 182501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos } 183501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos return false; 184501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos} 185501ac7ba5259b7e9f6d107fe1bed304886ef7e12Pyry Haulos 186c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos} // vk 187c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos 188c33eade2c4cc2cfc1dd10bc2f95aa5622981e50ePyry Haulos#endif // _VKQUERYUTIL_HPP 189