• 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 version introspection
36 
37 void											getCoreInstanceExtensions						(deUint32 apiVersion, std::vector<const char*>& dst);
38 void											getCoreDeviceExtensions							(deUint32 apiVersion, std::vector<const char*>& dst);
39 bool											isCoreInstanceExtension							(const deUint32 apiVersion, const std::string& extension);
40 bool											isCoreDeviceExtension							(const deUint32 apiVersion, const std::string& extension);
41 
42 // API queries
43 
44 std::vector<VkPhysicalDevice>					enumeratePhysicalDevices						(const InstanceInterface& vk, VkInstance instance);
45 std::vector<VkPhysicalDeviceGroupProperties>	enumeratePhysicalDeviceGroups					(const InstanceInterface& vk, VkInstance instance);
46 std::vector<VkQueueFamilyProperties>			getPhysicalDeviceQueueFamilyProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
47 VkPhysicalDeviceFeatures						getPhysicalDeviceFeatures						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
48 VkPhysicalDeviceFeatures2						getPhysicalDeviceFeatures2						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
49 VkPhysicalDeviceProperties						getPhysicalDeviceProperties						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
50 VkPhysicalDeviceMemoryProperties				getPhysicalDeviceMemoryProperties				(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
51 VkFormatProperties								getPhysicalDeviceFormatProperties				(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format);
52 VkImageFormatProperties							getPhysicalDeviceImageFormatProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags);
53 std::vector<VkSparseImageFormatProperties>		getPhysicalDeviceSparseImageFormatProperties	(const InstanceInterface& vk, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling);
54 
55 VkMemoryRequirements							getBufferMemoryRequirements						(const DeviceInterface& vk, VkDevice device, VkBuffer buffer);
56 VkMemoryRequirements							getImageMemoryRequirements						(const DeviceInterface& vk, VkDevice device, VkImage image);
57 VkMemoryRequirements							getImagePlaneMemoryRequirements					(const DeviceInterface& vk, VkDevice device, VkImage image, VkImageAspectFlagBits planeAspect);
58 std::vector<VkSparseImageMemoryRequirements>	getImageSparseMemoryRequirements				(const DeviceInterface& vk, VkDevice device, VkImage image);
59 
60 std::vector<VkLayerProperties>					enumerateInstanceLayerProperties				(const PlatformInterface& vkp);
61 std::vector<VkExtensionProperties>				enumerateInstanceExtensionProperties			(const PlatformInterface& vkp, const char* layerName);
62 std::vector<VkLayerProperties>					enumerateDeviceLayerProperties					(const InstanceInterface& vki, VkPhysicalDevice physicalDevice);
63 std::vector<VkExtensionProperties>				enumerateDeviceExtensionProperties				(const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName);
64 
65 VkQueue											getDeviceQueue									(const DeviceInterface& vkd, VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex);
66 VkQueue											getDeviceQueue2									(const DeviceInterface& vkd, VkDevice device, const VkDeviceQueueInfo2 *queueInfo);
67 
68 // Feature / extension support
69 
70 bool											isShaderStageSupported							(const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStageFlagBits stage);
71 
72 struct RequiredExtension
73 {
74 	std::string				name;
75 	tcu::Maybe<deUint32>	minVersion;
76 	tcu::Maybe<deUint32>	maxVersion;
77 
RequiredExtensionvk::RequiredExtension78 	explicit RequiredExtension (const std::string&		name_,
79 								tcu::Maybe<deUint32>	minVersion_ = tcu::nothing<deUint32>(),
80 								tcu::Maybe<deUint32>	maxVersion_ = tcu::nothing<deUint32>())
81 		: name			(name_)
82 		, minVersion	(minVersion_)
83 		, maxVersion	(maxVersion_)
84 	{}
85 };
86 
87 struct RequiredLayer
88 {
89 	std::string				name;
90 	tcu::Maybe<deUint32>	minSpecVersion;
91 	tcu::Maybe<deUint32>	maxSpecVersion;
92 	tcu::Maybe<deUint32>	minImplVersion;
93 	tcu::Maybe<deUint32>	maxImplVersion;
94 
RequiredLayervk::RequiredLayer95 	explicit RequiredLayer (const std::string&			name_,
96 							tcu::Maybe<deUint32>		minSpecVersion_		= tcu::nothing<deUint32>(),
97 							tcu::Maybe<deUint32>		maxSpecVersion_		= tcu::nothing<deUint32>(),
98 							tcu::Maybe<deUint32>		minImplVersion_		= tcu::nothing<deUint32>(),
99 							tcu::Maybe<deUint32>		maxImplVersion_		= tcu::nothing<deUint32>())
100 		: name			(name_)
101 		, minSpecVersion(minSpecVersion_)
102 		, maxSpecVersion(maxSpecVersion_)
103 		, minImplVersion(minImplVersion_)
104 		, maxImplVersion(maxImplVersion_)
105 	{}
106 };
107 
108 bool										isCompatible							(const VkExtensionProperties& extensionProperties, const RequiredExtension& required);
109 bool										isCompatible							(const VkLayerProperties& layerProperties, const RequiredLayer& required);
110 
111 template<typename ExtensionIterator>
112 bool										isExtensionSupported					(ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required);
113 bool										isExtensionSupported					(const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
114 bool										isDeviceExtensionSupported				(const deUint32 deviceVersion, const std::vector<std::string>& extensions, const std::string& required);
115 bool										isInstanceExtensionSupported			(const deUint32 instanceVersion, const std::vector<std::string>& extensions, const std::string& required);
116 bool										isDeviceExtensionSupported				(const deUint32 deviceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
117 bool										isInstanceExtensionSupported			(const deUint32 instanceVersion, const std::vector<VkExtensionProperties>& extensions, const RequiredExtension& required);
118 
119 template<typename LayerIterator>
120 bool										isLayerSupported						(LayerIterator begin, LayerIterator end, const RequiredLayer& required);
121 bool										isLayerSupported						(const std::vector<VkLayerProperties>& layers, const RequiredLayer& required);
122 
123 const void*									findStructureInChain					(const void* first, VkStructureType type);
124 void*										findStructureInChain					(void* first, VkStructureType type);
125 
126 template<typename StructType>
127 VkStructureType								getStructureType						(void);
128 
129 template<typename StructType>
findStructure(const void * first)130 const StructType*							findStructure							(const void* first)
131 {
132 	return reinterpret_cast<const StructType*>(findStructureInChain(first, getStructureType<StructType>()));
133 }
134 
135 template<typename StructType>
findStructure(void * first)136 StructType*									findStructure							(void* first)
137 {
138 	return reinterpret_cast<StructType*>(findStructureInChain(first, getStructureType<StructType>()));
139 }
140 
141 namespace ValidateQueryBits
142 {
143 
144 typedef struct
145 {
146 	size_t		offset;
147 	size_t		size;
148 } QueryMemberTableEntry;
149 
150 template <typename Context, typename Interface, typename Type>
151 //!< Return variable initialization validation
validateInitComplete(Context context,void (Interface::* Function)(Context,Type *)const,const Interface & interface,const QueryMemberTableEntry * queryMemberTableEntry)152 bool validateInitComplete(Context context, void (Interface::*Function)(Context, Type*)const, const Interface& interface, const QueryMemberTableEntry* queryMemberTableEntry)
153 {
154 	const QueryMemberTableEntry	*iterator;
155 	Type vec[2];
156 	deMemset(&vec[0], 0x00, sizeof(Type));
157 	deMemset(&vec[1], 0xFF, sizeof(Type));
158 
159 	(interface.*Function)(context, &vec[0]);
160 	(interface.*Function)(context, &vec[1]);
161 
162 	for (iterator = queryMemberTableEntry; iterator->size != 0; iterator++)
163 	{
164 		if (deMemCmp(((deUint8*)(&vec[0]))+iterator->offset, ((deUint8*)(&vec[1]))+iterator->offset, iterator->size) != 0)
165 			return false;
166 	}
167 
168 	return true;
169 }
170 
171 template<typename IterT>
172 //! Overwrite a range of objects with an 8-bit pattern.
fillBits(IterT beg,const IterT end,const deUint8 pattern=0xdeu)173 inline void fillBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu)
174 {
175 	for (; beg < end; ++beg)
176 		deMemset(&(*beg), static_cast<int>(pattern), sizeof(*beg));
177 }
178 
179 template<typename IterT>
180 //! 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)181 bool checkBits (IterT beg, const IterT end, const deUint8 pattern = 0xdeu)
182 {
183 	for (; beg < end; ++beg)
184 	{
185 		const deUint8* elementBytes = reinterpret_cast<const deUint8*>(&(*beg));
186 		for (std::size_t i = 0u; i < sizeof(*beg); ++i)
187 		{
188 			if (elementBytes[i] != pattern)
189 				return false;
190 		}
191 	}
192 	return true;
193 }
194 
195 } // ValidateQueryBits
196 
197 // Template implementations
198 
199 template<typename ExtensionIterator>
isExtensionSupported(ExtensionIterator begin,ExtensionIterator end,const RequiredExtension & required)200 bool isExtensionSupported (ExtensionIterator begin, ExtensionIterator end, const RequiredExtension& required)
201 {
202 	for (ExtensionIterator cur = begin; cur != end; ++cur)
203 	{
204 		if (isCompatible(*cur, required))
205 			return true;
206 	}
207 	return false;
208 }
209 
210 template<typename LayerIterator>
isLayerSupported(LayerIterator begin,LayerIterator end,const RequiredLayer & required)211 bool isLayerSupported (LayerIterator begin, LayerIterator end, const RequiredLayer& required)
212 {
213 	for (LayerIterator cur = begin; cur != end; ++cur)
214 	{
215 		if (isCompatible(*cur, required))
216 			return true;
217 	}
218 	return false;
219 }
220 
221 } // vk
222 
223 #endif // _VKQUERYUTIL_HPP
224