• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
32 namespace vk
33 {
34 
35 // API queries
36 
37 std::vector<VkPhysicalDevice>					enumeratePhysicalDevices						(const InstanceInterface& vk, VkInstance instance);
38 std::vector<VkQueueFamilyProperties>			getPhysicalDeviceQueueFamilyProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
39 VkPhysicalDeviceFeatures						getPhysicalDeviceFeatures						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
40 VkPhysicalDeviceProperties						getPhysicalDeviceProperties						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
41 VkPhysicalDeviceMemoryProperties				getPhysicalDeviceMemoryProperties				(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
42 VkFormatProperties								getPhysicalDeviceFormatProperties				(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format);
43 VkImageFormatProperties							getPhysicalDeviceImageFormatProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags);
44 std::vector<VkSparseImageFormatProperties>		getPhysicalDeviceSparseImageFormatProperties	(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling);
45 
46 VkMemoryRequirements							getBufferMemoryRequirements						(const DeviceInterface& vk, VkDevice device, VkBuffer buffer);
47 VkMemoryRequirements							getImageMemoryRequirements						(const DeviceInterface& vk, VkDevice device, VkImage image);
48 std::vector<VkSparseImageMemoryRequirements>	getImageSparseMemoryRequirements				(const DeviceInterface& vk, VkDevice device, VkImage image);
49 
50 std::vector<VkLayerProperties>					enumerateInstanceLayerProperties				(const PlatformInterface& vkp);
51 std::vector<VkExtensionProperties>				enumerateInstanceExtensionProperties			(const PlatformInterface& vkp, const char* layerName);
52 std::vector<VkLayerProperties>					enumerateDeviceLayerProperties					(const InstanceInterface& vki, VkPhysicalDevice physicalDevice);
53 std::vector<VkExtensionProperties>				enumerateDeviceExtensionProperties				(const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName);
54 
55 // Feature / extension support
56 
57 bool											isShaderStageSupported							(const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage);
58 
59 struct RequiredExtension
60 {
61 	std::string				name;
62 	tcu::Maybe<deUint32>	minVersion;
63 	tcu::Maybe<deUint32>	maxVersion;
64 
RequiredExtensionvk::RequiredExtension65 	explicit RequiredExtension (const std::string&		name_,
66 								tcu::Maybe<deUint32>	minVersion_ = tcu::nothing<deUint32>(),
67 								tcu::Maybe<deUint32>	maxVersion_ = tcu::nothing<deUint32>())
68 		: name			(name_)
69 		, minVersion	(minVersion_)
70 		, maxVersion	(maxVersion_)
71 	{}
72 };
73 
74 struct RequiredLayer
75 {
76 	std::string				name;
77 	tcu::Maybe<deUint32>	minSpecVersion;
78 	tcu::Maybe<deUint32>	maxSpecVersion;
79 	tcu::Maybe<deUint32>	minImplVersion;
80 	tcu::Maybe<deUint32>	maxImplVersion;
81 
RequiredLayervk::RequiredLayer82 	explicit RequiredLayer (const std::string&			name_,
83 							tcu::Maybe<deUint32>		minSpecVersion_		= tcu::nothing<deUint32>(),
84 							tcu::Maybe<deUint32>		maxSpecVersion_		= tcu::nothing<deUint32>(),
85 							tcu::Maybe<deUint32>		minImplVersion_		= tcu::nothing<deUint32>(),
86 							tcu::Maybe<deUint32>		maxImplVersion_		= tcu::nothing<deUint32>())
87 		: name			(name_)
88 		, minSpecVersion(minSpecVersion_)
89 		, maxSpecVersion(maxSpecVersion_)
90 		, minImplVersion(minImplVersion_)
91 		, maxImplVersion(maxImplVersion_)
92 	{}
93 };
94 
95 bool										isCompatible							(const VkExtensionProperties& extensionProperties, const RequiredExtension& required);
96 bool										isCompatible							(const VkLayerProperties& layerProperties, const RequiredLayer& required);
97 
98 template<typename ExtensionIterator>
99 bool										isExtensionSupported					(ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required);
100 bool										isExtensionSupported					(const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
101 
102 template<typename LayerIterator>
103 bool										isLayerSupported						(LayerIterator begin, LayerIterator end, const RequiredLayer& required);
104 bool										isLayerSupported						(const std::vector<VkLayerProperties>& layers, const RequiredLayer& required);
105 
106 namespace ValidateQueryBits
107 {
108 
109 typedef struct
110 {
111 	size_t		offset;
112 	size_t		size;
113 } QueryMemberTableEntry;
114 
115 template <typename Context, typename Interface, typename Type>
116 //!< Return variable initialization validation
validateInitComplete(Context context,void (Interface::* Function)(Context,Type *)const,const Interface & interface,const QueryMemberTableEntry * queryMemberTableEntry)117 bool validateInitComplete(Context context, void (Interface::*Function)(Context, Type*)const, const Interface& interface, const QueryMemberTableEntry* queryMemberTableEntry)
118 {
119 	const QueryMemberTableEntry	*iterator;
120 	Type vec[2];
121 	deMemset(&vec[0], 0x00, sizeof(Type));
122 	deMemset(&vec[1], 0xFF, sizeof(Type));
123 
124 	(interface.*Function)(context, &vec[0]);
125 	(interface.*Function)(context, &vec[1]);
126 
127 	for (iterator = queryMemberTableEntry; iterator->size != 0; iterator++)
128 	{
129 		if (deMemCmp(((deUint8*)(&vec[0]))+iterator->offset, ((deUint8*)(&vec[1]))+iterator->offset, iterator->size) != 0)
130 			return false;
131 	}
132 
133 	return true;
134 }
135 
136 template<typename IterT>
137 //! Overwrite a range of objects with an 8-bit pattern.
fillBits(IterT beg,const IterT end,const deUint8 pattern=0xdeu)138 inline void fillBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu)
139 {
140 	for (; beg < end; ++beg)
141 		deMemset(&(*beg), static_cast<int>(pattern), sizeof(*beg));
142 }
143 
144 template<typename IterT>
145 //! Verify that each byte of a range of objects is equal to an 8-bit pattern.
checkBits(IterT beg,const IterT end,const deUint8 pattern=0xdeu)146 bool checkBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu)
147 {
148 	for (; beg < end; ++beg)
149 	{
150 		const deUint8* elementBytes = reinterpret_cast<const deUint8*>(&(*beg));
151 		for (std::size_t i = 0u; i < sizeof(*beg); ++i)
152 		{
153 			if (elementBytes[i] != pattern)
154 				return false;
155 		}
156 	}
157 	return true;
158 }
159 
160 } // ValidateQueryBits
161 
162 // Template implementations
163 
164 template<typename ExtensionIterator>
isExtensionSupported(ExtensionIterator begin,ExtensionIterator end,const RequiredExtension & required)165 bool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required)
166 {
167 	for (ExtensionIterator cur = begin; cur != end; ++cur)
168 	{
169 		if (isCompatible(*cur, required))
170 			return true;
171 	}
172 	return false;
173 }
174 
175 template<typename LayerIterator>
isLayerSupported(LayerIterator begin,LayerIterator end,const RequiredLayer & required)176 bool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required)
177 {
178 	for (LayerIterator cur = begin; cur != end; ++cur)
179 	{
180 		if (isCompatible(*cur, required))
181 			return true;
182 	}
183 	return false;
184 }
185 
186 } // vk
187 
188 #endif // _VKQUERYUTIL_HPP
189