• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _VKTSPARSERESOURCESTESTSUTIL_HPP
2 #define _VKTSPARSERESOURCESTESTSUTIL_HPP
3 /*------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2016 The Khronos Group 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  vktSparseResourcesTestsUtil.hpp
23  * \brief Sparse Resources Tests Utility Classes
24  *//*--------------------------------------------------------------------*/
25 
26 #include "vkDefs.hpp"
27 #include "vkMemUtil.hpp"
28 #include "vkRef.hpp"
29 #include "vkRefUtil.hpp"
30 #include "vkMemUtil.hpp"
31 #include "vkImageUtil.hpp"
32 #include "deSharedPtr.hpp"
33 #include "deUniquePtr.hpp"
34 
35 namespace vkt
36 {
37 namespace sparse
38 {
39 
40 typedef de::SharedPtr<vk::Unique<vk::VkDeviceMemory> > DeviceMemorySp;
41 
42 enum ImageType
43 {
44 	IMAGE_TYPE_1D = 0,
45 	IMAGE_TYPE_1D_ARRAY,
46 	IMAGE_TYPE_2D,
47 	IMAGE_TYPE_2D_ARRAY,
48 	IMAGE_TYPE_3D,
49 	IMAGE_TYPE_CUBE,
50 	IMAGE_TYPE_CUBE_ARRAY,
51 	IMAGE_TYPE_BUFFER,
52 
53 	IMAGE_TYPE_LAST
54 };
55 
56 enum FeatureFlagBits
57 {
58 	FEATURE_TESSELLATION_SHADER							= 1u << 0,
59 	FEATURE_GEOMETRY_SHADER								= 1u << 1,
60 	FEATURE_SHADER_FLOAT_64								= 1u << 2,
61 	FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS			= 1u << 3,
62 	FEATURE_FRAGMENT_STORES_AND_ATOMICS					= 1u << 4,
63 	FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE	= 1u << 5,
64 };
65 typedef deUint32 FeatureFlags;
66 
67 enum
68 {
69 	BUFFER_IMAGE_COPY_OFFSET_GRANULARITY	= 4u,
70 	NO_MATCH_FOUND							= ~((deUint32)0),	//!< no matching index
71 };
72 
73 vk::VkImageType					mapImageType						(const ImageType					imageType);
74 
75 vk::VkImageViewType				mapImageViewType					(const ImageType					imageType);
76 
77 std::string						getImageTypeName					(const ImageType					imageType);
78 
79 std::string						getShaderImageType					(const tcu::TextureFormat&			format,
80 																	 const ImageType					imageType);
81 
82 std::string						getShaderImageDataType				(const tcu::TextureFormat&			format);
83 
84 std::string						getShaderImageFormatQualifier		(const tcu::TextureFormat&			format);
85 
86 std::string						getShaderImageCoordinates			(const ImageType					imageType,
87 																	 const std::string&					x,
88 																	 const std::string&					xy,
89 																	 const std::string&					xyz);
90 
91 //!< Size used for addresing image in a compute shader
92 tcu::UVec3						getShaderGridSize					(const ImageType					imageType,
93 																	 const tcu::UVec3&					imageSize,
94 																	 const deUint32						mipLevel	= 0);
95 
96 //!< Size of a single image layer
97 tcu::UVec3						getLayerSize						(const ImageType					imageType,
98 																	 const tcu::UVec3&					imageSize);
99 
100 //!< Number of array layers (for array and cube types)
101 deUint32						getNumLayers						(const ImageType					imageType,
102 																	 const tcu::UVec3&					imageSize);
103 
104 //!< Number of texels in an image
105 deUint32						getNumPixels						(const ImageType					imageType,
106 																	 const tcu::UVec3&					imageSize);
107 
108 //!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array)
109 deUint32						getDimensions						(const ImageType					imageType);
110 
111 //!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array)
112 deUint32						getLayerDimensions					(const ImageType					imageType);
113 
114 //!< Helper function for checking if requested image size does not exceed device limits
115 bool							isImageSizeSupported				(const vk::InstanceInterface&		instance,
116 																	 const vk::VkPhysicalDevice			physicalDevice,
117 																	 const ImageType					imageType,
118 																	 const tcu::UVec3&					imageSize);
119 
120 deUint32						getImageMaxMipLevels				(const vk::VkImageFormatProperties& imageFormatProperties,
121 																	 const vk::VkExtent3D&				extent);
122 
123 deUint32						getImageMipLevelSizeInBytes			(const vk::VkExtent3D&				baseExtents,
124 																	 const deUint32						layersCount,
125 																	 const tcu::TextureFormat&			format,
126 																	 const deUint32						mipmapLevel,
127 																	 const deUint32						mipmapMemoryAlignment	= 1u);
128 
129 deUint32						getImageSizeInBytes					(const vk::VkExtent3D&				baseExtents,
130 																	 const deUint32						layersCount,
131 																	 const tcu::TextureFormat&			format,
132 																	 const deUint32						mipmapLevelsCount		= 1u,
133 																	 const deUint32						mipmapMemoryAlignment	= 1u);
134 
135 vk::Move<vk::VkCommandPool>		makeCommandPool						(const vk::DeviceInterface&			vk,
136 																	 const vk::VkDevice					device,
137 																	 const deUint32						queueFamilyIndex);
138 
139 vk::Move<vk::VkPipelineLayout>	makePipelineLayout					(const vk::DeviceInterface&			vk,
140 																	 const vk::VkDevice					device,
141 																	 const vk::VkDescriptorSetLayout	descriptorSetLayout = DE_NULL);
142 
143 vk::Move<vk::VkPipeline>		makeComputePipeline					(const vk::DeviceInterface&			vk,
144 																	 const vk::VkDevice					device,
145 																	 const vk::VkPipelineLayout			pipelineLayout,
146 																	 const vk::VkShaderModule			shaderModule,
147 																	 const vk::VkSpecializationInfo*	specializationInfo	= 0);
148 
149 vk::Move<vk::VkBufferView>		makeBufferView						(const vk::DeviceInterface&			vk,
150 																	 const vk::VkDevice					device,
151 																	 const vk::VkBuffer					buffer,
152 																	 const vk::VkFormat					format,
153 																	 const vk::VkDeviceSize				offset,
154 																	 const vk::VkDeviceSize				size);
155 
156 vk::Move<vk::VkImageView>		makeImageView						(const vk::DeviceInterface&			vk,
157 																	 const vk::VkDevice					device,
158 																	 const vk::VkImage					image,
159 																	 const vk::VkImageViewType			imageViewType,
160 																	 const vk::VkFormat					format,
161 																	 const vk::VkImageSubresourceRange	subresourceRange);
162 
163 vk::Move<vk::VkDescriptorSet>	makeDescriptorSet					(const vk::DeviceInterface&			vk,
164 																	 const vk::VkDevice					device,
165 																	 const vk::VkDescriptorPool			descriptorPool,
166 																	 const vk::VkDescriptorSetLayout	setLayout);
167 
168 vk::Move<vk::VkFramebuffer>		makeFramebuffer						(const vk::DeviceInterface&			vk,
169 																	 const vk::VkDevice					device,
170 																	 const vk::VkRenderPass				renderPass,
171 																	 const deUint32						attachmentCount,
172 																	 const vk::VkImageView*				pAttachments,
173 																	 const deUint32						width,
174 																	 const deUint32						height,
175 																	 const deUint32						layers = 1u);
176 
177 de::MovePtr<vk::Allocation>		bindImage							(const vk::DeviceInterface&			vk,
178 																	 const vk::VkDevice					device,
179 																	 vk::Allocator&						allocator,
180 																	 const vk::VkImage					image,
181 																	 const vk::MemoryRequirement		requirement);
182 
183 de::MovePtr<vk::Allocation>		bindBuffer							(const vk::DeviceInterface&			vk,
184 																	 const vk::VkDevice					device,
185 																	 vk::Allocator&						allocator,
186 																	 const vk::VkBuffer					buffer,
187 																	 const vk::MemoryRequirement		requirement);
188 
189 vk::VkBufferCreateInfo			makeBufferCreateInfo				(const vk::VkDeviceSize				bufferSize,
190 																	 const vk::VkBufferUsageFlags		usage);
191 
192 vk::VkBufferImageCopy			makeBufferImageCopy					(const vk::VkExtent3D				extent,
193 																	 const deUint32						layersCount,
194 																	 const deUint32						mipmapLevel		= 0u,
195 																	 const vk::VkDeviceSize				bufferOffset	= 0ull);
196 
197 vk::VkSparseImageMemoryBind		makeSparseImageMemoryBind			(const vk::DeviceInterface&			vk,
198 																	 const vk::VkDevice					device,
199 																	 const vk::VkDeviceSize				allocationSize,
200 																	 const deUint32						memoryType,
201 																	 const vk::VkImageSubresource&		subresource,
202 																	 const vk::VkOffset3D&				offset,
203 																	 const vk::VkExtent3D&				extent);
204 
205 vk::VkSparseMemoryBind			makeSparseMemoryBind				(const vk::DeviceInterface&			vk,
206 																	 const vk::VkDevice					device,
207 																	 const vk::VkDeviceSize				allocationSize,
208 																	 const deUint32						memoryType,
209 																	 const vk::VkDeviceSize				resourceOffset,
210 																	 const vk::VkSparseMemoryBindFlags	flags			= 0u);
211 
212 void							submitCommands						(const vk::DeviceInterface&			vk,
213 																	 const vk::VkQueue					queue,
214 																	 const vk::VkCommandBuffer			cmdBuffer,
215 																	 const deUint32						waitSemaphoreCount		= 0,
216 																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
217 																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
218 																	 const deUint32						signalSemaphoreCount	= 0,
219 																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL);
220 
221 void							submitCommandsAndWait				(const vk::DeviceInterface&			vk,
222 																	 const vk::VkDevice					device,
223 																	 const vk::VkQueue					queue,
224 																	 const vk::VkCommandBuffer			cmdBuffer,
225 																	 const deUint32						waitSemaphoreCount		= 0,
226 																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
227 																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
228 																	 const deUint32						signalSemaphoreCount	= 0,
229 																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL,
230 																	 const bool							useDeviceGroups			= false,
231 																	 const deUint32						physicalDeviceID		= 0);
232 
233 void							requireFeatures						(const vk::InstanceInterface&		vki,
234 																	 const vk::VkPhysicalDevice			physicalDevice,
235 																	 const FeatureFlags					flags);
236 
237 deUint32						findMatchingMemoryType				(const vk::InstanceInterface&		instance,
238 																	 const vk::VkPhysicalDevice			physicalDevice,
239 																	 const vk::VkMemoryRequirements&	objectMemoryRequirements,
240 																	 const vk::MemoryRequirement&		memoryRequirement);
241 
242 deUint32						getHeapIndexForMemoryType			(const vk::InstanceInterface&		instance,
243 																	 const vk::VkPhysicalDevice			physicalDevice,
244 																	 const deUint32						memoryType);
245 
246 bool							checkSparseSupportForImageType		(const vk::InstanceInterface&		instance,
247 																	 const vk::VkPhysicalDevice			physicalDevice,
248 																	 const ImageType					imageType);
249 
250 bool							checkSparseSupportForImageFormat	(const vk::InstanceInterface&		instance,
251 																	 const vk::VkPhysicalDevice			physicalDevice,
252 																	 const vk::VkImageCreateInfo&		imageInfo);
253 
254 bool							checkImageFormatFeatureSupport		(const vk::InstanceInterface&		instance,
255 																	 const vk::VkPhysicalDevice			physicalDevice,
256 																	 const vk::VkFormat					format,
257 																	 const vk::VkFormatFeatureFlags		featureFlags);
258 
259 deUint32						getSparseAspectRequirementsIndex	(const std::vector<vk::VkSparseImageMemoryRequirements>&	requirements,
260 																	 const vk::VkImageAspectFlags								aspectFlags);
261 
makeBuffer(const vk::DeviceInterface & vk,const vk::VkDevice device,const vk::VkBufferCreateInfo & createInfo)262 inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
263 {
264 	return createBuffer(vk, device, &createInfo);
265 }
266 
makeImage(const vk::DeviceInterface & vk,const vk::VkDevice device,const vk::VkImageCreateInfo & createInfo)267 inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
268 {
269 	return createImage(vk, device, &createInfo);
270 }
271 
272 template<typename T>
makeVkSharedPtr(vk::Move<T> vkMove)273 inline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
274 {
275 	return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove));
276 }
277 
278 template<typename T>
makeDeSharedPtr(de::MovePtr<T> deMove)279 inline de::SharedPtr<de::UniquePtr<T> > makeDeSharedPtr (de::MovePtr<T> deMove)
280 {
281 	return de::SharedPtr<de::UniquePtr<T> >(new de::UniquePtr<T>(deMove));
282 }
283 
284 template<typename T>
sizeInBytes(const std::vector<T> & vec)285 inline std::size_t sizeInBytes (const std::vector<T>& vec)
286 {
287 	return vec.size() * sizeof(vec[0]);
288 }
289 
290 template<typename T>
getDataOrNullptr(const std::vector<T> & vec,const std::size_t index=0u)291 inline const T* getDataOrNullptr (const std::vector<T>& vec, const std::size_t index = 0u)
292 {
293 	return (index < vec.size() ? &vec[index] : DE_NULL);
294 }
295 
296 } // sparse
297 } // vkt
298 
299 #endif // _VKTSPARSERESOURCESTESTSUTIL_HPP
300