1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2017 The Khronos Group Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Vulkan Multi View Render Util
22  *//*--------------------------------------------------------------------*/
23 
24 #include "vktMultiViewRenderUtil.hpp"
25 #include "vktMultiViewRenderPassUtil.hpp"
26 
27 #include "vktTestCase.hpp"
28 #include "vkBuilderUtil.hpp"
29 #include "vkRefUtil.hpp"
30 #include "vkQueryUtil.hpp"
31 #include "vkTypeUtil.hpp"
32 #include "vkPrograms.hpp"
33 #include "vkPlatform.hpp"
34 #include "vkMemUtil.hpp"
35 #include "vkImageUtil.hpp"
36 
37 #include "tcuTestLog.hpp"
38 #include "tcuResource.hpp"
39 #include "tcuImageCompare.hpp"
40 #include "tcuCommandLine.hpp"
41 #include "tcuTextureUtil.hpp"
42 #include "tcuRGBA.hpp"
43 
44 namespace vkt
45 {
46 namespace MultiView
47 {
48 using namespace vk;
49 using de::MovePtr;
50 using de::UniquePtr;
51 using std::vector;
52 
getAspectFlags(tcu::TextureFormat format)53 VkImageAspectFlags getAspectFlags (tcu::TextureFormat format)
54 {
55 	VkImageAspectFlags	aspectFlag	= 0;
56 	aspectFlag |= (tcu::hasDepthComponent(format.order)? VK_IMAGE_ASPECT_DEPTH_BIT : 0);
57 	aspectFlag |= (tcu::hasStencilComponent(format.order)? VK_IMAGE_ASPECT_STENCIL_BIT : 0);
58 
59 	if (!aspectFlag)
60 		aspectFlag = VK_IMAGE_ASPECT_COLOR_BIT;
61 
62 	return aspectFlag;
63 }
64 
getStencilBufferFormat(const vk::VkFormat depthStencilImageFormat)65 VkFormat getStencilBufferFormat (const vk::VkFormat depthStencilImageFormat)
66 {
67 	const tcu::TextureFormat tcuFormat = mapVkFormat(depthStencilImageFormat);
68 	const VkFormat result = (tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS) ? VK_FORMAT_S8_UINT : VK_FORMAT_UNDEFINED;
69 
70 	DE_ASSERT(result != VK_FORMAT_UNDEFINED);
71 
72 	return result;
73 }
74 
getDepthBufferFormat(const vk::VkFormat depthStencilImageFormat)75 VkFormat getDepthBufferFormat (const vk::VkFormat depthStencilImageFormat)
76 {
77 	VkFormat result = VK_FORMAT_UNDEFINED;
78 
79 	switch (depthStencilImageFormat)
80 	{
81 		case VK_FORMAT_D16_UNORM:
82 		case VK_FORMAT_D16_UNORM_S8_UINT:
83 		{
84 			result = VK_FORMAT_D16_UNORM;
85 
86 			break;
87 		}
88 
89 		case VK_FORMAT_D32_SFLOAT:
90 		case VK_FORMAT_D32_SFLOAT_S8_UINT:
91 		{
92 			result = VK_FORMAT_D32_SFLOAT;
93 			break;
94 		}
95 
96 		case VK_FORMAT_X8_D24_UNORM_PACK32:
97 		case VK_FORMAT_D24_UNORM_S8_UINT:
98 		{
99 			result = VK_FORMAT_D24_UNORM_S8_UINT;
100 			break;
101 		}
102 
103 		default:
104 			result = VK_FORMAT_UNDEFINED;
105 	}
106 
107 	DE_ASSERT(result != VK_FORMAT_UNDEFINED);
108 
109 	return result;
110 }
111 
makeImageCreateInfo(const VkImageType imageType,const VkExtent3D & extent,const VkFormat format,const VkImageUsageFlags usage,const VkSampleCountFlagBits samples)112 VkImageCreateInfo makeImageCreateInfo (const VkImageType imageType, const VkExtent3D& extent, const VkFormat format, const VkImageUsageFlags usage, const VkSampleCountFlagBits samples)
113 {
114 	const VkImageCreateInfo imageInfo	=
115 	{
116 		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType			sType;
117 		DE_NULL,									// const void*				pNext;
118 		(VkImageCreateFlags)0,						// VkImageCreateFlags		flags;
119 		imageType,									// VkImageType				imageType;
120 		format,										// VkFormat					format;
121 		{extent.width, extent.height, 1u},			// VkExtent3D				extent;
122 		1u,											// uint32_t					mipLevels;
123 		extent.depth,								// uint32_t					arrayLayers;
124 		samples,									// VkSampleCountFlagBits	samples;
125 		VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling			tiling;
126 		usage,										// VkImageUsageFlags		usage;
127 		VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode			sharingMode;
128 		0u,											// uint32_t					queueFamilyIndexCount;
129 		DE_NULL,									// const uint32_t*			pQueueFamilyIndices;
130 		VK_IMAGE_LAYOUT_UNDEFINED,					// VkImageLayout			initialLayout;
131 	};
132 	return imageInfo;
133 }
134 
makeDescriptorSetLayout(const DeviceInterface & vk,const VkDevice device)135 Move<VkDescriptorSetLayout> makeDescriptorSetLayout (const DeviceInterface&		vk,
136 													const VkDevice				device)
137 {
138 	const VkDescriptorSetLayoutBinding		binding		=
139 	{
140 		0u,											//deUint32				binding;
141 		vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,	//VkDescriptorType		descriptorType;
142 		1u,											//deUint32				descriptorCount;
143 		vk::VK_SHADER_STAGE_FRAGMENT_BIT,			//VkShaderStageFlags	stageFlags;
144 		DE_NULL										//const VkSampler*		pImmutableSamplers;
145 	};
146 
147 	const VkDescriptorSetLayoutCreateInfo	createInfo	=
148 	{
149 		vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,	//VkStructureType						sType;
150 		DE_NULL,													//const void*							pNext;
151 		0u,															//VkDescriptorSetLayoutCreateFlags		flags;
152 		1u,															//deUint32								bindingCount;
153 		&binding													//const VkDescriptorSetLayoutBinding*	pBindings;
154 	};
155 	return vk::createDescriptorSetLayout(vk, device, &createInfo);
156 }
157 
158 template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
makeRenderPass(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<deUint32> & viewMasks,const VkSampleCountFlagBits samples,const VkAttachmentLoadOp colorLoadOp,const VkFormat dsFormat)159 Move<VkRenderPass> makeRenderPass (const DeviceInterface&		vk,
160 								   const VkDevice				device,
161 								   const VkFormat				colorFormat,
162 								   const vector<deUint32>&		viewMasks,
163 								   const VkSampleCountFlagBits	samples,
164 								   const VkAttachmentLoadOp		colorLoadOp,
165 								   const VkFormat				dsFormat)
166 {
167 	const bool									dsAttacmentAvailable		= (dsFormat != vk::VK_FORMAT_UNDEFINED);
168 	const deUint32								subpassCount				= static_cast<deUint32>(viewMasks.size());
169 	const AttachmentDesc						colorAttachmentDescription	// VkAttachmentDescription										||  VkAttachmentDescription2KHR
170 	(
171 																			//																||  VkStructureType						sType;
172 		DE_NULL,															//																||  const void*							pNext;
173 		(VkAttachmentDescriptionFlags)0,									//  VkAttachmentDescriptionFlags	flags;						||  VkAttachmentDescriptionFlags		flags;
174 		colorFormat,														//  VkFormat						format;						||  VkFormat							format;
175 		samples,															//  VkSampleCountFlagBits			samples;					||  VkSampleCountFlagBits				samples;
176 		colorLoadOp,														//  VkAttachmentLoadOp				loadOp;						||  VkAttachmentLoadOp					loadOp;
177 		VK_ATTACHMENT_STORE_OP_STORE,										//  VkAttachmentStoreOp				storeOp;					||  VkAttachmentStoreOp					storeOp;
178 		VK_ATTACHMENT_LOAD_OP_DONT_CARE,									//  VkAttachmentLoadOp				stencilLoadOp;				||  VkAttachmentLoadOp					stencilLoadOp;
179 		VK_ATTACHMENT_STORE_OP_DONT_CARE,									//  VkAttachmentStoreOp				stencilStoreOp;				||  VkAttachmentStoreOp					stencilStoreOp;
180 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,							//  VkImageLayout					initialLayout;				||  VkImageLayout						initialLayout;
181 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL							//  VkImageLayout					finalLayout;				||  VkImageLayout						finalLayout;
182 	);
183 
184 	const AttachmentRef							colorAttachmentReference	//  VkAttachmentReference										||  VkAttachmentReference2KHR
185 	(
186 																			//																||  VkStructureType						sType;
187 		DE_NULL,															//																||  const void*							pNext;
188 		0u,																	//  deUint32						attachment;					||  deUint32							attachment;
189 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,							//  VkImageLayout					layout;						||  VkImageLayout						layout;
190 		0u																	//																||  VkImageAspectFlags					aspectMask;
191 	);
192 
193 	const AttachmentDesc						dsAttachmentDescription		//  VkAttachmentDescription										||  VkAttachmentDescription2KHR
194 	(
195 																			//																||  VkStructureType						sType;
196 		DE_NULL,															//																||  const void*							pNext;
197 		(VkAttachmentDescriptionFlags)0,									//  VkAttachmentDescriptionFlags	flags;						||  VkAttachmentDescriptionFlags		flags;
198 		dsFormat,															//  VkFormat						format;						||  VkFormat							format;
199 		samples,															//  VkSampleCountFlagBits			samples;					||  VkSampleCountFlagBits				samples;
200 		VK_ATTACHMENT_LOAD_OP_LOAD,											//  VkAttachmentLoadOp				loadOp;						||  VkAttachmentLoadOp					loadOp;
201 		VK_ATTACHMENT_STORE_OP_STORE,										//  VkAttachmentStoreOp				storeOp;					||  VkAttachmentStoreOp					storeOp;
202 		VK_ATTACHMENT_LOAD_OP_LOAD,											//  VkAttachmentLoadOp				stencilLoadOp;				||  VkAttachmentLoadOp					stencilLoadOp;
203 		VK_ATTACHMENT_STORE_OP_STORE,										//  VkAttachmentStoreOp				stencilStoreOp;				||  VkAttachmentStoreOp					stencilStoreOp;
204 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,					//  VkImageLayout					initialLayout;				||  VkImageLayout						initialLayout;
205 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL					//  VkImageLayout					finalLayout;				||  VkImageLayout						finalLayout;
206 	);
207 
208 	const AttachmentRef							depthAttachmentReference	//  VkAttachmentReference										||  VkAttachmentReference2KHR
209 	(
210 																			//																||  VkStructureType						sType;
211 		DE_NULL,															//																||  const void*							pNext;
212 		dsAttacmentAvailable ? 1u : VK_ATTACHMENT_UNUSED,					//  deUint32						attachment;					||  deUint32							attachment;
213 		dsAttacmentAvailable ?												//  VkImageLayout					layout;						||  VkImageLayout						layout;
214 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
215 			VK_IMAGE_LAYOUT_UNDEFINED,
216 		0u																	//																||  VkImageAspectFlags					aspectMask;
217 	);
218 
219 	const AttachmentDesc						attachmentDescriptions[]	=
220 	{
221 		colorAttachmentDescription,
222 		dsAttachmentDescription,
223 	};
224 
225 	DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) || (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)));
226 
227 	vector <SubpassDesc>						subpassDescriptions;
228 	for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
229 	{
230 		const deUint32							viewMask					= (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2))
231 																			? viewMasks[subpassNdx]
232 																			: 0u;
233 		const SubpassDesc						subpassDescription			//  VkSubpassDescription										||  VkSubpassDescription2KHR
234 		(
235 																			//																||  VkStructureType						sType;
236 			DE_NULL,														//																||  const void*							pNext;
237 			(VkSubpassDescriptionFlags)0,									//  VkSubpassDescriptionFlags		flags;						||  VkSubpassDescriptionFlags			flags;
238 			VK_PIPELINE_BIND_POINT_GRAPHICS,								//  VkPipelineBindPoint				pipelineBindPoint;			||  VkPipelineBindPoint					pipelineBindPoint;
239 			viewMask,														//																||  deUint32							viewMask;
240 			0u,																//  deUint32						inputAttachmentCount;		||  deUint32							inputAttachmentCount;
241 			DE_NULL,														//  const VkAttachmentReference*	pInputAttachments;			||  const VkAttachmentReference2KHR*	pInputAttachments;
242 			1u,																//  deUint32						colorAttachmentCount;		||  deUint32							colorAttachmentCount;
243 			&colorAttachmentReference,										//  const VkAttachmentReference*	pColorAttachments;			||  const VkAttachmentReference2KHR*	pColorAttachments;
244 			DE_NULL,														//  const VkAttachmentReference*	pResolveAttachments;		||  const VkAttachmentReference2KHR*	pResolveAttachments;
245 			&depthAttachmentReference,										//  const VkAttachmentReference*	pDepthStencilAttachment;	||  const VkAttachmentReference2KHR*	pDepthStencilAttachment;
246 			0u,																//  deUint32						preserveAttachmentCount;	||  deUint32							preserveAttachmentCount;
247 			DE_NULL															//  const deUint32*					pPreserveAttachments;		||  const deUint32*						pPreserveAttachments;
248 		);
249 
250 		subpassDescriptions.push_back(subpassDescription);
251 	}
252 
253 	const VkRenderPassMultiviewCreateInfo		renderPassMultiviewInfo		=
254 	{
255 		VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR,			// VkStructureType	sType;
256 		DE_NULL,															// const void*		pNext;
257 		subpassCount,														// uint32_t			subpassCount;
258 		&viewMasks[0],														// const uint32_t*	pViewMasks;
259 		0u,																	// uint32_t			dependencyCount;
260 		DE_NULL,															// const int32_t*	pViewOffsets;
261 		0u,																	// uint32_t			correlationMaskCount;
262 		DE_NULL,															// const uint32_t*	pCorrelationMasks;
263 	};
264 	const VkRenderPassMultiviewCreateInfo*		renderPassMultiviewInfoPtr	= (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1))
265 																			? &renderPassMultiviewInfo
266 																			: DE_NULL;
267 
268 	const VkPipelineStageFlags					srcStageMask				= dsAttacmentAvailable
269 																			? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
270 																			: VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
271 	const VkAccessFlags							srcAccessMask				= dsAttacmentAvailable
272 																			? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
273 																			: VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
274 	vector <SubpassDep>							subpassDependencies;
275 	for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
276 	{
277 		const SubpassDep						subpassDependency			//  VkSubpassDependency											||  VkSubpassDependency2KHR
278 		(
279 																			//																||	VkStructureType						sType;
280 			DE_NULL,														//																||	const void*							pNext;
281 			subpassNdx,														//  deUint32						srcSubpass;					||	deUint32							srcSubpass;
282 			(subpassNdx == subpassCount -1u) ? subpassNdx : subpassNdx+1u,	//  deUint32						dstSubpass;					||	deUint32							dstSubpass;
283 			srcStageMask,													//  VkPipelineStageFlags			srcStageMask;				||	VkPipelineStageFlags				srcStageMask;
284 			VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,							//  VkPipelineStageFlags			dstStageMask;				||	VkPipelineStageFlags				dstStageMask;
285 			srcAccessMask,													//  VkAccessFlags					srcAccessMask;				||	VkAccessFlags						srcAccessMask;
286 			VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,							//  VkAccessFlags					dstAccessMask;				||	VkAccessFlags						dstAccessMask;
287 			VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR,								//  VkDependencyFlags				dependencyFlags;			||	VkDependencyFlags					dependencyFlags;
288 			0																//																||	deInt32								viewOffset;
289 		);
290 		subpassDependencies.push_back(subpassDependency);
291 	}
292 
293 	const RenderPassCreateInfo					renderPassInfo				//  VkRenderPassCreateInfo										||  VkRenderPassCreateInfo2KHR
294 	(
295 																			//  VkStructureType					sType;						||  VkStructureType						sType;
296 		renderPassMultiviewInfoPtr,											//  const void*						pNext;						||  const void*							pNext;
297 		(VkRenderPassCreateFlags)0,											//  VkRenderPassCreateFlags			flags;						||  VkRenderPassCreateFlags				flags;
298 		dsAttacmentAvailable ? 2u : 1u,										//  deUint32						attachmentCount;			||  deUint32							attachmentCount;
299 		attachmentDescriptions,												//  const VkAttachmentDescription*	pAttachments;				||  const VkAttachmentDescription2KHR*	pAttachments;
300 		subpassCount,														//  deUint32						subpassCount;				||  deUint32							subpassCount;
301 		&subpassDescriptions[0],											//  const VkSubpassDescription*		pSubpasses;					||  const VkSubpassDescription2KHR*		pSubpasses;
302 		subpassCount,														//  deUint32						dependencyCount;			||  deUint32							dependencyCount;
303 		&subpassDependencies[0],											//  const VkSubpassDependency*		pDependencies;				||  const VkSubpassDependency2KHR*		pDependencies;
304 		0u,																	//																||  deUint32							correlatedViewMaskCount;
305 		DE_NULL																//																||  const deUint32*						pCorrelatedViewMasks;
306 	);
307 
308 	return renderPassInfo.createRenderPass(vk, device);
309 }
310 
311 // Instantiate function for legacy renderpass structures
312 template
313 Move<VkRenderPass> makeRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>
314 								  (const DeviceInterface&		vk,
315 								   const VkDevice				device,
316 								   const VkFormat				colorFormat,
317 								   const vector<deUint32>&		viewMasks,
318 								   const VkSampleCountFlagBits	samples,
319 								   const VkAttachmentLoadOp		colorLoadOp,
320 								   const VkFormat				dsFormat);
321 
322 // Instantiate function for renderpass2 structures
323 template
324 Move<VkRenderPass> makeRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>
325 								  (const DeviceInterface&		vk,
326 								   const VkDevice				device,
327 								   const VkFormat				colorFormat,
328 								   const vector<deUint32>&		viewMasks,
329 								   const VkSampleCountFlagBits	samples,
330 								   const VkAttachmentLoadOp		colorLoadOp,
331 								   const VkFormat				dsFormat);
332 
333 
334 template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
makeRenderPassWithDepth(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<deUint32> & viewMasks,const VkFormat dsFormat)335 Move<VkRenderPass> makeRenderPassWithDepth (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector<deUint32>& viewMasks, const VkFormat dsFormat)
336 {
337 	return makeRenderPass<AttachmentDesc, AttachmentRef, SubpassDesc, SubpassDep, RenderPassCreateInfo>(vk, device, colorFormat, viewMasks, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR, dsFormat);
338 }
339 
340 // Instantiate function for legacy renderpass structures
341 template
342 Move<VkRenderPass> makeRenderPassWithDepth<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>
343 										   (const DeviceInterface&		vk,
344 											const VkDevice				device,
345 											const VkFormat				colorFormat,
346 											const vector<deUint32>&		viewMasks,
347 											const VkFormat				dsFormat);
348 
349 // Instantiate function for renderpass2 structures
350 template
351 Move<VkRenderPass> makeRenderPassWithDepth<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>
352 										   (const DeviceInterface&		vk,
353 											const VkDevice				device,
354 											const VkFormat				colorFormat,
355 											const vector<deUint32>&		viewMasks,
356 											const VkFormat				dsFormat);
357 
358 template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
makeRenderPassWithAttachments(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<deUint32> & viewMasks,bool useAspects)359 Move<VkRenderPass> makeRenderPassWithAttachments (const DeviceInterface&	vk,
360 												  const VkDevice			device,
361 												  const VkFormat			colorFormat,
362 												  const vector<deUint32>&	viewMasks,
363 												  bool						useAspects)
364 {
365 	const deUint32								subpassCount				= static_cast<deUint32>(viewMasks.size());
366 
367 	const AttachmentDesc						colorAttachmentDescription	//  VkAttachmentDescription										||  VkAttachmentDescription2KHR
368 	(
369 																			//																||  VkStructureType						sType;
370 		DE_NULL,															//																||  const void*							pNext;
371 		(VkAttachmentDescriptionFlags)0,									//  VkAttachmentDescriptionFlags	flags;						||  VkAttachmentDescriptionFlags		flags;
372 		colorFormat,														//  VkFormat						format;						||  VkFormat							format;
373 		VK_SAMPLE_COUNT_1_BIT,												//  VkSampleCountFlagBits			samples;					||  VkSampleCountFlagBits				samples;
374 		VK_ATTACHMENT_LOAD_OP_CLEAR,										//  VkAttachmentLoadOp				loadOp;						||  VkAttachmentLoadOp					loadOp;
375 		VK_ATTACHMENT_STORE_OP_STORE,										//  VkAttachmentStoreOp				storeOp;					||  VkAttachmentStoreOp					storeOp;
376 		VK_ATTACHMENT_LOAD_OP_DONT_CARE,									//  VkAttachmentLoadOp				stencilLoadOp;				||  VkAttachmentLoadOp					stencilLoadOp;
377 		VK_ATTACHMENT_STORE_OP_DONT_CARE,									//  VkAttachmentStoreOp				stencilStoreOp;				||  VkAttachmentStoreOp					stencilStoreOp;
378 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,							//  VkImageLayout					initialLayout;				||  VkImageLayout						initialLayout;
379 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL							//  VkImageLayout					finalLayout;				||  VkImageLayout						finalLayout;
380 	);
381 
382 	const AttachmentDesc						inputAttachmentDescription	//  VkAttachmentDescription										||  VkAttachmentDescription2KHR
383 	(
384 																			//																||  VkStructureType						sType;
385 		DE_NULL,															//																||  const void*							pNext;
386 		(VkAttachmentDescriptionFlags)0,									//  VkAttachmentDescriptionFlags	flags;						||  VkAttachmentDescriptionFlags		flags;
387 		colorFormat,														//  VkFormat						format;						||  VkFormat							format;
388 		VK_SAMPLE_COUNT_1_BIT,												//  VkSampleCountFlagBits			samples;					||  VkSampleCountFlagBits				samples;
389 		VK_ATTACHMENT_LOAD_OP_LOAD,											//  VkAttachmentLoadOp				loadOp;						||  VkAttachmentLoadOp					loadOp;
390 		VK_ATTACHMENT_STORE_OP_STORE,										//  VkAttachmentStoreOp				storeOp;					||  VkAttachmentStoreOp					storeOp;
391 		VK_ATTACHMENT_LOAD_OP_DONT_CARE,									//  VkAttachmentLoadOp				stencilLoadOp;				||  VkAttachmentLoadOp					stencilLoadOp;
392 		VK_ATTACHMENT_STORE_OP_DONT_CARE,									//  VkAttachmentStoreOp				stencilStoreOp;				||  VkAttachmentStoreOp					stencilStoreOp;
393 		VK_IMAGE_LAYOUT_GENERAL,											//  VkImageLayout					initialLayout;				||  VkImageLayout						initialLayout;
394 		VK_IMAGE_LAYOUT_GENERAL												//  VkImageLayout					finalLayout;				||  VkImageLayout						finalLayout;
395 	);
396 
397 	vector<AttachmentDesc>						attachments;
398 	attachments.push_back(colorAttachmentDescription);
399 	attachments.push_back(inputAttachmentDescription);
400 
401 	const AttachmentRef							colorAttachmentReference	//  VkAttachmentReference										||  VkAttachmentReference2KHR
402 	(
403 																			//																||  VkStructureType						sType;
404 		DE_NULL,															//																||  const void*							pNext;
405 		0u,																	//  deUint32						attachment;					||  deUint32							attachment;
406 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,							//  VkImageLayout					layout;						||  VkImageLayout						layout;
407 		0u																	//																||  VkImageAspectFlags					aspectMask;
408 	);
409 
410 	const AttachmentRef							inputAttachmentReference	//  VkAttachmentReference										||  VkAttachmentReference2KHR
411 	(
412 																			//																||  VkStructureType						sType;
413 		DE_NULL,															//																||  const void*							pNext;
414 		1u,																	//  deUint32						attachment;					||  deUint32							attachment;
415 		VK_IMAGE_LAYOUT_GENERAL,											//  VkImageLayout					layout;						||  VkImageLayout						layout;
416 		useAspects ? VK_IMAGE_ASPECT_COLOR_BIT : static_cast<VkImageAspectFlagBits>(0u)							//																||  VkImageAspectFlags					aspectMask;
417 	);
418 
419 	const AttachmentRef							depthAttachmentReference	//  VkAttachmentReference										||  VkAttachmentReference2KHR
420 	(
421 																			//																||  VkStructureType						sType;
422 		DE_NULL,															//																||  const void*							pNext;
423 		VK_ATTACHMENT_UNUSED,												//  deUint32						attachment;					||  deUint32							attachment;
424 		VK_IMAGE_LAYOUT_UNDEFINED,											//  VkImageLayout					layout;						||  VkImageLayout						layout;
425 		0u																	//																||  VkImageAspectFlags					aspectMask;
426 	);
427 
428 	DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) || (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)));
429 
430 	vector <SubpassDesc>						subpassDescriptions;
431 	for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
432 	{
433 		const deUint32							viewMask					= (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2))
434 																			? viewMasks[subpassNdx]
435 																			: 0u;
436 		const SubpassDesc						subpassDescription			//  VkSubpassDescription										||  VkSubpassDescription2KHR
437 		(
438 																			//																||  VkStructureType						sType;
439 			DE_NULL,														//																||  const void*							pNext;
440 			(VkSubpassDescriptionFlags)0,									// VkSubpassDescriptionFlags		flags;						||  VkSubpassDescriptionFlags			flags;
441 			VK_PIPELINE_BIND_POINT_GRAPHICS,								// VkPipelineBindPoint				pipelineBindPoint;			||  VkPipelineBindPoint					pipelineBindPoint;
442 			viewMask,														//																||  deUint32							viewMask;
443 			1u,																// deUint32							inputAttachmentCount;		||  deUint32							inputAttachmentCount;
444 			&inputAttachmentReference,										// const VkAttachmentReference*		pInputAttachments;			||  const VkAttachmentReference2KHR*	pInputAttachments;
445 			1u,																// deUint32							colorAttachmentCount;		||  deUint32							colorAttachmentCount;
446 			&colorAttachmentReference,										// const VkAttachmentReference*		pColorAttachments;			||  const VkAttachmentReference2KHR*	pColorAttachments;
447 			DE_NULL,														// const VkAttachmentReference*		pResolveAttachments;		||  const VkAttachmentReference2KHR*	pResolveAttachments;
448 			&depthAttachmentReference,										// const VkAttachmentReference*		pDepthStencilAttachment;	||  const VkAttachmentReference2KHR*	pDepthStencilAttachment;
449 			0u,																// deUint32							preserveAttachmentCount;	||  deUint32							preserveAttachmentCount;
450 			DE_NULL															// const deUint32*					pPreserveAttachments;		||  const deUint32*						pPreserveAttachments;
451 		);
452 		subpassDescriptions.push_back(subpassDescription);
453 	}
454 
455 	const VkRenderPassMultiviewCreateInfo		renderPassMultiviewInfo		=
456 	{
457 		VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR,	//VkStructureType	sType;
458 		DE_NULL,													//const void*		pNext;
459 		subpassCount,												//uint32_t			subpassCount;
460 		&viewMasks[0],												//const uint32_t*	pViewMasks;
461 		0u,															//uint32_t			dependencyCount;
462 		DE_NULL,													//const int32_t*	pViewOffsets;
463 		0u,															//uint32_t			correlationMaskCount;
464 		DE_NULL,													//const uint32_t*	pCorrelationMasks;
465 	};
466 	const VkRenderPassMultiviewCreateInfo*		renderPassMultiviewInfoPtr	= typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)
467 																			? &renderPassMultiviewInfo
468 																			: DE_NULL;
469 
470 	vector <SubpassDep>							subpassDependencies;
471 	for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
472 	{
473 		const SubpassDep						subpassDependency			//  VkSubpassDependency											||  VkSubpassDependency2KHR
474 		(
475 																			//																||	VkStructureType						sType;
476 			DE_NULL,														//																||	const void*							pNext;
477 			subpassNdx,														//  deUint32						srcSubpass;					||	deUint32							srcSubpass;
478 			(subpassNdx == subpassCount -1u) ? subpassNdx : subpassNdx+1u,	//  deUint32						dstSubpass;					||	deUint32							dstSubpass;
479 			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,					//  VkPipelineStageFlags			srcStageMask;				||	VkPipelineStageFlags				srcStageMask;
480 			VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,							//  VkPipelineStageFlags			dstStageMask;				||	VkPipelineStageFlags				dstStageMask;
481 			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,							//  VkAccessFlags					srcAccessMask;				||	VkAccessFlags						srcAccessMask;
482 			VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,							//  VkAccessFlags					dstAccessMask;				||	VkAccessFlags						dstAccessMask;
483 			VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR,								//  VkDependencyFlags				dependencyFlags;			||	VkDependencyFlags					dependencyFlags;
484 			0																//																||	deInt32								viewOffset;
485 		);
486 		subpassDependencies.push_back(subpassDependency);
487 	}
488 
489 	const RenderPassCreateInfo					renderPassInfo				//  VkRenderPassCreateInfo										||  VkRenderPassCreateInfo2KHR
490 	(
491 																			//  VkStructureType					sType;						||  VkStructureType						sType;
492 		renderPassMultiviewInfoPtr,											//  const void*						pNext;						||  const void*							pNext;
493 		(VkRenderPassCreateFlags)0,											//  VkRenderPassCreateFlags			flags;						||  VkRenderPassCreateFlags				flags;
494 		2u,																	//  deUint32						attachmentCount;			||  deUint32							attachmentCount;
495 		&attachments[0],													//  const VkAttachmentDescription*	pAttachments;				||  const VkAttachmentDescription2KHR*	pAttachments;
496 		subpassCount,														//  deUint32						subpassCount;				||  deUint32							subpassCount;
497 		&subpassDescriptions[0],											//  const VkSubpassDescription*		pSubpasses;					||  const VkSubpassDescription2KHR*		pSubpasses;
498 		subpassCount,														//  deUint32						dependencyCount;			||  deUint32							dependencyCount;
499 		&subpassDependencies[0],											//  const VkSubpassDependency*		pDependencies;				||  const VkSubpassDependency2KHR*		pDependencies;
500 		0u,																	//																||  deUint32							correlatedViewMaskCount;
501 		DE_NULL																//																||  const deUint32*						pCorrelatedViewMasks;
502 	);
503 
504 	return renderPassInfo.createRenderPass(vk, device);
505 }
506 
507 // Instantiate function for legacy renderpass structures
508 template
509 Move<VkRenderPass> makeRenderPassWithAttachments<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>
510 												 (const DeviceInterface&	vk,
511 												  const VkDevice			device,
512 												  const VkFormat			colorFormat,
513 												  const vector<deUint32>&	viewMasks,
514 												  bool						useAspects);
515 
516 // Instantiate function for renderpass2 structures
517 template
518 Move<VkRenderPass> makeRenderPassWithAttachments<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>
519 												 (const DeviceInterface&	vk,
520 												  const VkDevice			device,
521 												  const VkFormat			colorFormat,
522 												  const vector<deUint32>&	viewMasks,
523 												  bool						useAspects);
524 
beginSecondaryCommandBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,const VkRenderPass renderPass,const deUint32 subpass,const VkFramebuffer framebuffer)525 void beginSecondaryCommandBuffer (const DeviceInterface&				vk,
526 								   const VkCommandBuffer				commandBuffer,
527 								   const VkRenderPass					renderPass,
528 								   const deUint32						subpass,
529 								   const VkFramebuffer					framebuffer)
530 {
531 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
532 	{
533 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,	//VkStructureType				sType;
534 		DE_NULL,											//const void*					pNext;
535 		renderPass,											//VkRenderPass					renderPass;
536 		subpass,											//deUint32						subpass;
537 		framebuffer,										//VkFramebuffer					framebuffer;
538 		VK_FALSE,											//VkBool32						occlusionQueryEnable;
539 		(VkQueryControlFlags)0u,							//VkQueryControlFlags			queryFlags;
540 		(VkQueryPipelineStatisticFlags)0u,					//VkQueryPipelineStatisticFlags	pipelineStatistics;
541 	};
542 
543 	const VkCommandBufferBeginInfo			info					=
544 	{
545 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,		// VkStructureType							sType;
546 		DE_NULL,											// const void*								pNext;
547 		VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,	// VkCommandBufferUsageFlags				flags;
548 		&secCmdBufInheritInfo,							// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
549 	};
550 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
551 }
552 
imageBarrier(const DeviceInterface & vk,const VkCommandBuffer cmdBuffer,const VkImage image,const VkImageSubresourceRange subresourceRange,const VkImageLayout oldLayout,const VkImageLayout newLayout,const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkPipelineStageFlags srcStageMask,const VkPipelineStageFlags dstStageMask)553 void imageBarrier (const DeviceInterface&			vk,
554 				   const VkCommandBuffer			cmdBuffer,
555 				   const VkImage					image,
556 				   const VkImageSubresourceRange	subresourceRange,
557 				   const VkImageLayout				oldLayout,
558 				   const VkImageLayout				newLayout,
559 				   const VkAccessFlags				srcAccessMask,
560 				   const VkAccessFlags				dstAccessMask,
561 				   const VkPipelineStageFlags		srcStageMask,
562 				   const VkPipelineStageFlags		dstStageMask)
563 {
564 	const VkImageMemoryBarrier		barrier				=
565 	{
566 		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,	// VkStructureType			sType;
567 		DE_NULL,								// const void*				pNext;
568 		srcAccessMask,							// VkAccessFlags			srcAccessMask;
569 		dstAccessMask,							// VkAccessFlags			dstAccessMask;
570 		oldLayout,								// VkImageLayout			oldLayout;
571 		newLayout,								// VkImageLayout			newLayout;
572 		VK_QUEUE_FAMILY_IGNORED,				// deUint32					srcQueueFamilyIndex;
573 		VK_QUEUE_FAMILY_IGNORED,				// deUint32					dstQueueFamilyIndex;
574 		image,									// VkImage					image;
575 		subresourceRange,						// VkImageSubresourceRange	subresourceRange;
576 	};
577 
578 	vk.cmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL,
579 		0u, (const VkBufferMemoryBarrier*)DE_NULL,
580 		1u, &barrier);
581 }
582 
583 } // MultiView
584 } // vkt
585