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