1/*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2019 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 Imageless Framebuffer Tests
22 *//*--------------------------------------------------------------------*/
23
24#include "vktImagelessFramebufferTests.hpp"
25#include "vktTestGroupUtil.hpp"
26#include "vktTestCase.hpp"
27
28#include "deUniquePtr.hpp"
29#include "deRandom.hpp"
30
31#include "tcuTextureUtil.hpp"
32#include "tcuVectorUtil.hpp"
33#include "tcuImageCompare.hpp"
34#include "tcuRGBA.hpp"
35
36#include "vkCmdUtil.hpp"
37#include "vkImageUtil.hpp"
38#include "vkObjUtil.hpp"
39#include "vkQueryUtil.hpp"
40#include "vkRefUtil.hpp"
41#include "vkTypeUtil.hpp"
42#include "vkBuilderUtil.hpp"
43
44#include <iostream>
45
46namespace vkt
47{
48namespace imageless
49{
50
51namespace
52{
53using namespace vk;
54using de::MovePtr;
55using de::UniquePtr;
56using de::SharedPtr;
57
58typedef SharedPtr<Unique<VkPipeline> >	SharedPtrVkPipeline;
59
60enum TestType
61{
62	TEST_TYPE_COLOR = 0,
63	TEST_TYPE_DEPTH_STENCIL,
64	TEST_TYPE_COLOR_RESOLVE,
65	TEST_TYPE_DEPTH_STENCIL_RESOLVE,
66	TEST_TYPE_MULTISUBPASS,
67	TEST_TYPE_DIFFERENT_ATTACHMENTS,
68	TEST_TYPE_LAST
69};
70
71enum AspectFlagBits
72{
73	ASPECT_NONE				= 0,
74	ASPECT_COLOR			= (1<<0),
75	ASPECT_DEPTH			= (1<<1),
76	ASPECT_STENCIL			= (1<<2),
77	ASPECT_DEPTH_STENCIL	= ASPECT_DEPTH | ASPECT_STENCIL,
78};
79typedef deUint32 AspectFlags;
80
81const deUint32	NO_SAMPLE	= static_cast<deUint32>(-1);
82const deUint32	NO_SUBPASS	= static_cast<deUint32>(-1);
83
84struct TestParameters
85{
86	TestType	testType;
87	VkFormat	colorFormat;
88	VkFormat	dsFormat;
89};
90
91template<typename T>
92inline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move)
93{
94	return SharedPtr<Unique<T> >(new Unique<T>(move));
95}
96
97VkSampleCountFlagBits sampleCountBitFromSampleCount (deUint32 count)
98{
99	switch (count)
100	{
101		case 1:  return VK_SAMPLE_COUNT_1_BIT;
102		case 2:  return VK_SAMPLE_COUNT_2_BIT;
103		case 4:  return VK_SAMPLE_COUNT_4_BIT;
104		case 8:  return VK_SAMPLE_COUNT_8_BIT;
105		case 16: return VK_SAMPLE_COUNT_16_BIT;
106		case 32: return VK_SAMPLE_COUNT_32_BIT;
107		case 64: return VK_SAMPLE_COUNT_64_BIT;
108
109		default:
110			DE_FATAL("Invalid sample count");
111			return (VkSampleCountFlagBits)0x0;
112	}
113}
114
115VkAttachmentReference2 convertAttachmentReference (const VkAttachmentReference& attachmentReference, const VkImageAspectFlags aspectMask)
116{
117	const VkAttachmentReference2	attachmentReference2	=
118	{
119		VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,		//  VkStructureType		sType;
120		DE_NULL,										//  const void*			pNext;
121		attachmentReference.attachment,					//  deUint32			attachment;
122		attachmentReference.layout,						//  VkImageLayout		layout;
123		aspectMask										//  VkImageAspectFlags	aspectMask;
124	};
125
126	return attachmentReference2;
127}
128
129std::vector<VkAttachmentDescription2> convertAttachmentDescriptions (const std::vector<VkAttachmentDescription>& attachmentDescriptions)
130{
131	std::vector<VkAttachmentDescription2>	attachmentDescriptions2;
132
133	attachmentDescriptions2.reserve(attachmentDescriptions.size());
134
135	for (size_t adNdx = 0; adNdx < attachmentDescriptions.size(); ++adNdx)
136	{
137		const VkAttachmentDescription&		attachmentDescription	= attachmentDescriptions[adNdx];
138		const VkAttachmentDescription2		attachmentDescription2	=
139		{
140			VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,		//  VkStructureType					sType;
141			DE_NULL,										//  const void*						pNext;
142			attachmentDescription.flags,					//  VkAttachmentDescriptionFlags	flags;
143			attachmentDescription.format,					//  VkFormat						format;
144			attachmentDescription.samples,					//  VkSampleCountFlagBits			samples;
145			attachmentDescription.loadOp,					//  VkAttachmentLoadOp				loadOp;
146			attachmentDescription.storeOp,					//  VkAttachmentStoreOp				storeOp;
147			attachmentDescription.stencilLoadOp,			//  VkAttachmentLoadOp				stencilLoadOp;
148			attachmentDescription.stencilStoreOp,			//  VkAttachmentStoreOp				stencilStoreOp;
149			attachmentDescription.initialLayout,			//  VkImageLayout					initialLayout;
150			attachmentDescription.finalLayout,				//  VkImageLayout					finalLayout;
151		};
152
153		attachmentDescriptions2.push_back(attachmentDescription2);
154	}
155
156	return attachmentDescriptions2;
157}
158
159Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&		vk,
160									   const VkDevice				device,
161									   const VkPipelineLayout		pipelineLayout,
162									   const VkRenderPass			renderPass,
163									   const VkShaderModule			vertexModule,
164									   const VkShaderModule			fragmendModule,
165									   const VkExtent2D				renderSize,
166									   const AspectFlags			depthStencilAspects	= ASPECT_NONE,
167									   const VkSampleCountFlagBits	sampleCountBits		= VK_SAMPLE_COUNT_1_BIT,
168									   const deUint32				subpass				= 0)
169{
170	const bool									useDepth						= (depthStencilAspects & ASPECT_DEPTH) != 0;
171	const bool									useStencil						= (depthStencilAspects & ASPECT_STENCIL) != 0;
172	const std::vector<VkViewport>				viewports						(1, makeViewport(renderSize));
173	const std::vector<VkRect2D>					scissors						(1, makeRect2D(renderSize));
174	const VkStencilOpState						stencilOpState					=
175	{
176		VK_STENCIL_OP_KEEP,					//  VkStencilOp	failOp;
177		VK_STENCIL_OP_INCREMENT_AND_CLAMP,	//  VkStencilOp	passOp;
178		VK_STENCIL_OP_KEEP,					//  VkStencilOp	depthFailOp;
179		VK_COMPARE_OP_ALWAYS,				//  VkCompareOp	compareOp;
180		~0u,								//  deUint32	compareMask;
181		~0u,								//  deUint32	writeMask;
182		0u									//  deUint32	reference;
183	};
184	const VkPipelineDepthStencilStateCreateInfo	pipelineDepthStencilStateInfo	=
185	{
186		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	//  VkStructureType							sType;
187		DE_NULL,													//  const void*								pNext;
188		(VkPipelineDepthStencilStateCreateFlags)0,					//  VkPipelineDepthStencilStateCreateFlags	flags;
189		useDepth ? VK_TRUE : VK_FALSE,								//  VkBool32								depthTestEnable;
190		useDepth ? VK_TRUE : VK_FALSE,								//  VkBool32								depthWriteEnable;
191		VK_COMPARE_OP_LESS,											//  VkCompareOp								depthCompareOp;
192		VK_FALSE,													//  VkBool32								depthBoundsTestEnable;
193		useStencil ? VK_TRUE : VK_FALSE,							//  VkBool32								stencilTestEnable;
194		stencilOpState,												//  VkStencilOpState						front;
195		stencilOpState,												//  VkStencilOpState						back;
196		0.0f,														//  float									minDepthBounds;
197		1.0f														//  float									maxDepthBounds;
198	};
199	const VkPipelineMultisampleStateCreateInfo	multisampleState				=
200	{
201		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	//  VkStructureType							sType;
202		DE_NULL,													//  const void*								pNext;
203		(VkPipelineMultisampleStateCreateFlags)0u,					//  VkPipelineMultisampleStateCreateFlags	flags;
204		sampleCountBits,											//  VkSampleCountFlagBits					rasterizationSamples;
205		VK_FALSE,													//  VkBool32								sampleShadingEnable;
206		0.0f,														//  float									minSampleShading;
207		DE_NULL,													//  const VkSampleMask*						pSampleMask;
208		VK_FALSE,													//  VkBool32								alphaToCoverageEnable;
209		VK_FALSE,													//  VkBool32								alphaToOneEnable;
210	};
211
212	return makeGraphicsPipeline(vk,									//  const DeviceInterface&							vk
213								device,								//  const VkDevice									device
214								pipelineLayout,						//  const VkPipelineLayout							pipelineLayout
215								vertexModule,						//  const VkShaderModule							vertexShaderModule
216								DE_NULL,							//  const VkShaderModule							tessellationControlModule
217								DE_NULL,							//  const VkShaderModule							tessellationEvalModule
218								DE_NULL,							//  const VkShaderModule							geometryShaderModule
219								fragmendModule,						//  const VkShaderModule							fragmentShaderModule
220								renderPass,							//  const VkRenderPass								renderPass
221								viewports,							//  const std::vector<VkViewport>&					viewports
222								scissors,							//  const std::vector<VkRect2D>&					scissors
223								VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,//  const VkPrimitiveTopology						topology
224								subpass,							//  const deUint32									subpass
225								0u,									//  const deUint32									patchControlPoints
226								DE_NULL,							//  const VkPipelineVertexInputStateCreateInfo*		vertexInputStateCreateInfo
227								DE_NULL,							//  const VkPipelineRasterizationStateCreateInfo*	rasterizationStateCreateInfo
228								&multisampleState,					//  const VkPipelineMultisampleStateCreateInfo*		multisampleStateCreateInfo
229								&pipelineDepthStencilStateInfo);	//  const VkPipelineDepthStencilStateCreateInfo*	depthStencilStateCreateInfo
230}
231
232Move<VkRenderPass> makeRenderPass (const DeviceInterface&				vk,
233								   const VkDevice						device,
234								   const VkFormat						colorFormat,
235								   const VkFormat						depthStencilFormat,
236								   const VkSampleCountFlagBits			colorSamples,
237								   const VkSampleCountFlagBits			depthStencilSamples			= VK_SAMPLE_COUNT_1_BIT,
238								   const VkAttachmentLoadOp				loadOperation				= VK_ATTACHMENT_LOAD_OP_CLEAR,
239								   const VkImageLayout					finalLayoutColor			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
240								   const VkImageLayout					finalLayoutDepthStencil		= VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
241								   const VkImageLayout					subpassLayoutColor			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
242								   const VkImageLayout					subpassLayoutDepthStencil	= VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
243								   const VkAllocationCallbacks* const	allocationCallbacks			= DE_NULL)
244{
245	const bool								hasColor									= colorFormat != VK_FORMAT_UNDEFINED;
246	const bool								hasDepthStencil								= depthStencilFormat != VK_FORMAT_UNDEFINED;
247	const bool								hasColorResolve								= hasColor && (colorSamples != VK_SAMPLE_COUNT_1_BIT);
248	const bool								hasDepthStencilResolve						= hasDepthStencil && (depthStencilSamples != VK_SAMPLE_COUNT_1_BIT);
249	const VkImageLayout						initialLayoutColor							= loadOperation == VK_ATTACHMENT_LOAD_OP_LOAD ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
250	const VkImageLayout						initialLayoutDepthStencil					= loadOperation == VK_ATTACHMENT_LOAD_OP_LOAD ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
251	const VkAttachmentDescription			colorAttachmentDescription					=
252	{
253		(VkAttachmentDescriptionFlags)0,		//  VkAttachmentDescriptionFlags	flags;
254		colorFormat,							//  VkFormat						format;
255		colorSamples,							//  VkSampleCountFlagBits			samples;
256		loadOperation,							//  VkAttachmentLoadOp				loadOp;
257		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				storeOp;
258		VK_ATTACHMENT_LOAD_OP_DONT_CARE,		//  VkAttachmentLoadOp				stencilLoadOp;
259		VK_ATTACHMENT_STORE_OP_DONT_CARE,		//  VkAttachmentStoreOp				stencilStoreOp;
260		initialLayoutColor,						//  VkImageLayout					initialLayout;
261		finalLayoutColor						//  VkImageLayout					finalLayout;
262	};
263	const VkAttachmentDescription			depthStencilAttachmentDescription			=
264	{
265		(VkAttachmentDescriptionFlags)0,		//  VkAttachmentDescriptionFlags	flags;
266		depthStencilFormat,						//  VkFormat						format;
267		depthStencilSamples,					//  VkSampleCountFlagBits			samples;
268		loadOperation,							//  VkAttachmentLoadOp				loadOp;
269		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				storeOp;
270		loadOperation,							//  VkAttachmentLoadOp				stencilLoadOp;
271		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				stencilStoreOp;
272		initialLayoutDepthStencil,				//  VkImageLayout					initialLayout;
273		finalLayoutDepthStencil					//  VkImageLayout					finalLayout;
274	};
275	const VkAttachmentDescription			colorResolveAttachmentDescription			=
276	{
277		(VkAttachmentDescriptionFlags)0,		//  VkAttachmentDescriptionFlags	flags;
278		colorFormat,							//  VkFormat						format;
279		VK_SAMPLE_COUNT_1_BIT,					//  VkSampleCountFlagBits			samples;
280		VK_ATTACHMENT_LOAD_OP_DONT_CARE,		//  VkAttachmentLoadOp				loadOp;
281		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				storeOp;
282		VK_ATTACHMENT_LOAD_OP_DONT_CARE,		//  VkAttachmentLoadOp				stencilLoadOp;
283		VK_ATTACHMENT_STORE_OP_DONT_CARE,		//  VkAttachmentStoreOp				stencilStoreOp;
284		initialLayoutColor,						//  VkImageLayout					initialLayout;
285		finalLayoutColor						//  VkImageLayout					finalLayout;
286	};
287	const VkAttachmentDescription			depthStencilResolveAttachmentDescription	=
288	{
289		(VkAttachmentDescriptionFlags)0,		//  VkAttachmentDescriptionFlags	flags;
290		depthStencilFormat,						//  VkFormat						format;
291		VK_SAMPLE_COUNT_1_BIT,					//  VkSampleCountFlagBits			samples;
292		VK_ATTACHMENT_LOAD_OP_DONT_CARE,		//  VkAttachmentLoadOp				loadOp;
293		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				storeOp;
294		VK_ATTACHMENT_LOAD_OP_DONT_CARE,		//  VkAttachmentLoadOp				stencilLoadOp;
295		VK_ATTACHMENT_STORE_OP_STORE,			//  VkAttachmentStoreOp				stencilStoreOp;
296		initialLayoutDepthStencil,				//  VkImageLayout					initialLayout;
297		finalLayoutDepthStencil					//  VkImageLayout					finalLayout;
298	};
299	std::vector<VkAttachmentDescription>	attachmentDescriptions;
300
301	if (hasColor)
302		attachmentDescriptions.push_back(colorAttachmentDescription);
303	if (hasDepthStencil)
304		attachmentDescriptions.push_back(depthStencilAttachmentDescription);
305	if (hasColorResolve)
306		attachmentDescriptions.push_back(colorResolveAttachmentDescription);
307	if (hasDepthStencilResolve)
308		attachmentDescriptions.push_back(depthStencilResolveAttachmentDescription);
309
310	deUint32								attachmentCounter								= 0;
311	const VkAttachmentReference				colorAttachmentRef								=
312	{
313		hasColor ? attachmentCounter++ : 0u,				//  deUint32		attachment;
314		subpassLayoutColor									//  VkImageLayout	layout;
315	};
316	const VkAttachmentReference				depthStencilAttachmentRef						=
317	{
318		hasDepthStencil ? attachmentCounter++ : 0u,			//  deUint32		attachment;
319		subpassLayoutDepthStencil							//  VkImageLayout	layout;
320	};
321	const VkAttachmentReference				colorResolveAttachmentRef						=
322	{
323		hasColorResolve ? attachmentCounter++ : 0u,			//  deUint32		attachment;
324		subpassLayoutColor									//  VkImageLayout	layout;
325	};
326
327	if (hasDepthStencilResolve)
328	{
329		const VkImageAspectFlags							colorAspectMask							= VK_IMAGE_ASPECT_COLOR_BIT;
330		const VkImageAspectFlags							depthStencilAspectMask					= VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
331		const VkAttachmentReference2						colorAttachmentRef2						= convertAttachmentReference(colorAttachmentRef, colorAspectMask);
332		const VkAttachmentReference2						depthStencilAttachmentRef2				= convertAttachmentReference(depthStencilAttachmentRef, depthStencilAspectMask);
333		const VkAttachmentReference2						colorResolveAttachmentRef2				= convertAttachmentReference(colorResolveAttachmentRef, colorAspectMask);
334		const VkAttachmentReference2						depthStencilResolveAttachmentRef2		=
335		{
336			VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,				//  VkStructureType		sType;
337			DE_NULL,												//  const void*			pNext;
338			hasDepthStencilResolve ? attachmentCounter++ : 0u,		//  deUint32			attachment;
339			subpassLayoutDepthStencil,								//  VkImageLayout		layout;
340			depthStencilAspectMask									//  VkImageAspectFlags	aspectMask;
341		};
342		const VkSubpassDescriptionDepthStencilResolve		subpassDescriptionDepthStencilResolve	=
343		{
344			VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,		//  VkStructureType						sType;
345			DE_NULL,															//  const void*							pNext;
346			VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,									//  VkResolveModeFlagBitsKHR			depthResolveMode;
347			VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,									//  VkResolveModeFlagBitsKHR			stencilResolveMode;
348			&depthStencilResolveAttachmentRef2									//  const VkAttachmentReference2KHR*	pDepthStencilResolveAttachment;
349		};
350		const VkSubpassDescription2							subpassDescription2						=
351		{
352			VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,					//  VkStructureType						sType;
353			&subpassDescriptionDepthStencilResolve,						//  const void*							pNext;
354			(VkSubpassDescriptionFlags)0,								//  VkSubpassDescriptionFlags			flags;
355			VK_PIPELINE_BIND_POINT_GRAPHICS,							//  VkPipelineBindPoint					pipelineBindPoint;
356			0u,															//  deUint32							viewMask;
357			0u,															//  deUint32							inputAttachmentCount;
358			DE_NULL,													//  const VkAttachmentReference2*		pInputAttachments;
359			hasColor ? 1u : 0u,											//  deUint32							colorAttachmentCount;
360			hasColor ? &colorAttachmentRef2 : DE_NULL,					//  const VkAttachmentReference2*		pColorAttachments;
361			hasColorResolve ? &colorResolveAttachmentRef2 : DE_NULL,	//  const VkAttachmentReference2*		pResolveAttachments;
362			hasDepthStencil ? &depthStencilAttachmentRef2 : DE_NULL,	//  const VkAttachmentReference2*		pDepthStencilAttachment;
363			0u,															//  deUint32							preserveAttachmentCount;
364			DE_NULL														//  const deUint32*						pPreserveAttachments;
365		};
366		const std::vector<VkAttachmentDescription2>			attachmentDescriptions2					= convertAttachmentDescriptions(attachmentDescriptions);
367		const VkRenderPassCreateInfo2						renderPassInfo							=
368		{
369			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,		//  VkStructureType						sType;
370			DE_NULL,											//  const void*							pNext;
371			(VkRenderPassCreateFlags)0,							//  VkRenderPassCreateFlags				flags;
372			(deUint32)attachmentDescriptions2.size(),			//  deUint32							attachmentCount;
373			&attachmentDescriptions2[0],						//  const VkAttachmentDescription2*		pAttachments;
374			1u,													//  deUint32							subpassCount;
375			&subpassDescription2,								//  const VkSubpassDescription2*		pSubpasses;
376			0u,													//  deUint32							dependencyCount;
377			DE_NULL,											//  const VkSubpassDependency2*			pDependencies;
378			0u,													//  deUint32							correlatedViewMaskCount;
379			DE_NULL												//  const deUint32*						pCorrelatedViewMasks;
380		};
381
382		return createRenderPass2(vk, device, &renderPassInfo, allocationCallbacks);
383	}
384	else
385	{
386		const VkSubpassDescription				subpassDescription							=
387		{
388			(VkSubpassDescriptionFlags)0,							//  VkSubpassDescriptionFlags		flags;
389			VK_PIPELINE_BIND_POINT_GRAPHICS,						//  VkPipelineBindPoint				pipelineBindPoint;
390			0u,														//  deUint32						inputAttachmentCount;
391			DE_NULL,												//  const VkAttachmentReference*	pInputAttachments;
392			hasColor ? 1u : 0u,										//  deUint32						colorAttachmentCount;
393			hasColor ? &colorAttachmentRef : DE_NULL,				//  const VkAttachmentReference*	pColorAttachments;
394			hasColorResolve ? &colorResolveAttachmentRef : DE_NULL,	//  const VkAttachmentReference*	pResolveAttachments;
395			hasDepthStencil ? &depthStencilAttachmentRef : DE_NULL,	//  const VkAttachmentReference*	pDepthStencilAttachment;
396			0u,														//  deUint32						preserveAttachmentCount;
397			DE_NULL													//  const deUint32*					pPreserveAttachments;
398		};
399		const VkRenderPassCreateInfo			renderPassInfo								=
400		{
401			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,	//  VkStructureType					sType;
402			DE_NULL,									//  const void*						pNext;
403			(VkRenderPassCreateFlags)0,					//  VkRenderPassCreateFlags			flags;
404			(deUint32)attachmentDescriptions.size(),	//  deUint32						attachmentCount;
405			&attachmentDescriptions[0],					//  const VkAttachmentDescription*	pAttachments;
406			1u,											//  deUint32						subpassCount;
407			&subpassDescription,						//  const VkSubpassDescription*		pSubpasses;
408			0u,											//  deUint32						dependencyCount;
409			DE_NULL										//  const VkSubpassDependency*		pDependencies;
410		};
411
412		return createRenderPass(vk, device, &renderPassInfo, allocationCallbacks);
413	}
414}
415
416Move<VkRenderPass> makeRenderPass (const DeviceInterface&				vk,
417								   const VkDevice						device,
418								   const VkFormat						colorFormat,
419								   const VkAllocationCallbacks* const	allocationCallbacks)
420{
421	const VkAttachmentDescription	attachmentDescriptions[]	=
422	{
423		{
424			(VkAttachmentDescriptionFlags)0,			//  VkAttachmentDescriptionFlags	flags;
425			colorFormat,								//  VkFormat						format;
426			VK_SAMPLE_COUNT_1_BIT,						//  VkSampleCountFlagBits			samples;
427			VK_ATTACHMENT_LOAD_OP_CLEAR,				//  VkAttachmentLoadOp				loadOp;
428			VK_ATTACHMENT_STORE_OP_STORE,				//  VkAttachmentStoreOp				storeOp;
429			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			//  VkAttachmentLoadOp				stencilLoadOp;
430			VK_ATTACHMENT_STORE_OP_DONT_CARE,			//  VkAttachmentStoreOp				stencilStoreOp;
431			VK_IMAGE_LAYOUT_UNDEFINED,					//  VkImageLayout					initialLayout;
432			VK_IMAGE_LAYOUT_GENERAL						//  VkImageLayout					finalLayout;
433		},
434		{
435			(VkAttachmentDescriptionFlags)0,			//  VkAttachmentDescriptionFlags	flags;
436			colorFormat,								//  VkFormat						format;
437			VK_SAMPLE_COUNT_1_BIT,						//  VkSampleCountFlagBits			samples;
438			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			//  VkAttachmentLoadOp				loadOp;
439			VK_ATTACHMENT_STORE_OP_STORE,				//  VkAttachmentStoreOp				storeOp;
440			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			//  VkAttachmentLoadOp				stencilLoadOp;
441			VK_ATTACHMENT_STORE_OP_DONT_CARE,			//  VkAttachmentStoreOp				stencilStoreOp;
442			VK_IMAGE_LAYOUT_UNDEFINED,					//  VkImageLayout					initialLayout;
443			VK_IMAGE_LAYOUT_GENERAL						//  VkImageLayout					finalLayout;
444		},
445	};
446	const VkAttachmentReference		colorAttachmentRef0			=
447	{
448		0u,							//  deUint32		attachment;
449		VK_IMAGE_LAYOUT_GENERAL		//  VkImageLayout	layout;
450	};
451	const deUint32					preserveAttachment			= 1u;
452	const VkAttachmentReference		inputAttachmentRef1			=
453	{
454		0u,							//  deUint32		attachment;
455		VK_IMAGE_LAYOUT_GENERAL		//  VkImageLayout	layout;
456	};
457	const VkAttachmentReference		colorAttachmentRef1			=
458	{
459		1u,							//  deUint32		attachment;
460		VK_IMAGE_LAYOUT_GENERAL		//  VkImageLayout	layout;
461	};
462	const VkSubpassDescription		subpassDescriptions[]		=
463	{
464		{
465			(VkSubpassDescriptionFlags)0,				//  VkSubpassDescriptionFlags		flags;
466			VK_PIPELINE_BIND_POINT_GRAPHICS,			//  VkPipelineBindPoint				pipelineBindPoint;
467			0u,											//  deUint32						inputAttachmentCount;
468			DE_NULL,									//  const VkAttachmentReference*	pInputAttachments;
469			1u,											//  deUint32						colorAttachmentCount;
470			&colorAttachmentRef0,						//  const VkAttachmentReference*	pColorAttachments;
471			DE_NULL,									//  const VkAttachmentReference*	pResolveAttachments;
472			DE_NULL,									//  const VkAttachmentReference*	pDepthStencilAttachment;
473			1u,											//  deUint32						preserveAttachmentCount;
474			&preserveAttachment							//  const deUint32*					pPreserveAttachments;
475		},
476		{
477			(VkSubpassDescriptionFlags)0,				//  VkSubpassDescriptionFlags		flags;
478			VK_PIPELINE_BIND_POINT_GRAPHICS,			//  VkPipelineBindPoint				pipelineBindPoint;
479			1u,											//  deUint32						inputAttachmentCount;
480			&inputAttachmentRef1,						//  const VkAttachmentReference*	pInputAttachments;
481			1u,											//  deUint32						colorAttachmentCount;
482			&colorAttachmentRef1,						//  const VkAttachmentReference*	pColorAttachments;
483			DE_NULL,									//  const VkAttachmentReference*	pResolveAttachments;
484			DE_NULL,									//  const VkAttachmentReference*	pDepthStencilAttachment;
485			0u,											//  deUint32						preserveAttachmentCount;
486			DE_NULL										//  const deUint32*					pPreserveAttachments;
487		},
488	};
489	const VkSubpassDependency		subpassDependency			=
490	{
491		0,												//  deUint32						srcSubpass;
492		1u,												//  deUint32						dstSubpass;
493		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,	//  VkPipelineStageFlags			srcStageMask;
494		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,			//  VkPipelineStageFlags			dstStageMask;
495		VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			//  VkAccessFlags					srcAccessMask;
496		VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,			//  VkAccessFlags					dstAccessMask;
497		VK_DEPENDENCY_VIEW_LOCAL_BIT,					//  VkDependencyFlags				dependencyFlags;
498	};
499	const VkRenderPassCreateInfo	renderPassInfo				=
500	{
501		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		//  VkStructureType					sType;
502		DE_NULL,										//  const void*						pNext;
503		(VkRenderPassCreateFlags)0,						//  VkRenderPassCreateFlags			flags;
504		DE_LENGTH_OF_ARRAY(attachmentDescriptions),		//  deUint32						attachmentCount;
505		&attachmentDescriptions[0],						//  const VkAttachmentDescription*	pAttachments;
506		DE_LENGTH_OF_ARRAY(subpassDescriptions),		//  deUint32						subpassCount;
507		&subpassDescriptions[0],						//  const VkSubpassDescription*		pSubpasses;
508		1u,												//  deUint32						dependencyCount;
509		&subpassDependency								//  const VkSubpassDependency*		pDependencies;
510	};
511
512	return createRenderPass(vk, device, &renderPassInfo, allocationCallbacks);
513}
514
515Move<VkRenderPass> makeSingleAttachmentRenderPass (const DeviceInterface&				vk,
516												   const VkDevice						device,
517												   const VkFormat						colorFormat,
518												   const VkAllocationCallbacks* const	allocationCallbacks)
519{
520	const VkAttachmentDescription	attachmentDescriptions[]	=
521	{
522		{
523			(VkAttachmentDescriptionFlags)0,			//  VkAttachmentDescriptionFlags	flags;
524			colorFormat,								//  VkFormat						format;
525			VK_SAMPLE_COUNT_1_BIT,						//  VkSampleCountFlagBits			samples;
526			VK_ATTACHMENT_LOAD_OP_CLEAR,				//  VkAttachmentLoadOp				loadOp;
527			VK_ATTACHMENT_STORE_OP_STORE,				//  VkAttachmentStoreOp				storeOp;
528			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			//  VkAttachmentLoadOp				stencilLoadOp;
529			VK_ATTACHMENT_STORE_OP_DONT_CARE,			//  VkAttachmentStoreOp				stencilStoreOp;
530			VK_IMAGE_LAYOUT_UNDEFINED,					//  VkImageLayout					initialLayout;
531			VK_IMAGE_LAYOUT_GENERAL						//  VkImageLayout					finalLayout;
532		},
533	};
534	const VkAttachmentReference		colorAttachmentRef0			=
535	{
536		0u,							//  deUint32		attachment;
537		VK_IMAGE_LAYOUT_GENERAL		//  VkImageLayout	layout;
538	};
539	const VkSubpassDescription		subpassDescriptions[]		=
540	{
541		{
542			(VkSubpassDescriptionFlags)0,				//  VkSubpassDescriptionFlags		flags;
543			VK_PIPELINE_BIND_POINT_GRAPHICS,			//  VkPipelineBindPoint				pipelineBindPoint;
544			0u,											//  deUint32						inputAttachmentCount;
545			DE_NULL,									//  const VkAttachmentReference*	pInputAttachments;
546			1u,											//  deUint32						colorAttachmentCount;
547			&colorAttachmentRef0,						//  const VkAttachmentReference*	pColorAttachments;
548			DE_NULL,									//  const VkAttachmentReference*	pResolveAttachments;
549			DE_NULL,									//  const VkAttachmentReference*	pDepthStencilAttachment;
550			0u,											//  deUint32						preserveAttachmentCount;
551			DE_NULL										//  const deUint32*					pPreserveAttachments;
552		}
553	};
554	const VkRenderPassCreateInfo	renderPassInfo				=
555	{
556		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		//  VkStructureType					sType;
557		DE_NULL,										//  const void*						pNext;
558		(VkRenderPassCreateFlags)0,						//  VkRenderPassCreateFlags			flags;
559		DE_LENGTH_OF_ARRAY(attachmentDescriptions),		//  deUint32						attachmentCount;
560		&attachmentDescriptions[0],						//  const VkAttachmentDescription*	pAttachments;
561		DE_LENGTH_OF_ARRAY(subpassDescriptions),		//  deUint32						subpassCount;
562		&subpassDescriptions[0],						//  const VkSubpassDescription*		pSubpasses;
563		0u,												//  deUint32						dependencyCount;
564		DE_NULL											//  const VkSubpassDependency*		pDependencies;
565	};
566
567	return createRenderPass(vk, device, &renderPassInfo, allocationCallbacks);
568}
569
570VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const VkExtent2D size, const VkImageUsageFlags usage, VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT)
571{
572	const VkExtent3D		extent		= { size.width, size.height, 1u };
573	const VkImageCreateInfo imageParams =
574	{
575		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType			sType;
576		DE_NULL,										// const void*				pNext;
577		0u,												// VkImageCreateFlags		flags;
578		VK_IMAGE_TYPE_2D,								// VkImageType				imageType;
579		format,											// VkFormat					format;
580		extent,											// VkExtent3D				extent;
581		1u,												// deUint32					mipLevels;
582		1u,												// deUint32					arrayLayers;
583		samples,										// VkSampleCountFlagBits	samples;
584		VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling			tiling;
585		usage,											// VkImageUsageFlags		usage;
586		VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode			sharingMode;
587		0u,												// deUint32					queueFamilyIndexCount;
588		DE_NULL,										// const deUint32*			pQueueFamilyIndices;
589		VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout			initialLayout;
590	};
591	return imageParams;
592}
593
594std::vector<VkFramebufferAttachmentImageInfo> makeFramebufferAttachmentImageInfos (const VkExtent2D&			renderSize,
595																				   const VkFormat*				colorFormat,
596																				   const VkImageUsageFlags		colorUsage,
597																				   const VkFormat*				dsFormat,
598																				   const VkImageUsageFlags		dsUsage,
599																				   const AspectFlags			resolveAspects,
600																				   const deUint32				inputAttachmentCount)
601{
602	const bool										colorResolve					= (resolveAspects & ASPECT_COLOR) != 0;
603	const bool										depthStencilResolve				= (resolveAspects & ASPECT_DEPTH_STENCIL) != 0;
604	std::vector<VkFramebufferAttachmentImageInfo>	framebufferAttachmentImageInfos;
605
606	DE_ASSERT(colorFormat != DE_NULL);
607	DE_ASSERT(dsFormat != DE_NULL);
608
609	if (*colorFormat != VK_FORMAT_UNDEFINED)
610	{
611		const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo		=
612		{
613			VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,		//  VkStructureType		sType;
614			DE_NULL,													//  const void*			pNext;
615			(VkImageCreateFlags)0u,										//  VkImageCreateFlags	flags;
616			colorUsage,													//  VkImageUsageFlags	usage;
617			renderSize.width,											//  deUint32			width;
618			renderSize.height,											//  deUint32			height;
619			1u,															//  deUint32			layerCount;
620			1u,															//  deUint32			viewFormatCount;
621			colorFormat													//  const VkFormat*		pViewFormats;
622		};
623
624		framebufferAttachmentImageInfos.push_back(framebufferAttachmentImageInfo);
625	}
626
627	if (*dsFormat != VK_FORMAT_UNDEFINED)
628	{
629		const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo		=
630		{
631			VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,		//  VkStructureType		sType;
632			DE_NULL,													//  const void*			pNext;
633			(VkImageCreateFlags)0u,										//  VkImageCreateFlags	flags;
634			dsUsage,													//  VkImageUsageFlags	usage;
635			renderSize.width,											//  deUint32			width;
636			renderSize.height,											//  deUint32			height;
637			1u,															//  deUint32			layerCount;
638			1u,															//  deUint32			viewFormatCount;
639			dsFormat													//  const VkFormat*		pViewFormats;
640		};
641
642		framebufferAttachmentImageInfos.push_back(framebufferAttachmentImageInfo);
643	}
644
645	if (colorResolve)
646	{
647		const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo		=
648		{
649			VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,		//  VkStructureType		sType;
650			DE_NULL,													//  const void*			pNext;
651			(VkImageCreateFlags)0u,										//  VkImageCreateFlags	flags;
652			colorUsage,													//  VkImageUsageFlags	usage;
653			renderSize.width,											//  deUint32			width;
654			renderSize.height,											//  deUint32			height;
655			1u,															//  deUint32			layerCount;
656			1u,															//  deUint32			viewFormatCount;
657			colorFormat													//  const VkFormat*		pViewFormats;
658		};
659
660		DE_ASSERT(*colorFormat != VK_FORMAT_UNDEFINED);
661
662		framebufferAttachmentImageInfos.push_back(framebufferAttachmentImageInfo);
663	}
664
665	if (depthStencilResolve)
666	{
667		const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo		=
668		{
669			VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,		//  VkStructureType		sType;
670			DE_NULL,													//  const void*			pNext;
671			(VkImageCreateFlags)0u,										//  VkImageCreateFlags	flags;
672			dsUsage,													//  VkImageUsageFlags	usage;
673			renderSize.width,											//  deUint32			width;
674			renderSize.height,											//  deUint32			height;
675			1u,															//  deUint32			layerCount;
676			1u,															//  deUint32			viewFormatCount;
677			dsFormat													//  const VkFormat*		pViewFormats;
678		};
679
680		DE_ASSERT(*dsFormat != VK_FORMAT_UNDEFINED);
681
682		framebufferAttachmentImageInfos.push_back(framebufferAttachmentImageInfo);
683	}
684
685	for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < inputAttachmentCount; ++inputAttachmentNdx)
686	{
687		const VkFramebufferAttachmentImageInfo framebufferAttachmentImageInfo		=
688		{
689			VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,		//  VkStructureType		sType;
690			DE_NULL,													//  const void*			pNext;
691			(VkImageCreateFlags)0u,										//  VkImageCreateFlags	flags;
692			colorUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,			//  VkImageUsageFlags	usage;
693			renderSize.width,											//  deUint32			width;
694			renderSize.height,											//  deUint32			height;
695			1u,															//  deUint32			layerCount;
696			1u,															//  deUint32			viewFormatCount;
697			colorFormat													//  const VkFormat*		pViewFormats;
698		};
699
700		framebufferAttachmentImageInfos.push_back(framebufferAttachmentImageInfo);
701	}
702
703	return framebufferAttachmentImageInfos;
704}
705
706Move<VkFramebuffer> makeFramebuffer (const DeviceInterface&			vk,
707									 const VkDevice					device,
708									 const VkRenderPass				renderPass,
709									 const VkExtent2D&				renderSize,
710									 const VkFormat*				colorFormat,
711									 const VkImageUsageFlags		colorUsage,
712									 const VkFormat*				dsFormat,
713									 const VkImageUsageFlags		dsUsage					= static_cast<VkImageUsageFlags>(0),
714									 const AspectFlags				resolveAspects			= ASPECT_NONE,
715									 const deUint32					inputAttachmentCount	= 0)
716{
717	const std::vector<VkFramebufferAttachmentImageInfo>		framebufferAttachmentImageInfos		= makeFramebufferAttachmentImageInfos(renderSize, colorFormat, colorUsage, dsFormat, dsUsage, resolveAspects, inputAttachmentCount);
718	const deUint32											attachmentCount						= static_cast<deUint32>(framebufferAttachmentImageInfos.size());
719	const VkFramebufferAttachmentsCreateInfo				framebufferAttachmentsCreateInfo	=
720	{
721		VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,		//  VkStructureType								sType;
722		DE_NULL,													//  const void*									pNext;
723		attachmentCount,											//  deUint32									attachmentImageInfoCount;
724		&framebufferAttachmentImageInfos[0]							//  const VkFramebufferAttachmentImageInfo*		pAttachmentImageInfos;
725	};
726	const VkFramebufferCreateInfo							framebufferInfo	=
727	{
728		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,					//  VkStructureType				sType;
729		&framebufferAttachmentsCreateInfo,							//  const void*					pNext;
730		VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,						//  VkFramebufferCreateFlags	flags;
731		renderPass,													//  VkRenderPass				renderPass;
732		attachmentCount,											//  deUint32					attachmentCount;
733		DE_NULL,													//  const VkImageView*			pAttachments;
734		renderSize.width,											//  deUint32					width;
735		renderSize.height,											//  deUint32					height;
736		1u,															//  deUint32					layers;
737	};
738
739	return createFramebuffer(vk, device, &framebufferInfo);
740}
741
742Move<VkFramebuffer> makeVerifyFramebuffer (const DeviceInterface&	vk,
743										   const VkDevice			device,
744										   const VkRenderPass		renderPass,
745										   const VkImageView		colorAttachment,
746										   const VkExtent2D&		renderSize,
747										   const deUint32			layers = 1u)
748{
749	const VkFramebufferCreateInfo framebufferInfo = {
750		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,		//  VkStructureType				sType;
751		DE_NULL,										//  const void*					pNext;
752		(VkFramebufferCreateFlags)0,					//  VkFramebufferCreateFlags	flags;
753		renderPass,										//  VkRenderPass				renderPass;
754		1u,												//  deUint32					attachmentCount;
755		&colorAttachment,								//  const VkImageView*			pAttachments;
756		renderSize.width,								//  deUint32					width;
757		renderSize.height,								//  deUint32					height;
758		layers,											//  deUint32					layers;
759	};
760
761	return createFramebuffer(vk, device, &framebufferInfo);
762}
763
764Move<VkPipelineLayout> makeVerifyPipelineLayout (const DeviceInterface&			vk,
765												 const VkDevice					device,
766												 const VkDescriptorSetLayout	descriptorSetLayout)
767{
768	const VkPushConstantRange			pushConstantRanges			=
769	{
770		VK_SHADER_STAGE_FRAGMENT_BIT,					//  VkShaderStageFlags				stageFlags;
771		0u,												//  deUint32						offset;
772		sizeof(deUint32)								//  deUint32						size;
773	};
774	const VkPipelineLayoutCreateInfo	pipelineLayoutCreateInfo	=
775	{
776		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,	//  VkStructureType					sType;
777		DE_NULL,										//  const void*						pNext;
778		(VkPipelineLayoutCreateFlags)0,					//  VkPipelineLayoutCreateFlags		flags;
779		1u,												//  deUint32						setLayoutCount;
780		&descriptorSetLayout,							//  const VkDescriptorSetLayout*	pSetLayouts;
781		1u,												//  deUint32						pushConstantRangeCount;
782		&pushConstantRanges,							//  const VkPushConstantRange*		pPushConstantRanges;
783	};
784	return createPipelineLayout(vk, device, &pipelineLayoutCreateInfo);
785}
786
787Move<VkRenderPass> makeVerifyRenderPass (const DeviceInterface&	vk,
788										 const VkDevice			device,
789										 const VkFormat			colorFormat)
790{
791	return makeRenderPass(vk, device, colorFormat);
792}
793
794VkImageMemoryBarrier makeImageMemoryBarrier	(const VkAccessFlags			srcAccessMask,
795											 const VkAccessFlags			dstAccessMask,
796											 const VkImageLayout			oldLayout,
797											 const VkImageLayout			newLayout,
798											 const VkImage					image,
799											 const VkImageSubresourceRange	subresourceRange)
800{
801	const VkImageMemoryBarrier barrier =
802	{
803		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
804		DE_NULL,										// const void*				pNext;
805		srcAccessMask,									// VkAccessFlags			outputMask;
806		dstAccessMask,									// VkAccessFlags			inputMask;
807		oldLayout,										// VkImageLayout			oldLayout;
808		newLayout,										// VkImageLayout			newLayout;
809		VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
810		VK_QUEUE_FAMILY_IGNORED,						// deUint32					destQueueFamilyIndex;
811		image,											// VkImage					image;
812		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
813	};
814	return barrier;
815}
816
817VkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags	srcAccessMask,
818											   const VkAccessFlags	dstAccessMask,
819											   const VkBuffer		buffer,
820											   const VkDeviceSize	offset,
821											   const VkDeviceSize	bufferSizeBytes)
822{
823	const VkBufferMemoryBarrier barrier =
824	{
825		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	//  VkStructureType	sType;
826		DE_NULL,									//  const void*		pNext;
827		srcAccessMask,								//  VkAccessFlags	srcAccessMask;
828		dstAccessMask,								//  VkAccessFlags	dstAccessMask;
829		VK_QUEUE_FAMILY_IGNORED,					//  deUint32		srcQueueFamilyIndex;
830		VK_QUEUE_FAMILY_IGNORED,					//  deUint32		destQueueFamilyIndex;
831		buffer,										//  VkBuffer		buffer;
832		offset,										//  VkDeviceSize	offset;
833		bufferSizeBytes,							//  VkDeviceSize	size;
834	};
835	return barrier;
836}
837
838Move<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice& device)
839{
840	const VkSamplerCreateInfo createInfo =
841	{
842		VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,		//  VkStructureType			sType;
843		DE_NULL,									//  const void*				pNext;
844		0u,											//  VkSamplerCreateFlags	flags;
845		VK_FILTER_NEAREST,							//  VkFilter				magFilter;
846		VK_FILTER_NEAREST,							//  VkFilter				minFilter;
847		VK_SAMPLER_MIPMAP_MODE_LINEAR,				//  VkSamplerMipmapMode		mipmapMode;
848		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//  VkSamplerAddressMode	addressModeU;
849		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//  VkSamplerAddressMode	addressModeV;
850		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//  VkSamplerAddressMode	addressModeW;
851		0.0f,										//  float					mipLodBias;
852		VK_FALSE,									//  VkBool32				anisotropyEnable;
853		1.0f,										//  float					maxAnisotropy;
854		VK_FALSE,									//  VkBool32				compareEnable;
855		VK_COMPARE_OP_ALWAYS,						//  VkCompareOp				compareOp;
856		0.0f,										//  float					minLod;
857		0.0f,										//  float					maxLod;
858		VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,	//  VkBorderColor			borderColor;
859		VK_FALSE									//  VkBool32				unnormalizedCoordinates;
860	};
861
862	return createSampler(vk, device, &createInfo);
863}
864
865void fillBuffer (const DeviceInterface& vk, const VkDevice device, Allocation& bufferAlloc, const void* data, const VkDeviceSize dataSize)
866{
867	const VkMappedMemoryRange	memRange		=
868	{
869		VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	//  VkStructureType	sType;
870		DE_NULL,								//  const void*		pNext;
871		bufferAlloc.getMemory(),				//  VkDeviceMemory	memory;
872		bufferAlloc.getOffset(),				//  VkDeviceSize	offset;
873		VK_WHOLE_SIZE							//  VkDeviceSize	size;
874	};
875	const deUint32				dataSize32		= static_cast<deUint32>(dataSize);
876
877	deMemcpy(bufferAlloc.getHostPtr(), data, dataSize32);
878	VK_CHECK(vk.flushMappedMemoryRanges(device, 1u, &memRange));
879}
880
881std::vector<float> getFullQuadVertices (void)
882{
883	const float					verticesData[]	=
884	{
885		-1.0f, -1.0f, 0.0f, 1.0f,
886		-1.0f, +1.0f, 0.0f, 1.0f,
887		+1.0f, -1.0f, 0.0f, 1.0f,
888		-1.0f, +1.0f, 0.0f, 1.0f,
889		+1.0f, -1.0f, 0.0f, 1.0f,
890		+1.0f, +1.0f, 0.0f, 1.0f,
891	};
892	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
893
894	return vertices;
895}
896
897void checkImageFormatProperties (const InstanceInterface&	vki,
898								 const VkPhysicalDevice&	physDevice,
899								 const VkFormat				format,
900								 const VkImageUsageFlags	imageUsageFlags,
901								 const VkExtent2D&			requiredSize2D)
902{
903	const VkImageType			imageType			= VK_IMAGE_TYPE_2D;
904	const VkImageTiling			imageTiling			= VK_IMAGE_TILING_OPTIMAL;
905	const VkImageCreateFlags	imageCreateFlags	= static_cast<VkImageCreateFlags>(0u);
906	const deUint32				requiredLayers		= 1u;
907	const VkExtent3D			requiredSize		= makeExtent3D(requiredSize2D.height, requiredSize2D.width, 1u);
908
909	VkImageFormatProperties	imageFormatProperties;
910	VkResult				result;
911
912	deMemset(&imageFormatProperties, 0, sizeof(imageFormatProperties));
913
914	result = vki.getPhysicalDeviceImageFormatProperties(physDevice, format, imageType, imageTiling, imageUsageFlags, imageCreateFlags, &imageFormatProperties);
915
916	if (result									!= VK_SUCCESS			||
917		imageFormatProperties.maxArrayLayers	<  requiredLayers		||
918		imageFormatProperties.maxExtent.height	<  requiredSize.height	||
919		imageFormatProperties.maxExtent.width	<  requiredSize.width	||
920		imageFormatProperties.maxExtent.depth	<  requiredSize.depth)
921	{
922		TCU_THROW(NotSupportedError, "Depth/stencil format is not supported");
923	}
924}
925
926VkFormat getStencilBufferFormat(VkFormat depthStencilImageFormat)
927{
928	const tcu::TextureFormat	tcuFormat	= mapVkFormat(depthStencilImageFormat);
929	const VkFormat				result		= (tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS) ? VK_FORMAT_S8_UINT : VK_FORMAT_UNDEFINED;
930
931	DE_ASSERT(result != VK_FORMAT_UNDEFINED);
932
933	return result;
934}
935
936static MovePtr<tcu::TextureLevel> convertDepthToColor (const tcu::TextureFormat& dataFormat, const int width, const int height, const void* data, const tcu::TextureFormat& targetFormat)
937{
938	const tcu::ConstPixelBufferAccess	srcImage	(dataFormat, width, height, 1u, data);
939	MovePtr<tcu::TextureLevel>			dstImage	(new tcu::TextureLevel(targetFormat, width, height, 1u));
940	tcu::PixelBufferAccess				dstAccess	(dstImage->getAccess());
941
942	for (int y = 0; y < height; y++)
943	for (int x = 0; x < width; x++)
944	{
945		const float		depth	= srcImage.getPixDepth(x, y);
946		const tcu::Vec4	color	= tcu::Vec4(depth, depth, depth, 1.0f);
947
948		dstAccess.setPixel(color, x, y);
949	}
950
951	return dstImage;
952}
953
954static MovePtr<tcu::TextureLevel> convertStencilToColor (const tcu::TextureFormat& dataFormat, const int width, const int height, const void* data, const tcu::TextureFormat& targetFormat)
955{
956	const int							maxValue	(4);
957	const tcu::ConstPixelBufferAccess	srcImage	(dataFormat, width, height, 1u, data);
958	MovePtr<tcu::TextureLevel>			dstImage	(new tcu::TextureLevel(targetFormat, width, height, 1u));
959	tcu::PixelBufferAccess				dstAccess	(dstImage->getAccess());
960
961	for (int y = 0; y < height; y++)
962	for (int x = 0; x < width; x++)
963	{
964		const int		stencilInt	= srcImage.getPixStencil(x, y);
965		const float		stencil		= (stencilInt < maxValue) ? float(stencilInt) / float(maxValue) : 1.0f;
966		const tcu::Vec4	color		= tcu::Vec4(stencil, stencil, stencil, 1.0f);
967
968		dstAccess.setPixel(color, x, y);
969	}
970
971	return dstImage;
972}
973
974class ColorImagelessTestInstance : public TestInstance
975{
976public:
977										ColorImagelessTestInstance			(Context& context, const TestParameters& parameters);
978protected:
979	virtual tcu::TestStatus				iterate								(void);
980
981	virtual std::vector<float>			getVertices							(void);
982	void								readOneSampleFromMultisampleImage	(const VkFormat					srcFormat,
983																			 const Unique<VkImage>&			srcImage,
984																			 const deUint32					sampleID,
985																			 const VkFormat					dstFormat,
986																			 const Unique<VkImage>&			dstImage,
987																			 const Unique<VkBuffer>&		dstBuffer,
988																			 const AspectFlags				aspect);
989	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage				(const tcu::TextureFormat&		textureFormat,
990																			 const AspectFlags				aspectFlags,
991																			 const deUint32					sample,
992																			 const deUint32					subpass);
993	virtual bool						verifyBuffer						(const UniquePtr<Allocation>&	bufAlloc,
994																			 const VkFormat					bufferFormat,
995																			 const std::string&				name,
996																			 const AspectFlags				aspectFlags,
997																			 const deUint32					sample		= NO_SAMPLE,
998																			 const deUint32					subpass		= NO_SUBPASS);
999	virtual bool						verifyBufferInternal				(const void*					resultData,
1000																			 const tcu::TextureFormat&		textureFormat,
1001																			 const tcu::TextureLevel&		referenceImage,
1002																			 const std::string&				name);
1003
1004	const bool							m_extensions;
1005	const VkExtent2D					m_imageExtent2D;
1006	const TestParameters				m_parameters;
1007	VkImageUsageFlags					m_colorImageUsage;
1008};
1009
1010ColorImagelessTestInstance::ColorImagelessTestInstance (Context& context, const TestParameters& parameters)
1011	: TestInstance				(context)
1012	, m_extensions				(context.requireDeviceFunctionality("VK_KHR_imageless_framebuffer"))
1013	, m_imageExtent2D			(makeExtent2D(32u, 32u))
1014	, m_parameters				(parameters)
1015	, m_colorImageUsage			(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
1016{
1017	const InstanceInterface&								vki								= m_context.getInstanceInterface();
1018	const VkPhysicalDevice									physDevice						= m_context.getPhysicalDevice();
1019	const VkPhysicalDeviceImagelessFramebufferFeatures&		imagelessFramebufferFeatures	(context.getImagelessFramebufferFeatures());
1020
1021	if (imagelessFramebufferFeatures.imagelessFramebuffer == DE_FALSE)
1022		TCU_THROW(NotSupportedError, "Imageless framebuffer is not supported");
1023
1024	checkImageFormatProperties(vki, physDevice, m_parameters.colorFormat, m_colorImageUsage, m_imageExtent2D);
1025}
1026
1027void ColorImagelessTestInstance::readOneSampleFromMultisampleImage (const VkFormat			srcFormat,
1028																	const Unique<VkImage>&	srcImage,
1029																	const deUint32			sampleID,
1030																	const VkFormat			dstFormat,
1031																	const Unique<VkImage>&	dstImage,
1032																	const Unique<VkBuffer>&	dstBuffer,
1033																	const AspectFlags		aspect)
1034{
1035	const DeviceInterface&				vk					= m_context.getDeviceInterface();
1036	const VkDevice						device				= m_context.getDevice();
1037	const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
1038	const VkQueue						queue				= m_context.getUniversalQueue();
1039	Allocator&							allocator			= m_context.getDefaultAllocator();
1040
1041	const tcu::Vec4						clearColor			= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
1042	const bool							color				= ((aspect & ASPECT_COLOR) != 0);
1043	const bool							depth				= ((aspect & ASPECT_DEPTH) != 0);
1044	const bool							stencil				= ((aspect & ASPECT_STENCIL) != 0);
1045	const VkImageAspectFlags			srcAspect			= color   ? VK_IMAGE_ASPECT_COLOR_BIT
1046															: depth   ? VK_IMAGE_ASPECT_DEPTH_BIT
1047															: VK_IMAGE_ASPECT_STENCIL_BIT;
1048	const VkImageSubresourceRange		srcSubresRange		= makeImageSubresourceRange(srcAspect, 0u, 1u, 0u, 1u);
1049	const Unique<VkImageView>			srcImageView		(makeImageView			(vk, device, *srcImage, VK_IMAGE_VIEW_TYPE_2D, srcFormat, srcSubresRange));
1050
1051	const VkImageAspectFlags			dstAspect			= VK_IMAGE_ASPECT_COLOR_BIT;
1052	const VkImageSubresourceRange		dstSubresRange		= makeImageSubresourceRange(dstAspect, 0u, 1u, 0u, 1u);
1053	const Unique<VkImageView>			dstAttachment		(makeImageView			(vk, device, *dstImage, VK_IMAGE_VIEW_TYPE_2D, dstFormat, dstSubresRange));
1054
1055	const std::string					fragModuleInfix		= color   ? "-color"
1056															: depth   ? "-depth"
1057															: stencil ? "-stencil"
1058															: "";
1059	const Unique<VkShaderModule>		vertModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("demultisample-vert"), 0u));
1060	const Unique<VkShaderModule>		fragModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("demultisample" + fragModuleInfix + "-frag"), 0u));
1061	const Unique<VkRenderPass>			renderPass			(makeVerifyRenderPass	(vk, device, dstFormat));
1062	const Unique<VkFramebuffer>			framebuffer			(makeVerifyFramebuffer	(vk, device, *renderPass, *dstAttachment, m_imageExtent2D));
1063
1064	const VkDescriptorType				samplerDescType		(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
1065	const Unique<VkSampler>				sampler				(makeSampler(vk, device));
1066	const Unique<VkDescriptorSetLayout>	descriptorSetLayout	(DescriptorSetLayoutBuilder()
1067		.addSingleSamplerBinding(samplerDescType, VK_SHADER_STAGE_FRAGMENT_BIT, &sampler.get())
1068		.build(vk, device));
1069	const Unique<VkDescriptorPool>		descriptorPool		(DescriptorPoolBuilder()
1070		.addType(samplerDescType)
1071		.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
1072	const Unique<VkDescriptorSet>		descriptorSet		(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
1073	const VkDescriptorImageInfo			imageDescriptorInfo	(makeDescriptorImageInfo(DE_NULL, *srcImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
1074
1075	DescriptorSetUpdateBuilder()
1076		.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), samplerDescType, &imageDescriptorInfo)
1077		.update(vk, device);
1078
1079	const Unique<VkPipelineLayout>		pipelineLayout		(makeVerifyPipelineLayout	(vk, device, *descriptorSetLayout));
1080	const Unique<VkPipeline>			pipeline			(makeGraphicsPipeline		(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D));
1081	const Unique<VkCommandPool>			cmdPool				(createCommandPool			(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
1082	const Unique<VkCommandBuffer>		cmdBuffer			(allocateCommandBuffer		(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1083
1084	const std::vector<float>			vertexArray			(getFullQuadVertices());
1085	const deUint32						vertexCount			(static_cast<deUint32>(vertexArray.size() / 4u));
1086	const VkDeviceSize					vertexArraySize		(vertexArray.size() * sizeof(vertexArray[0]));
1087	const Unique<VkBuffer>				vertexBuffer		(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
1088	const UniquePtr<Allocation>			vertexBufferAlloc	(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
1089	const VkDeviceSize					vertexBufferOffset	(0u);
1090
1091	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
1092
1093	beginCommandBuffer(vk, *cmdBuffer);
1094	{
1095		if (sampleID == 0)
1096		{
1097			if (color)
1098			{
1099				const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
1100																						 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
1101																						 *srcImage, srcSubresRange);
1102
1103				vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1104			}
1105			else if (depth)
1106			{
1107				const VkImageSubresourceRange	preCopySubresRange	= makeImageSubresourceRange	(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u);
1108				const VkImageMemoryBarrier		preCopyBarrier		= makeImageMemoryBarrier	(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
1109																								 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
1110																								 *srcImage, preCopySubresRange);
1111
1112				vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1113			}
1114		}
1115
1116		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor);
1117		{
1118			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1119
1120			vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
1121
1122			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
1123
1124			vk.cmdPushConstants(*cmdBuffer, *pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0u, sizeof(sampleID), &sampleID);
1125
1126			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
1127		}
1128		endRenderPass(vk, *cmdBuffer);
1129
1130		// Image copy
1131		{
1132			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1133																					 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1134																					 *dstImage, dstSubresRange);
1135			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1136																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
1137			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *dstBuffer, 0ull, VK_WHOLE_SIZE);
1138
1139			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1140			vk.cmdCopyImageToBuffer(*cmdBuffer, *dstImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *dstBuffer, 1u, &region);
1141			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
1142		}
1143	}
1144	endCommandBuffer(vk, *cmdBuffer);
1145	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1146}
1147
1148bool ColorImagelessTestInstance::verifyBufferInternal (const void* resultData, const tcu::TextureFormat& textureFormat, const tcu::TextureLevel& referenceImage, const std::string& name)
1149{
1150	const int							dataSize		(m_imageExtent2D.width * m_imageExtent2D.height * textureFormat.getPixelSize());
1151	const tcu::ConstPixelBufferAccess	referenceAccess	(referenceImage.getAccess());
1152
1153	if (deMemCmp(resultData, referenceAccess.getDataPtr(), dataSize) != 0)
1154	{
1155		const tcu::ConstPixelBufferAccess	resultImage	(textureFormat, m_imageExtent2D.width, m_imageExtent2D.height, 1u, resultData);
1156		bool								ok;
1157
1158		ok = tcu::intThresholdCompare(m_context.getTestContext().getLog(), name.c_str(), "", referenceAccess, resultImage, tcu::UVec4(1), tcu::COMPARE_LOG_RESULT);
1159
1160		return ok;
1161	}
1162
1163	return true;
1164}
1165
1166bool ColorImagelessTestInstance::verifyBuffer (const UniquePtr<Allocation>& bufAlloc, const VkFormat bufferFormat, const std::string& name, const AspectFlags aspectFlags, const deUint32 sample, const deUint32 subpass)
1167{
1168	invalidateMappedMemoryRange(m_context.getDeviceInterface(), m_context.getDevice(), bufAlloc->getMemory(), bufAlloc->getOffset(), VK_WHOLE_SIZE);
1169
1170	const tcu::TextureFormat			bufferTextureFormat		(mapVkFormat(bufferFormat));
1171	const bool							multisampled			(sample != NO_SAMPLE);
1172	const bool							depth					((aspectFlags & ASPECT_DEPTH) != 0);
1173	const bool							stencil					((aspectFlags & ASPECT_STENCIL) != 0);
1174	const bool							convertRequired			((depth || stencil) && !multisampled);
1175	const tcu::TextureFormat			convertTextureFormat	(tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNORM_INT8));
1176	const tcu::TextureFormat			referenceTextureFormat	(convertRequired ? convertTextureFormat : bufferTextureFormat);
1177	const MovePtr<tcu::TextureLevel>	referenceImage			(generateReferenceImage(referenceTextureFormat, aspectFlags, sample, subpass));
1178
1179	if (!multisampled && depth)
1180	{
1181		MovePtr<tcu::TextureLevel>	convertedImage	(convertDepthToColor(bufferTextureFormat, m_imageExtent2D.width, m_imageExtent2D.height, bufAlloc->getHostPtr(), convertTextureFormat));
1182		tcu::ConstPixelBufferAccess	convertedAccess	(convertedImage->getAccess());
1183
1184		return verifyBufferInternal(convertedAccess.getDataPtr(), convertTextureFormat, *referenceImage, name);
1185	}
1186	else if (!multisampled && stencil)
1187	{
1188		MovePtr<tcu::TextureLevel>	convertedImage	(convertStencilToColor(bufferTextureFormat, m_imageExtent2D.width, m_imageExtent2D.height, bufAlloc->getHostPtr(), convertTextureFormat));
1189		tcu::ConstPixelBufferAccess	convertedAccess	(convertedImage->getAccess());
1190
1191		return verifyBufferInternal(convertedAccess.getDataPtr(), convertTextureFormat, *referenceImage, name);
1192	}
1193	else
1194	{
1195		const void*	resultData	(bufAlloc->getHostPtr());
1196
1197		return verifyBufferInternal(resultData, bufferTextureFormat, *referenceImage, name);
1198	}
1199}
1200
1201MovePtr<tcu::TextureLevel> ColorImagelessTestInstance::generateReferenceImage (const tcu::TextureFormat&	textureFormat,
1202																			   const AspectFlags			aspectFlags,
1203																			   const deUint32				sample,
1204																			   const deUint32				subpass)
1205{
1206	const int					width			= m_imageExtent2D.width;
1207	const int					height			= m_imageExtent2D.height;
1208	const int					componentValue	(static_cast<int>(0.75f * 0x100));
1209	const tcu::RGBA				colorDrawRGBA	(tcu::RGBA(componentValue, componentValue, componentValue, 0xFF));
1210	const tcu::Vec4				colorDraw		(colorDrawRGBA.toVec());
1211	const tcu::Vec4				colorFill		(tcu::RGBA::black().toVec());
1212	MovePtr<tcu::TextureLevel>	image			(new tcu::TextureLevel(textureFormat, width, height));
1213	tcu::PixelBufferAccess		access			(image->getAccess());
1214
1215	DE_UNREF(aspectFlags);
1216	DE_ASSERT(aspectFlags == ASPECT_COLOR);
1217	DE_UNREF(sample);
1218	DE_ASSERT(sample == NO_SAMPLE);
1219	DE_UNREF(subpass);
1220	DE_ASSERT(subpass == NO_SUBPASS);
1221
1222	for (int y = 0; y < height; ++y)
1223	{
1224		const tcu::Vec4&	validColor	= (y < height / 2) ? colorFill : colorDraw;
1225
1226		for (int x = 0; x < width; ++x)
1227			access.setPixel(validColor, x, y);
1228	}
1229
1230	return image;
1231}
1232
1233std::vector<float> ColorImagelessTestInstance::getVertices (void)
1234{
1235	const float					verticesData[]	=
1236	{
1237		-1.0f,  0.0f, 0.0f, 1.0f,
1238		-1.0f, +1.0f, 0.0f, 1.0f,
1239		+1.0f,  0.0f, 0.0f, 1.0f,
1240		-1.0f, +1.0f, 0.0f, 1.0f,
1241		+1.0f,  0.0f, 0.0f, 1.0f,
1242		+1.0f, +1.0f, 0.0f, 1.0f,
1243	};
1244	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
1245
1246	return vertices;
1247}
1248
1249tcu::TestStatus ColorImagelessTestInstance::iterate (void)
1250{
1251	const DeviceInterface&			vk					= m_context.getDeviceInterface();
1252	const VkDevice					device				= m_context.getDevice();
1253	const deUint32					queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
1254	const VkQueue					queue				= m_context.getUniversalQueue();
1255	Allocator&						allocator			= m_context.getDefaultAllocator();
1256
1257	const tcu::Vec4					clearColor			= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
1258	const VkFormat					colorFormat			= m_parameters.colorFormat;
1259	const VkDeviceSize				colorBufferSize		= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
1260	const VkImageSubresourceRange	colorSubresRange	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1261
1262	const Unique<VkImage>			colorImage			(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
1263	const UniquePtr<Allocation>		colorImageAlloc		(bindImage				(vk, device, allocator, *colorImage, MemoryRequirement::Any));
1264	const Unique<VkImageView>		colorAttachment		(makeImageView			(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1265	const Unique<VkBuffer>			colorBuffer			(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1266	const UniquePtr<Allocation>		colorBufferAlloc	(bindBuffer				(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
1267
1268	const Unique<VkShaderModule>	vertModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
1269	const Unique<VkShaderModule>	fragModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
1270	const Unique<VkRenderPass>		renderPass			(makeRenderPass			(vk, device, colorFormat, m_parameters.dsFormat));
1271	const Unique<VkFramebuffer>		framebuffer			(makeFramebuffer		(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &m_parameters.dsFormat));
1272	const Unique<VkPipelineLayout>	pipelineLayout		(makePipelineLayout		(vk, device));
1273	const Unique<VkPipeline>		pipeline			(makeGraphicsPipeline	(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D));
1274	const Unique<VkCommandPool>		cmdPool				(createCommandPool		(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
1275	const Unique<VkCommandBuffer>	cmdBuffer			(allocateCommandBuffer	(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1276
1277	const std::vector<float>		vertexArray			(getVertices());
1278	const deUint32					vertexCount			(static_cast<deUint32>(vertexArray.size() / 4u));
1279	const VkDeviceSize				vertexArraySize		(vertexArray.size() * sizeof(vertexArray[0]));
1280	const Unique<VkBuffer>			vertexBuffer		(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
1281	const UniquePtr<Allocation>		vertexBufferAlloc	(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
1282	const VkDeviceSize				vertexBufferOffset	(0u);
1283
1284	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
1285
1286	beginCommandBuffer(vk, *cmdBuffer);
1287	{
1288		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo	=
1289		{
1290			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
1291			DE_NULL,													//  const void*			pNext;
1292			1u,															//  deUint32			attachmentCount;
1293			&*colorAttachment											//  const VkImageView*	pAttachments;
1294		};
1295
1296		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, &renderPassAttachmentBeginInfo);
1297		{
1298			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1299
1300			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
1301
1302			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
1303		}
1304		endRenderPass(vk, *cmdBuffer);
1305
1306		// Color image copy
1307		{
1308			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1309																					 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1310																					 *colorImage, colorSubresRange);
1311			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1312																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
1313			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *colorBuffer, 0ull, VK_WHOLE_SIZE);
1314
1315			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1316			vk.cmdCopyImageToBuffer(*cmdBuffer, *colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *colorBuffer, 1u, &region);
1317			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
1318		}
1319	}
1320	endCommandBuffer(vk, *cmdBuffer);
1321	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1322
1323	if (verifyBuffer(colorBufferAlloc, colorFormat, "Color", ASPECT_COLOR))
1324		return tcu::TestStatus::pass("Pass");
1325	else
1326		return tcu::TestStatus::fail("Fail");
1327}
1328
1329class DepthImagelessTestInstance : public ColorImagelessTestInstance
1330{
1331public:
1332										DepthImagelessTestInstance	(Context& context, const TestParameters& parameters);
1333
1334protected:
1335	virtual tcu::TestStatus				iterate						(void);
1336
1337	virtual std::vector<float>			getVertices					(void);
1338
1339	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage		(const tcu::TextureFormat&	textureFormat,
1340																	 const AspectFlags			aspectFlags,
1341																	 const deUint32				sample,
1342																	 const deUint32				subpass);
1343
1344	VkImageUsageFlags					m_dsImageUsage;
1345};
1346
1347DepthImagelessTestInstance::DepthImagelessTestInstance (Context& context, const TestParameters& parameters)
1348	: ColorImagelessTestInstance	(context, parameters)
1349	, m_dsImageUsage				(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
1350{
1351	const InstanceInterface&	vki			= m_context.getInstanceInterface();
1352	const VkPhysicalDevice		physDevice	= m_context.getPhysicalDevice();
1353
1354	checkImageFormatProperties(vki, physDevice, m_parameters.dsFormat, m_dsImageUsage, m_imageExtent2D);
1355}
1356
1357MovePtr<tcu::TextureLevel> DepthImagelessTestInstance::generateReferenceImage (const tcu::TextureFormat&	textureFormat,
1358																			   const AspectFlags			aspectFlags,
1359																			   const deUint32				sample,
1360																			   const deUint32				subpass)
1361{
1362	const bool					color	= ((aspectFlags & ASPECT_COLOR) != 0);
1363	const bool					depth	= ((aspectFlags & ASPECT_DEPTH) != 0);
1364	const bool					stencil	= ((aspectFlags & ASPECT_STENCIL) != 0);
1365	const int					width	= m_imageExtent2D.width;
1366	const int					height	= m_imageExtent2D.height;
1367	MovePtr<tcu::TextureLevel>	image	(new tcu::TextureLevel(textureFormat, width, height));
1368	tcu::PixelBufferAccess		access	(image->getAccess());
1369
1370	DE_ASSERT(dePop32(aspectFlags) == 1);
1371	DE_UNREF(sample);
1372	DE_ASSERT(sample == NO_SAMPLE);
1373	DE_UNREF(subpass);
1374	DE_ASSERT(subpass == NO_SUBPASS);
1375
1376	if (color)
1377	{
1378		const int		componentValue	(static_cast<int>(0.75f * 0x100));
1379		const tcu::RGBA	colorDrawRGBA	(tcu::RGBA(componentValue, componentValue, componentValue, 0xFF));
1380		const tcu::Vec4	colorDraw		(colorDrawRGBA.toVec());
1381		const tcu::Vec4	colorDrawTop	(tcu::RGBA::white().toVec());
1382		const tcu::Vec4	colorFill		(tcu::RGBA::black().toVec());
1383
1384		for (int y = 0; y < height; ++y)
1385		for (int x = 0; x < width; ++x)
1386		{
1387			const tcu::Vec4&	validColor	= (y < height / 2) ? colorFill
1388											: (x < width  / 2) ? colorDraw
1389											: colorDrawTop;
1390
1391			access.setPixel(validColor, x, y);
1392		}
1393	}
1394
1395	if (depth)
1396	{
1397		const int			colorFillValue	(static_cast<int>(1.00f * 0x100));
1398		const int			colorDrawValue	(static_cast<int>(0.50f * 0x100));
1399		const int			colorTopValue	(static_cast<int>(0.25f * 0x100));
1400		const tcu::IVec4	colorFill		(colorFillValue, 0, 0, 0xFF);
1401		const tcu::IVec4	colorDraw		(colorDrawValue, 0, 0, 0xFF);
1402		const tcu::IVec4	colorTop		(colorTopValue,  0, 0, 0xFF);
1403
1404		for (int y = 0; y < height; ++y)
1405		for (int x = 0; x < width; ++x)
1406		{
1407			const tcu::IVec4&	validColor	= (y < height / 2) ? colorFill
1408											: (x < width  / 2) ? colorDraw
1409											: colorTop;
1410
1411			access.setPixel(validColor, x, y);
1412		}
1413	}
1414
1415	if (stencil)
1416	{
1417		const int			colorFillValue	(static_cast<int>(0.00f * 0x100));
1418		const int			colorDrawValue	(static_cast<int>(0.25f * 0x100));
1419		const int			colorTopValue	(static_cast<int>(0.50f * 0x100));
1420		const tcu::IVec4	colorFill		(colorFillValue, 0, 0, 0xFF);
1421		const tcu::IVec4	colorDraw		(colorDrawValue, 0, 0, 0xFF);
1422		const tcu::IVec4	colorTop		(colorTopValue,  0, 0, 0xFF);
1423
1424		for (int y = 0; y < height; ++y)
1425		for (int x = 0; x < width; ++x)
1426		{
1427			const tcu::IVec4&	validColor	= (y < height / 2) ? colorFill
1428											: (x < width  / 2) ? colorDraw
1429											: colorTop;
1430
1431			access.setPixel(validColor, x, y);
1432		}
1433	}
1434
1435	return image;
1436}
1437
1438std::vector<float> DepthImagelessTestInstance::getVertices (void)
1439{
1440	const float					verticesData[]	=
1441	{
1442		-1.0f,  0.0f, 0.50f, 1.0f,
1443		-1.0f, +1.0f, 0.50f, 1.0f,
1444		+1.0f,  0.0f, 0.50f, 1.0f,
1445		-1.0f, +1.0f, 0.50f, 1.0f,
1446		+1.0f,  0.0f, 0.50f, 1.0f,
1447		+1.0f, +1.0f, 0.50f, 1.0f,
1448
1449		 0.0f,  0.0f, 0.25f, 1.0f,
1450		 0.0f, +1.0f, 0.25f, 1.0f,
1451		+1.0f,  0.0f, 0.25f, 1.0f,
1452		 0.0f, +1.0f, 0.25f, 1.0f,
1453		+1.0f,  0.0f, 0.25f, 1.0f,
1454		+1.0f, +1.0f, 0.25f, 1.0f,
1455	};
1456	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
1457
1458	return vertices;
1459}
1460
1461tcu::TestStatus DepthImagelessTestInstance::iterate (void)
1462{
1463	const DeviceInterface&			vk					= m_context.getDeviceInterface();
1464	const VkDevice					device				= m_context.getDevice();
1465	const deUint32					queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
1466	const VkQueue					queue				= m_context.getUniversalQueue();
1467	Allocator&						allocator			= m_context.getDefaultAllocator();
1468
1469	const deUint32					sampleCount			= 1u;
1470	const VkSampleCountFlagBits		sampleCountFlag		= sampleCountBitFromSampleCount(sampleCount);
1471	const tcu::Vec4					clearColor			= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
1472	const VkFormat					colorFormat			= m_parameters.colorFormat;
1473	const VkDeviceSize				colorBufferSize		= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
1474	const VkImageSubresourceRange	colorSubresRange	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1475
1476	const Unique<VkImage>			colorImage			(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
1477	const UniquePtr<Allocation>		colorImageAlloc		(bindImage				(vk, device, allocator, *colorImage, MemoryRequirement::Any));
1478	const Unique<VkImageView>		colorAttachment		(makeImageView			(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1479	const Unique<VkBuffer>			colorBuffer			(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1480	const UniquePtr<Allocation>		colorBufferAlloc	(bindBuffer				(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
1481
1482	const float						clearDepth			= 1.0f;
1483	const deUint32					clearStencil		= 0u;
1484	const VkFormat					dsFormat			= m_parameters.dsFormat;
1485	const deUint32					dsImagePixelSize	= static_cast<deUint32>(tcu::getPixelSize(mapVkFormat(dsFormat)));
1486	const VkImageAspectFlags		dsAspectFlags		= VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1487	const VkImageSubresourceRange	dsSubresRange		= makeImageSubresourceRange(dsAspectFlags, 0u, 1u, 0u, 1u);
1488
1489	const VkDeviceSize				depthBufferSize		= m_imageExtent2D.width * m_imageExtent2D.height * dsImagePixelSize;
1490	const VkFormat					stencilBufferFormat	= getStencilBufferFormat(dsFormat);
1491	const deUint32					stencilPixelSize	= static_cast<deUint32>(tcu::getPixelSize(mapVkFormat(stencilBufferFormat)));
1492	const VkDeviceSize				stencilBufferSize	= m_imageExtent2D.width * m_imageExtent2D.height * stencilPixelSize;
1493
1494	const Unique<VkImage>			dsImage				(makeImage				(vk, device, makeImageCreateInfo(dsFormat, m_imageExtent2D, m_dsImageUsage)));
1495	const UniquePtr<Allocation>		dsImageAlloc		(bindImage				(vk, device, allocator, *dsImage, MemoryRequirement::Any));
1496	const Unique<VkImageView>		dsAttachment		(makeImageView			(vk, device, *dsImage, VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresRange));
1497	const Unique<VkBuffer>			depthBuffer			(makeBuffer				(vk, device, depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1498	const UniquePtr<Allocation>		depthBufferAlloc	(bindBuffer				(vk, device, allocator, *depthBuffer, MemoryRequirement::HostVisible));
1499	const Unique<VkBuffer>			stencilBuffer		(makeBuffer				(vk, device, stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1500	const UniquePtr<Allocation>		stencilBufferAlloc	(bindBuffer				(vk, device, allocator, *stencilBuffer, MemoryRequirement::HostVisible));
1501
1502	const Unique<VkShaderModule>	vertModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
1503	const Unique<VkShaderModule>	fragModule			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
1504	const Unique<VkRenderPass>		renderPass			(makeRenderPass			(vk, device, colorFormat, dsFormat, sampleCountFlag));
1505	const Unique<VkFramebuffer>		framebuffer			(makeFramebuffer		(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &dsFormat, m_dsImageUsage));
1506	const Unique<VkPipelineLayout>	pipelineLayout		(makePipelineLayout		(vk, device));
1507	const Unique<VkPipeline>		pipeline			(makeGraphicsPipeline	(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D, ASPECT_DEPTH_STENCIL));
1508	const Unique<VkCommandPool>		cmdPool				(createCommandPool		(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
1509	const Unique<VkCommandBuffer>	cmdBuffer			(allocateCommandBuffer	(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1510
1511	const std::vector<float>		vertexArray			(getVertices());
1512	const deUint32					vertexCount			(static_cast<deUint32>(vertexArray.size() / 4u));
1513	const VkDeviceSize				vertexArraySize		(vertexArray.size() * sizeof(vertexArray[0]));
1514	const Unique<VkBuffer>			vertexBuffer		(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
1515	const UniquePtr<Allocation>		vertexBufferAlloc	(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
1516	const VkDeviceSize				vertexBufferOffset	(0u);
1517
1518	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
1519
1520	beginCommandBuffer(vk, *cmdBuffer);
1521	{
1522		const VkImageView							attachments[]					= { *colorAttachment, *dsAttachment };
1523		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo	=
1524		{
1525			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
1526			DE_NULL,													//  const void*			pNext;
1527			DE_LENGTH_OF_ARRAY(attachments),							//  deUint32			attachmentCount;
1528			attachments													//  const VkImageView*	pAttachments;
1529		};
1530
1531		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, clearDepth, clearStencil, &renderPassAttachmentBeginInfo);
1532		{
1533			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1534
1535			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
1536
1537			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
1538		}
1539		endRenderPass(vk, *cmdBuffer);
1540
1541		// Color image copy
1542		{
1543			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1544																					 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1545																					 *colorImage, colorSubresRange);
1546			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1547																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
1548			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *colorBuffer, 0ull, VK_WHOLE_SIZE);
1549
1550			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1551			vk.cmdCopyImageToBuffer(*cmdBuffer, *colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *colorBuffer, 1u, &region);
1552			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
1553		}
1554
1555		// Depth/Stencil image copy
1556		{
1557			const VkImageMemoryBarrier	preCopyBarrier		= makeImageMemoryBarrier(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1558																VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *dsImage, dsSubresRange);
1559			const VkBufferImageCopy		depthCopyRegion		= makeBufferImageCopy(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1560																				  makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, 1u));
1561			const VkBufferImageCopy		stencilCopyRegion	= makeBufferImageCopy(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1562																				  makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u));
1563			const VkBufferMemoryBarrier	postCopyBarriers[]	=
1564			{
1565				makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *depthBuffer, 0ull, VK_WHOLE_SIZE),
1566				makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *stencilBuffer, 0ull, VK_WHOLE_SIZE),
1567			};
1568
1569			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1570			vk.cmdCopyImageToBuffer(*cmdBuffer, *dsImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *depthBuffer, 1u, &depthCopyRegion);
1571			vk.cmdCopyImageToBuffer(*cmdBuffer, *dsImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *stencilBuffer, 1u, &stencilCopyRegion);
1572			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(postCopyBarriers), postCopyBarriers, DE_NULL, 0u);
1573		}
1574	}
1575	endCommandBuffer(vk, *cmdBuffer);
1576	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1577
1578	{
1579		std::string result;
1580
1581		if (!verifyBuffer(colorBufferAlloc, colorFormat, "Color", ASPECT_COLOR))
1582			result += " Color";
1583
1584		if (!verifyBuffer(depthBufferAlloc, dsFormat, "Depth", ASPECT_DEPTH))
1585			result += " Depth";
1586
1587		if (!verifyBuffer(stencilBufferAlloc, stencilBufferFormat, "Stencil", ASPECT_STENCIL))
1588			result += " Stencil";
1589
1590		if (result.empty())
1591			return tcu::TestStatus::pass("Pass");
1592		else
1593			return tcu::TestStatus::fail("Following parts of image are incorrect:" + result);
1594	}
1595}
1596
1597class ColorResolveImagelessTestInstance : public ColorImagelessTestInstance
1598{
1599public:
1600										ColorResolveImagelessTestInstance	(Context& context, const TestParameters& parameters);
1601protected:
1602	virtual tcu::TestStatus				iterate								(void);
1603
1604	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage				(const tcu::TextureFormat&	textureFormat,
1605																			 const AspectFlags			aspectFlags,
1606																			 const deUint32				sample,
1607																			 const deUint32				subpass);
1608
1609	virtual std::vector<float>			getVertices							(void);
1610};
1611
1612ColorResolveImagelessTestInstance::ColorResolveImagelessTestInstance (Context& context, const TestParameters& parameters)
1613	: ColorImagelessTestInstance	(context, parameters)
1614{
1615	const InstanceInterface&	vki			= m_context.getInstanceInterface();
1616	const VkPhysicalDevice		physDevice	= m_context.getPhysicalDevice();
1617
1618	// To validate per-sample image image must also be sampled
1619	m_colorImageUsage |= VK_IMAGE_USAGE_SAMPLED_BIT;
1620
1621	checkImageFormatProperties(vki, physDevice, m_parameters.colorFormat, m_colorImageUsage, m_imageExtent2D);
1622}
1623
1624MovePtr<tcu::TextureLevel> ColorResolveImagelessTestInstance::generateReferenceImage (const tcu::TextureFormat&	textureFormat,
1625																					  const AspectFlags			aspectFlags,
1626																					  const deUint32			sample,
1627																					  const deUint32			subpass)
1628{
1629	const int					width			= m_imageExtent2D.width;
1630	const int					height			= m_imageExtent2D.height;
1631	MovePtr<tcu::TextureLevel>	image			(new tcu::TextureLevel(textureFormat, width, height));
1632	tcu::PixelBufferAccess		access			(image->getAccess());
1633	const int					componentValue	(static_cast<int>(0.75f * 0x100));
1634	const tcu::RGBA				colorDrawRGBA	(tcu::RGBA(componentValue, componentValue, componentValue, 0xFF));
1635	const tcu::Vec4				colorDraw		(colorDrawRGBA.toVec());
1636	const tcu::Vec4				colorFill		(tcu::RGBA::black().toVec());
1637	const tcu::Vec4				colorEdge0		(colorDraw);
1638	const tcu::Vec4				colorEdge1		(colorFill);
1639	const tcu::Vec4				colorEdge2		(colorDraw);
1640	const tcu::Vec4				colorEdge3		(colorFill);
1641	const tcu::Vec4				colorEdgeR		((colorDraw.x() + colorFill.x()) / 2, (colorDraw.y() + colorFill.y()) / 2, (colorDraw.z() + colorFill.z()) / 2, colorDraw.w()); // AVERAGE
1642	const tcu::Vec4&			colorEdge		= sample == 0 ? colorEdge0
1643												: sample == 1 ? colorEdge1
1644												: sample == 2 ? colorEdge2
1645												: sample == 3 ? colorEdge3
1646												: colorEdgeR;
1647
1648	DE_UNREF(aspectFlags);
1649	DE_ASSERT(dePop32(aspectFlags) == 1);
1650	DE_ASSERT(aspectFlags == ASPECT_COLOR);
1651	DE_UNREF(subpass);
1652	DE_ASSERT(subpass == NO_SUBPASS);
1653
1654	for (int y = 0; y < height; ++y)
1655	for (int x = 0; x < width; ++x)
1656	{
1657		const int			mx			= width - 1 - x;
1658		const tcu::Vec4&	validColor	= (y == mx) ? colorEdge
1659										: (y >  mx) ? colorFill
1660										: colorDraw;
1661
1662		access.setPixel(validColor, x, y);
1663	}
1664
1665	return image;
1666}
1667
1668std::vector<float> ColorResolveImagelessTestInstance::getVertices (void)
1669{
1670	const float					verticesData[]	=
1671	{
1672		-1.0f, -1.0f, 0.0f, 1.0f,
1673		-1.0f, +1.0f, 0.0f, 1.0f,
1674		+1.0f, -1.0f, 0.0f, 1.0f,
1675	};
1676	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
1677
1678	return vertices;
1679}
1680
1681tcu::TestStatus ColorResolveImagelessTestInstance::iterate (void)
1682{
1683	const DeviceInterface&			vk						= m_context.getDeviceInterface();
1684	const VkDevice					device					= m_context.getDevice();
1685	const deUint32					queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
1686	const VkQueue					queue					= m_context.getUniversalQueue();
1687	Allocator&						allocator				= m_context.getDefaultAllocator();
1688
1689	const VkSampleCountFlagBits		sampleCount				= VK_SAMPLE_COUNT_4_BIT;
1690	const tcu::Vec4					clearColor				= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
1691	const VkFormat					colorFormat				= m_parameters.colorFormat;
1692	const VkDeviceSize				colorBufferSize			= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
1693	const VkImageSubresourceRange	colorSubresRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1694
1695	const Unique<VkImage>			colorImage				(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage, sampleCount)));
1696	const UniquePtr<Allocation>		colorImageAlloc			(bindImage				(vk, device, allocator, *colorImage, MemoryRequirement::Any));
1697	const Unique<VkImageView>		colorAttachment			(makeImageView			(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1698
1699	const Unique<VkImage>			colorResolveImage		(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
1700	const UniquePtr<Allocation>		colorResolveImageAlloc	(bindImage				(vk, device, allocator, *colorResolveImage, MemoryRequirement::Any));
1701	const Unique<VkImageView>		colorResolveAttachment	(makeImageView			(vk, device, *colorResolveImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1702	const Unique<VkBuffer>			colorResolveBuffer		(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1703	const UniquePtr<Allocation>		colorResolveBufferAlloc	(bindBuffer				(vk, device, allocator, *colorResolveBuffer, MemoryRequirement::HostVisible));
1704
1705	const Unique<VkShaderModule>	vertModule				(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
1706	const Unique<VkShaderModule>	fragModule				(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
1707	const Unique<VkRenderPass>		renderPass				(makeRenderPass			(vk, device, colorFormat, m_parameters.dsFormat, sampleCount));
1708	const Unique<VkFramebuffer>		framebuffer				(makeFramebuffer		(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &m_parameters.dsFormat, 0u, ASPECT_COLOR));
1709	const Unique<VkPipelineLayout>	pipelineLayout			(makePipelineLayout		(vk, device));
1710	const Unique<VkPipeline>		pipeline				(makeGraphicsPipeline	(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D, ASPECT_NONE, sampleCount));
1711	const Unique<VkCommandPool>		cmdPool					(createCommandPool		(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
1712	const Unique<VkCommandBuffer>	cmdBuffer				(allocateCommandBuffer	(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1713
1714	const std::vector<float>		vertexArray				(getVertices());
1715	const deUint32					vertexCount				(static_cast<deUint32>(vertexArray.size() / 4u));
1716	const VkDeviceSize				vertexArraySize			(vertexArray.size() * sizeof(vertexArray[0]));
1717	const Unique<VkBuffer>			vertexBuffer			(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
1718	const UniquePtr<Allocation>		vertexBufferAlloc		(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
1719	const VkDeviceSize				vertexBufferOffset		(0u);
1720
1721	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
1722
1723	beginCommandBuffer(vk, *cmdBuffer);
1724	{
1725		const VkImageView							attachments[]					= { *colorAttachment, *colorResolveAttachment };
1726		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo	=
1727		{
1728			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
1729			DE_NULL,													//  const void*			pNext;
1730			DE_LENGTH_OF_ARRAY(attachments),							//  deUint32			attachmentCount;
1731			attachments													//  const VkImageView*	pAttachments;
1732		};
1733
1734		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, &renderPassAttachmentBeginInfo);
1735		{
1736			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1737
1738			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
1739
1740			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
1741		}
1742		endRenderPass(vk, *cmdBuffer);
1743
1744		// Color image copy
1745		{
1746			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1747																					 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1748																					 *colorResolveImage, colorSubresRange);
1749			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
1750																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
1751			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *colorResolveBuffer, 0ull, VK_WHOLE_SIZE);
1752
1753			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
1754			vk.cmdCopyImageToBuffer(*cmdBuffer, *colorResolveImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *colorResolveBuffer, 1u, &region);
1755			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
1756		}
1757	}
1758	endCommandBuffer(vk, *cmdBuffer);
1759	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1760
1761	{
1762		std::string result;
1763
1764		if (!verifyBuffer(colorResolveBufferAlloc, colorFormat, "ResolveColor", ASPECT_COLOR))
1765			result += " ResolveColor";
1766
1767		// Parse color aspect of separate samples of multisample image
1768		for (deUint32 sampleNdx = 0; sampleNdx < sampleCount; ++sampleNdx)
1769		{
1770			const std::string				name				("Color" + de::toString(sampleNdx));
1771			const Unique<VkImage>			imageSample			(makeImage	(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
1772			const UniquePtr<Allocation>		imageSampleAlloc	(bindImage	(vk, device, allocator, *imageSample, MemoryRequirement::Any));
1773			const Unique<VkBuffer>			imageBuffer			(makeBuffer	(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1774			const UniquePtr<Allocation>		imageBufferAlloc	(bindBuffer	(vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
1775
1776			readOneSampleFromMultisampleImage(colorFormat, colorImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_COLOR);
1777
1778			if (!verifyBuffer(imageBufferAlloc, colorFormat, name, ASPECT_COLOR, sampleNdx))
1779				result += " " + name;
1780		}
1781
1782
1783		if (result.empty())
1784			return tcu::TestStatus::pass("Pass");
1785		else
1786			return tcu::TestStatus::fail("Fail");
1787	}
1788}
1789
1790class DepthResolveImagelessTestInstance : public DepthImagelessTestInstance
1791{
1792public:
1793										DepthResolveImagelessTestInstance	(Context& context, const TestParameters& parameters);
1794
1795protected:
1796	virtual tcu::TestStatus				iterate								(void);
1797
1798	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage				(const tcu::TextureFormat&	textureFormat,
1799																			 const AspectFlags			aspectFlags,
1800																			 const deUint32				sample,
1801																			 const deUint32				subpass);
1802
1803	virtual std::vector<float>			getVertices							(void);
1804};
1805
1806DepthResolveImagelessTestInstance::DepthResolveImagelessTestInstance (Context& context, const TestParameters& parameters)
1807	: DepthImagelessTestInstance	(context, parameters)
1808{
1809	context.requireDeviceFunctionality("VK_KHR_depth_stencil_resolve");
1810
1811	const InstanceInterface&							vki					= m_context.getInstanceInterface();
1812	const VkPhysicalDevice								physDevice			= m_context.getPhysicalDevice();
1813	VkPhysicalDeviceProperties2							deviceProperties;
1814	VkPhysicalDeviceDepthStencilResolveProperties		dsResolveProperties;
1815
1816	deMemset(&deviceProperties, 0, sizeof(deviceProperties));
1817	deMemset(&dsResolveProperties, 0, sizeof(dsResolveProperties));
1818
1819	deviceProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
1820	deviceProperties.pNext = &dsResolveProperties;
1821
1822	dsResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
1823	dsResolveProperties.pNext = DE_NULL;
1824
1825	vki.getPhysicalDeviceProperties2(physDevice, &deviceProperties);
1826
1827	m_colorImageUsage |= VK_IMAGE_USAGE_SAMPLED_BIT;
1828
1829	checkImageFormatProperties(vki, physDevice, m_parameters.colorFormat, m_colorImageUsage, m_imageExtent2D);
1830
1831	m_dsImageUsage |= VK_IMAGE_USAGE_SAMPLED_BIT;
1832
1833	checkImageFormatProperties(vki, physDevice, m_parameters.dsFormat, m_dsImageUsage, m_imageExtent2D);
1834}
1835
1836MovePtr<tcu::TextureLevel> DepthResolveImagelessTestInstance::generateReferenceImage (const tcu::TextureFormat&	textureFormat,
1837																					  const AspectFlags			aspectFlags,
1838																					  const deUint32			sample,
1839																					  const deUint32			subpass)
1840{
1841	const bool					color	= ((aspectFlags & ASPECT_COLOR) != 0);
1842	const bool					depth	= ((aspectFlags & ASPECT_DEPTH) != 0);
1843	const bool					stencil	= ((aspectFlags & ASPECT_STENCIL) != 0);
1844	const int					width	= m_imageExtent2D.width;
1845	const int					height	= m_imageExtent2D.height;
1846	MovePtr<tcu::TextureLevel>	image	(new tcu::TextureLevel(textureFormat, width, height));
1847	tcu::PixelBufferAccess		access	(image->getAccess());
1848
1849	DE_ASSERT(dePop32(aspectFlags) == 1);
1850	DE_UNREF(subpass);
1851
1852	if (color)
1853	{
1854		const tcu::Vec4		colorDraw	(tcu::RGBA::blue().toVec());
1855		const tcu::Vec4		colorFill	(tcu::RGBA::black().toVec());
1856		const tcu::Vec4		colorEdge0	(colorDraw);
1857		const tcu::Vec4		colorEdge1	(colorFill);
1858		const tcu::Vec4		colorEdge2	(colorDraw);
1859		const tcu::Vec4		colorEdge3	(colorFill);
1860		const tcu::Vec4		colorEdgeR	((colorDraw.x() + colorFill.x()) / 2, (colorDraw.y() + colorFill.y()) / 2, (colorDraw.z() + colorFill.z()) / 2, colorDraw.w()); // AVERAGE
1861		const tcu::Vec4&	colorEdge	= sample == 0 ? colorEdge0
1862										: sample == 1 ? colorEdge1
1863										: sample == 2 ? colorEdge2
1864										: sample == 3 ? colorEdge3
1865										: colorEdgeR;
1866
1867		for (int y = 0; y < height; ++y)
1868		for (int x = 0; x < width; ++x)
1869		{
1870			const int			mx			= width - 1 - x;
1871			const tcu::Vec4&	validColor	= (y == mx) ? colorEdge
1872											: (y >  mx) ? colorFill
1873											: colorDraw;
1874
1875			access.setPixel(validColor, x, y);
1876		}
1877	}
1878
1879	if (depth)
1880	{
1881		const int			colorFillValue	(static_cast<int>(1.00f * 0x100));
1882		const int			colorDrawValue	(static_cast<int>(0.00f * 0x100));
1883		const tcu::IVec4	colorFill		(colorFillValue, colorFillValue, colorFillValue, 0xFF);
1884		const tcu::IVec4	colorDraw		(colorDrawValue, colorDrawValue, colorDrawValue, 0xFF);
1885		const tcu::IVec4	colorEdge0		(colorDraw);
1886		const tcu::IVec4	colorEdge1		(colorFill);
1887		const tcu::IVec4	colorEdge2		(colorDraw);
1888		const tcu::IVec4	colorEdge3		(colorFill);
1889		const tcu::IVec4	colorEdgeR		(colorEdge0); // SAMPLE_ZERO
1890		const tcu::IVec4&	colorEdge		= sample == 0 ? colorEdge0
1891											: sample == 1 ? colorEdge1
1892											: sample == 2 ? colorEdge2
1893											: sample == 3 ? colorEdge3
1894											: colorEdgeR;
1895
1896		for (int y = 0; y < height; ++y)
1897		for (int x = 0; x < width; ++x)
1898		{
1899			const int			mx			= width - 1 - x;
1900			const tcu::IVec4&	validColor	= (y == mx) ? colorEdge
1901											: (y >  mx) ? colorFill
1902											: colorDraw;
1903
1904			access.setPixel(validColor, x, y);
1905		}
1906	}
1907
1908	if (stencil)
1909	{
1910		const int			colorFillValue	((0 * 0x100) / 4);
1911		const int			colorDrawValue	((1 * 0x100) / 4);
1912		const tcu::IVec4	colorFill		(colorFillValue, colorFillValue, colorFillValue, 0xFF);
1913		const tcu::IVec4	colorDraw		(colorDrawValue, colorDrawValue, colorDrawValue, 0xFF);
1914		const tcu::IVec4	colorEdge0		(colorDraw);
1915		const tcu::IVec4	colorEdge1		(colorFill);
1916		const tcu::IVec4	colorEdge2		(colorDraw);
1917		const tcu::IVec4	colorEdge3		(colorFill);
1918		const tcu::IVec4	colorEdgeR		(colorEdge0); // SAMPLE_ZERO
1919		const tcu::IVec4&	colorEdge		= sample == 0 ? colorEdge0
1920											: sample == 1 ? colorEdge1
1921											: sample == 2 ? colorEdge2
1922											: sample == 3 ? colorEdge3
1923											: colorEdgeR;
1924
1925		for (int y = 0; y < height; ++y)
1926		for (int x = 0; x < width; ++x)
1927		{
1928			const int			mx			= width - 1 - x;
1929			const tcu::IVec4&	validColor	= (y == mx) ? colorEdge
1930											: (y >  mx) ? colorFill
1931											: colorDraw;
1932
1933			access.setPixel(validColor, x, y);
1934		}
1935	}
1936
1937	return image;
1938}
1939
1940std::vector<float> DepthResolveImagelessTestInstance::getVertices (void)
1941{
1942	const float					verticesData[]	=
1943	{
1944		-1.0f, -1.0f, 0.0f, 1.0f,
1945		-1.0f, +1.0f, 0.0f, 1.0f,
1946		+1.0f, -1.0f, 0.0f, 1.0f,
1947		-1.0f, -1.0f, 0.5f, 1.0f,
1948		-1.0f, +1.0f, 0.5f, 1.0f,
1949		+1.0f, -1.0f, 0.5f, 1.0f,
1950	};
1951	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
1952
1953	return vertices;
1954}
1955
1956tcu::TestStatus DepthResolveImagelessTestInstance::iterate (void)
1957{
1958	const DeviceInterface&			vk							= m_context.getDeviceInterface();
1959	const VkDevice					device						= m_context.getDevice();
1960	const deUint32					queueFamilyIndex			= m_context.getUniversalQueueFamilyIndex();
1961	const VkQueue					queue						= m_context.getUniversalQueue();
1962	Allocator&						allocator					= m_context.getDefaultAllocator();
1963
1964	const deUint32					sampleCount					= 4u;
1965	const VkSampleCountFlagBits		sampleCountFlag				= sampleCountBitFromSampleCount(sampleCount);
1966	const tcu::Vec4					clearColor					= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
1967	const VkFormat					colorFormat					= m_parameters.colorFormat;
1968	const VkDeviceSize				colorBufferSize				= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
1969	const VkImageSubresourceRange	colorSubresRange			= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1970
1971	const Unique<VkImage>			colorImage					(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage, sampleCountFlag)));
1972	const UniquePtr<Allocation>		colorImageAlloc				(bindImage				(vk, device, allocator, *colorImage, MemoryRequirement::Any));
1973	const Unique<VkImageView>		colorAttachment				(makeImageView			(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1974
1975	const Unique<VkImage>			colorResolveImage			(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
1976	const UniquePtr<Allocation>		colorResolveImageAlloc		(bindImage				(vk, device, allocator, *colorResolveImage, MemoryRequirement::Any));
1977	const Unique<VkImageView>		colorResolveAttachment		(makeImageView			(vk, device, *colorResolveImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
1978	const Unique<VkBuffer>			colorResolveBuffer			(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1979	const UniquePtr<Allocation>		colorResolveBufferAlloc		(bindBuffer				(vk, device, allocator, *colorResolveBuffer, MemoryRequirement::HostVisible));
1980
1981	const float						clearDepth					= 1.0f;
1982	const deUint32					clearStencil				= 0u;
1983	const VkFormat					dsFormat					= m_parameters.dsFormat;
1984	const deUint32					dsImagePixelSize			= static_cast<deUint32>(tcu::getPixelSize(mapVkFormat(dsFormat)));
1985	const VkImageAspectFlags		dsAspectFlags				= VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1986	const VkImageSubresourceRange	dsSubresRange				= makeImageSubresourceRange(dsAspectFlags, 0u, 1u, 0u, 1u);
1987
1988	const VkDeviceSize				depthBufferSize				= m_imageExtent2D.width * m_imageExtent2D.height * dsImagePixelSize;
1989	const VkFormat					stencilBufferFormat			= getStencilBufferFormat(dsFormat);
1990	const deUint32					stencilPixelSize			= static_cast<deUint32>(tcu::getPixelSize(mapVkFormat(stencilBufferFormat)));
1991	const VkDeviceSize				stencilBufferSize			= m_imageExtent2D.width * m_imageExtent2D.height * stencilPixelSize;
1992
1993	const Unique<VkImage>			dsImage						(makeImage				(vk, device, makeImageCreateInfo(dsFormat, m_imageExtent2D, m_dsImageUsage, sampleCountFlag)));
1994	const UniquePtr<Allocation>		dsImageAlloc				(bindImage				(vk, device, allocator, *dsImage, MemoryRequirement::Any));
1995	const Unique<VkImageView>		dsAttachment				(makeImageView			(vk, device, *dsImage, VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresRange));
1996
1997	const Unique<VkImage>			dsResolveImage				(makeImage				(vk, device, makeImageCreateInfo(dsFormat, m_imageExtent2D, m_dsImageUsage)));
1998	const UniquePtr<Allocation>		dsResolveImageAlloc			(bindImage				(vk, device, allocator, *dsResolveImage, MemoryRequirement::Any));
1999	const Unique<VkImageView>		dsResolveAttachment			(makeImageView			(vk, device, *dsResolveImage, VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresRange));
2000	const Unique<VkBuffer>			depthResolveBuffer			(makeBuffer				(vk, device, depthBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2001	const UniquePtr<Allocation>		depthResolveBufferAlloc		(bindBuffer				(vk, device, allocator, *depthResolveBuffer, MemoryRequirement::HostVisible));
2002	const Unique<VkBuffer>			stencilResolveBuffer		(makeBuffer				(vk, device, stencilBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2003	const UniquePtr<Allocation>		stencilResolveBufferAlloc	(bindBuffer				(vk, device, allocator, *stencilResolveBuffer, MemoryRequirement::HostVisible));
2004
2005	const Unique<VkShaderModule>	vertModule					(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
2006	const Unique<VkShaderModule>	fragModule					(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
2007	const Unique<VkRenderPass>		renderPass					(makeRenderPass			(vk, device, colorFormat, m_parameters.dsFormat, sampleCountFlag, sampleCountFlag));
2008	const Unique<VkFramebuffer>		framebuffer					(makeFramebuffer		(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &m_parameters.dsFormat, m_dsImageUsage, ASPECT_COLOR|ASPECT_DEPTH_STENCIL));
2009	const Unique<VkPipelineLayout>	pipelineLayout				(makePipelineLayout		(vk, device));
2010	const Unique<VkPipeline>		pipeline					(makeGraphicsPipeline	(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D, ASPECT_DEPTH_STENCIL, sampleCountFlag));
2011	const Unique<VkCommandPool>		cmdPool						(createCommandPool		(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
2012	const Unique<VkCommandBuffer>	cmdBuffer					(allocateCommandBuffer	(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
2013
2014	const std::vector<float>		vertexArray					(getVertices());
2015	const deUint32					vertexCount					(static_cast<deUint32>(vertexArray.size() / 4u));
2016	const VkDeviceSize				vertexArraySize				(vertexArray.size() * sizeof(vertexArray[0]));
2017	const Unique<VkBuffer>			vertexBuffer				(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
2018	const UniquePtr<Allocation>		vertexBufferAlloc			(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
2019	const VkDeviceSize				vertexBufferOffset			(0u);
2020
2021	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
2022
2023	beginCommandBuffer(vk, *cmdBuffer);
2024	{
2025		const VkImageView							attachments[]					= { *colorAttachment, *dsAttachment, *colorResolveAttachment, *dsResolveAttachment };
2026		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo	=
2027		{
2028			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
2029			DE_NULL,													//  const void*			pNext;
2030			DE_LENGTH_OF_ARRAY(attachments),							//  deUint32			attachmentCount;
2031			attachments													//  const VkImageView*	pAttachments;
2032		};
2033
2034		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, clearDepth, clearStencil, &renderPassAttachmentBeginInfo);
2035		{
2036			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
2037
2038			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
2039
2040			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
2041		}
2042		endRenderPass(vk, *cmdBuffer);
2043
2044		// Color resolve image copy
2045		{
2046			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
2047																					 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2048																					 *colorResolveImage, colorSubresRange);
2049			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2050																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
2051			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *colorResolveBuffer, 0ull, VK_WHOLE_SIZE);
2052
2053			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2054			vk.cmdCopyImageToBuffer(*cmdBuffer, *colorResolveImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *colorResolveBuffer, 1u, &region);
2055			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
2056		}
2057
2058		// Depth/Stencil resolve image copy
2059		{
2060			const VkImageMemoryBarrier	preCopyBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_READ_BIT,
2061																					 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2062																					 *dsResolveImage, dsSubresRange);
2063			const VkBufferImageCopy		depthCopyRegion		= makeBufferImageCopy(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2064																				  makeImageSubresourceLayers(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, 1u));
2065			const VkBufferImageCopy		stencilCopyRegion	= makeBufferImageCopy(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2066																				  makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u));
2067			const VkBufferMemoryBarrier	postCopyBarriers[]	=
2068			{
2069				makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *depthResolveBuffer, 0ull, VK_WHOLE_SIZE),
2070				makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *stencilResolveBuffer, 0ull, VK_WHOLE_SIZE),
2071			};
2072
2073			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2074			vk.cmdCopyImageToBuffer(*cmdBuffer, *dsResolveImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *depthResolveBuffer, 1u, &depthCopyRegion);
2075			vk.cmdCopyImageToBuffer(*cmdBuffer, *dsResolveImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *stencilResolveBuffer, 1u, &stencilCopyRegion);
2076			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(postCopyBarriers), postCopyBarriers, DE_NULL, 0u);
2077		}
2078	}
2079	endCommandBuffer(vk, *cmdBuffer);
2080	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
2081
2082	{
2083		std::string result;
2084
2085		if (!verifyBuffer(colorResolveBufferAlloc, colorFormat, "ResolveColor", ASPECT_COLOR))
2086			result += " ResolveColor";
2087
2088		if (!verifyBuffer(depthResolveBufferAlloc, dsFormat, "ResolveDepth", ASPECT_DEPTH))
2089			result += " ResolveDepth";
2090
2091		if (!verifyBuffer(stencilResolveBufferAlloc, stencilBufferFormat, "ResolveStencil", ASPECT_STENCIL))
2092			result += " ResolveStencil";
2093
2094		// Parse color aspect of separate samples of multisample image
2095		for (deUint32 sampleNdx = 0; sampleNdx < sampleCount; ++sampleNdx)
2096		{
2097			const std::string				name				("Color" + de::toString(sampleNdx));
2098			const Unique<VkImage>			imageSample			(makeImage	(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
2099			const UniquePtr<Allocation>		imageSampleAlloc	(bindImage	(vk, device, allocator, *imageSample, MemoryRequirement::Any));
2100			const Unique<VkBuffer>			imageBuffer			(makeBuffer	(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2101			const UniquePtr<Allocation>		imageBufferAlloc	(bindBuffer	(vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
2102
2103			readOneSampleFromMultisampleImage(colorFormat, colorImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_COLOR);
2104
2105			if (!verifyBuffer(imageBufferAlloc, colorFormat, name, ASPECT_COLOR, sampleNdx))
2106				result += " " + name;
2107		}
2108
2109		// Parse depth aspect of separate samples of multisample image
2110		for (deUint32 sampleNdx = 0; sampleNdx < sampleCount; ++sampleNdx)
2111		{
2112			const std::string				name				("Depth" + de::toString(sampleNdx));
2113			const Unique<VkImage>			imageSample			(makeImage	(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
2114			const UniquePtr<Allocation>		imageSampleAlloc	(bindImage	(vk, device, allocator, *imageSample, MemoryRequirement::Any));
2115			const Unique<VkBuffer>			imageBuffer			(makeBuffer	(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2116			const UniquePtr<Allocation>		imageBufferAlloc	(bindBuffer	(vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
2117
2118			readOneSampleFromMultisampleImage(dsFormat, dsImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_DEPTH);
2119
2120			if (!verifyBuffer(imageBufferAlloc, colorFormat, name, ASPECT_DEPTH, sampleNdx))
2121				result += " " + name;
2122		}
2123
2124		// Parse stencil aspect of separate samples of multisample image
2125		for (deUint32 sampleNdx = 0; sampleNdx < sampleCount; ++sampleNdx)
2126		{
2127			const std::string				name				("Stencil" + de::toString(sampleNdx));
2128			const Unique<VkImage>			imageSample			(makeImage	(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage)));
2129			const UniquePtr<Allocation>		imageSampleAlloc	(bindImage	(vk, device, allocator, *imageSample, MemoryRequirement::Any));
2130			const Unique<VkBuffer>			imageBuffer			(makeBuffer	(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2131			const UniquePtr<Allocation>		imageBufferAlloc	(bindBuffer	(vk, device, allocator, *imageBuffer, MemoryRequirement::HostVisible));
2132
2133			readOneSampleFromMultisampleImage(dsFormat, dsImage, sampleNdx, colorFormat, imageSample, imageBuffer, ASPECT_STENCIL);
2134
2135			if (!verifyBuffer(imageBufferAlloc, colorFormat, name, ASPECT_STENCIL, sampleNdx))
2136				result += " " + name;
2137		}
2138
2139		if (result.empty())
2140			return tcu::TestStatus::pass("Pass");
2141		else
2142			return tcu::TestStatus::fail("Following parts of image are incorrect:" + result);
2143	}
2144}
2145
2146class MultisubpassTestInstance : public ColorImagelessTestInstance
2147{
2148public:
2149										MultisubpassTestInstance	(Context& context, const TestParameters& parameters);
2150
2151protected:
2152	virtual tcu::TestStatus				iterate						(void);
2153
2154	virtual std::vector<float>			getVertices					(void);
2155
2156	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage		(const tcu::TextureFormat&	textureFormat,
2157																	 const AspectFlags			aspectFlags,
2158																	 const deUint32				sample,
2159																	 const deUint32				subpass);
2160};
2161
2162MultisubpassTestInstance::MultisubpassTestInstance (Context& context, const TestParameters& parameters)
2163	: ColorImagelessTestInstance	(context, parameters)
2164{
2165}
2166
2167std::vector<float> MultisubpassTestInstance::getVertices (void)
2168{
2169	const float					verticesData[]	=
2170	{
2171		-1.0f,  0.0f, 0.0f, 1.0f,
2172		-1.0f, +1.0f, 0.0f, 1.0f,
2173		+1.0f,  0.0f, 0.0f, 1.0f,
2174		-1.0f, +1.0f, 0.0f, 1.0f,
2175		+1.0f,  0.0f, 0.0f, 1.0f,
2176		+1.0f, +1.0f, 0.0f, 1.0f,
2177	};
2178	const std::vector<float>	vertices		(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
2179
2180	return vertices;
2181}
2182
2183MovePtr<tcu::TextureLevel> MultisubpassTestInstance::generateReferenceImage (const tcu::TextureFormat&	textureFormat,
2184																			 const AspectFlags			aspectFlags,
2185																			 const deUint32				sample,
2186																			 const deUint32				subpass)
2187{
2188	const int					width			= m_imageExtent2D.width;
2189	const int					height			= m_imageExtent2D.height;
2190	const tcu::Vec4				colorDraw0		(0.0f, 0.0f, 1.0f, 1.0f);
2191	const tcu::Vec4				colorFill0		(tcu::RGBA::black().toVec());
2192	const tcu::Vec4				colorDraw1		(colorDraw0.x(), 1.0f, colorDraw0.z(), 1.0f);
2193	const tcu::Vec4				colorFill1		(colorFill0.x(), 1.0f, colorFill0.z(), 1.0f);
2194	const tcu::Vec4&			colorDraw		((subpass == 0) ? colorDraw0 : colorDraw1);
2195	const tcu::Vec4&			colorFill		((subpass == 0) ? colorFill0 : colorFill1);
2196	MovePtr<tcu::TextureLevel>	image			(new tcu::TextureLevel(textureFormat, width, height));
2197	tcu::PixelBufferAccess		access			(image->getAccess());
2198
2199	DE_UNREF(aspectFlags);
2200	DE_ASSERT(aspectFlags == ASPECT_COLOR);
2201	DE_UNREF(sample);
2202	DE_ASSERT(sample == NO_SAMPLE);
2203	DE_ASSERT(subpass != NO_SUBPASS);
2204
2205	for (int y = 0; y < height; ++y)
2206	{
2207		const tcu::Vec4&	validColor	= (y < height / 2) ? colorFill : colorDraw;
2208
2209		for (int x = 0; x < width; ++x)
2210			access.setPixel(validColor, x, y);
2211	}
2212
2213	return image;
2214}
2215
2216tcu::TestStatus MultisubpassTestInstance::iterate (void)
2217{
2218	const DeviceInterface&				vk					= m_context.getDeviceInterface();
2219	const VkDevice						device				= m_context.getDevice();
2220	const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
2221	const VkQueue						queue				= m_context.getUniversalQueue();
2222	Allocator&							allocator			= m_context.getDefaultAllocator();
2223
2224	const tcu::Vec4						clearColor			= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
2225	const VkFormat						colorFormat			= m_parameters.colorFormat;
2226	const VkDeviceSize					colorBufferSize		= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
2227	const VkImageSubresourceRange		colorSubresRange	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
2228
2229	const Unique<VkImage>				color0Image			(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
2230	const UniquePtr<Allocation>			color0ImageAlloc	(bindImage				(vk, device, allocator, *color0Image, MemoryRequirement::Any));
2231	const Unique<VkImageView>			color0Attachment	(makeImageView			(vk, device, *color0Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
2232	const Unique<VkBuffer>				color0Buffer		(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2233	const UniquePtr<Allocation>			color0BufferAlloc	(bindBuffer				(vk, device, allocator, *color0Buffer, MemoryRequirement::HostVisible));
2234
2235	const Unique<VkImage>				color1Image			(makeImage				(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
2236	const UniquePtr<Allocation>			color1ImageAlloc	(bindImage				(vk, device, allocator, *color1Image, MemoryRequirement::Any));
2237	const Unique<VkImageView>			color1Attachment	(makeImageView			(vk, device, *color1Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
2238	const Unique<VkBuffer>				color1Buffer		(makeBuffer				(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2239	const UniquePtr<Allocation>			color1BufferAlloc	(bindBuffer				(vk, device, allocator, *color1Buffer, MemoryRequirement::HostVisible));
2240
2241	const VkDescriptorType				descriptorType		(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT);
2242	const Unique<VkDescriptorSetLayout>	descriptorSetLayout	(DescriptorSetLayoutBuilder()
2243		.addSingleBinding(descriptorType, VK_SHADER_STAGE_FRAGMENT_BIT)
2244		.build(vk, device));
2245	const Unique<VkDescriptorPool>		descriptorPool		(DescriptorPoolBuilder()
2246		.addType(descriptorType)
2247		.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
2248	const Unique<VkDescriptorSet>		descriptorSet		(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
2249	const VkDescriptorImageInfo			imageDescriptorInfo	(makeDescriptorImageInfo(DE_NULL, *color0Attachment, VK_IMAGE_LAYOUT_GENERAL));
2250
2251	DescriptorSetUpdateBuilder()
2252		.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &imageDescriptorInfo)
2253		.update(vk, device);
2254
2255	const Unique<VkRenderPass>			renderPass			(makeRenderPass			(vk, device, colorFormat, DE_NULL));
2256	const Unique<VkFramebuffer>			framebuffer			(makeFramebuffer		(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &m_parameters.dsFormat, 0u, ASPECT_NONE, 1u));
2257	const Unique<VkCommandPool>			cmdPool				(createCommandPool		(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
2258	const Unique<VkCommandBuffer>		cmdBuffer			(allocateCommandBuffer	(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
2259
2260	const Unique<VkShaderModule>		vertModule0			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
2261	const Unique<VkShaderModule>		fragModule0			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
2262	const Unique<VkPipelineLayout>		pipelineLayout0		(makePipelineLayout		(vk, device));
2263	const Unique<VkPipeline>			pipeline0			(makeGraphicsPipeline	(vk, device, *pipelineLayout0, *renderPass, *vertModule0, *fragModule0, m_imageExtent2D));
2264
2265	const Unique<VkShaderModule>		vertModule1			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("vert1"), 0u));
2266	const Unique<VkShaderModule>		fragModule1			(createShaderModule		(vk, device, m_context.getBinaryCollection().get("frag1"), 0u));
2267	const Unique<VkPipelineLayout>		pipelineLayout1		(makePipelineLayout		(vk, device, 1u, &*descriptorSetLayout));
2268	const Unique<VkPipeline>			pipeline1			(makeGraphicsPipeline	(vk, device, *pipelineLayout1, *renderPass, *vertModule1, *fragModule1, m_imageExtent2D, 0u, VK_SAMPLE_COUNT_1_BIT, 1u));
2269
2270	const std::vector<float>			vertex0Array		(getVertices());
2271	const deUint32						vertex0Count		(static_cast<deUint32>(vertex0Array.size() / 4u));
2272	const VkDeviceSize					vertex0ArraySize	(vertex0Array.size() * sizeof(vertex0Array[0]));
2273	const Unique<VkBuffer>				vertex0Buffer		(makeBuffer				(vk, device, vertex0ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
2274	const UniquePtr<Allocation>			vertex0BufferAlloc	(bindBuffer				(vk, device, allocator, *vertex0Buffer, MemoryRequirement::HostVisible));
2275	const VkDeviceSize					vertex0BufferOffset	(0u);
2276
2277	const std::vector<float>			vertex1Array		(getFullQuadVertices());
2278	const deUint32						vertex1Count		(static_cast<deUint32>(vertex1Array.size() / 4u));
2279	const VkDeviceSize					vertex1ArraySize	(vertex1Array.size() * sizeof(vertex1Array[0]));
2280	const Unique<VkBuffer>				vertex1Buffer		(makeBuffer				(vk, device, vertex1ArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
2281	const UniquePtr<Allocation>			vertex1BufferAlloc	(bindBuffer				(vk, device, allocator, *vertex1Buffer, MemoryRequirement::HostVisible));
2282	const VkDeviceSize					vertex1BufferOffset	(0u);
2283
2284	fillBuffer(vk, device, *vertex0BufferAlloc, &vertex0Array[0], vertex0ArraySize);
2285	fillBuffer(vk, device, *vertex1BufferAlloc, &vertex1Array[0], vertex1ArraySize);
2286
2287	beginCommandBuffer(vk, *cmdBuffer);
2288	{
2289		const VkImageView							attachments[]					= { *color0Attachment, *color1Attachment };
2290		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo	=
2291		{
2292			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
2293			DE_NULL,													//  const void*			pNext;
2294			DE_LENGTH_OF_ARRAY(attachments),							//  deUint32			attachmentCount;
2295			&attachments[0]												//  const VkImageView*	pAttachments;
2296		};
2297
2298		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, &renderPassAttachmentBeginInfo);
2299		{
2300			{
2301				vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline0);
2302
2303				vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertex0Buffer, &vertex0BufferOffset);
2304
2305				vk.cmdDraw(*cmdBuffer, vertex0Count, 1u, 0u, 0u);
2306			}
2307
2308			vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
2309
2310			{
2311				vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline1);
2312
2313				vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertex1Buffer, &vertex1BufferOffset);
2314
2315				vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout1, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
2316
2317				vk.cmdDraw(*cmdBuffer, vertex1Count, 1u, 0u, 0u);
2318			}
2319		}
2320		endRenderPass(vk, *cmdBuffer);
2321
2322		// Subpass0 color image copy
2323		{
2324			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
2325																					 VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2326																					 *color0Image, colorSubresRange);
2327			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2328																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
2329			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *color0Buffer, 0ull, VK_WHOLE_SIZE);
2330
2331			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2332			vk.cmdCopyImageToBuffer(*cmdBuffer, *color0Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *color0Buffer, 1u, &region);
2333			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
2334		}
2335
2336		// Subpass1 color image copy
2337		{
2338			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
2339																					 VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2340																					 *color1Image, colorSubresRange);
2341			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2342																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
2343			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *color1Buffer, 0ull, VK_WHOLE_SIZE);
2344
2345			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2346			vk.cmdCopyImageToBuffer(*cmdBuffer, *color1Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *color1Buffer, 1u, &region);
2347			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
2348		}
2349	}
2350	endCommandBuffer(vk, *cmdBuffer);
2351	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
2352
2353	{
2354		std::string result;
2355
2356		if (!verifyBuffer(color0BufferAlloc, colorFormat, "ColorSubpass0", ASPECT_COLOR, NO_SAMPLE, 0u))
2357			result += " ColorSubpass0";
2358
2359		if (!verifyBuffer(color1BufferAlloc, colorFormat, "ColorSubpass1", ASPECT_COLOR, NO_SAMPLE, 1u))
2360			result += " ColorSubpass1";
2361
2362		if (result.empty())
2363			return tcu::TestStatus::pass("Pass");
2364		else
2365			return tcu::TestStatus::fail("Following parts of image are incorrect:" + result);
2366	}
2367}
2368
2369
2370class DifferentAttachmentsTestInstance : public ColorImagelessTestInstance
2371{
2372public:
2373	DifferentAttachmentsTestInstance(Context& context, const TestParameters& parameters);
2374
2375protected:
2376	virtual tcu::TestStatus				iterate(void);
2377
2378	virtual std::vector<float>			getVertices(void);
2379
2380	virtual MovePtr<tcu::TextureLevel>	generateReferenceImage(const tcu::TextureFormat& textureFormat,
2381															   const AspectFlags		 aspectFlags,
2382															   const deUint32			 sample,
2383															   const deUint32			 subpass);
2384};
2385
2386DifferentAttachmentsTestInstance::DifferentAttachmentsTestInstance(Context& context, const TestParameters& parameters)
2387	: ColorImagelessTestInstance(context, parameters)
2388{
2389}
2390
2391std::vector<float> DifferentAttachmentsTestInstance::getVertices(void)
2392{
2393	const float					verticesData[] =
2394	{
2395		-1.0f,  0.0f, 0.0f, 1.0f,
2396		-1.0f, +1.0f, 0.0f, 1.0f,
2397		+1.0f,  0.0f, 0.0f, 1.0f,
2398		-1.0f, +1.0f, 0.0f, 1.0f,
2399		+1.0f,  0.0f, 0.0f, 1.0f,
2400		+1.0f, +1.0f, 0.0f, 1.0f,
2401	};
2402	const std::vector<float>	vertices(verticesData, verticesData + DE_LENGTH_OF_ARRAY(verticesData));
2403
2404	return vertices;
2405}
2406
2407MovePtr<tcu::TextureLevel> DifferentAttachmentsTestInstance::generateReferenceImage(const tcu::TextureFormat& textureFormat,
2408																					const AspectFlags			aspectFlags,
2409																					const deUint32				sample,
2410																					const deUint32)
2411{
2412	const int					width			= m_imageExtent2D.width;
2413	const int					height			= m_imageExtent2D.height;
2414	const tcu::Vec4				colorDraw		(0.0f, 0.0f, 1.0f, 1.0f);
2415	const tcu::Vec4				colorFill		(tcu::RGBA::black().toVec());
2416	MovePtr<tcu::TextureLevel>	image			(new tcu::TextureLevel(textureFormat, width, height));
2417	tcu::PixelBufferAccess		access			(image->getAccess());
2418
2419	DE_UNREF(aspectFlags);
2420	DE_ASSERT(aspectFlags == ASPECT_COLOR);
2421	DE_UNREF(sample);
2422	DE_ASSERT(sample == NO_SAMPLE);
2423
2424	for (int y = 0; y < height; ++y)
2425	{
2426		const tcu::Vec4&	validColor	= (y < height / 2) ? colorFill : colorDraw;
2427
2428		for (int x = 0; x < width; ++x)
2429			access.setPixel(validColor, x, y);
2430	}
2431
2432	return image;
2433}
2434
2435tcu::TestStatus DifferentAttachmentsTestInstance::iterate(void)
2436{
2437	const DeviceInterface&				vk					= m_context.getDeviceInterface();
2438	const VkDevice						device				= m_context.getDevice();
2439	const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
2440	const VkQueue						queue				= m_context.getUniversalQueue();
2441	Allocator&							allocator			= m_context.getDefaultAllocator();
2442
2443	const tcu::Vec4						clearColor			= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
2444	const VkFormat						colorFormat			= m_parameters.colorFormat;
2445	const VkDeviceSize					colorBufferSize		= m_imageExtent2D.width * m_imageExtent2D.height * tcu::getPixelSize(mapVkFormat(colorFormat));
2446	const VkImageSubresourceRange		colorSubresRange	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
2447
2448	const Unique<VkImage>				color0Image			(makeImage						(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
2449	const UniquePtr<Allocation>			color0ImageAlloc	(bindImage						(vk, device, allocator, *color0Image, MemoryRequirement::Any));
2450	const Unique<VkImageView>			color0Attachment	(makeImageView					(vk, device, *color0Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
2451	const Unique<VkBuffer>				color0Buffer		(makeBuffer						(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2452	const UniquePtr<Allocation>			color0BufferAlloc	(bindBuffer						(vk, device, allocator, *color0Buffer, MemoryRequirement::HostVisible));
2453
2454	const Unique<VkImage>				color1Image			(makeImage						(vk, device, makeImageCreateInfo(colorFormat, m_imageExtent2D, m_colorImageUsage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)));
2455	const UniquePtr<Allocation>			color1ImageAlloc	(bindImage						(vk, device, allocator, *color1Image, MemoryRequirement::Any));
2456	const Unique<VkImageView>			color1Attachment	(makeImageView					(vk, device, *color1Image, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
2457	const Unique<VkBuffer>				color1Buffer		(makeBuffer						(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
2458	const UniquePtr<Allocation>			color1BufferAlloc	(bindBuffer						(vk, device, allocator, *color1Buffer, MemoryRequirement::HostVisible));
2459
2460	const Unique<VkRenderPass>			renderPass			(makeSingleAttachmentRenderPass	(vk, device, colorFormat, DE_NULL));
2461	const Unique<VkFramebuffer>			framebuffer			(makeFramebuffer				(vk, device, *renderPass, m_imageExtent2D, &colorFormat, m_colorImageUsage, &m_parameters.dsFormat));
2462	const Unique<VkCommandPool>			cmdPool				(createCommandPool				(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
2463	const Unique<VkCommandBuffer>		cmdBuffer			(allocateCommandBuffer			(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
2464
2465	const Unique<VkShaderModule>		vertModule			(createShaderModule				(vk, device, m_context.getBinaryCollection().get("vert"), 0u));
2466	const Unique<VkShaderModule>		fragModule			(createShaderModule				(vk, device, m_context.getBinaryCollection().get("frag"), 0u));
2467	const Unique<VkPipelineLayout>		pipelineLayout		(makePipelineLayout				(vk, device));
2468	const Unique<VkPipeline>			pipeline			(makeGraphicsPipeline			(vk, device, *pipelineLayout, *renderPass, *vertModule, *fragModule, m_imageExtent2D));
2469
2470	const std::vector<float>			vertexArray			(getVertices());
2471	const deUint32						vertexCount			(static_cast<deUint32>(vertexArray.size() / 4u));
2472	const VkDeviceSize					vertexArraySize		(vertexArray.size() * sizeof(vertexArray[0]));
2473	const Unique<VkBuffer>				vertexBuffer		(makeBuffer				(vk, device, vertexArraySize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
2474	const UniquePtr<Allocation>			vertexBufferAlloc	(bindBuffer				(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
2475	const VkDeviceSize					vertexBufferOffset	(0u);
2476
2477	fillBuffer(vk, device, *vertexBufferAlloc, &vertexArray[0], vertexArraySize);
2478
2479	beginCommandBuffer(vk, *cmdBuffer);
2480	{
2481		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo0	=
2482		{
2483			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
2484			DE_NULL,													//  const void*			pNext;
2485			1u,															//  deUint32			attachmentCount;
2486			&*color0Attachment											//  const VkImageView*	pAttachments;
2487		};
2488
2489		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, &renderPassAttachmentBeginInfo0);
2490		{
2491			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
2492
2493			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
2494
2495			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
2496		}
2497		endRenderPass(vk, *cmdBuffer);
2498
2499		const VkRenderPassAttachmentBeginInfo		renderPassAttachmentBeginInfo1	=
2500		{
2501			VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,		//  VkStructureType		sType;
2502			DE_NULL,													//  const void*			pNext;
2503			1u,															//  deUint32			attachmentCount;
2504			&*color1Attachment											//  const VkImageView*	pAttachments;
2505		};
2506
2507		beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D), clearColor, &renderPassAttachmentBeginInfo1);
2508		{
2509			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
2510
2511			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &*vertexBuffer, &vertexBufferOffset);
2512
2513			vk.cmdDraw(*cmdBuffer, vertexCount, 1u, 0u, 0u);
2514		}
2515		endRenderPass(vk, *cmdBuffer);
2516
2517		// Subpass0 color image copy
2518		{
2519			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
2520																					 VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2521																					 *color0Image, colorSubresRange);
2522			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2523																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
2524			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *color0Buffer, 0ull, VK_WHOLE_SIZE);
2525
2526			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2527			vk.cmdCopyImageToBuffer(*cmdBuffer, *color0Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *color0Buffer, 1u, &region);
2528			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
2529		}
2530
2531		// Subpass1 color image copy
2532		{
2533			const VkImageMemoryBarrier	preCopyBarrier	= makeImageMemoryBarrier	(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
2534																					 VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2535																					 *color1Image, colorSubresRange);
2536			const VkBufferImageCopy		region			= makeBufferImageCopy		(makeExtent3D(m_imageExtent2D.width, m_imageExtent2D.height, 1u),
2537																					 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
2538			const VkBufferMemoryBarrier	postCopyBarrier	= makeBufferMemoryBarrier	(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, *color1Buffer, 0ull, VK_WHOLE_SIZE);
2539
2540			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &preCopyBarrier);
2541			vk.cmdCopyImageToBuffer(*cmdBuffer, *color1Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *color1Buffer, 1u, &region);
2542			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &postCopyBarrier, DE_NULL, 0u);
2543		}
2544	}
2545	endCommandBuffer(vk, *cmdBuffer);
2546	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
2547
2548	{
2549		std::string result;
2550
2551		if (!verifyBuffer(color0BufferAlloc, colorFormat, "ColorSubpass0", ASPECT_COLOR, NO_SAMPLE, 0u))
2552			result += " ColorSubpass0";
2553
2554		if (!verifyBuffer(color1BufferAlloc, colorFormat, "ColorSubpass1", ASPECT_COLOR, NO_SAMPLE, 1u))
2555			result += " ColorSubpass1";
2556
2557		if (result.empty())
2558			return tcu::TestStatus::pass("Pass");
2559		else
2560			return tcu::TestStatus::fail("Following parts of image are incorrect:" + result);
2561	}
2562}
2563
2564class BaseTestCase : public TestCase
2565{
2566public:
2567							BaseTestCase	(tcu::TestContext& context, const std::string& name, const TestParameters& parameters);
2568	virtual					~BaseTestCase	(void);
2569
2570protected:
2571	virtual void			checkSupport	(Context& context) const;
2572	virtual void			initPrograms	(SourceCollections& programCollection) const;
2573	virtual TestInstance*	createInstance	(Context& context) const;
2574
2575	const TestParameters	m_parameters;
2576};
2577
2578BaseTestCase::BaseTestCase (tcu::TestContext& context, const std::string& name, const TestParameters& parameters)
2579	: TestCase		(context, name)
2580	, m_parameters	(parameters)
2581{
2582}
2583
2584BaseTestCase::~BaseTestCase ()
2585{
2586}
2587
2588void BaseTestCase::checkSupport (Context& context) const
2589{
2590	if (m_parameters.testType == TEST_TYPE_COLOR_RESOLVE || m_parameters.testType == TEST_TYPE_DEPTH_STENCIL_RESOLVE)
2591	{
2592		if (!context.getDeviceProperties().limits.standardSampleLocations)
2593			TCU_THROW(NotSupportedError, "Non-standard sample locations are not supported");
2594	}
2595}
2596
2597void BaseTestCase::initPrograms (SourceCollections& programCollection) const
2598{
2599	// Vertex shader
2600	{
2601		std::ostringstream src;
2602
2603		if (m_parameters.testType == TEST_TYPE_COLOR || m_parameters.testType == TEST_TYPE_COLOR_RESOLVE || m_parameters.testType == TEST_TYPE_DEPTH_STENCIL)
2604		{
2605			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2606				<< "\n"
2607				<< "layout(location = 0) in highp vec4 a_position;\n"
2608				<< "layout(location = 0) out highp vec4 a_color;\n"
2609				<< "\n"
2610				<< "void main (void)\n"
2611				<< "{\n"
2612				<< "    gl_Position = a_position;\n"
2613				<< "    if (gl_VertexIndex < 6)\n"
2614				<< "        a_color = vec4(0.75f, 0.75f, 0.75f, 1.0f);\n"
2615				<< "    else\n"
2616				<< "        a_color = vec4(1.00f, 1.00f, 1.00f, 1.0f);\n"
2617				<< "}\n";
2618		}
2619
2620		if (m_parameters.testType == TEST_TYPE_DEPTH_STENCIL_RESOLVE)
2621		{
2622			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2623				<< "\n"
2624				<< "layout(location = 0) in highp vec4 a_position;\n"
2625				<< "layout(location = 0) out highp vec4 a_color;\n"
2626				<< "\n"
2627				<< "void main (void)\n"
2628				<< "{\n"
2629				<< "    gl_Position = a_position;\n"
2630				<< "    if (gl_VertexIndex < 3)\n"
2631				<< "        a_color = vec4(0.00f, 0.00f, 1.00f, 1.0f);\n"
2632				<< "    else\n"
2633				<< "        a_color = vec4(0.00f, 1.00f, 0.00f, 1.0f);\n"
2634				<< "}\n";
2635		}
2636
2637		if (m_parameters.testType == TEST_TYPE_MULTISUBPASS || m_parameters.testType == TEST_TYPE_DIFFERENT_ATTACHMENTS)
2638		{
2639			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2640				<< "\n"
2641				<< "layout(location = 0) in highp vec4 a_position;\n"
2642				<< "layout(location = 0) out highp vec4 a_color;\n"
2643				<< "\n"
2644				<< "void main (void)\n"
2645				<< "{\n"
2646				<< "    gl_Position = a_position;\n"
2647				<< "    a_color = vec4(0.0f, 0.0f, 1.0f, 1.0f);\n"
2648				<< "}\n";
2649		}
2650
2651		programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
2652	}
2653
2654	// Fragment shader
2655	{
2656		std::ostringstream src;
2657
2658		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2659			<< "\n"
2660			<< "layout(location = 0) in highp vec4 a_color;\n"
2661			<< "layout(location = 0) out highp vec4 o_color;\n"
2662			<< "\n"
2663			<< "void main (void)\n"
2664			<< "{\n"
2665			<< "    o_color = a_color;\n"
2666			<< "}\n";
2667
2668		programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
2669	}
2670
2671	// Additional shaders
2672	if (m_parameters.testType == TEST_TYPE_COLOR_RESOLVE || m_parameters.testType == TEST_TYPE_DEPTH_STENCIL_RESOLVE)
2673	{
2674		// Vertex shader
2675		{
2676			std::ostringstream src;
2677
2678			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2679				<< "\n"
2680				<< "layout(location = 0) in highp vec4 a_position;\n"
2681				<< "\n"
2682				<< "void main (void)\n"
2683				<< "{\n"
2684				<< "    gl_Position = a_position;\n"
2685				<< "}\n";
2686
2687			programCollection.glslSources.add("demultisample-vert") << glu::VertexSource(src.str());
2688		}
2689
2690		// Fragment shader
2691		{
2692			// Color
2693			{
2694				std::ostringstream src;
2695
2696				src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2697					<< "\n"
2698					<< "layout(set = 0, binding = 0) uniform sampler2DMS u_ms_image_sampler;\n"
2699					<< "layout(push_constant) uniform PushConstantsBlock {\n"
2700					<< "    highp int sampleID;\n"
2701					<< "} pushConstants;\n"
2702					<< "layout(location = 0) out highp vec4 o_color;\n"
2703					<< "\n"
2704					<< "void main (void)\n"
2705					<< "{\n"
2706					<< "    o_color = texelFetch(u_ms_image_sampler, ivec2(gl_FragCoord.xy), pushConstants.sampleID);\n"
2707					<< "}\n";
2708
2709				programCollection.glslSources.add("demultisample-color-frag") << glu::FragmentSource(src.str());
2710			}
2711
2712			// Depth
2713			{
2714				std::ostringstream src;
2715
2716				// Depth-component textures are treated as one-component floating-point textures.
2717				src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2718					<< "\n"
2719					<< "layout(binding = 0) uniform sampler2DMS u_ms_image_sampler;\n"
2720					<< "layout(push_constant) uniform PushConstantsBlock {\n"
2721					<< "    highp int sampleID;\n"
2722					<< "} pushConstants;\n"
2723					<< "layout(location = 0) out highp vec4 o_color;\n"
2724					<< "\n"
2725					<< "void main (void)\n"
2726					<< "{\n"
2727					<< "    vec4 val = texelFetch(u_ms_image_sampler, ivec2(gl_FragCoord.xy), pushConstants.sampleID);\n"
2728					<< "    o_color = vec4(val.x, val.x, val.x, 1.0);\n"
2729					<< "}\n";
2730
2731				programCollection.glslSources.add("demultisample-depth-frag") << glu::FragmentSource(src.str());
2732			}
2733
2734			// Stencil
2735			{
2736				std::ostringstream src;
2737
2738				// Stencil-component textures are treated as one-component unsigned integer textures.
2739				src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2740					<< "\n"
2741					<< "layout(binding = 0) uniform usampler2DMS u_ms_image_sampler;\n"
2742					<< "layout(push_constant) uniform PushConstantsBlock {\n"
2743					<< "    highp int sampleID;\n"
2744					<< "} pushConstants;\n"
2745					<< "layout(location = 0) out highp vec4 o_color;\n"
2746					<< "\n"
2747					<< "void main (void)\n"
2748					<< "{\n"
2749					<< "    uvec4 uVal = texelFetch(u_ms_image_sampler, ivec2(gl_FragCoord.xy), pushConstants.sampleID);\n"
2750					<< "    float val = float(uVal.x) / 4.0f;\n"
2751					<< "    o_color = vec4(val, val, val, 1.0);\n"
2752					<< "}\n";
2753
2754				programCollection.glslSources.add("demultisample-stencil-frag") << glu::FragmentSource(src.str());
2755			}
2756		}
2757	}
2758
2759	if (m_parameters.testType == TEST_TYPE_MULTISUBPASS)
2760	{
2761		// Vertex shader
2762		{
2763			std::ostringstream src;
2764
2765			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2766				<< "\n"
2767				<< "layout(location = 0) in highp vec4 a_position;\n"
2768				<< "\n"
2769				<< "void main (void)\n"
2770				<< "{\n"
2771				<< "    gl_Position = a_position;\n"
2772				<< "}\n";
2773
2774			programCollection.glslSources.add("vert1") << glu::VertexSource(src.str());
2775		}
2776
2777		// Fragment shader
2778		{
2779			std::ostringstream src;
2780
2781			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
2782				<< "\n"
2783				<< "layout(input_attachment_index = 0, set = 0, binding = 0) uniform subpassInput u_colors;\n"
2784				<< "layout(location = 0) out highp vec4 o_color;\n"
2785				<< "\n"
2786				<< "void main (void)\n"
2787				<< "{\n"
2788				<< "    o_color = subpassLoad(u_colors);\n"
2789				<< "    o_color.g = 1.0f;\n"
2790				<< "    o_color.a = 1.0f;\n"
2791				<< "}\n";
2792
2793			programCollection.glslSources.add("frag1") << glu::FragmentSource(src.str());
2794		}
2795	}
2796
2797
2798	return;
2799}
2800
2801TestInstance*	BaseTestCase::createInstance (Context& context) const
2802{
2803	if (m_parameters.testType == TEST_TYPE_COLOR)
2804		return new ColorImagelessTestInstance(context, m_parameters);
2805
2806	if (m_parameters.testType == TEST_TYPE_DEPTH_STENCIL)
2807		return new DepthImagelessTestInstance(context, m_parameters);
2808
2809	if (m_parameters.testType == TEST_TYPE_COLOR_RESOLVE)
2810		return new ColorResolveImagelessTestInstance(context, m_parameters);
2811
2812	if (m_parameters.testType == TEST_TYPE_DEPTH_STENCIL_RESOLVE)
2813		return new DepthResolveImagelessTestInstance(context, m_parameters);
2814
2815	if (m_parameters.testType == TEST_TYPE_MULTISUBPASS)
2816		return new MultisubpassTestInstance(context, m_parameters);
2817
2818	if (m_parameters.testType == TEST_TYPE_DIFFERENT_ATTACHMENTS)
2819		return new DifferentAttachmentsTestInstance(context, m_parameters);
2820
2821
2822	TCU_THROW(InternalError, "Unknown test type specified");
2823}
2824
2825tcu::TestNode*	imagelessColorTests (tcu::TestContext& testCtx)
2826{
2827	TestParameters	parameters	=
2828	{
2829		TEST_TYPE_COLOR,					//  TestType	testType;
2830		VK_FORMAT_R8G8B8A8_UNORM,			//  VkFormat	colorFormat;
2831		VK_FORMAT_UNDEFINED,				//  VkFormat	dsFormat;
2832	};
2833
2834	// Imageless color attachment test
2835	return new BaseTestCase(testCtx, "color", parameters);
2836}
2837
2838tcu::TestNode*	imagelessDepthStencilTests (tcu::TestContext& testCtx)
2839{
2840	TestParameters	parameters	=
2841	{
2842		TEST_TYPE_DEPTH_STENCIL,			//  TestType	testType;
2843		VK_FORMAT_R8G8B8A8_UNORM,			//  VkFormat	colorFormat;
2844		VK_FORMAT_D24_UNORM_S8_UINT,		//  VkFormat	dsFormat;
2845	};
2846
2847	// Imageless depth/stencil attachment test
2848	return new BaseTestCase(testCtx, "depth_stencil", parameters);
2849}
2850
2851tcu::TestNode*	imagelessColorResolveTests (tcu::TestContext& testCtx)
2852{
2853	TestParameters	parameters	=
2854	{
2855		TEST_TYPE_COLOR_RESOLVE,			//  TestType	testType;
2856		VK_FORMAT_R8G8B8A8_UNORM,			//  VkFormat	colorFormat;
2857		VK_FORMAT_UNDEFINED,				//  VkFormat	dsFormat;
2858	};
2859
2860	// Imageless color attachment resolve test
2861	return new BaseTestCase(testCtx, "color_resolve", parameters);
2862}
2863
2864tcu::TestNode*	imagelessDepthStencilResolveTests (tcu::TestContext& testCtx)
2865{
2866	TestParameters	parameters	=
2867	{
2868		TEST_TYPE_DEPTH_STENCIL_RESOLVE,	//  TestType	testType;
2869		VK_FORMAT_R8G8B8A8_UNORM,			//  VkFormat	colorFormat;
2870		VK_FORMAT_D24_UNORM_S8_UINT,		//  VkFormat	dsFormat;
2871	};
2872
2873	// Imageless color and depth/stencil attachment resolve test
2874	return new BaseTestCase(testCtx, "depth_stencil_resolve", parameters);
2875}
2876
2877tcu::TestNode* imagelessMultisubpass(tcu::TestContext& testCtx)
2878{
2879	TestParameters	parameters =
2880	{
2881		TEST_TYPE_MULTISUBPASS,			//  TestType	testType;
2882		VK_FORMAT_R8G8B8A8_UNORM,		//  VkFormat	colorFormat;
2883		VK_FORMAT_UNDEFINED,			//  VkFormat	dsFormat;
2884	};
2885
2886	// Multi-subpass test
2887	return new BaseTestCase(testCtx, "multisubpass", parameters);
2888}
2889
2890tcu::TestNode* imagelessDifferentAttachments(tcu::TestContext& testCtx)
2891{
2892	TestParameters	parameters =
2893	{
2894		TEST_TYPE_DIFFERENT_ATTACHMENTS,	//  TestType	testType;
2895		VK_FORMAT_R8G8B8A8_UNORM,			//  VkFormat	colorFormat;
2896		VK_FORMAT_UNDEFINED,				//  VkFormat	dsFormat;
2897	};
2898
2899	// Different attachments in multiple render passes
2900	return new BaseTestCase(testCtx, "different_attachments", parameters);
2901}
2902
2903}	// anonymous
2904
2905tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx, const std::string& name)
2906{
2907	de::MovePtr<tcu::TestCaseGroup> imagelessFramebufferGroup (new tcu::TestCaseGroup(testCtx, name.c_str(), "Imageless Framebuffer tests"));
2908
2909	imagelessFramebufferGroup->addChild(imagelessColorTests(testCtx));						// Color only test
2910	imagelessFramebufferGroup->addChild(imagelessDepthStencilTests(testCtx));				// Color and depth/stencil test
2911	imagelessFramebufferGroup->addChild(imagelessColorResolveTests(testCtx));				// Color and color resolve test
2912	imagelessFramebufferGroup->addChild(imagelessDepthStencilResolveTests(testCtx));		// Color, depth and depth resolve test (interaction with VK_KHR_depth_stencil_resolve)
2913	imagelessFramebufferGroup->addChild(imagelessMultisubpass(testCtx));					// Multi-subpass test
2914	imagelessFramebufferGroup->addChild(imagelessDifferentAttachments(testCtx));			// Different attachments in multiple render passes
2915
2916	return imagelessFramebufferGroup.release();
2917}
2918
2919} // imageless
2920} // vkt
2921