1956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski/*------------------------------------------------------------------------
2956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski * Vulkan Conformance Tests
3956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski * ------------------------
4956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *
59a869c2848d0419008cb99f72c9fa372e3af805dPyry Haulos * Copyright (c) 2016 The Khronos Group Inc.
6956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *
7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
10956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
18956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *
19956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *//*!
20956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski * \file
21956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski * \brief Compute tests utility classes
22956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski *//*--------------------------------------------------------------------*/
23956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
24956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski#include "vktComputeTestsUtil.hpp"
25956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski#include "vkQueryUtil.hpp"
26956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski#include "vkTypeUtil.hpp"
27956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
28956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskiusing namespace vk;
29956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
30956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskinamespace vkt
31956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
32956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskinamespace compute
33956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
34956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
35956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiBuffer::Buffer (const DeviceInterface&		vk,
36956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski				const VkDevice				device,
37956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski				Allocator&					allocator,
38956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski				const VkBufferCreateInfo&	bufferCreateInfo,
39956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski				const MemoryRequirement		memoryRequirement)
40956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
41956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	m_buffer = createBuffer(vk, device, &bufferCreateInfo);
42956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	m_allocation = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), memoryRequirement);
43956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.bindBufferMemory(device, *m_buffer, m_allocation->getMemory(), m_allocation->getOffset()));
44956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
45956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
46956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiImage::Image (const DeviceInterface&	vk,
47956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski			  const VkDevice			device,
48956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski			  Allocator&				allocator,
49956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski			  const VkImageCreateInfo&	imageCreateInfo,
50956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski			  const MemoryRequirement	memoryRequirement)
51956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
52956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	m_image = createImage(vk, device, &imageCreateInfo);
53956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	m_allocation = allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement);
54956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.bindImageMemory(device, *m_image, m_allocation->getMemory(), m_allocation->getOffset()));
55956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
56956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
57956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiVkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize			bufferSize,
58956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										 const VkBufferUsageFlags	usage)
59956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
60956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkBufferCreateInfo bufferCreateInfo =
61956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
62956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType		sType;
63956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,								// const void*			pNext;
64956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,										// VkBufferCreateFlags	flags;
65956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		bufferSize,								// VkDeviceSize			size;
66956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		usage,									// VkBufferUsageFlags	usage;
67956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode		sharingMode;
68956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,										// deUint32				queueFamilyIndexCount;
69956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,								// const deUint32*		pQueueFamilyIndices;
70956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
71956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return bufferCreateInfo;
72956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
73956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
74a9f670634b3213102e5d230bc5f72c40228cdf13Pyry HaulosVkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
75956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski									   const deUint32	arraySize)
76956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
77956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkBufferImageCopy copyParams =
78956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
79956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0ull,																		//	VkDeviceSize				bufferOffset;
80956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,																			//	deUint32					bufferRowLength;
81956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,																			//	deUint32					bufferImageHeight;
82956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, arraySize),	//	VkImageSubresourceLayers	imageSubresource;
83956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		makeOffset3D(0, 0, 0),														//	VkOffset3D					imageOffset;
84956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		extent,																		//	VkExtent3D					imageExtent;
85956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
86956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return copyParams;
87956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
88956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
89956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkCommandPool> makeCommandPool (const DeviceInterface& vk, const VkDevice device, const deUint32 queueFamilyIndex)
90956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
91956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkCommandPoolCreateInfo commandPoolParams =
92956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
93956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,			// VkStructureType			sType;
94956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*				pNext;
95956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,	// VkCommandPoolCreateFlags	flags;
96369bb7563a5671e167b212d77a3d5b88beac04f0Pyry Haulos		queueFamilyIndex,									// deUint32					queueFamilyIndex;
97956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
98956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createCommandPool(vk, device, &commandPoolParams);
99956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
100956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
101956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkCommandBuffer> makeCommandBuffer (const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool)
102956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
103956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkCommandBufferAllocateInfo bufferAllocateParams =
104956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
105956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,		// VkStructureType			sType;
106956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*				pNext;
107956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		commandPool,										// VkCommandPool			commandPool;
108956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_COMMAND_BUFFER_LEVEL_PRIMARY,					// VkCommandBufferLevel		level;
109956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		1u,													// deUint32					bufferCount;
110956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
111956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return allocateCommandBuffer(vk, device, &bufferAllocateParams);
112956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
113956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
114956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
115956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										   const VkDevice				device)
116956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
117956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
118956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
119956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
120956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*						pNext;
121956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// VkPipelineLayoutCreateFlags		flags;
122956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// deUint32							setLayoutCount;
123956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const VkDescriptorSetLayout*		pSetLayouts;
124956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// deUint32							pushConstantRangeCount;
125956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
126956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
127956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createPipelineLayout(vk, device, &pipelineLayoutParams);
128956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
129956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
130956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
131956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										   const VkDevice				device,
132956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										   const VkDescriptorSetLayout	descriptorSetLayout)
133956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
134956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
135956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
136956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
137956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*						pNext;
138956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// VkPipelineLayoutCreateFlags		flags;
139956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		1u,													// deUint32							setLayoutCount;
140956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		&descriptorSetLayout,								// const VkDescriptorSetLayout*		pSetLayouts;
141956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// deUint32							pushConstantRangeCount;
142956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
143956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
144956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createPipelineLayout(vk, device, &pipelineLayoutParams);
145956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
146956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
147956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkPipeline> makeComputePipeline (const DeviceInterface&	vk,
148956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski									  const VkDevice			device,
149956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski									  const VkPipelineLayout	pipelineLayout,
150956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski									  const VkShaderModule		shaderModule)
151956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
152956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
153956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
154956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
155956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,												// const void*							pNext;
156956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,														// VkPipelineShaderStageCreateFlags		flags;
157956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_SHADER_STAGE_COMPUTE_BIT,							// VkShaderStageFlagBits				stage;
158956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		shaderModule,											// VkShaderModule						module;
159956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		"main",													// const char*							pName;
160956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,												// const VkSpecializationInfo*			pSpecializationInfo;
161956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
162956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkComputePipelineCreateInfo pipelineCreateInfo =
163956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
164956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,		// VkStructureType					sType;
165956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*						pNext;
166956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,													// VkPipelineCreateFlags			flags;
167956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		pipelineShaderStageParams,							// VkPipelineShaderStageCreateInfo	stage;
168956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		pipelineLayout,										// VkPipelineLayout					layout;
169956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// VkPipeline						basePipelineHandle;
170956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0,													// deInt32							basePipelineIndex;
171956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
172956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
173956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
174956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
175956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkBufferView> makeBufferView (const DeviceInterface&	vk,
176956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								   const VkDevice			vkDevice,
177956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								   const VkBuffer			buffer,
178956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								   const VkFormat			format,
179956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								   const VkDeviceSize		offset,
180956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								   const VkDeviceSize		size)
181956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
182956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkBufferViewCreateInfo bufferViewParams =
183956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
184956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,	// VkStructureType			sType;
185956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,									// const void*				pNext;
186956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,											// VkBufferViewCreateFlags	flags;
187956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		buffer,										// VkBuffer					buffer;
188956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		format,										// VkFormat					format;
189956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		offset,										// VkDeviceSize				offset;
190956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		size,										// VkDeviceSize				range;
191956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
192956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createBufferView(vk, vkDevice, &bufferViewParams);
193956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
194956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
195956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkImageView> makeImageView (const DeviceInterface&			vk,
196956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								 const VkDevice					vkDevice,
197956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								 const VkImage					image,
198956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								 const VkImageViewType			imageViewType,
199956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								 const VkFormat					format,
200956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski								 const VkImageSubresourceRange	subresourceRange)
201956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
202956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkImageViewCreateInfo imageViewParams =
203956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
204956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// VkStructureType			sType;
205956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,										// const void*				pNext;
206956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,												// VkImageViewCreateFlags	flags;
207956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		image,											// VkImage					image;
208956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		imageViewType,									// VkImageViewType			viewType;
209956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		format,											// VkFormat					format;
210956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		makeComponentMappingRGBA(),						// VkComponentMapping		components;
211956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
212956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
213956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return createImageView(vk, vkDevice, &imageViewParams);
214956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
215956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
216956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiMove<VkDescriptorSet> makeDescriptorSet (const DeviceInterface&			vk,
217956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										 const VkDevice					device,
218956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										 const VkDescriptorPool			descriptorPool,
219956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski										 const VkDescriptorSetLayout	setLayout)
220956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
221956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkDescriptorSetAllocateInfo allocateParams =
222956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
223956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType				sType;
224956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,											// const void*					pNext;
225956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		descriptorPool,										// VkDescriptorPool				descriptorPool;
226956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		1u,													// deUint32						setLayoutCount;
227956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		&setLayout,											// const VkDescriptorSetLayout*	pSetLayouts;
228956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
229956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return allocateDescriptorSet(vk, device, &allocateParams);
230956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
231956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
232956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiVkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags	srcAccessMask,
233956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											   const VkAccessFlags	dstAccessMask,
234956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											   const VkBuffer		buffer,
235956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											   const VkDeviceSize	offset,
236956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											   const VkDeviceSize	bufferSizeBytes)
237956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
238956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkBufferMemoryBarrier barrier =
239956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
240956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
241956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,									// const void*		pNext;
242956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		srcAccessMask,								// VkAccessFlags	srcAccessMask;
243956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		dstAccessMask,								// VkAccessFlags	dstAccessMask;
244956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
245956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_QUEUE_FAMILY_IGNORED,					// deUint32			destQueueFamilyIndex;
246956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		buffer,										// VkBuffer			buffer;
247956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		offset,										// VkDeviceSize		offset;
248956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		bufferSizeBytes,							// VkDeviceSize		size;
249956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
250956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return barrier;
251956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
252956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
253956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej JesionowskiVkImageMemoryBarrier makeImageMemoryBarrier	(const VkAccessFlags			srcAccessMask,
254956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											 const VkAccessFlags			dstAccessMask,
255956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											 const VkImageLayout			oldLayout,
256956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											 const VkImageLayout			newLayout,
257956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											 const VkImage					image,
258956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski											 const VkImageSubresourceRange	subresourceRange)
259956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
260956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkImageMemoryBarrier barrier =
261956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
262956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
263956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,										// const void*				pNext;
264956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		srcAccessMask,									// VkAccessFlags			outputMask;
265956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		dstAccessMask,									// VkAccessFlags			inputMask;
266956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		oldLayout,										// VkImageLayout			oldLayout;
267956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		newLayout,										// VkImageLayout			newLayout;
268956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
269956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_QUEUE_FAMILY_IGNORED,						// deUint32					destQueueFamilyIndex;
270956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		image,											// VkImage					image;
271956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
272956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
273956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	return barrier;
274956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
275956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
276956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskivoid beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
277956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
278956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkCommandBufferBeginInfo commandBufBeginParams =
279956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
2807c07a7d482295107670797fdf7da8a40e461b40bMaciej Jesionowski		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
2817c07a7d482295107670797fdf7da8a40e461b40bMaciej Jesionowski		DE_NULL,										// const void*						pNext;
2827c07a7d482295107670797fdf7da8a40e461b40bMaciej Jesionowski		0u,												// VkCommandBufferUsageFlags		flags;
283689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkCommandBufferInheritanceInfo*)DE_NULL,
284956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
285956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
286956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
287956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
288956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskivoid endCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
289956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
290956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.endCommandBuffer(commandBuffer));
291956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
292956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
293956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowskivoid submitCommandsAndWait (const DeviceInterface&	vk,
294956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski							const VkDevice			device,
295956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski							const VkQueue			queue,
296956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski							const VkCommandBuffer	commandBuffer)
297956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski{
298956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkFenceCreateInfo	fenceParams =
299956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
300956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
301956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,								// const void*			pNext;
302956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,										// VkFenceCreateFlags	flags;
303956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
304956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const Unique<VkFence> fence(createFence(vk, device, &fenceParams));
305956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
306956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	const VkSubmitInfo submitInfo =
307956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	{
308956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		VK_STRUCTURE_TYPE_SUBMIT_INFO,		// VkStructureType			sType;
309956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,							// const void*				pNext;
310956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,									// deUint32					waitSemaphoreCount;
311956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
312689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
313956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		1u,									// deUint32					commandBufferCount;
314956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		&commandBuffer,						// const VkCommandBuffer*	pCommandBuffers;
315956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		0u,									// deUint32					signalSemaphoreCount;
316956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski		DE_NULL,							// const VkSemaphore*		pSignalSemaphores;
317956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	};
318956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
319956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
320956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
321956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski}
322956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski
323956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski} // compute
324956dc48a6649925e468ba4f4f1ce6cd7591472ddMaciej Jesionowski} // vkt
325