1e5c31af7Sopenharmony_ci#ifndef _VKTSPARSERESOURCESTESTSUTIL_HPP
2e5c31af7Sopenharmony_ci#define _VKTSPARSERESOURCESTESTSUTIL_HPP
3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2016 The Khronos Group Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file  vktSparseResourcesTestsUtil.hpp
23e5c31af7Sopenharmony_ci * \brief Sparse Resources Tests Utility Classes
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "vkDefs.hpp"
27e5c31af7Sopenharmony_ci#include "vkObjUtil.hpp"
28e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
29e5c31af7Sopenharmony_ci#include "vkRef.hpp"
30e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp"
31e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
32e5c31af7Sopenharmony_ci#include "vkImageUtil.hpp"
33e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp"
34e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_cinamespace vkt
37e5c31af7Sopenharmony_ci{
38e5c31af7Sopenharmony_cinamespace sparse
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Unique<vk::VkDeviceMemory> > DeviceMemorySp;
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_cienum ImageType
44e5c31af7Sopenharmony_ci{
45e5c31af7Sopenharmony_ci	IMAGE_TYPE_1D = 0,
46e5c31af7Sopenharmony_ci	IMAGE_TYPE_1D_ARRAY,
47e5c31af7Sopenharmony_ci	IMAGE_TYPE_2D,
48e5c31af7Sopenharmony_ci	IMAGE_TYPE_2D_ARRAY,
49e5c31af7Sopenharmony_ci	IMAGE_TYPE_3D,
50e5c31af7Sopenharmony_ci	IMAGE_TYPE_CUBE,
51e5c31af7Sopenharmony_ci	IMAGE_TYPE_CUBE_ARRAY,
52e5c31af7Sopenharmony_ci	IMAGE_TYPE_BUFFER,
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_ci	IMAGE_TYPE_LAST
55e5c31af7Sopenharmony_ci};
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_cienum FeatureFlagBits
58e5c31af7Sopenharmony_ci{
59e5c31af7Sopenharmony_ci	FEATURE_TESSELLATION_SHADER							= 1u << 0,
60e5c31af7Sopenharmony_ci	FEATURE_GEOMETRY_SHADER								= 1u << 1,
61e5c31af7Sopenharmony_ci	FEATURE_SHADER_FLOAT_64								= 1u << 2,
62e5c31af7Sopenharmony_ci	FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS			= 1u << 3,
63e5c31af7Sopenharmony_ci	FEATURE_FRAGMENT_STORES_AND_ATOMICS					= 1u << 4,
64e5c31af7Sopenharmony_ci	FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE	= 1u << 5,
65e5c31af7Sopenharmony_ci};
66e5c31af7Sopenharmony_citypedef deUint32 FeatureFlags;
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_cienum
69e5c31af7Sopenharmony_ci{
70e5c31af7Sopenharmony_ci	NO_MATCH_FOUND							= ~((deUint32)0),	//!< no matching index
71e5c31af7Sopenharmony_ci};
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_cistruct TestFormat
74e5c31af7Sopenharmony_ci{
75e5c31af7Sopenharmony_ci	vk::VkFormat	format;
76e5c31af7Sopenharmony_ci};
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_cistruct TestImageParameters
79e5c31af7Sopenharmony_ci{
80e5c31af7Sopenharmony_ci	ImageType				imageType;
81e5c31af7Sopenharmony_ci	std::vector<tcu::UVec3>	imageSizes;
82e5c31af7Sopenharmony_ci	std::vector<TestFormat>	formats;
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci	TestImageParameters (ImageType imageType_, const std::vector<tcu::UVec3>& imageSizes_, const std::vector<TestFormat>& formats_)
85e5c31af7Sopenharmony_ci		: imageType		(imageType_)
86e5c31af7Sopenharmony_ci		, imageSizes	(imageSizes_)
87e5c31af7Sopenharmony_ci		, formats		(formats_)
88e5c31af7Sopenharmony_ci		{}
89e5c31af7Sopenharmony_ci};
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_cibool							formatIsR64							(const vk::VkFormat& format);
92e5c31af7Sopenharmony_ci
93e5c31af7Sopenharmony_cistd::vector<TestFormat>			getTestFormats						(const ImageType& imageType);
94e5c31af7Sopenharmony_ci
95e5c31af7Sopenharmony_civk::VkImageType					mapImageType						(const ImageType					imageType);
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_civk::VkImageViewType				mapImageViewType					(const ImageType					imageType);
98e5c31af7Sopenharmony_ci
99e5c31af7Sopenharmony_cistd::string						getImageTypeName					(const ImageType					imageType);
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_cistd::string						getShaderImageType					(const tcu::TextureFormat&			format,
102e5c31af7Sopenharmony_ci																	 const ImageType					imageType);
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_cistd::string						getShaderImageType					(const vk::PlanarFormatDescription& description,
105e5c31af7Sopenharmony_ci																	 const ImageType imageType);
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_cistd::string						getShaderImageDataType				(const tcu::TextureFormat&			format);
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_cistd::string						getShaderImageDataType				(const vk::PlanarFormatDescription& description);
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_cistd::string						getShaderImageFormatQualifier		(const tcu::TextureFormat&			format);
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_cistd::string						getShaderImageFormatQualifier		(vk::VkFormat						format);
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_cistd::string						getImageFormatID					(vk::VkFormat						format);
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_cistd::string						getShaderImageCoordinates			(const ImageType					imageType,
118e5c31af7Sopenharmony_ci																	 const std::string&					x,
119e5c31af7Sopenharmony_ci																	 const std::string&					xy,
120e5c31af7Sopenharmony_ci																	 const std::string&					xyz);
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci//!< Size used for addresing image in a compute shader
123e5c31af7Sopenharmony_citcu::UVec3						getShaderGridSize					(const ImageType					imageType,
124e5c31af7Sopenharmony_ci																	 const tcu::UVec3&					imageSize,
125e5c31af7Sopenharmony_ci																	 const deUint32						mipLevel	= 0);
126e5c31af7Sopenharmony_ci
127e5c31af7Sopenharmony_ci//!< Size of a single image layer
128e5c31af7Sopenharmony_citcu::UVec3						getLayerSize						(const ImageType					imageType,
129e5c31af7Sopenharmony_ci																	 const tcu::UVec3&					imageSize);
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci//!< Number of array layers (for array and cube types)
132e5c31af7Sopenharmony_cideUint32						getNumLayers						(const ImageType					imageType,
133e5c31af7Sopenharmony_ci																	 const tcu::UVec3&					imageSize);
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci//!< Number of texels in an image
136e5c31af7Sopenharmony_cideUint32						getNumPixels						(const ImageType					imageType,
137e5c31af7Sopenharmony_ci																	 const tcu::UVec3&					imageSize);
138e5c31af7Sopenharmony_ci
139e5c31af7Sopenharmony_ci//!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array)
140e5c31af7Sopenharmony_cideUint32						getDimensions						(const ImageType					imageType);
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci//!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array)
143e5c31af7Sopenharmony_cideUint32						getLayerDimensions					(const ImageType					imageType);
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ci//!< Helper function for checking if requested image size does not exceed device limits
146e5c31af7Sopenharmony_cibool							isImageSizeSupported				(const vk::InstanceInterface&		instance,
147e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
148e5c31af7Sopenharmony_ci																	 const ImageType					imageType,
149e5c31af7Sopenharmony_ci																	 const tcu::UVec3&					imageSize);
150e5c31af7Sopenharmony_ci
151e5c31af7Sopenharmony_cideUint32						getImageMipLevelSizeInBytes			(const vk::VkExtent3D&				baseExtents,
152e5c31af7Sopenharmony_ci																	 const deUint32						layersCount,
153e5c31af7Sopenharmony_ci																	 const tcu::TextureFormat&			format,
154e5c31af7Sopenharmony_ci																	 const deUint32						mipmapLevel,
155e5c31af7Sopenharmony_ci																	 const deUint32						mipmapMemoryAlignment	= 1u);
156e5c31af7Sopenharmony_ci
157e5c31af7Sopenharmony_cideUint32						getImageSizeInBytes					(const vk::VkExtent3D&				baseExtents,
158e5c31af7Sopenharmony_ci																	 const deUint32						layersCount,
159e5c31af7Sopenharmony_ci																	 const tcu::TextureFormat&			format,
160e5c31af7Sopenharmony_ci																	 const deUint32						mipmapLevelsCount		= 1u,
161e5c31af7Sopenharmony_ci																	 const deUint32						mipmapMemoryAlignment	= 1u);
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_cideUint32						getImageMipLevelSizeInBytes			(const vk::VkExtent3D&				baseExtents,
164e5c31af7Sopenharmony_ci																	 const deUint32						layersCount,
165e5c31af7Sopenharmony_ci																	 const vk::PlanarFormatDescription&	formatDescription,
166e5c31af7Sopenharmony_ci																	 const deUint32						planeNdx,
167e5c31af7Sopenharmony_ci																	 const deUint32						mipmapLevel,
168e5c31af7Sopenharmony_ci																	 const deUint32						mipmapMemoryAlignment	= 1u);
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_cideUint32						getImageSizeInBytes					(const vk::VkExtent3D&				baseExtents,
171e5c31af7Sopenharmony_ci																	 const deUint32						layersCount,
172e5c31af7Sopenharmony_ci																	 const vk::PlanarFormatDescription&	formatDescription,
173e5c31af7Sopenharmony_ci																	 const deUint32						planeNdx,
174e5c31af7Sopenharmony_ci																	 const deUint32						mipmapLevelsCount		=1u,
175e5c31af7Sopenharmony_ci																	 const deUint32						mipmapMemoryAlignment	=1u);
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_civk::VkBufferImageCopy			makeBufferImageCopy					(const vk::VkExtent3D				extent,
178e5c31af7Sopenharmony_ci																	 const deUint32						layersCount,
179e5c31af7Sopenharmony_ci																	 const deUint32						mipmapLevel		= 0u,
180e5c31af7Sopenharmony_ci																	 const vk::VkDeviceSize				bufferOffset	= 0ull);
181e5c31af7Sopenharmony_ci
182e5c31af7Sopenharmony_civk::VkSparseImageMemoryBind		makeSparseImageMemoryBind			(const vk::DeviceInterface&			vk,
183e5c31af7Sopenharmony_ci																	 const vk::VkDevice					device,
184e5c31af7Sopenharmony_ci																	 const vk::VkDeviceSize				allocationSize,
185e5c31af7Sopenharmony_ci																	 const deUint32						memoryType,
186e5c31af7Sopenharmony_ci																	 const vk::VkImageSubresource&		subresource,
187e5c31af7Sopenharmony_ci																	 const vk::VkOffset3D&				offset,
188e5c31af7Sopenharmony_ci																	 const vk::VkExtent3D&				extent);
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_civk::VkSparseMemoryBind			makeSparseMemoryBind				(const vk::DeviceInterface&			vk,
191e5c31af7Sopenharmony_ci																	 const vk::VkDevice					device,
192e5c31af7Sopenharmony_ci																	 const vk::VkDeviceSize				allocationSize,
193e5c31af7Sopenharmony_ci																	 const deUint32						memoryType,
194e5c31af7Sopenharmony_ci																	 const vk::VkDeviceSize				resourceOffset,
195e5c31af7Sopenharmony_ci																	 const vk::VkSparseMemoryBindFlags	flags			= 0u);
196e5c31af7Sopenharmony_ci
197e5c31af7Sopenharmony_civoid							submitCommands						(const vk::DeviceInterface&			vk,
198e5c31af7Sopenharmony_ci																	 const vk::VkQueue					queue,
199e5c31af7Sopenharmony_ci																	 const vk::VkCommandBuffer			cmdBuffer,
200e5c31af7Sopenharmony_ci																	 const deUint32						waitSemaphoreCount		= 0,
201e5c31af7Sopenharmony_ci																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
202e5c31af7Sopenharmony_ci																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
203e5c31af7Sopenharmony_ci																	 const deUint32						signalSemaphoreCount	= 0,
204e5c31af7Sopenharmony_ci																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL);
205e5c31af7Sopenharmony_ci
206e5c31af7Sopenharmony_civoid							submitCommandsAndWait				(const vk::DeviceInterface&			vk,
207e5c31af7Sopenharmony_ci																	 const vk::VkDevice					device,
208e5c31af7Sopenharmony_ci																	 const vk::VkQueue					queue,
209e5c31af7Sopenharmony_ci																	 const vk::VkCommandBuffer			cmdBuffer,
210e5c31af7Sopenharmony_ci																	 const deUint32						waitSemaphoreCount		= 0,
211e5c31af7Sopenharmony_ci																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
212e5c31af7Sopenharmony_ci																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
213e5c31af7Sopenharmony_ci																	 const deUint32						signalSemaphoreCount	= 0,
214e5c31af7Sopenharmony_ci																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL,
215e5c31af7Sopenharmony_ci																	 const bool							useDeviceGroups			= false,
216e5c31af7Sopenharmony_ci																	 const deUint32						physicalDeviceID		= 0);
217e5c31af7Sopenharmony_ci
218e5c31af7Sopenharmony_civoid							requireFeatures						(const vk::InstanceInterface&		vki,
219e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
220e5c31af7Sopenharmony_ci																	 const FeatureFlags					flags);
221e5c31af7Sopenharmony_ci
222e5c31af7Sopenharmony_cideUint32						findMatchingMemoryType				(const vk::InstanceInterface&		instance,
223e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
224e5c31af7Sopenharmony_ci																	 const vk::VkMemoryRequirements&	objectMemoryRequirements,
225e5c31af7Sopenharmony_ci																	 const vk::MemoryRequirement&		memoryRequirement);
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_cideUint32						getHeapIndexForMemoryType			(const vk::InstanceInterface&		instance,
228e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
229e5c31af7Sopenharmony_ci																	 const deUint32						memoryType);
230e5c31af7Sopenharmony_ci
231e5c31af7Sopenharmony_cibool							checkSparseSupportForImageType		(const vk::InstanceInterface&		instance,
232e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
233e5c31af7Sopenharmony_ci																	 const ImageType					imageType);
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_cibool							checkSparseSupportForImageFormat	(const vk::InstanceInterface&		instance,
236e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
237e5c31af7Sopenharmony_ci																	 const vk::VkImageCreateInfo&		imageInfo);
238e5c31af7Sopenharmony_ci
239e5c31af7Sopenharmony_cibool							checkImageFormatFeatureSupport		(const vk::InstanceInterface&		instance,
240e5c31af7Sopenharmony_ci																	 const vk::VkPhysicalDevice			physicalDevice,
241e5c31af7Sopenharmony_ci																	 const vk::VkFormat					format,
242e5c31af7Sopenharmony_ci																	 const vk::VkFormatFeatureFlags		featureFlags);
243e5c31af7Sopenharmony_ci
244e5c31af7Sopenharmony_cideUint32						getSparseAspectRequirementsIndex	(const std::vector<vk::VkSparseImageMemoryRequirements>&	requirements,
245e5c31af7Sopenharmony_ci																	 const vk::VkImageAspectFlags								aspectFlags);
246e5c31af7Sopenharmony_ci
247e5c31af7Sopenharmony_civk::VkFormat					getPlaneCompatibleFormatForWriting	(const vk::PlanarFormatDescription&	formatInfo,
248e5c31af7Sopenharmony_ci																	 deUint32							planeNdx);
249e5c31af7Sopenharmony_ci
250e5c31af7Sopenharmony_cibool							areLsb6BitsDontCare(vk::VkFormat format);
251e5c31af7Sopenharmony_ci
252e5c31af7Sopenharmony_cibool							areLsb4BitsDontCare(vk::VkFormat format);
253e5c31af7Sopenharmony_ci
254e5c31af7Sopenharmony_citemplate<typename T>
255e5c31af7Sopenharmony_ciinline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
256e5c31af7Sopenharmony_ci{
257e5c31af7Sopenharmony_ci	return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove));
258e5c31af7Sopenharmony_ci}
259e5c31af7Sopenharmony_ci
260e5c31af7Sopenharmony_citemplate<typename T>
261e5c31af7Sopenharmony_ciinline de::SharedPtr<de::UniquePtr<T> > makeDeSharedPtr (de::MovePtr<T> deMove)
262e5c31af7Sopenharmony_ci{
263e5c31af7Sopenharmony_ci	return de::SharedPtr<de::UniquePtr<T> >(new de::UniquePtr<T>(deMove));
264e5c31af7Sopenharmony_ci}
265e5c31af7Sopenharmony_ci
266e5c31af7Sopenharmony_citemplate<typename T>
267e5c31af7Sopenharmony_ciinline std::size_t sizeInBytes (const std::vector<T>& vec)
268e5c31af7Sopenharmony_ci{
269e5c31af7Sopenharmony_ci	return vec.size() * sizeof(vec[0]);
270e5c31af7Sopenharmony_ci}
271e5c31af7Sopenharmony_ci
272e5c31af7Sopenharmony_citemplate<typename T>
273e5c31af7Sopenharmony_ciinline const T* getDataOrNullptr (const std::vector<T>& vec, const std::size_t index = 0u)
274e5c31af7Sopenharmony_ci{
275e5c31af7Sopenharmony_ci	return (index < vec.size() ? &vec[index] : DE_NULL);
276e5c31af7Sopenharmony_ci}
277e5c31af7Sopenharmony_ci
278e5c31af7Sopenharmony_ci} // sparse
279e5c31af7Sopenharmony_ci} // vkt
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_ci#endif // _VKTSPARSERESOURCESTESTSUTIL_HPP
282