1932fee600b73b54426a83ce0122e37578289a24fKantoch#ifndef _VKTSPARSERESOURCESTESTSUTIL_HPP
2932fee600b73b54426a83ce0122e37578289a24fKantoch#define _VKTSPARSERESOURCESTESTSUTIL_HPP
3932fee600b73b54426a83ce0122e37578289a24fKantoch/*------------------------------------------------------------------------
4932fee600b73b54426a83ce0122e37578289a24fKantoch * Vulkan Conformance Tests
5932fee600b73b54426a83ce0122e37578289a24fKantoch * ------------------------
6932fee600b73b54426a83ce0122e37578289a24fKantoch *
7932fee600b73b54426a83ce0122e37578289a24fKantoch * Copyright (c) 2016 The Khronos Group Inc.
8932fee600b73b54426a83ce0122e37578289a24fKantoch *
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
12932fee600b73b54426a83ce0122e37578289a24fKantoch *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
14932fee600b73b54426a83ce0122e37578289a24fKantoch *
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.
20932fee600b73b54426a83ce0122e37578289a24fKantoch *
21932fee600b73b54426a83ce0122e37578289a24fKantoch *//*!
22932fee600b73b54426a83ce0122e37578289a24fKantoch * \file  vktSparseResourcesTestsUtil.hpp
23932fee600b73b54426a83ce0122e37578289a24fKantoch * \brief Sparse Resources Tests Utility Classes
24932fee600b73b54426a83ce0122e37578289a24fKantoch *//*--------------------------------------------------------------------*/
25932fee600b73b54426a83ce0122e37578289a24fKantoch
26932fee600b73b54426a83ce0122e37578289a24fKantoch#include "vkDefs.hpp"
27932fee600b73b54426a83ce0122e37578289a24fKantoch#include "vkMemUtil.hpp"
28932fee600b73b54426a83ce0122e37578289a24fKantoch#include "vkRef.hpp"
29932fee600b73b54426a83ce0122e37578289a24fKantoch#include "vkRefUtil.hpp"
30a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski#include "vkMemUtil.hpp"
31932fee600b73b54426a83ce0122e37578289a24fKantoch#include "vkImageUtil.hpp"
32932fee600b73b54426a83ce0122e37578289a24fKantoch#include "deSharedPtr.hpp"
33a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski#include "deUniquePtr.hpp"
34932fee600b73b54426a83ce0122e37578289a24fKantoch
35932fee600b73b54426a83ce0122e37578289a24fKantochnamespace vkt
36932fee600b73b54426a83ce0122e37578289a24fKantoch{
37932fee600b73b54426a83ce0122e37578289a24fKantochnamespace sparse
38932fee600b73b54426a83ce0122e37578289a24fKantoch{
39932fee600b73b54426a83ce0122e37578289a24fKantoch
40a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitypedef de::SharedPtr<vk::Unique<vk::VkDeviceMemory> > DeviceMemorySp;
41a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
42932fee600b73b54426a83ce0122e37578289a24fKantochenum ImageType
43932fee600b73b54426a83ce0122e37578289a24fKantoch{
44932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_1D = 0,
45932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_1D_ARRAY,
46932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_2D,
47932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_2D_ARRAY,
48932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_3D,
49932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_CUBE,
50932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_CUBE_ARRAY,
51932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_BUFFER,
52932fee600b73b54426a83ce0122e37578289a24fKantoch
53932fee600b73b54426a83ce0122e37578289a24fKantoch	IMAGE_TYPE_LAST
54932fee600b73b54426a83ce0122e37578289a24fKantoch};
55932fee600b73b54426a83ce0122e37578289a24fKantoch
56a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskienum FeatureFlagBits
57452d94dd78885b79b938cbb5297f076a4d3f3a9ePetros Bantolas{
58a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_TESSELLATION_SHADER							= 1u << 0,
59a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_GEOMETRY_SHADER								= 1u << 1,
60a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_SHADER_FLOAT_64								= 1u << 2,
61a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS			= 1u << 3,
62a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_FRAGMENT_STORES_AND_ATOMICS					= 1u << 4,
63a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE	= 1u << 5,
64452d94dd78885b79b938cbb5297f076a4d3f3a9ePetros Bantolas};
65a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitypedef deUint32 FeatureFlags;
66452d94dd78885b79b938cbb5297f076a4d3f3a9ePetros Bantolas
67a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskienum
68932fee600b73b54426a83ce0122e37578289a24fKantoch{
69a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	BUFFER_IMAGE_COPY_OFFSET_GRANULARITY	= 4u,
70a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	NO_MATCH_FOUND							= ~((deUint32)0),	//!< no matching index
71932fee600b73b54426a83ce0122e37578289a24fKantoch};
72932fee600b73b54426a83ce0122e37578289a24fKantoch
73a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkImageType					mapImageType						(const ImageType					imageType);
74932fee600b73b54426a83ce0122e37578289a24fKantoch
75a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkImageViewType				mapImageViewType					(const ImageType					imageType);
760abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch
77a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskistd::string						getImageTypeName					(const ImageType					imageType);
78a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
79a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskistd::string						getShaderImageType					(const tcu::TextureFormat&			format,
80a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const ImageType					imageType);
81a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
82a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskistd::string						getShaderImageDataType				(const tcu::TextureFormat&			format);
83a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
84a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskistd::string						getShaderImageFormatQualifier		(const tcu::TextureFormat&			format);
85a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
86a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskistd::string						getShaderImageCoordinates			(const ImageType					imageType,
87a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const std::string&					x,
88a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const std::string&					xy,
89a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const std::string&					xyz);
900abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch
910abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Size used for addresing image in a compute shader
92a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitcu::UVec3						getShaderGridSize					(const ImageType					imageType,
93a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::UVec3&					imageSize,
94a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipLevel	= 0);
95a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
960abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Size of a single image layer
97a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitcu::UVec3						getLayerSize						(const ImageType					imageType,
98a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::UVec3&					imageSize);
99a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
1000abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Number of array layers (for array and cube types)
101a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getNumLayers						(const ImageType					imageType,
102a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::UVec3&					imageSize);
103a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
1040abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Number of texels in an image
105a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getNumPixels						(const ImageType					imageType,
106a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::UVec3&					imageSize);
107a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
1080abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array)
109a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getDimensions						(const ImageType					imageType);
110a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
1110abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array)
112a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getLayerDimensions					(const ImageType					imageType);
113a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
1140abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch//!< Helper function for checking if requested image size does not exceed device limits
115a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskibool							isImageSizeSupported				(const vk::InstanceInterface&		instance,
116a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
117a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const ImageType					imageType,
118a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::UVec3&					imageSize);
119a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
120a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkExtent3D					mipLevelExtents						(const vk::VkExtent3D&				baseExtents,
121a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipLevel);
122a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
123a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitcu::UVec3						mipLevelExtents						(const tcu::UVec3&					baseExtents,
124a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipLevel);
125a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
126a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getImageMaxMipLevels				(const vk::VkImageFormatProperties& imageFormatProperties,
127a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkExtent3D&				extent);
128a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
129a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getImageMipLevelSizeInBytes			(const vk::VkExtent3D&				baseExtents,
130a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						layersCount,
131a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::TextureFormat&			format,
132a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipmapLevel,
133a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipmapMemoryAlignment	= 1u);
134a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
135a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getImageSizeInBytes					(const vk::VkExtent3D&				baseExtents,
136a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						layersCount,
137a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const tcu::TextureFormat&			format,
138a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipmapLevelsCount		= 1u,
139a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipmapMemoryAlignment	= 1u);
140a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
141a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkCommandPool>		makeCommandPool						(const vk::DeviceInterface&			vk,
142a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
143a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						queueFamilyIndex);
144a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
145a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkCommandBuffer>	makeCommandBuffer					(const vk::DeviceInterface&			vk,
146a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
147a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkCommandPool			commandPool);
148a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
149a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkPipelineLayout>	makePipelineLayout					(const vk::DeviceInterface&			vk,
150a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
151b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const vk::VkDescriptorSetLayout	descriptorSetLayout = DE_NULL);
152a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
153a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkPipeline>		makeComputePipeline					(const vk::DeviceInterface&			vk,
154a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
155a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPipelineLayout			pipelineLayout,
156a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkShaderModule			shaderModule,
157a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkSpecializationInfo*	specializationInfo	= 0);
158a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
159a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkBufferView>		makeBufferView						(const vk::DeviceInterface&			vk,
160a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
161a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkBuffer					buffer,
162a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkFormat					format,
163a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				offset,
164a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				size);
165a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
166a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkImageView>		makeImageView						(const vk::DeviceInterface&			vk,
167a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
168a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImage					image,
169a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageViewType			imageViewType,
170a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkFormat					format,
171a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageSubresourceRange	subresourceRange);
172a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
173a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkDescriptorSet>	makeDescriptorSet					(const vk::DeviceInterface&			vk,
174a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
175a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDescriptorPool			descriptorPool,
176a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDescriptorSetLayout	setLayout);
177a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
178a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkSemaphore>		makeSemaphore						(const vk::DeviceInterface&			vk,
179a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device);
180a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
181a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::Move<vk::VkFence>			makeFence							(const vk::DeviceInterface&			vk,
182a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
183a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkFenceCreateFlags		flags	= 0u);
184a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
185b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowskivk::Move<vk::VkFramebuffer>		makeFramebuffer						(const vk::DeviceInterface&			vk,
186b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const vk::VkDevice					device,
187b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const vk::VkRenderPass				renderPass,
188b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const deUint32						attachmentCount,
189b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const vk::VkImageView*				pAttachments,
190b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const deUint32						width,
191b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const deUint32						height,
192b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski																	 const deUint32						layers = 1u);
193b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski
194a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskide::MovePtr<vk::Allocation>		bindImage							(const vk::DeviceInterface&			vk,
195a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
196a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 vk::Allocator&						allocator,
197a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImage					image,
198a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::MemoryRequirement		requirement);
199a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
200a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskide::MovePtr<vk::Allocation>		bindBuffer							(const vk::DeviceInterface&			vk,
201a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
202a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 vk::Allocator&						allocator,
203a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkBuffer					buffer,
204a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::MemoryRequirement		requirement);
205a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
206a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkBufferCreateInfo			makeBufferCreateInfo				(const vk::VkDeviceSize				bufferSize,
207a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkBufferUsageFlags		usage);
208a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
209a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkBufferImageCopy			makeBufferImageCopy					(const vk::VkExtent3D				extent,
210a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						layersCount,
211a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						mipmapLevel		= 0u,
212a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				bufferOffset	= 0ull);
213a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
214a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkBufferMemoryBarrier		makeBufferMemoryBarrier				(const vk::VkAccessFlags			srcAccessMask,
215a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkAccessFlags			dstAccessMask,
216a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkBuffer					buffer,
217a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				offset,
218a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				bufferSizeBytes);
219a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
220a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkImageMemoryBarrier		makeImageMemoryBarrier				(const vk::VkAccessFlags			srcAccessMask,
221a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkAccessFlags			dstAccessMask,
222a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageLayout			oldLayout,
223a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageLayout			newLayout,
224a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImage					image,
225a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageSubresourceRange	subresourceRange);
226a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
227a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkImageMemoryBarrier		makeImageMemoryBarrier				(const vk::VkAccessFlags			srcAccessMask,
228a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkAccessFlags			dstAccessMask,
229a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageLayout			oldLayout,
230a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageLayout			newLayout,
231a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						srcQueueFamilyIndex,
232a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						destQueueFamilyIndex,
233a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImage					image,
234a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageSubresourceRange	subresourceRange);
235a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
236a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkMemoryBarrier				makeMemoryBarrier					(const vk::VkAccessFlags			srcAccessMask,
237a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkAccessFlags			dstAccessMask);
238a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
239a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkSparseImageMemoryBind		makeSparseImageMemoryBind			(const vk::DeviceInterface&			vk,
240a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
241a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				allocationSize,
242a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						memoryType,
243a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageSubresource&		subresource,
244a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkOffset3D&				offset,
245a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkExtent3D&				extent);
246a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
247a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivk::VkSparseMemoryBind			makeSparseMemoryBind				(const vk::DeviceInterface&			vk,
248a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
249a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				allocationSize,
250a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						memoryType,
251a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDeviceSize				resourceOffset);
252a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
253a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivoid							beginCommandBuffer					(const vk::DeviceInterface&			vk,
254a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkCommandBuffer			cmdBuffer);
255a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
256a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivoid							endCommandBuffer					(const vk::DeviceInterface&			vk,
257a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkCommandBuffer			cmdBuffer);
258a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
259a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivoid							submitCommands						(const vk::DeviceInterface&			vk,
260a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkQueue					queue,
261a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkCommandBuffer			cmdBuffer,
262a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						waitSemaphoreCount		= 0,
263a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
264a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
265a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						signalSemaphoreCount	= 0,
266a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL);
267a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
268a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivoid							submitCommandsAndWait				(const vk::DeviceInterface&			vk,
269a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkDevice					device,
270a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkQueue					queue,
271a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkCommandBuffer			cmdBuffer,
272a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						waitSemaphoreCount		= 0,
273a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkSemaphore*				pWaitSemaphores			= DE_NULL,
274a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPipelineStageFlags*	pWaitDstStageMask		= DE_NULL,
275a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const deUint32						signalSemaphoreCount	= 0,
276a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkSemaphore*				pSignalSemaphores		= DE_NULL);
277a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
278a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskivoid							requireFeatures						(const vk::InstanceInterface&		vki,
279a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
280a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const FeatureFlags					flags);
281a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
282a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						findMatchingMemoryType				(const vk::InstanceInterface&		instance,
283a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
284a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkMemoryRequirements&	objectMemoryRequirements,
285a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::MemoryRequirement&		memoryRequirement);
286a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
287a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskibool							checkSparseSupportForImageType		(const vk::InstanceInterface&		instance,
288a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
289a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const ImageType					imageType);
290a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
291a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskibool							checkSparseSupportForImageFormat	(const vk::InstanceInterface&		instance,
292a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
293a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageCreateInfo&		imageInfo);
294a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
295a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskibool							checkImageFormatFeatureSupport		(const vk::InstanceInterface&		instance,
296a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkPhysicalDevice			physicalDevice,
297a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkFormat					format,
298a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkFormatFeatureFlags		featureFlags);
299a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
300a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej JesionowskideUint32						getSparseAspectRequirementsIndex	(const std::vector<vk::VkSparseImageMemoryRequirements>&	requirements,
301a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski																	 const vk::VkImageAspectFlags								aspectFlags);
3020abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch
303b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowskiinline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
304b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski{
305b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski	return createBuffer(vk, device, &createInfo);
306b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski}
307b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski
308b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowskiinline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
309b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski{
310b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski	return createImage(vk, device, &createInfo);
311b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski}
312b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski
313932fee600b73b54426a83ce0122e37578289a24fKantochtemplate<typename T>
314a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskiinline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
315932fee600b73b54426a83ce0122e37578289a24fKantoch{
316932fee600b73b54426a83ce0122e37578289a24fKantoch	return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove));
317932fee600b73b54426a83ce0122e37578289a24fKantoch}
318932fee600b73b54426a83ce0122e37578289a24fKantoch
3190abb8ae884208e3355eb68bde6cedab1dd7b773cKantochtemplate<typename T>
320b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowskiinline de::SharedPtr<de::UniquePtr<T> > makeDeSharedPtr (de::MovePtr<T> deMove)
321b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski{
322b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski	return de::SharedPtr<de::UniquePtr<T> >(new de::UniquePtr<T>(deMove));
323b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski}
324b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowski
325b61fc2025246c4a88212f4f97895b47ad82a138dMaciej Jesionowskitemplate<typename T>
326a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskiinline std::size_t sizeInBytes (const std::vector<T>& vec)
3270abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch{
3280abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch	return vec.size() * sizeof(vec[0]);
3290abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch}
3300abb8ae884208e3355eb68bde6cedab1dd7b773cKantoch
331a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskitemplate<typename T>
332a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowskiinline const T* getDataOrNullptr (const std::vector<T>& vec, const std::size_t index = 0u)
333a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski{
334a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski	return (index < vec.size() ? &vec[index] : DE_NULL);
335a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski}
336a6fbec3926163fbfc0ad45b21f7b7e2f8aae7adfMaciej Jesionowski
337932fee600b73b54426a83ce0122e37578289a24fKantoch} // sparse
338932fee600b73b54426a83ce0122e37578289a24fKantoch} // vkt
339932fee600b73b54426a83ce0122e37578289a24fKantoch
340932fee600b73b54426a83ce0122e37578289a24fKantoch#endif // _VKTSPARSERESOURCESTESTSUTIL_HPP
341