1e5c31af7Sopenharmony_ci#ifndef _VKOBJUTIL_HPP
2e5c31af7Sopenharmony_ci#define _VKOBJUTIL_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan CTS Framework
5e5c31af7Sopenharmony_ci * --------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2015 Google 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
23e5c31af7Sopenharmony_ci * \brief Utilities for creating commonly used Vulkan objects
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include <vector>
27e5c31af7Sopenharmony_ci#include <memory>
28e5c31af7Sopenharmony_ci#include "vkRef.hpp"
29e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp"
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_cinamespace vk
32e5c31af7Sopenharmony_ci{
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_cistruct CommandPoolWithBuffer {
35e5c31af7Sopenharmony_ci	Move<VkCommandPool>		cmdPool;
36e5c31af7Sopenharmony_ci	Move<VkCommandBuffer>	cmdBuffer;
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ci	CommandPoolWithBuffer(const DeviceInterface& vkd, const VkDevice device, const deUint32 queueFamilyIndex);
39e5c31af7Sopenharmony_ci};
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_ciMove<VkPipeline> makeComputePipeline (const DeviceInterface&					vk,
42e5c31af7Sopenharmony_ci									  const VkDevice							device,
43e5c31af7Sopenharmony_ci									  const VkPipelineLayout					pipelineLayout,
44e5c31af7Sopenharmony_ci									  const VkPipelineCreateFlags				pipelineFlags,
45e5c31af7Sopenharmony_ci									  const void*								pipelinePNext,
46e5c31af7Sopenharmony_ci									  const VkShaderModule						shaderModule,
47e5c31af7Sopenharmony_ci									  const VkPipelineShaderStageCreateFlags	shaderFlags,
48e5c31af7Sopenharmony_ci									  const VkSpecializationInfo*				specializationInfo = DE_NULL,
49e5c31af7Sopenharmony_ci									  const VkPipelineCache						pipelineCache = DE_NULL,
50e5c31af7Sopenharmony_ci									  const uint32_t							subgroupSize = 0);
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_ciMove<VkPipeline> makeComputePipeline (const DeviceInterface&	vk,
53e5c31af7Sopenharmony_ci									  VkDevice					device,
54e5c31af7Sopenharmony_ci									  VkPipelineLayout			pipelineLayout,
55e5c31af7Sopenharmony_ci									  VkShaderModule			shaderModule);
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface&							vk,
58e5c31af7Sopenharmony_ci									   const VkDevice									device,
59e5c31af7Sopenharmony_ci									   const VkPipelineLayout							pipelineLayout,
60e5c31af7Sopenharmony_ci									   const VkShaderModule								vertexShaderModule,
61e5c31af7Sopenharmony_ci									   const VkShaderModule								tessellationControlShaderModule,
62e5c31af7Sopenharmony_ci									   const VkShaderModule								tessellationEvalShaderModule,
63e5c31af7Sopenharmony_ci									   const VkShaderModule								geometryShaderModule,
64e5c31af7Sopenharmony_ci									   const VkShaderModule								fragmentShaderModule,
65e5c31af7Sopenharmony_ci									   const VkRenderPass								renderPass,
66e5c31af7Sopenharmony_ci									   const std::vector<VkViewport>&					viewports,
67e5c31af7Sopenharmony_ci									   const std::vector<VkRect2D>&						scissors,
68e5c31af7Sopenharmony_ci									   const VkPrimitiveTopology						topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
69e5c31af7Sopenharmony_ci									   const deUint32									subpass = 0u,
70e5c31af7Sopenharmony_ci									   const deUint32									patchControlPoints = 0u,
71e5c31af7Sopenharmony_ci									   const VkPipelineVertexInputStateCreateInfo*		vertexInputStateCreateInfo = DE_NULL,
72e5c31af7Sopenharmony_ci									   const VkPipelineRasterizationStateCreateInfo*	rasterizationStateCreateInfo = DE_NULL,
73e5c31af7Sopenharmony_ci									   const VkPipelineMultisampleStateCreateInfo*		multisampleStateCreateInfo = DE_NULL,
74e5c31af7Sopenharmony_ci									   const VkPipelineDepthStencilStateCreateInfo*		depthStencilStateCreateInfo = DE_NULL,
75e5c31af7Sopenharmony_ci									   const VkPipelineColorBlendStateCreateInfo*		colorBlendStateCreateInfo = DE_NULL,
76e5c31af7Sopenharmony_ci									   const VkPipelineDynamicStateCreateInfo*			dynamicStateCreateInfo = DE_NULL,
77e5c31af7Sopenharmony_ci									   const void*										pNext = DE_NULL,
78e5c31af7Sopenharmony_ci									   const VkPipelineCreateFlags						pipelineCreateFlags = 0u);
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface&							vk,
81e5c31af7Sopenharmony_ci									   const VkDevice									device,
82e5c31af7Sopenharmony_ci									   const VkPipelineLayout							pipelineLayout,
83e5c31af7Sopenharmony_ci									   const VkShaderModule								vertexShaderModule,
84e5c31af7Sopenharmony_ci									   const VkShaderModule								tessellationControlShaderModule,
85e5c31af7Sopenharmony_ci									   const VkShaderModule								tessellationEvalShaderModule,
86e5c31af7Sopenharmony_ci									   const VkShaderModule								geometryShaderModule,
87e5c31af7Sopenharmony_ci									   const VkShaderModule								fragmentShaderModule,
88e5c31af7Sopenharmony_ci									   const VkRenderPass								renderPass,
89e5c31af7Sopenharmony_ci									   const deUint32									subpass = 0u,
90e5c31af7Sopenharmony_ci									   const VkPipelineVertexInputStateCreateInfo*		vertexInputStateCreateInfo = DE_NULL,
91e5c31af7Sopenharmony_ci									   const VkPipelineInputAssemblyStateCreateInfo*	inputAssemblyStateCreateInfo = DE_NULL,
92e5c31af7Sopenharmony_ci									   const VkPipelineTessellationStateCreateInfo*		tessStateCreateInfo = DE_NULL,
93e5c31af7Sopenharmony_ci									   const VkPipelineViewportStateCreateInfo*			viewportStateCreateInfo = DE_NULL,
94e5c31af7Sopenharmony_ci									   const VkPipelineRasterizationStateCreateInfo*	rasterizationStateCreateInfo = DE_NULL,
95e5c31af7Sopenharmony_ci									   const VkPipelineMultisampleStateCreateInfo*		multisampleStateCreateInfo = DE_NULL,
96e5c31af7Sopenharmony_ci									   const VkPipelineDepthStencilStateCreateInfo*		depthStencilStateCreateInfo = DE_NULL,
97e5c31af7Sopenharmony_ci									   const VkPipelineColorBlendStateCreateInfo*		colorBlendStateCreateInfo = DE_NULL,
98e5c31af7Sopenharmony_ci									   const VkPipelineDynamicStateCreateInfo*			dynamicStateCreateInfo = DE_NULL,
99e5c31af7Sopenharmony_ci									   const void*										pNext = DE_NULL,
100e5c31af7Sopenharmony_ci									   const VkPipelineCreateFlags						pipelineCreateFlags = 0u);
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC
103e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface&							vk,
104e5c31af7Sopenharmony_ci									   const VkDevice									device,
105e5c31af7Sopenharmony_ci									   const VkPipelineLayout							pipelineLayout,
106e5c31af7Sopenharmony_ci									   const VkShaderModule								taskShaderModule,
107e5c31af7Sopenharmony_ci									   const VkShaderModule								meshShaderModule,
108e5c31af7Sopenharmony_ci									   const VkShaderModule								fragmentShaderModule,
109e5c31af7Sopenharmony_ci									   const VkRenderPass								renderPass,
110e5c31af7Sopenharmony_ci									   const std::vector<VkViewport>&					viewports,
111e5c31af7Sopenharmony_ci									   const std::vector<VkRect2D>&						scissors,
112e5c31af7Sopenharmony_ci									   const deUint32									subpass = 0u,
113e5c31af7Sopenharmony_ci									   const VkPipelineRasterizationStateCreateInfo*	rasterizationStateCreateInfo = nullptr,
114e5c31af7Sopenharmony_ci									   const VkPipelineMultisampleStateCreateInfo*		multisampleStateCreateInfo = nullptr,
115e5c31af7Sopenharmony_ci									   const VkPipelineDepthStencilStateCreateInfo*		depthStencilStateCreateInfo = nullptr,
116e5c31af7Sopenharmony_ci									   const VkPipelineColorBlendStateCreateInfo*		colorBlendStateCreateInfo = nullptr,
117e5c31af7Sopenharmony_ci									   const VkPipelineDynamicStateCreateInfo*			dynamicStateCreateInfo = nullptr,
118e5c31af7Sopenharmony_ci									   const VkPipelineCreateFlags						pipelineCreateFlags = 0u,
119e5c31af7Sopenharmony_ci									   const void*										pNext = nullptr);
120e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface&								vk,
123e5c31af7Sopenharmony_ci									   const VkDevice										device,
124e5c31af7Sopenharmony_ci									   const VkPipeline										basePipelineHandle,
125e5c31af7Sopenharmony_ci									   const VkPipelineLayout								pipelineLayout,
126e5c31af7Sopenharmony_ci									   const VkPipelineCreateFlags							pipelineCreateFlags,
127e5c31af7Sopenharmony_ci									   const std::vector<VkPipelineShaderStageCreateInfo>&	shaderCreateInfos,
128e5c31af7Sopenharmony_ci									   const VkRenderPass									renderPass,
129e5c31af7Sopenharmony_ci									   const std::vector<VkViewport>&						viewports,
130e5c31af7Sopenharmony_ci									   const std::vector<VkRect2D>&							scissors,
131e5c31af7Sopenharmony_ci									   const deUint32										subpass = 0u,
132e5c31af7Sopenharmony_ci									   const VkPipelineRasterizationStateCreateInfo*		rasterizationStateCreateInfo = nullptr,
133e5c31af7Sopenharmony_ci									   const VkPipelineMultisampleStateCreateInfo*			multisampleStateCreateInfo = nullptr,
134e5c31af7Sopenharmony_ci									   const VkPipelineDepthStencilStateCreateInfo*			depthStencilStateCreateInfo = nullptr,
135e5c31af7Sopenharmony_ci									   const VkPipelineColorBlendStateCreateInfo*			colorBlendStateCreateInfo = nullptr,
136e5c31af7Sopenharmony_ci									   const VkPipelineDynamicStateCreateInfo*				dynamicStateCreateInfo = nullptr,
137e5c31af7Sopenharmony_ci									   const void*											pNext = nullptr);
138e5c31af7Sopenharmony_ci
139e5c31af7Sopenharmony_ciMove<VkRenderPass> makeRenderPass (const DeviceInterface&				vk,
140e5c31af7Sopenharmony_ci								   const VkDevice						device,
141e5c31af7Sopenharmony_ci								   const VkFormat						colorFormat					= VK_FORMAT_UNDEFINED,
142e5c31af7Sopenharmony_ci								   const VkFormat						depthStencilFormat			= VK_FORMAT_UNDEFINED,
143e5c31af7Sopenharmony_ci								   const VkAttachmentLoadOp				loadOperation				= VK_ATTACHMENT_LOAD_OP_CLEAR,
144e5c31af7Sopenharmony_ci								   const VkImageLayout					finalLayoutColor			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
145e5c31af7Sopenharmony_ci								   const VkImageLayout					finalLayoutDepthStencil		= VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
146e5c31af7Sopenharmony_ci								   const VkImageLayout					subpassLayoutColor			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
147e5c31af7Sopenharmony_ci								   const VkImageLayout					subpassLayoutDepthStencil	= VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
148e5c31af7Sopenharmony_ci								   const VkAllocationCallbacks* const	allocationCallbacks			= nullptr,
149e5c31af7Sopenharmony_ci								   const void*							pNext						= nullptr);
150e5c31af7Sopenharmony_ci
151e5c31af7Sopenharmony_ciMove<VkImageView> makeImageView (const DeviceInterface&					vk,
152e5c31af7Sopenharmony_ci								 const VkDevice							vkDevice,
153e5c31af7Sopenharmony_ci								 const VkImage							image,
154e5c31af7Sopenharmony_ci								 const VkImageViewType					imageViewType,
155e5c31af7Sopenharmony_ci								 const VkFormat							format,
156e5c31af7Sopenharmony_ci								 const VkImageSubresourceRange			subresourceRange,
157e5c31af7Sopenharmony_ci								 const vk::VkImageViewUsageCreateInfo*	imageUsageCreateInfo = DE_NULL);
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ciMove<VkBufferView> makeBufferView (const DeviceInterface&	vk,
160e5c31af7Sopenharmony_ci								   const VkDevice			vkDevice,
161e5c31af7Sopenharmony_ci								   const VkBuffer			buffer,
162e5c31af7Sopenharmony_ci								   const VkFormat			format,
163e5c31af7Sopenharmony_ci								   const VkDeviceSize		offset,
164e5c31af7Sopenharmony_ci								   const VkDeviceSize		size);
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_ciMove<VkDescriptorSet> makeDescriptorSet (const DeviceInterface&			vk,
167e5c31af7Sopenharmony_ci										 const VkDevice					device,
168e5c31af7Sopenharmony_ci										 const VkDescriptorPool			descriptorPool,
169e5c31af7Sopenharmony_ci										 const VkDescriptorSetLayout	setLayout,
170e5c31af7Sopenharmony_ci										 const void*					pNext = DE_NULL);
171e5c31af7Sopenharmony_ci
172e5c31af7Sopenharmony_ciVkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize			size,
173e5c31af7Sopenharmony_ci										 const VkBufferUsageFlags	usage);
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ciVkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize				size,
176e5c31af7Sopenharmony_ci										 const VkBufferUsageFlags		usage,
177e5c31af7Sopenharmony_ci										 const std::vector<deUint32>&	queueFamilyIndices,
178e5c31af7Sopenharmony_ci										 const VkBufferCreateFlags		createFlags = 0);
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
181e5c31af7Sopenharmony_ci										   const VkDevice				device,
182e5c31af7Sopenharmony_ci										   const VkDescriptorSetLayout	descriptorSetLayout = DE_NULL,
183e5c31af7Sopenharmony_ci										   const VkPushConstantRange*	pushConstantRange = nullptr);
184e5c31af7Sopenharmony_ci
185e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&					vk,
186e5c31af7Sopenharmony_ci										   const VkDevice							device,
187e5c31af7Sopenharmony_ci										   const std::vector<VkDescriptorSetLayout>	&descriptorSetLayouts);
188e5c31af7Sopenharmony_ci
189e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&								vk,
190e5c31af7Sopenharmony_ci										   const VkDevice										device,
191e5c31af7Sopenharmony_ci										   const std::vector<vk::Move<VkDescriptorSetLayout>>	&descriptorSetLayouts);
192e5c31af7Sopenharmony_ci
193e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&				vk,
194e5c31af7Sopenharmony_ci										   const VkDevice						device,
195e5c31af7Sopenharmony_ci										   const deUint32						setLayoutCount,
196e5c31af7Sopenharmony_ci										   const VkDescriptorSetLayout*			descriptorSetLayout,
197e5c31af7Sopenharmony_ci										   const VkPipelineLayoutCreateFlags	flags = 0u);
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&				vk,
200e5c31af7Sopenharmony_ci										   const VkDevice						device,
201e5c31af7Sopenharmony_ci										   const deUint32						setLayoutCount,
202e5c31af7Sopenharmony_ci										   const VkDescriptorSetLayout*			descriptorSetLayout,
203e5c31af7Sopenharmony_ci										   const deUint32						pushConstantRangeCount,
204e5c31af7Sopenharmony_ci										   const VkPushConstantRange*			pPushConstantRanges,
205e5c31af7Sopenharmony_ci										   const VkPipelineLayoutCreateFlags	flags = 0u);
206e5c31af7Sopenharmony_ci
207e5c31af7Sopenharmony_ciMove<VkFramebuffer> makeFramebuffer (const DeviceInterface&	vk,
208e5c31af7Sopenharmony_ci									 const VkDevice			device,
209e5c31af7Sopenharmony_ci									 const VkRenderPass		renderPass,
210e5c31af7Sopenharmony_ci									 const VkImageView		colorAttachment,
211e5c31af7Sopenharmony_ci									 const deUint32			width,
212e5c31af7Sopenharmony_ci									 const deUint32			height,
213e5c31af7Sopenharmony_ci									 const deUint32			layers = 1u);
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ciMove<VkFramebuffer> makeFramebuffer (const DeviceInterface&	vk,
216e5c31af7Sopenharmony_ci									 const VkDevice			device,
217e5c31af7Sopenharmony_ci									 const VkRenderPass		renderPass,
218e5c31af7Sopenharmony_ci									 const deUint32			attachmentCount,
219e5c31af7Sopenharmony_ci									 const VkImageView*		attachmentsArray,
220e5c31af7Sopenharmony_ci									 const deUint32			width,
221e5c31af7Sopenharmony_ci									 const deUint32			height,
222e5c31af7Sopenharmony_ci									 const deUint32			layers = 1u);
223e5c31af7Sopenharmony_ci
224e5c31af7Sopenharmony_ciMove<VkCommandPool> makeCommandPool (const DeviceInterface&	vk,
225e5c31af7Sopenharmony_ci									 const VkDevice			device,
226e5c31af7Sopenharmony_ci									 const deUint32			queueFamilyIndex);
227e5c31af7Sopenharmony_ci
228e5c31af7Sopenharmony_ciinline Move<VkBuffer> makeBuffer (const DeviceInterface&	vk,
229e5c31af7Sopenharmony_ci								  const VkDevice			device,
230e5c31af7Sopenharmony_ci								  const VkDeviceSize		bufferSize,
231e5c31af7Sopenharmony_ci								  const VkBufferUsageFlags	usage)
232e5c31af7Sopenharmony_ci{
233e5c31af7Sopenharmony_ci	const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
234e5c31af7Sopenharmony_ci	return createBuffer(vk, device, &bufferCreateInfo);
235e5c31af7Sopenharmony_ci}
236e5c31af7Sopenharmony_ci
237e5c31af7Sopenharmony_ciinline Move<VkBuffer> makeBuffer (const vk::DeviceInterface&	vk,
238e5c31af7Sopenharmony_ci								  const vk::VkDevice			device,
239e5c31af7Sopenharmony_ci								  const vk::VkBufferCreateInfo&	createInfo)
240e5c31af7Sopenharmony_ci{
241e5c31af7Sopenharmony_ci	return createBuffer(vk, device, &createInfo);
242e5c31af7Sopenharmony_ci}
243e5c31af7Sopenharmony_ci
244e5c31af7Sopenharmony_ciinline Move<VkImage> makeImage (const DeviceInterface&		vk,
245e5c31af7Sopenharmony_ci								const VkDevice				device,
246e5c31af7Sopenharmony_ci								const VkImageCreateInfo&	createInfo)
247e5c31af7Sopenharmony_ci{
248e5c31af7Sopenharmony_ci	return createImage(vk, device, &createInfo);
249e5c31af7Sopenharmony_ci}
250e5c31af7Sopenharmony_ci
251e5c31af7Sopenharmony_ciVkBufferImageCopy makeBufferImageCopy (const VkExtent3D					extent,
252e5c31af7Sopenharmony_ci									   const VkImageSubresourceLayers	subresourceLayers);
253e5c31af7Sopenharmony_ci
254e5c31af7Sopenharmony_ci} // vk
255e5c31af7Sopenharmony_ci
256e5c31af7Sopenharmony_ci#endif // _VKOBJUTIL_HPP
257