• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2021 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 Dynamic Rendering Tests
22  *//*--------------------------------------------------------------------*/
23 
24 #include "deRandom.hpp"
25 #include "deUniquePtr.hpp"
26 
27 #include "tcuImageCompare.hpp"
28 #include "tcuRGBA.hpp"
29 #include "tcuTestLog.hpp"
30 #include "tcuTextureUtil.hpp"
31 #include "tcuVectorUtil.hpp"
32 
33 #include "vkBarrierUtil.hpp"
34 #include "vkBuilderUtil.hpp"
35 #include "vkCmdUtil.hpp"
36 #include "vktDrawBufferObjectUtil.hpp"
37 #include "vktDynamicRenderingTests.hpp"
38 #include "vkImageUtil.hpp"
39 #include "vkObjUtil.hpp"
40 #include "vkQueryUtil.hpp"
41 #include "vkRefUtil.hpp"
42 #include "vktTestGroupUtil.hpp"
43 #include "vktTestCase.hpp"
44 #include "vkTypeUtil.hpp"
45 
46 #include <iostream>
47 
48 namespace vkt
49 {
50 namespace renderpass
51 {
52 namespace
53 {
54 
55 using namespace vk;
56 using namespace Draw;
57 
58 using de::MovePtr;
59 using de::UniquePtr;
60 using de::SharedPtr;
61 
62 using tcu::UVec2;
63 using tcu::Vec4;
64 using tcu::IVec4;
65 using tcu::UVec4;
66 
67 constexpr auto		VK_NULL_HANDLE				= DE_NULL;
68  // maxColorAttachments is guaranteed to be at least 4.
69 constexpr deUint32	COLOR_ATTACHMENTS_NUMBER	= 4;
70 
71 constexpr deUint32	TEST_ATTACHMENT_LOAD_OP_LAST = 3;
72 
73 enum TestType
74 {
75 	// Draw two triangles in a single primary command buffer, beginning and ending the render pass instance.
76 	TEST_TYPE_SINGLE_CMDBUF = 0,
77 	// Draw two triangles in a single primary command buffer, but across two render pass instances, with the second RESUMING the first.
78 	TEST_TYPE_SINGLE_CMDBUF_RESUMING,
79 	// Draw two triangles in two primary command buffers, across two render pass instances, with the second RESUMING the first.
80 	TEST_TYPE_TWO_CMDBUF_RESUMING,
81 	// Draw two triangles in two secondary command buffers, across two render pass instances,
82 	//with the second RESUMING the first, both recorded to the same primary command buffer.
83 	TEST_TYPE_SECONDARY_CMDBUF_RESUMING,
84 	// Draw two triangles in two secondary command buffers, across two render pass instances,
85 	// with the second RESUMING the first, executed in the two primary command buffers.
86 	TEST_TYPE_SECONDARY_CMDBUF_TWO_PRIMARY_RESUMING,
87 	// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in one secondary command buffer,
88 	// and execute it inside a single render pass instance in one primary command buffer.
89 	TEST_TYPE_CONTENTS_SECONDARY_COMMAND_BUFFER,
90 	// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
91 	// and execute them inside a single render pass instance in one primary command buffer.
92 	TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER,
93 	// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
94 	// and execute them inside two render pass instances, with the second RESUMING the first, both recorded in the same primary command buffer.
95 	TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER_RESUMING,
96 	// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
97 	// and execute them inside two render pass instances, with the second RESUMING the first, recorded into two primary command buffers.
98 	TEST_TYPE_CONTENTS_2_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
99 	// In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
100 	// draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
101 	// draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
102 	TEST_TYPE_CONTENTS_PRIMARY_SECONDARY_COMDBUF_RESUMING,
103 	// In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
104 	// use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer,
105 	// and execute it in that first render pass instance.In the second, draw one triangle directly in the primary command buffer.
106 	TEST_TYPE_CONTENTS_SECONDARY_PRIMARY_COMDBUF_RESUMING,
107 	// In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
108 	// draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
109 	// draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
110 	TEST_TYPE_CONTENTS_2_PRIMARY_SECONDARY_COMDBUF_RESUMING,
111 	// In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
112 	// use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer, and execute it in that first
113 	// render pass instance.In the second, draw one triangle directly in the primary command buffer.
114 	TEST_TYPE_CONTENTS_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
115 	TEST_TYPE_LAST
116 };
117 
118 enum TestAttachmentType
119 {
120 	TEST_ATTACHMENT_SINGLE_COLOR = 0,
121 	TEST_ATTACHMENT_DEPTH_ATTACHMENT,
122 	TEST_ATTACHMENT_STENCIL_ATTACHMENT,
123 	TEST_ATTACHMENT_MULTIPLE_COLOR,
124 	TEST_ATTACHMENT_ALL,
125 	TEST_ATTACHMENT_LAST
126 };
127 
128 enum TestAttachmentStoreOp
129 {
130 	TEST_ATTACHMENT_STORE_OP_STORE     = VK_ATTACHMENT_STORE_OP_STORE,
131 	TEST_ATTACHMENT_STORE_OP_DONT_CARE =VK_ATTACHMENT_STORE_OP_DONT_CARE,
132 	TEST_ATTACHMENT_STORE_OP_LAST
133 };
134 
135 struct TestParameters
136 {
137 	TestType		testType;
138 	const Vec4		clearColor;
139 	const VkFormat	imageFormat;
140 	const UVec2		renderSize;
141 };
142 
143 struct ImagesLayout
144 {
145 	VkImageLayout	oldColors[COLOR_ATTACHMENTS_NUMBER];
146 	VkImageLayout	oldStencil;
147 	VkImageLayout	oldDepth;
148 };
149 
150 struct ImagesFormat
151 {
152 	VkFormat	colors[COLOR_ATTACHMENTS_NUMBER];
153 	VkFormat	depth;
154 	VkFormat	stencil;
155 };
156 
157 struct ClearAttachmentData
158 {
159 	std::vector<VkClearAttachment>	colorDepthClear1;
160 	std::vector<VkClearAttachment>	colorDepthClear2;
161 	VkClearAttachment				stencilClear1;
162 	VkClearAttachment				stencilClear2;
163 	VkClearRect						rectColorDepth1;
164 	VkClearRect						rectColorDepth2;
165 	VkClearRect						rectStencil1;
166 	VkClearRect						rectStencil2;
167 
ClearAttachmentDatavkt::renderpass::__anona1bf8b7c0111::ClearAttachmentData168 	ClearAttachmentData	(const deUint32	colorAtchCount,
169 						const VkFormat	depth,
170 						const VkFormat	stencil)
171 	{
172 		if (colorAtchCount != 0)
173 		{
174 			for (deUint32 atchNdx = 0; atchNdx < colorAtchCount; ++atchNdx)
175 			{
176 				const VkClearAttachment green =
177 				{
178 					VK_IMAGE_ASPECT_COLOR_BIT,
179 					atchNdx,
180 					makeClearValueColorF32(0.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
181 				};
182 				colorDepthClear1.push_back(green);
183 
184 				const VkClearAttachment yellow =
185 				{
186 					VK_IMAGE_ASPECT_COLOR_BIT,
187 					atchNdx,
188 					makeClearValueColorF32(1.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
189 				};
190 				colorDepthClear2.push_back(yellow);
191 			}
192 		}
193 
194 		if (depth != VK_FORMAT_UNDEFINED)
195 		{
196 			const VkClearAttachment zero =
197 			{
198 				VK_IMAGE_ASPECT_DEPTH_BIT,
199 				0,
200 				makeClearValueDepthStencil(0.0f, 0)
201 			};
202 			colorDepthClear1.push_back(zero);
203 
204 			const VkClearAttachment one =
205 			{
206 				VK_IMAGE_ASPECT_DEPTH_BIT,
207 				0,
208 				makeClearValueDepthStencil(0.2f, 0)
209 			};
210 			colorDepthClear2.push_back(one);
211 		}
212 
213 		if (stencil != VK_FORMAT_UNDEFINED)
214 		{
215 			stencilClear1 =
216 			{
217 				VK_IMAGE_ASPECT_STENCIL_BIT,
218 				0,
219 				makeClearValueDepthStencil(0.0f, 1)
220 			};
221 
222 			stencilClear2 =
223 			{
224 				VK_IMAGE_ASPECT_STENCIL_BIT,
225 				0,
226 				makeClearValueDepthStencil(0.0f, 2)
227 			};
228 
229 			rectStencil1 =
230 			{
231 				makeRect2D(0, 0, 32, 16),
232 				0u,
233 				1u,
234 			};
235 
236 			rectStencil2 =
237 			{
238 				makeRect2D(0, 16, 32, 16),
239 				0u,
240 				1u,
241 			};
242 		}
243 
244 		rectColorDepth1 =
245 		{
246 			makeRect2D(0, 0, 16, 32),
247 			0u,
248 			1u,
249 		};
250 
251 		rectColorDepth2 =
252 		{
253 			makeRect2D(16, 0, 16, 32),
254 			0u,
255 			1u,
256 		};
257 	}
258 };
259 
260 template<typename T>
sizeInBytes(const std::vector<T> & vec)261 inline VkDeviceSize sizeInBytes (const std::vector<T>& vec)
262 {
263 	return vec.size() * sizeof(vec[0]);
264 }
265 
makeImageCreateInfo(const VkFormat format,const UVec2 & size,VkImageUsageFlags usage)266 VkImageCreateInfo makeImageCreateInfo (const VkFormat		format,
267 									   const UVec2&			size,
268 									   VkImageUsageFlags	usage)
269 {
270 	const VkImageCreateInfo imageParams =
271 	{
272 		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,	// VkStructureType			sType;
273 		DE_NULL,								// const void*				pNext;
274 		(VkImageCreateFlags)0,					// VkImageCreateFlags		flags;
275 		VK_IMAGE_TYPE_2D,						// VkImageType				imageType;
276 		format,									// VkFormat					format;
277 		makeExtent3D(size.x(), size.y(), 1),	// VkExtent3D				extent;
278 		1u,										// deUint32					mipLevels;
279 		1u,										// deUint32					arrayLayers;
280 		VK_SAMPLE_COUNT_1_BIT,					// VkSampleCountFlagBits	samples;
281 		VK_IMAGE_TILING_OPTIMAL,				// VkImageTiling			tiling;
282 		usage,									// VkImageUsageFlags		usage;
283 		VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode			sharingMode;
284 		0u,										// deUint32					queueFamilyIndexCount;
285 		DE_NULL,								// const deUint32*			pQueueFamilyIndices;
286 		VK_IMAGE_LAYOUT_UNDEFINED,				// VkImageLayout			initialLayout;
287 	};
288 	return imageParams;
289 }
290 
makeGraphicsPipeline(const DeviceInterface & vk,const VkDevice device,const VkPipelineLayout pipelineLayout,const VkShaderModule vertexModule,const VkShaderModule fragmentModule,const UVec2 renderSize,const deUint32 colorAttachmentCount,const VkFormat * pColorAttachmentFormats,const VkFormat depthAttachmentFormat,const VkFormat stencilAttachmentFormat)291 Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&	vk,
292 									   const VkDevice			device,
293 									   const VkPipelineLayout	pipelineLayout,
294 									   const VkShaderModule		vertexModule,
295 									   const VkShaderModule		fragmentModule,
296 									   const UVec2				renderSize,
297 									   const deUint32			colorAttachmentCount,
298 									   const VkFormat*			pColorAttachmentFormats,
299 									   const VkFormat			depthAttachmentFormat,
300 									   const VkFormat			stencilAttachmentFormat)
301 {
302 	const VkVertexInputBindingDescription vertexInputBindingDescription =
303 	{
304 		0u,								// uint32_t				binding;
305 		sizeof(Vec4),					// uint32_t				stride;
306 		VK_VERTEX_INPUT_RATE_VERTEX,	// VkVertexInputRate	inputRate;
307 	};
308 
309 	const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
310 	{
311 		{
312 			0u,								// uint32_t			location;
313 			0u,								// uint32_t			binding;
314 			VK_FORMAT_R32G32B32A32_SFLOAT,	// VkFormat			format;
315 			0u,								// uint32_t			offset;
316 		},
317 	};
318 
319 	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
320 	{
321 		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType								sType;
322 		DE_NULL,														// const void*									pNext;
323 		(VkPipelineVertexInputStateCreateFlags)0,						// VkPipelineVertexInputStateCreateFlags		flags;
324 		1u,																// uint32_t										vertexBindingDescriptionCount;
325 		&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*		pVertexBindingDescriptions;
326 		DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions),			// uint32_t										vertexAttributeDescriptionCount;
327 		vertexInputAttributeDescriptions,								// const VkVertexInputAttributeDescription*		pVertexAttributeDescriptions;
328 	};
329 
330 	const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
331 	{
332 		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType								sType;
333 		DE_NULL,														// const void*									pNext;
334 		(VkPipelineInputAssemblyStateCreateFlags)0,						// VkPipelineInputAssemblyStateCreateFlags		flags;
335 		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,							// VkPrimitiveTopology							topology;
336 		VK_FALSE,														// VkBool32										primitiveRestartEnable;
337 	};
338 
339 	VkViewport		viewport = makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()), 0.0f, 1.0f);
340 	const VkRect2D	rectScissorRenderSize = { { 0, 0 }, { renderSize.x(), renderSize.y() } };
341 
342 	const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
343 	{
344 		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,	// VkStructureType								sType;
345 		DE_NULL,												// const void*									pNext;
346 		(VkPipelineViewportStateCreateFlags)0,					// VkPipelineViewportStateCreateFlags			flags;
347 		1u,														// uint32_t										viewportCount;
348 		&viewport,												// const VkViewport*							pViewports;
349 		1u,														// uint32_t										scissorCount;
350 		&rectScissorRenderSize,									// const VkRect2D*								pScissors;
351 	};
352 
353 	const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
354 	{
355 		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// VkStructureType								sType;
356 		DE_NULL,													// const void*									pNext;
357 		(VkPipelineRasterizationStateCreateFlags)0,					// VkPipelineRasterizationStateCreateFlags		flags;
358 		VK_FALSE,													// VkBool32										depthClampEnable;
359 		VK_FALSE,													// VkBool32										rasterizerDiscardEnable;
360 		VK_POLYGON_MODE_FILL,										// VkPolygonMode								polygonMode;
361 		VK_CULL_MODE_NONE,											// VkCullModeFlags								cullMode;
362 		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// VkFrontFace									frontFace;
363 		VK_FALSE,													// VkBool32										depthBiasEnable;
364 		0.0f,														// float										depthBiasConstantFactor;
365 		0.0f,														// float										depthBiasClamp;
366 		0.0f,														// float										depthBiasSlopeFactor;
367 		1.0f,														// float										lineWidth;
368 	};
369 
370 	const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
371 	{
372 		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType								sType;
373 		DE_NULL,													// const void*									pNext;
374 		(VkPipelineMultisampleStateCreateFlags)0,					// VkPipelineMultisampleStateCreateFlags		flags;
375 		VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits						rasterizationSamples;
376 		VK_FALSE,													// VkBool32										sampleShadingEnable;
377 		0.0f,														// float										minSampleShading;
378 		DE_NULL,													// const VkSampleMask*							pSampleMask;
379 		VK_FALSE,													// VkBool32										alphaToCoverageEnable;
380 		VK_FALSE													// VkBool32										alphaToOneEnable;
381 	};
382 
383 	const VkStencilOpState stencilOp = makeStencilOpState(
384 		VK_STENCIL_OP_ZERO,					// stencil fail
385 		VK_STENCIL_OP_INCREMENT_AND_CLAMP,	// depth & stencil pass
386 		VK_STENCIL_OP_INCREMENT_AND_CLAMP,	// depth only fail
387 		VK_COMPARE_OP_NOT_EQUAL,			// compare op
388 		240u,								// compare mask
389 		255u,								// write mask
390 		255u);								// reference
391 
392 	VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
393 	{
394 		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,		// VkStructureType								sType;
395 		DE_NULL,														// const void*									pNext;
396 		(VkPipelineDepthStencilStateCreateFlags)0,						// VkPipelineDepthStencilStateCreateFlags		flags;
397 		VK_TRUE,														// VkBool32										depthTestEnable;
398 		VK_TRUE,														// VkBool32										depthWriteEnable;
399 		VK_COMPARE_OP_ALWAYS,											// VkCompareOp									depthCompareOp;
400 		VK_FALSE,														// VkBool32										depthBoundsTestEnable;
401 		VK_TRUE,														// VkBool32										stencilTestEnable;
402 		stencilOp,														// VkStencilOpState								front;
403 		stencilOp,														// VkStencilOpState								back;
404 		0.0f,															// float										minDepthBounds;
405 		1.0f,															// float										maxDepthBounds;
406 	};
407 
408 	const VkColorComponentFlags					colorComponentsAll = VK_COLOR_COMPONENT_R_BIT |
409 																	 VK_COLOR_COMPONENT_G_BIT |
410 																	 VK_COLOR_COMPONENT_B_BIT |
411 																	 VK_COLOR_COMPONENT_A_BIT;
412 
413 	std::vector<VkPipelineColorBlendAttachmentState>	colorBlendAttachmentState;
414 
415 	for (deUint32 ndx = 0 ; ndx < colorAttachmentCount; ++ndx)
416 	{
417 		const VkPipelineColorBlendAttachmentState	pipelineColorBlendAttachmentState =
418 		{
419 			VK_FALSE,				// VkBool32					blendEnable;
420 			VK_BLEND_FACTOR_ONE,	// VkBlendFactor			srcColorBlendFactor;
421 			VK_BLEND_FACTOR_ZERO,	// VkBlendFactor			dstColorBlendFactor;
422 			VK_BLEND_OP_ADD,		// VkBlendOp				colorBlendOp;
423 			VK_BLEND_FACTOR_ONE,	// VkBlendFactor			srcAlphaBlendFactor;
424 			VK_BLEND_FACTOR_ZERO,	// VkBlendFactor			dstAlphaBlendFactor;
425 			VK_BLEND_OP_ADD,		// VkBlendOp				alphaBlendOp;
426 			colorComponentsAll,		// VkColorComponentFlags	colorWriteMask;
427 		};
428 
429 		colorBlendAttachmentState.push_back(pipelineColorBlendAttachmentState);
430 	}
431 
432 	const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
433 	{
434 		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
435 		DE_NULL,													// const void*									pNext;
436 		(VkPipelineColorBlendStateCreateFlags)0,					// VkPipelineColorBlendStateCreateFlags			flags;
437 		VK_FALSE,													// VkBool32										logicOpEnable;
438 		VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
439 		colorAttachmentCount,										// deUint32										attachmentCount;
440 		colorBlendAttachmentState.data(),							// const VkPipelineColorBlendAttachmentState*	pAttachments;
441 		{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConstants[4];
442 	};
443 
444 	const VkPipelineShaderStageCreateInfo pShaderStages[] =
445 	{
446 		{
447 			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType								sType;
448 			DE_NULL,												// const void*									pNext;
449 			(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags				flags;
450 			VK_SHADER_STAGE_VERTEX_BIT,								// VkShaderStageFlagBits						stage;
451 			vertexModule,											// VkShaderModule								module;
452 			"main",													// const char*									pName;
453 			DE_NULL,												// const VkSpecializationInfo*					pSpecializationInfo;
454 		},
455 		{
456 			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType								sType;
457 			DE_NULL,												// const void*									pNext;
458 			(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags				flags;
459 			VK_SHADER_STAGE_FRAGMENT_BIT,							// VkShaderStageFlagBits						stage;
460 			fragmentModule,											// VkShaderModule								module;
461 			"main",													// const char*									pName;
462 			DE_NULL,												// const VkSpecializationInfo*					pSpecializationInfo;
463 		},
464 	};
465 
466 	const VkPipelineRenderingCreateInfoKHR renderingCreateInfo
467 	{
468 		VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR,			// VkStructureType	sType;
469 		DE_NULL,														// const void*		pNext;
470 		0u,																// deUint32			viewMask;
471 		colorAttachmentCount,											// deUint32			colorAttachmentCount;
472 		pColorAttachmentFormats,										// const VkFormat*	pColorAttachmentFormats;
473 		depthAttachmentFormat,											// VkFormat			depthAttachmentFormat;
474 		stencilAttachmentFormat,										// VkFormat			stencilAttachmentFormat;
475 	};
476 
477 	const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
478 	{
479 		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
480 		&renderingCreateInfo,								// const void*										pNext;
481 		(VkPipelineCreateFlags)0,							// VkPipelineCreateFlags							flags;
482 		2u,													// deUint32											stageCount;
483 		pShaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
484 		&vertexInputStateInfo,								// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
485 		&pipelineInputAssemblyStateInfo,					// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
486 		DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
487 		&pipelineViewportStateInfo,							// const VkPipelineViewportStateCreateInfo*			pViewportState;
488 		&pipelineRasterizationStateInfo,					// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
489 		&pipelineMultisampleStateInfo,						// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
490 		&pipelineDepthStencilStateInfo,						// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
491 		&pipelineColorBlendStateInfo,						// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
492 		DE_NULL,											// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
493 		pipelineLayout,										// VkPipelineLayout									layout;
494 		VK_NULL_HANDLE,										// VkRenderPass										renderPass;
495 		0u,													// deUint32											subpass;
496 		DE_NULL,											// VkPipeline										basePipelineHandle;
497 		0,													// deInt32											basePipelineIndex;
498 	};
499 
500 	return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
501 }
502 
getSupportedStencilFormat(const InstanceInterface & vki,VkPhysicalDevice physDev)503 VkFormat getSupportedStencilFormat (const InstanceInterface&	vki,
504 									VkPhysicalDevice			physDev)
505 {
506 	const VkFormat				formatList[] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT };
507 	const VkFormatFeatureFlags	requirements = (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
508 												VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
509 
510 	for (int i = 0; i < DE_LENGTH_OF_ARRAY(formatList); ++i)
511 	{
512 		const auto properties = getPhysicalDeviceFormatProperties(vki, physDev, formatList[i]);
513 		if ((properties.optimalTilingFeatures & requirements) == requirements)
514 			return formatList[i];
515 	}
516 
517 	return VK_FORMAT_UNDEFINED;
518 }
519 
getDepthTextureFormat(const VkFormat depthStencilFormat)520 tcu::TextureFormat getDepthTextureFormat (const VkFormat	depthStencilFormat)
521 {
522 	return	((depthStencilFormat == VK_FORMAT_D24_UNORM_S8_UINT) ?
523 			tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::UNSIGNED_INT_24_8_REV) :
524 			tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::FLOAT));
525 }
526 
generateColroImage(const tcu::TextureFormat format,const UVec2 & renderSize,const int attachmentNdx)527 tcu::TextureLevel generateColroImage (const tcu::TextureFormat	format,
528 									  const UVec2&				renderSize,
529 									  const int					attachmentNdx)
530 {
531 	tcu::TextureLevel	image		(format, renderSize.x(), renderSize.y());
532 	const float			atchNdx		= static_cast<float>(attachmentNdx);
533 	const Vec4			greenColor	= Vec4(0.0f, 1.0f, atchNdx * 0.15f, 1.0f);
534 	const Vec4			yellowColor	= Vec4(1.0f, 1.0f, atchNdx * 0.15f, 1.0f);
535 
536 	for (deUint32 y = 0; y < renderSize.y(); ++y)
537 	{
538 		for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
539 		{
540 			image.getAccess().setPixel(greenColor, x, y);
541 		}
542 		for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
543 		{
544 			image.getAccess().setPixel(yellowColor, x, y);
545 		}
546 	}
547 
548 	return image;
549 }
550 
generateDepthImage(const tcu::TextureFormat format,const UVec2 & renderSize)551 tcu::TextureLevel generateDepthImage (const tcu::TextureFormat	format,
552 									  const UVec2&				renderSize)
553 {
554 	tcu::TextureLevel	image	(format, renderSize.x(), renderSize.y());
555 	const float			value1	= 0.0f;
556 	const float			value2	= 0.2f;
557 
558 	for (deUint32 y = 0; y < renderSize.y(); ++y)
559 	{
560 		for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
561 		{
562 			image.getAccess().setPixDepth(value1, x, y);
563 		}
564 		for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
565 		{
566 			image.getAccess().setPixDepth(value2, x, y);
567 		}
568 	}
569 
570 	return image;
571 }
572 
generateStencilImage(const tcu::TextureFormat format,const UVec2 & renderSize)573 tcu::TextureLevel generateStencilImage (const tcu::TextureFormat	format,
574 										const UVec2&				renderSize)
575 {
576 	tcu::TextureLevel	image	(format, renderSize.x(), renderSize.y());
577 	const IVec4			value1	= IVec4(1,0,0,0);
578 	const IVec4			value2	= IVec4(2,0,0,0);
579 
580 	for (deUint32 x = 0; x < renderSize.x(); ++x)
581 	{
582 		for (deUint32 y = 0; y < renderSize.y() / 2u; ++y)
583 		{
584 			image.getAccess().setPixel(value1, x, y);
585 		}
586 		for (deUint32 y = renderSize.y() / 2u; y < renderSize.y(); ++y)
587 		{
588 			image.getAccess().setPixel(value2, x, y);
589 		}
590 	}
591 
592 	return image;
593 }
594 
submitCommandsAndWait(const DeviceInterface & vk,const VkDevice device,const VkQueue queue,const VkCommandBuffer commandBuffer,const VkCommandBuffer commandBuffer2)595 void submitCommandsAndWait (const DeviceInterface&	vk,
596 							const VkDevice			device,
597 							const VkQueue			queue,
598 							const VkCommandBuffer	commandBuffer,
599 							const VkCommandBuffer	commandBuffer2)
600 {
601 	const Unique<VkFence>	fence(createFence(vk, device));
602 	const VkCommandBuffer	cmdBuffers[2] = { commandBuffer, commandBuffer2 };
603 
604 	const VkSubmitInfo		submitInfo =
605 	{
606 		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType				sType;
607 		DE_NULL,						// const void*					pNext;
608 		0u,								// deUint32						waitSemaphoreCount;
609 		DE_NULL,						// const VkSemaphore*			pWaitSemaphores;
610 		DE_NULL,						// const VkPipelineStageFlags*	pWaitDstStageMask;
611 		2u,								// deUint32						commandBufferCount;
612 		cmdBuffers,						// const VkCommandBuffer*		pCommandBuffers;
613 		0u,								// deUint32						signalSemaphoreCount;
614 		nullptr,						// const VkSemaphore*			pSignalSemaphores;
615 	};
616 
617 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
618 	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
619 }
620 
beginSecondaryCmdBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,VkRenderingFlagsKHR renderingFlags,const deUint32 colorAttachmentCount,const ImagesFormat & imagesFormat)621 void beginSecondaryCmdBuffer (const DeviceInterface&	vk,
622 							  const VkCommandBuffer		commandBuffer,
623 							  VkRenderingFlagsKHR		renderingFlags,
624 							  const deUint32			colorAttachmentCount,
625 							  const ImagesFormat&		imagesFormat)
626 {
627 	const VkCommandBufferInheritanceRenderingInfoKHR inheritanceRenderingInfo
628 	{
629 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR,	// VkStructureType			sType;
630 		DE_NULL,															// const void*				pNext;
631 		renderingFlags,														// VkRenderingFlagsKHR		flags;
632 		0u,																	// uint32_t					viewMask;
633 		colorAttachmentCount,												// uint32_t					colorAttachmentCount;
634 		(colorAttachmentCount > 0) ? imagesFormat.colors : DE_NULL,			// const VkFormat*			pColorAttachmentFormats;
635 		imagesFormat.depth,													// VkFormat					depthAttachmentFormat;
636 		imagesFormat.stencil,												// VkFormat					stencilAttachmentFormat;
637 		VK_SAMPLE_COUNT_1_BIT,												// VkSampleCountFlagBits	rasterizationSamples;
638 	};
639 
640 	const VkCommandBufferInheritanceInfo	bufferInheritanceInfo =
641 	{
642 		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,	// VkStructureType					sType;
643 		&inheritanceRenderingInfo,								// const void*						pNext;
644 		VK_NULL_HANDLE,											// VkRenderPass						renderPass;
645 		0u,														// deUint32							subpass;
646 		VK_NULL_HANDLE,											// VkFramebuffer					framebuffer;
647 		VK_FALSE,												// VkBool32							occlusionQueryEnable;
648 		(vk::VkQueryControlFlags)0u,							// VkQueryControlFlags				queryFlags;
649 		(vk::VkQueryPipelineStatisticFlags)0u					// VkQueryPipelineStatisticFlags	pipelineStatistics;
650 	};
651 
652 	const VkCommandBufferBeginInfo commandBufBeginParams =
653 	{
654 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,		// VkStructureType				sType;
655 		DE_NULL,											// const void*					pNext;
656 		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
657 		VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,	// VkCommandBufferUsageFlags	flags;
658 		&bufferInheritanceInfo
659 	};
660 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
661 }
662 
beginSecondaryCmdBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer)663 void beginSecondaryCmdBuffer(const DeviceInterface&	vk,
664 							const VkCommandBuffer	commandBuffer)
665 {
666 	const VkCommandBufferInheritanceInfo	bufferInheritanceInfo =
667 	{
668 		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,	// VkStructureType					sType;
669 		DE_NULL,												// const void*						pNext;
670 		VK_NULL_HANDLE,											// VkRenderPass						renderPass;
671 		0u,														// deUint32							subpass;
672 		VK_NULL_HANDLE,											// VkFramebuffer					framebuffer;
673 		VK_FALSE,												// VkBool32							occlusionQueryEnable;
674 		(vk::VkQueryControlFlags)0u,							// VkQueryControlFlags				queryFlags;
675 		(vk::VkQueryPipelineStatisticFlags)0u					// VkQueryPipelineStatisticFlags	pipelineStatistics;
676 	};
677 
678 	const VkCommandBufferBeginInfo commandBufBeginParams =
679 	{
680 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,		// VkStructureType				sType;
681 		DE_NULL,											// const void*					pNext;
682 		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,		// VkCommandBufferUsageFlags	flags;
683 		&bufferInheritanceInfo
684 	};
685 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
686 }
687 
688 class DynamicRenderingTestInstance : public TestInstance
689 {
690 public:
691 									DynamicRenderingTestInstance	(Context&							context,
692 																	 const TestParameters&				parameters);
693 protected:
694 	virtual tcu::TestStatus			iterate							(void);
695 	void							initialize						(void);
696 	void							createCmdBuffer					(void);
697 	virtual void					rendering						(const VkPipeline					pipeline,
698 																	 const std::vector<VkImageView>&	attachmentBindInfos,
699 																	 const deUint32						colorAtchCount,
700 																	 ImagesLayout&						imagesLayout,
701 																	 const ImagesFormat&				imagesFormat);
702 	void							preBarier						(const deUint32						colorAtchCount,
703 																	 ImagesLayout&						imagesLayout,
704 																	 const ImagesFormat&				imagesFormat);
705 	void							beginRendering					(VkCommandBuffer					cmdBuffer,
706 																	 const std::vector<VkImageView>&	attachmentBindInfos,
707 																	 const VkRenderingFlagsKHR			flags,
708 																	 const deUint32						colorAtchCount,
709 																	 const ImagesFormat&				imagesFormat,
710 																	 const VkAttachmentLoadOp			loadOp,
711 																	 const VkAttachmentStoreOp			storeOp);
712 	void							copyImgToBuff					(VkCommandBuffer					commandBuffer,
713 																	const deUint32						colorAtchCount,
714 																	 ImagesLayout&						imagesLayout,
715 																	 const ImagesFormat&				imagesFormat);
716 	void							verifyResults					(const deUint32						colorAtchCount,
717 																	 const ImagesFormat&				imagesFormat);
718 
719 	const TestParameters			m_parameters;
720 	VkFormat						m_formatStencilDepthImage;
721 	Move<VkImage>					m_imageColor[COLOR_ATTACHMENTS_NUMBER];
722 	Move<VkImage>					m_imageStencilDepth;
723 	Move<VkImageView>				m_colorAttachmentView[COLOR_ATTACHMENTS_NUMBER];
724 	Move<VkImageView>				m_stencilDepthAttachmentView;
725 	MovePtr<Allocation>				m_imageColorAlloc[COLOR_ATTACHMENTS_NUMBER];
726 	MovePtr<Allocation>				m_imageStencilDepthAlloc;
727 	SharedPtr<Buffer>				m_imageBuffer[COLOR_ATTACHMENTS_NUMBER];
728 	SharedPtr<Buffer>				m_imageDepthBuffer;
729 	SharedPtr<Buffer>				m_imageStencilBuffer;
730 
731 	Move<VkShaderModule>			m_vertexModule;
732 	Move<VkShaderModule>			m_fragmentModule;
733 	SharedPtr<Buffer>				m_vertexBuffer;
734 	Move<VkPipelineLayout>			m_pipelineLayout;
735 
736 	Move<VkCommandPool>				m_cmdPool;
737 	Move<VkCommandBuffer>			m_cmdBuffer;
738 
739 	std::vector<tcu::TextureLevel>	m_referenceImages;
740 };
741 
DynamicRenderingTestInstance(Context & context,const TestParameters & parameters)742 DynamicRenderingTestInstance::DynamicRenderingTestInstance (Context&				context,
743 															const TestParameters&	parameters)
744 	: TestInstance	(context)
745 	, m_parameters	(parameters)
746 {
747 	const VkPhysicalDeviceDynamicRenderingFeaturesKHR&		dynamicRenderingFeatures	(context.getDynamicRenderingFeatures());
748 
749 	if (dynamicRenderingFeatures.dynamicRendering == DE_FALSE)
750 		TCU_FAIL("dynamicRendering is not supported");
751 
752 	initialize();
753 	createCmdBuffer();
754 }
755 
iterate(void)756 tcu::TestStatus DynamicRenderingTestInstance::iterate (void)
757 {
758 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
759 	const VkDevice			device	= m_context.getDevice();
760 
761 	ImagesLayout imagesLayout
762 	{
763 		{
764 			VK_IMAGE_LAYOUT_UNDEFINED,
765 			VK_IMAGE_LAYOUT_UNDEFINED,
766 			VK_IMAGE_LAYOUT_UNDEFINED,
767 			VK_IMAGE_LAYOUT_UNDEFINED
768 		},								// oldColors
769 		VK_IMAGE_LAYOUT_UNDEFINED,		// oldLStencil
770 		VK_IMAGE_LAYOUT_UNDEFINED,		// oldDepth
771 	};
772 
773 	for (int attachmentTest = 0; attachmentTest < TEST_ATTACHMENT_LAST; ++attachmentTest)
774 	{
775 		std::vector<VkImageView>	attachmentBindInfos;
776 
777 		ImagesFormat imagesFormat
778 		{
779 			{
780 				m_parameters.imageFormat,
781 				m_parameters.imageFormat,
782 				m_parameters.imageFormat,
783 				m_parameters.imageFormat,
784 			},								// colors
785 			m_formatStencilDepthImage,		// depth
786 			m_formatStencilDepthImage,		// stencil
787 		};
788 
789 		deUint32	colorAtchCount		= 0u;
790 
791 		switch(attachmentTest)
792 		{
793 			case TEST_ATTACHMENT_SINGLE_COLOR:
794 			{
795 				attachmentBindInfos.push_back(*m_colorAttachmentView[0]);
796 				imagesFormat.depth		= VK_FORMAT_UNDEFINED;
797 				imagesFormat.stencil	= VK_FORMAT_UNDEFINED;
798 				colorAtchCount			= 1u;
799 				break;
800 			}
801 			case TEST_ATTACHMENT_DEPTH_ATTACHMENT:
802 			{
803 				attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
804 				imagesFormat.colors[0]	= VK_FORMAT_UNDEFINED;
805 				imagesFormat.stencil	= VK_FORMAT_UNDEFINED;
806 				break;
807 			}
808 			case TEST_ATTACHMENT_STENCIL_ATTACHMENT:
809 			{
810 				attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
811 				imagesFormat.colors[0]	= VK_FORMAT_UNDEFINED;
812 				imagesFormat.depth		= VK_FORMAT_UNDEFINED;
813 				break;
814 			}
815 			case TEST_ATTACHMENT_MULTIPLE_COLOR:
816 			{
817 				for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
818 					attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
819 
820 				colorAtchCount			= COLOR_ATTACHMENTS_NUMBER;
821 				imagesFormat.depth		= VK_FORMAT_UNDEFINED;
822 				imagesFormat.stencil	= VK_FORMAT_UNDEFINED;
823 				break;
824 			}
825 			case TEST_ATTACHMENT_ALL:
826 			{
827 				for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
828 					attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
829 
830 				attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
831 				attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
832 
833 				colorAtchCount = COLOR_ATTACHMENTS_NUMBER;
834 				break;
835 			}
836 			default:
837 				DE_FATAL("Impossible");
838 		};
839 		Move<VkPipeline>	pipeline	= makeGraphicsPipeline(vk, device, *m_pipelineLayout,
840 															  *m_vertexModule, *m_fragmentModule,
841 															   m_parameters.renderSize, colorAtchCount, imagesFormat.colors,
842 															   imagesFormat.depth, imagesFormat.stencil);
843 
844 		rendering(*pipeline, attachmentBindInfos, colorAtchCount, imagesLayout, imagesFormat);
845 	}
846 	return tcu::TestStatus::pass("Pass");
847 }
848 
initialize(void)849 void DynamicRenderingTestInstance::initialize (void)
850 {
851 	const InstanceInterface&	vki			= m_context.getInstanceInterface();
852 	const DeviceInterface&		vk			= m_context.getDeviceInterface();
853 	const VkPhysicalDevice		physDevice	= m_context.getPhysicalDevice();
854 	const VkDevice				device		= m_context.getDevice();
855 	Allocator&					allocator	= m_context.getDefaultAllocator();
856 
857 	// Vertices.
858 	{
859 		std::vector<Vec4>	vertices;
860 
861 		// Draw a quad covering the whole renderarea
862 		vertices.push_back(Vec4(-1.0f,  1.0f, 0.0f, 1.0f));
863 		vertices.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
864 		vertices.push_back(Vec4( 0.0f,  1.0f, 0.0f, 1.0f));
865 		vertices.push_back(Vec4( 0.0f, -1.0f, 0.0f, 1.0f));
866 
867 		vertices.push_back(Vec4(1.0f, -1.0f, 0.2f, 1.0f));
868 		vertices.push_back(Vec4(0.0f, -1.0f, 0.2f, 1.0f));
869 		vertices.push_back(Vec4(1.0f,  1.0f, 0.2f, 1.0f));
870 		vertices.push_back(Vec4(0.0f,  1.0f, 0.2f, 1.0f));
871 
872 		vertices.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f));
873 		vertices.push_back(Vec4(-1.0f, 0.0f, 0.0f, 1.0f));
874 		vertices.push_back(Vec4( 1.0f, 1.0f, 0.0f, 1.0f));
875 		vertices.push_back(Vec4( 1.0f, 0.0f, 0.0f, 1.0f));
876 
877 		const VkDeviceSize			bufferSize	= sizeInBytes(vertices);
878 		const VkBufferCreateInfo	bufferInfo	= makeBufferCreateInfo(bufferSize,
879 																	   VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
880 
881 		m_vertexBuffer	= Buffer::createAndAlloc(vk, device,
882 												 bufferInfo,
883 												 allocator,
884 												 MemoryRequirement::HostVisible);
885 		deMemcpy(m_vertexBuffer->getBoundMemory().getHostPtr(), vertices.data(), static_cast<std::size_t>(bufferSize));
886 		flushAlloc(vk, device, m_vertexBuffer->getBoundMemory());
887 	}
888 
889 	// Images color attachment.
890 	{
891 		const VkImageUsageFlags			imageUsage			= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
892 															  VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
893 		const VkDeviceSize				imageBufferSize		= m_parameters.renderSize.x() *
894 															  m_parameters.renderSize.y() *
895 															  tcu::getPixelSize(mapVkFormat(m_parameters.imageFormat));
896 		const VkImageSubresourceRange	imageSubresource	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
897 		const VkImageCreateInfo			imageInfo			= makeImageCreateInfo(m_parameters.imageFormat,
898 																				  m_parameters.renderSize, imageUsage);
899 		const VkBufferCreateInfo		bufferInfo			= makeBufferCreateInfo(imageBufferSize,
900 																				   VK_BUFFER_USAGE_TRANSFER_DST_BIT);
901 
902 		for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
903 		{
904 			m_imageColor[ndx]			= makeImage(vk, device, imageInfo);
905 			m_imageColorAlloc[ndx]		= bindImage(vk, device, allocator, *m_imageColor[ndx], MemoryRequirement::Any);
906 			m_imageBuffer[ndx]			= Buffer::createAndAlloc(vk, device, bufferInfo,
907 																 allocator, MemoryRequirement::HostVisible);
908 			m_colorAttachmentView[ndx]	= makeImageView(vk, device, *m_imageColor[ndx],
909 														VK_IMAGE_VIEW_TYPE_2D, m_parameters.imageFormat, imageSubresource);
910 
911 			const Allocation alloc = m_imageBuffer[ndx]->getBoundMemory();
912 			deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferSize));
913 			flushAlloc(vk, device, alloc);
914 		}
915 	}
916 
917 	//Image stencil and depth attachment.
918 	{
919 		m_formatStencilDepthImage = getSupportedStencilFormat(vki, physDevice);
920 
921 		const VkImageAspectFlags		imageDepthStencilAspec	= VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
922 		const VkImageSubresourceRange	imageStencilSubresource	= makeImageSubresourceRange(imageDepthStencilAspec, 0u, 1u, 0u, 1u);
923 		const VkDeviceSize				imageBufferStencilSize	= m_parameters.renderSize.x() *
924 																  m_parameters.renderSize.y() *
925 																  tcu::getPixelSize(mapVkFormat(VK_FORMAT_S8_UINT));
926 		const VkDeviceSize				imageBufferDepthlSize	= m_parameters.renderSize.x() *
927 																  m_parameters.renderSize.y() *
928 																  tcu::getPixelSize(getDepthTextureFormat(m_formatStencilDepthImage));
929 
930 		const VkImageUsageFlags			imageStenciDepthlUsage	= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
931 																  VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
932 		const VkImageCreateInfo			imageInfo				= makeImageCreateInfo(m_formatStencilDepthImage,
933 																					  m_parameters.renderSize, imageStenciDepthlUsage);
934 		const VkBufferCreateInfo		bufferStencilInfo		= makeBufferCreateInfo(imageBufferStencilSize,
935 																					   VK_BUFFER_USAGE_TRANSFER_DST_BIT);
936 		const VkBufferCreateInfo		bufferDepthlInfo		= makeBufferCreateInfo(imageBufferDepthlSize,
937 																					   VK_BUFFER_USAGE_TRANSFER_DST_BIT);
938 
939 		m_imageStencilDepth				= makeImage(vk, device, imageInfo);
940 		m_imageStencilDepthAlloc		= bindImage(vk, device, allocator, *m_imageStencilDepth, MemoryRequirement::Any);
941 
942 		m_imageStencilBuffer			= Buffer::createAndAlloc(vk, device, bufferStencilInfo,
943 																 allocator, MemoryRequirement::HostVisible);
944 		m_imageDepthBuffer				= Buffer::createAndAlloc(vk, device, bufferDepthlInfo,
945 																 allocator, MemoryRequirement::HostVisible);
946 		m_stencilDepthAttachmentView	= makeImageView(vk, device, *m_imageStencilDepth,
947 														VK_IMAGE_VIEW_TYPE_2D, m_formatStencilDepthImage, imageStencilSubresource);
948 
949 		const Allocation alloc = m_imageStencilBuffer->getBoundMemory();
950 		deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferStencilSize));
951 		flushAlloc(vk, device, alloc);
952 
953 		const Allocation allocDepth = m_imageDepthBuffer->getBoundMemory();
954 		deMemset(allocDepth.getHostPtr(), 0, static_cast<std::size_t>(imageBufferDepthlSize));
955 		flushAlloc(vk, device, allocDepth);
956 	}
957 
958 	m_pipelineLayout		= makePipelineLayout(vk, device);
959 	m_vertexModule			= createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0u);
960 	m_fragmentModule		= createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0u);
961 
962 	for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
963 	{
964 		m_referenceImages.push_back(generateColroImage(mapVkFormat(m_parameters.imageFormat),
965 			m_parameters.renderSize, ndx));
966 	}
967 
968 	m_referenceImages.push_back(generateDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
969 		m_parameters.renderSize));
970 
971 	m_referenceImages.push_back(generateStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
972 		m_parameters.renderSize));
973 }
974 
createCmdBuffer(void)975 void DynamicRenderingTestInstance::createCmdBuffer (void)
976 {
977 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
978 	const VkDevice			device	= m_context.getDevice();
979 
980 	m_cmdPool	= createCommandPool(vk, device,
981 									VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
982 									m_context.getUniversalQueueFamilyIndex());
983 	m_cmdBuffer	= allocateCommandBuffer(vk, device, *m_cmdPool,
984 										VK_COMMAND_BUFFER_LEVEL_PRIMARY);
985 }
986 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)987 void DynamicRenderingTestInstance::rendering (const VkPipeline					pipeline,
988 											  const std::vector<VkImageView>&	attachmentBindInfos,
989 											  const deUint32					colorAtchCount,
990 											  ImagesLayout&						imagesLayout,
991 											  const ImagesFormat&				imagesFormat)
992 {
993 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
994 	const VkDevice			device	= m_context.getDevice();
995 	const VkQueue			queue	= m_context.getUniversalQueue();
996 
997 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
998 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
999 	{
1000 
1001 		beginCommandBuffer(vk, *m_cmdBuffer);
1002 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
1003 
1004 		beginRendering(*m_cmdBuffer,
1005 					   attachmentBindInfos,
1006 					   0,
1007 					   colorAtchCount,
1008 					   imagesFormat,
1009 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1010 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1011 
1012 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1013 
1014 		{
1015 			const VkBuffer vertexBuffer = m_vertexBuffer->object();
1016 			const VkDeviceSize vertexBufferOffset = 0ull;
1017 			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1018 		}
1019 
1020 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1021 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1022 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
1023 
1024 		vk.cmdEndRendering(*m_cmdBuffer);
1025 
1026 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1027 
1028 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1029 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1030 
1031 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1032 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1033 		{
1034 			verifyResults(colorAtchCount, imagesFormat);
1035 
1036 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1037 
1038 			beginCommandBuffer(vk, *m_cmdBuffer);
1039 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
1040 
1041 			beginRendering(*m_cmdBuffer,
1042 						   attachmentBindInfos,
1043 						   0,
1044 						   colorAtchCount,
1045 						   imagesFormat,
1046 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1047 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1048 
1049 			if (clearData.colorDepthClear1.size() != 0)
1050 			{
1051 				vk.cmdClearAttachments(*m_cmdBuffer,
1052 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
1053 										clearData.colorDepthClear1.data(),
1054 										1, &clearData.rectColorDepth1);
1055 			}
1056 
1057 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1058 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1059 
1060 			if (clearData.colorDepthClear2.size() != 0)
1061 			{
1062 				vk.cmdClearAttachments(*m_cmdBuffer,
1063 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
1064 										clearData.colorDepthClear2.data(),
1065 										1, &clearData.rectColorDepth2);
1066 			}
1067 
1068 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1069 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1070 
1071 			vk.cmdEndRendering(*m_cmdBuffer);
1072 
1073 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1074 
1075 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1076 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1077 
1078 			verifyResults(colorAtchCount, imagesFormat);
1079 		}
1080 	}
1081 }
1082 
preBarier(const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1083 void DynamicRenderingTestInstance::preBarier (const deUint32		colorAtchCount,
1084 											  ImagesLayout&			imagesLayout,
1085 											  const ImagesFormat&	imagesFormat)
1086 {
1087 	const DeviceInterface&	vk = m_context.getDeviceInterface();
1088 
1089 	std::vector<VkImageMemoryBarrier> barriers;
1090 
1091 	for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
1092 	{
1093 		const VkImageSubresourceRange	subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1094 		const VkImageMemoryBarrier		barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1095 																		 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
1096 																		 imagesLayout.oldColors[ndx],
1097 																		 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1098 																		 *m_imageColor[ndx],
1099 																		 subresource);
1100 		barriers.push_back(barrier);
1101 		imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
1102 	}
1103 
1104 	if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1105 	{
1106 		const VkImageSubresourceRange	subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u);
1107 		const VkImageMemoryBarrier		barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1108 																		 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
1109 																		 imagesLayout.oldDepth,
1110 																		 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1111 																		 *m_imageStencilDepth,
1112 																		 subresource);
1113 		imagesLayout.oldDepth = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
1114 		barriers.push_back(barrier);
1115 	}
1116 
1117 	if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1118 	{
1119 		const VkImageSubresourceRange	subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u);
1120 		const VkImageMemoryBarrier		barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1121 																		 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
1122 																		 imagesLayout.oldStencil,
1123 																		 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1124 																		 *m_imageStencilDepth,
1125 																		 subresource);
1126 		imagesLayout.oldStencil = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
1127 		barriers.push_back(barrier);
1128 	}
1129 
1130 	cmdPipelineImageMemoryBarrier(vk,
1131 								  *m_cmdBuffer,
1132 								  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
1133 								  VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1134 								  VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
1135 								  barriers.data(),
1136 								  barriers.size());
1137 }
1138 
beginRendering(VkCommandBuffer cmdBuffer,const std::vector<VkImageView> & attachmentBindInfos,const VkRenderingFlagsKHR flags,const deUint32 colorAtchCount,const ImagesFormat & imagesFormat,const VkAttachmentLoadOp loadOp,const VkAttachmentStoreOp storeOp)1139 void DynamicRenderingTestInstance::beginRendering (VkCommandBuffer					cmdBuffer,
1140 												   const std::vector<VkImageView>&	attachmentBindInfos,
1141 												   const VkRenderingFlagsKHR			flags,
1142 												   const deUint32					colorAtchCount,
1143 												   const ImagesFormat&				imagesFormat,
1144 												   const VkAttachmentLoadOp			loadOp,
1145 												   const VkAttachmentStoreOp			storeOp)
1146 {
1147 	const DeviceInterface&	vk			= m_context.getDeviceInterface();
1148 	const VkClearValue		clearValue	= makeClearValueColor(m_parameters.clearColor);
1149 	const VkRect2D			renderArea	=
1150 	{
1151 		makeOffset2D(0, 0),
1152 		makeExtent2D(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1153 	};
1154 
1155 	std::vector<VkRenderingAttachmentInfoKHR>	attachments;
1156 
1157 	for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
1158 	{
1159 		const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1160 		{
1161 			VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,	// VkStructureType			sType;
1162 			DE_NULL,											// const void*				pNext;
1163 			attachmentBindInfos[ndx],							// VkImageView				imageView;
1164 			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout			imageLayout;
1165 			VK_RESOLVE_MODE_NONE,								// VkResolveModeFlagBits	resolveMode;
1166 			VK_NULL_HANDLE,										// VkImageView				resolveImageView;
1167 			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			resolveImageLayout;
1168 			loadOp,												// VkAttachmentLoadOp		loadOp;
1169 			storeOp,											// VkAttachmentStoreOp		storeOp;
1170 			clearValue,											// VkClearValue				clearValue;
1171 		};
1172 
1173 		attachments.push_back(renderingAtachInfo);
1174 	}
1175 
1176 	if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1177 	{
1178 		const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1179 		{
1180 			VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,	// VkStructureType			sType;
1181 			DE_NULL,											// const void*				pNext;
1182 			attachmentBindInfos[colorAtchCount],				// VkImageView				imageView;
1183 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout			imageLayout;
1184 			VK_RESOLVE_MODE_NONE,								// VkResolveModeFlagBits	resolveMode;
1185 			VK_NULL_HANDLE,										// VkImageView				resolveImageView;
1186 			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			resolveImageLayout;
1187 			loadOp,												// VkAttachmentLoadOp		loadOp;
1188 			storeOp,											// VkAttachmentStoreOp		storeOp;
1189 			clearValue,											// VkClearValue				clearValue;
1190 		};
1191 
1192 		attachments.push_back(renderingAtachInfo);
1193 	}
1194 
1195 	const deUint32 stencilNdx = colorAtchCount + ((imagesFormat.depth != VK_FORMAT_UNDEFINED) ? 1 : 0);
1196 
1197 	if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1198 	{
1199 		const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1200 		{
1201 			VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,	// VkStructureType			sType;
1202 			DE_NULL,											// const void*				pNext;
1203 			attachmentBindInfos[stencilNdx],					// VkImageView				imageView;
1204 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout			imageLayout;
1205 			VK_RESOLVE_MODE_NONE,								// VkResolveModeFlagBits	resolveMode;
1206 			VK_NULL_HANDLE,										// VkImageView				resolveImageView;
1207 			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			resolveImageLayout;
1208 			loadOp,												// VkAttachmentLoadOp		loadOp;
1209 			storeOp,											// VkAttachmentStoreOp		storeOp;
1210 			clearValue,											// VkClearValue				clearValue;
1211 		};
1212 
1213 		attachments.push_back(renderingAtachInfo);
1214 	}
1215 
1216 	const VkRenderingInfoKHR renderingInfo =
1217 	{
1218 		VK_STRUCTURE_TYPE_RENDERING_INFO_KHR,					// VkStructureType						sType;
1219 		DE_NULL,												// const void*							pNext;
1220 		flags,													// VkRenderingFlagsKHR					flags;
1221 		renderArea,												// VkRect2D								renderArea;
1222 		1u,														// deUint32								layerCount;
1223 		0u,														// deUint32								viewMask;
1224 		colorAtchCount,											// deUint32								colorAttachmentCount;
1225 		((colorAtchCount != 0) ? attachments.data() : DE_NULL),	// const VkRenderingAttachmentInfoKHR*	pColorAttachments;
1226 		((imagesFormat.depth != VK_FORMAT_UNDEFINED) ?
1227 			&attachments[colorAtchCount] :
1228 			DE_NULL),											// const VkRenderingAttachmentInfoKHR*	pDepthAttachment;
1229 		((imagesFormat.stencil != VK_FORMAT_UNDEFINED) ?
1230 			&attachments[stencilNdx] :
1231 			DE_NULL),											// const VkRenderingAttachmentInfoKHR*	pStencilAttachment;
1232 	};
1233 
1234 	vk.cmdBeginRendering(cmdBuffer, &renderingInfo);
1235 }
1236 
copyImgToBuff(VkCommandBuffer commandBuffer,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1237 void DynamicRenderingTestInstance::copyImgToBuff (VkCommandBuffer		commandBuffer,
1238 												  const deUint32		colorAtchCount,
1239 												  ImagesLayout&			imagesLayout,
1240 												  const ImagesFormat&	imagesFormat)
1241 {
1242 	const DeviceInterface&	vk = m_context.getDeviceInterface();
1243 
1244 	if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
1245 	{
1246 		for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
1247 		{
1248 			vk::copyImageToBuffer(vk, commandBuffer, *m_imageColor[ndx], m_imageBuffer[ndx]->object(),
1249 								  tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1250 								  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, imagesLayout.oldColors[ndx], 1u,
1251 								  VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_COLOR_BIT);
1252 			imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1253 		}
1254 	}
1255 	if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1256 	{
1257 		copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageDepthBuffer->object(),
1258 						  tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1259 						  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldDepth,
1260 						  1u, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT);
1261 		imagesLayout.oldDepth = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1262 	}
1263 	if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1264 	{
1265 		copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageStencilBuffer->object(),
1266 						  tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1267 						  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldStencil,
1268 						  1u, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_ASPECT_STENCIL_BIT);
1269 		imagesLayout.oldStencil = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1270 	}
1271 }
1272 
verifyResults(const deUint32 colorAtchCount,const ImagesFormat & imagesFormat)1273 void	DynamicRenderingTestInstance::verifyResults (const deUint32			colorAtchCount,
1274 													 const ImagesFormat&	imagesFormat)
1275 {
1276 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1277 	const VkDevice			device	= m_context.getDevice();
1278 	tcu::TestLog&			log		= m_context.getTestContext().getLog();
1279 
1280 	if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
1281 	{
1282 		for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
1283 		{
1284 			const Allocation allocColor = m_imageBuffer[ndx]->getBoundMemory();
1285 			invalidateAlloc(vk, device, allocColor);
1286 			const tcu::ConstPixelBufferAccess	resultColorImage(mapVkFormat(m_parameters.imageFormat), m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u, allocColor.getHostPtr());
1287 
1288 			if (!tcu::floatThresholdCompare(log, "Compare Color Image", "Result comparison",
1289 				m_referenceImages[ndx].getAccess(), resultColorImage,
1290 				Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
1291 			{
1292 				TCU_FAIL("Rendered color image is not correct");
1293 			}
1294 		}
1295 	}
1296 
1297 	if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1298 	{
1299 		const Allocation			allocDepth = m_imageDepthBuffer->getBoundMemory();
1300 		invalidateAlloc(vk, device, allocDepth);
1301 
1302 		const tcu::ConstPixelBufferAccess	resultDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
1303 															 m_parameters.renderSize.x(),
1304 															 m_parameters.renderSize.y(),
1305 															 1u, allocDepth.getHostPtr());
1306 		if (m_formatStencilDepthImage == VK_FORMAT_D24_UNORM_S8_UINT)
1307 		{
1308 			de::MovePtr<tcu::TextureLevel>	result(new tcu::TextureLevel(mapVkFormat(m_formatStencilDepthImage),
1309 														m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u));
1310 			tcu::copy(tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH), resultDepthImage);
1311 
1312 			const tcu::ConstPixelBufferAccess	depthResult		= tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH);
1313 			const tcu::ConstPixelBufferAccess	expectedResult	= tcu::getEffectiveDepthStencilAccess(m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), tcu::Sampler::MODE_DEPTH);
1314 
1315 			if (!tcu::intThresholdCompare(log, "Compare Depth Image", "Result comparison",
1316 				expectedResult, depthResult,UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
1317 			{
1318 				TCU_FAIL("Rendered depth image is not correct");
1319 			}
1320 		}
1321 		else
1322 		{
1323 			if (!tcu::floatThresholdCompare(log, "Compare Depth Image", "Result comparison",
1324 				m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), resultDepthImage,
1325 				Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
1326 			{
1327 				TCU_FAIL("Rendered depth image is not correct");
1328 			}
1329 		}
1330 	}
1331 
1332 	if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1333 	{
1334 		const Allocation allocStencil = m_imageStencilBuffer->getBoundMemory();
1335 		invalidateAlloc(vk, device, allocStencil);
1336 		const tcu::ConstPixelBufferAccess	resultStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
1337 															   m_parameters.renderSize.x(),
1338 															   m_parameters.renderSize.y(),
1339 															   1u, allocStencil.getHostPtr());
1340 
1341 		if (!tcu::intThresholdCompare(log, "Compare Stencil Image", "Result comparison",
1342 			m_referenceImages[COLOR_ATTACHMENTS_NUMBER + 1].getAccess(), resultStencilImage,
1343 			UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
1344 		{
1345 			TCU_FAIL("Rendered stencil image is not correct");
1346 		}
1347 	}
1348 }
1349 
1350 class SingleCmdBufferResuming : public DynamicRenderingTestInstance
1351 {
1352 public:
1353 			SingleCmdBufferResuming	(Context&							context,
1354 									 const TestParameters&				parameters);
1355 protected:
1356 	void	rendering				(const VkPipeline					pipeline,
1357 									 const std::vector<VkImageView>&	attachmentBindInfos,
1358 									 const deUint32						colorAtchCount,
1359 									 ImagesLayout&						imagesLayout,
1360 									 const ImagesFormat&				imagesFormat) override;
1361 };
1362 
SingleCmdBufferResuming(Context & context,const TestParameters & parameters)1363 SingleCmdBufferResuming::SingleCmdBufferResuming (Context&				context,
1364 													const TestParameters&	parameters)
1365 	: DynamicRenderingTestInstance(context, parameters)
1366 {
1367 }
1368 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1369 void	SingleCmdBufferResuming::rendering (const VkPipeline				pipeline,
1370 											const std::vector<VkImageView>&	attachmentBindInfos,
1371 											const deUint32					colorAtchCount,
1372 											ImagesLayout&					imagesLayout,
1373 											const ImagesFormat&				imagesFormat)
1374 {
1375 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1376 	const VkDevice			device	= m_context.getDevice();
1377 	const VkQueue			queue	= m_context.getUniversalQueue();
1378 
1379 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
1380 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1381 	{
1382 		beginCommandBuffer(vk, *m_cmdBuffer);
1383 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
1384 
1385 		beginRendering(*m_cmdBuffer,
1386 					   attachmentBindInfos,
1387 					   VK_RENDERING_SUSPENDING_BIT_KHR,
1388 					   colorAtchCount,
1389 					   imagesFormat,
1390 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1391 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1392 
1393 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1394 
1395 		{
1396 			const VkBuffer vertexBuffer = m_vertexBuffer->object();
1397 			const VkDeviceSize vertexBufferOffset = 0ull;
1398 			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1399 		}
1400 
1401 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1402 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1403 		vk.cmdEndRendering(*m_cmdBuffer);
1404 
1405 		beginRendering(*m_cmdBuffer,
1406 					   attachmentBindInfos,
1407 					   VK_RENDERING_RESUMING_BIT_KHR,
1408 					   colorAtchCount,
1409 					   imagesFormat,
1410 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1411 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1412 
1413 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
1414 
1415 		vk.cmdEndRendering(*m_cmdBuffer);
1416 
1417 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1418 
1419 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1420 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1421 
1422 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1423 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1424 		{
1425 			verifyResults(colorAtchCount, imagesFormat);
1426 
1427 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1428 
1429 			beginCommandBuffer(vk, *m_cmdBuffer);
1430 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
1431 
1432 			beginRendering(*m_cmdBuffer,
1433 						   attachmentBindInfos,
1434 						   VK_RENDERING_SUSPENDING_BIT_KHR,
1435 						   colorAtchCount,
1436 						   imagesFormat,
1437 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1438 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1439 
1440 			if (clearData.colorDepthClear1.size() != 0)
1441 			{
1442 				vk.cmdClearAttachments(*m_cmdBuffer,
1443 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
1444 										clearData.colorDepthClear1.data(),
1445 										1, &clearData.rectColorDepth1);
1446 			}
1447 
1448 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1449 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1450 
1451 			vk.cmdEndRendering(*m_cmdBuffer);
1452 
1453 			beginRendering(*m_cmdBuffer,
1454 						   attachmentBindInfos,
1455 						   VK_RENDERING_RESUMING_BIT_KHR,
1456 						   colorAtchCount,
1457 						   imagesFormat,
1458 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1459 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1460 
1461 			if (clearData.colorDepthClear2.size() != 0)
1462 			{
1463 				vk.cmdClearAttachments(*m_cmdBuffer,
1464 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
1465 										clearData.colorDepthClear2.data(),
1466 										1, &clearData.rectColorDepth2);
1467 			}
1468 
1469 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1470 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1471 
1472 			vk.cmdEndRendering(*m_cmdBuffer);
1473 
1474 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1475 
1476 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1477 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1478 
1479 			verifyResults(colorAtchCount, imagesFormat);
1480 		}
1481 	}
1482 }
1483 
1484 class TwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
1485 {
1486 public:
1487 			TwoPrimaryCmdBufferResuming	(Context&							context,
1488 										 const TestParameters&				parameters);
1489 protected:
1490 	void	rendering					(const VkPipeline					pipeline,
1491 										 const std::vector<VkImageView>&	attachmentBindInfos,
1492 										 const deUint32						colorAtchCount,
1493 										 ImagesLayout&						imagesLayout,
1494 										 const ImagesFormat&				imagesFormat) override;
1495 
1496 	Move<VkCommandBuffer>	m_cmdBuffer2;
1497 };
1498 
TwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)1499 TwoPrimaryCmdBufferResuming::TwoPrimaryCmdBufferResuming (Context&				context,
1500 														  const TestParameters&	parameters)
1501 	: DynamicRenderingTestInstance(context, parameters)
1502 {
1503 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1504 	const VkDevice			device	= m_context.getDevice();
1505 
1506 	m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
1507 }
1508 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1509 void	TwoPrimaryCmdBufferResuming::rendering (const VkPipeline				pipeline,
1510 												const std::vector<VkImageView>&	attachmentBindInfos,
1511 												const deUint32					colorAtchCount,
1512 												ImagesLayout&					imagesLayout,
1513 												const ImagesFormat&				imagesFormat)
1514 {
1515 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1516 	const VkDevice			device	= m_context.getDevice();
1517 	const VkQueue			queue	= m_context.getUniversalQueue();
1518 
1519 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
1520 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1521 	{
1522 		// First Primary CommandBuffer
1523 		beginCommandBuffer(vk, *m_cmdBuffer);
1524 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
1525 
1526 		beginRendering(*m_cmdBuffer,
1527 					   attachmentBindInfos,
1528 					   VK_RENDERING_SUSPENDING_BIT_KHR,
1529 					   colorAtchCount,
1530 					   imagesFormat,
1531 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1532 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1533 
1534 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1535 
1536 		{
1537 			const VkBuffer vertexBuffer = m_vertexBuffer->object();
1538 			const VkDeviceSize vertexBufferOffset = 0ull;
1539 			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1540 		}
1541 
1542 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1543 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1544 
1545 		vk.cmdEndRendering(*m_cmdBuffer);
1546 
1547 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1548 
1549 		// Second Primary CommandBuffer
1550 		beginCommandBuffer(vk, *m_cmdBuffer2);
1551 
1552 		beginRendering(*m_cmdBuffer2,
1553 					   attachmentBindInfos,
1554 					   VK_RENDERING_RESUMING_BIT_KHR,
1555 					   colorAtchCount,
1556 					   imagesFormat,
1557 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1558 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1559 
1560 		vk.cmdBindPipeline(*m_cmdBuffer2, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1561 
1562 		{
1563 			const VkBuffer vertexBuffer = m_vertexBuffer->object();
1564 			const VkDeviceSize vertexBufferOffset = 0ull;
1565 			vk.cmdBindVertexBuffers(*m_cmdBuffer2, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1566 		}
1567 
1568 		vk.cmdDraw(*m_cmdBuffer2, 4u, 1u, 4u, 0u);
1569 
1570 		vk.cmdEndRendering(*m_cmdBuffer2);
1571 
1572 		copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1573 
1574 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1575 
1576 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1577 
1578 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1579 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1580 		{
1581 			verifyResults(colorAtchCount, imagesFormat);
1582 
1583 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1584 
1585 			// First Primary CommandBuffer
1586 			beginCommandBuffer(vk, *m_cmdBuffer);
1587 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
1588 
1589 			beginRendering(*m_cmdBuffer,
1590 						   attachmentBindInfos,
1591 						   VK_RENDERING_SUSPENDING_BIT_KHR,
1592 						   colorAtchCount,
1593 						   imagesFormat,
1594 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1595 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1596 
1597 			if (clearData.colorDepthClear1.size() != 0)
1598 			{
1599 				vk.cmdClearAttachments(*m_cmdBuffer,
1600 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
1601 										clearData.colorDepthClear1.data(),
1602 										1, &clearData.rectColorDepth1);
1603 			}
1604 
1605 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1606 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1607 
1608 			vk.cmdEndRendering(*m_cmdBuffer);
1609 
1610 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1611 
1612 			// Second Primary CommandBuffer
1613 			beginCommandBuffer(vk, *m_cmdBuffer2);
1614 
1615 			beginRendering(*m_cmdBuffer2,
1616 						   attachmentBindInfos,
1617 						   VK_RENDERING_RESUMING_BIT_KHR,
1618 						   colorAtchCount,
1619 						   imagesFormat,
1620 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1621 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1622 
1623 			if (clearData.colorDepthClear2.size() != 0)
1624 			{
1625 				vk.cmdClearAttachments(*m_cmdBuffer2,
1626 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
1627 										clearData.colorDepthClear2.data(),
1628 										1, &clearData.rectColorDepth2);
1629 			}
1630 
1631 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1632 				vk.cmdClearAttachments(*m_cmdBuffer2, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1633 
1634 			vk.cmdEndRendering(*m_cmdBuffer2);
1635 
1636 			copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1637 
1638 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1639 
1640 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1641 
1642 			verifyResults(colorAtchCount, imagesFormat);
1643 		}
1644 	}
1645 }
1646 
1647 class TwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
1648 {
1649 public:
1650 			TwoSecondaryCmdBufferResuming	(Context&							context,
1651 											 const TestParameters&				parameters);
1652 protected:
1653 	void	rendering						(const VkPipeline					pipeline,
1654 											 const std::vector<VkImageView>&	attachmentBindInfos,
1655 											 const deUint32						colorAtchCount,
1656 											 ImagesLayout&						imagesLayout,
1657 											 const ImagesFormat&				imagesFormat) override;
1658 
1659 	Move<VkCommandBuffer>	m_secCmdBuffers[2];
1660 };
1661 
TwoSecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)1662 TwoSecondaryCmdBufferResuming::TwoSecondaryCmdBufferResuming (Context&				context,
1663 															  const TestParameters&	parameters)
1664 	: DynamicRenderingTestInstance(context, parameters)
1665 {
1666 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1667 	const VkDevice			device	= m_context.getDevice();
1668 
1669 	m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1670 	m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1671 }
1672 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1673 void	TwoSecondaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
1674 												  const std::vector<VkImageView>&	attachmentBindInfos,
1675 												  const deUint32					colorAtchCount,
1676 												  ImagesLayout&						imagesLayout,
1677 												  const ImagesFormat&				imagesFormat)
1678 {
1679 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1680 	const VkDevice			device	= m_context.getDevice();
1681 	const VkQueue			queue	= m_context.getUniversalQueue();
1682 
1683 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
1684 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1685 	{
1686 		VkCommandBuffer		secCmdBuffers[2]	= {
1687 													*(m_secCmdBuffers[0]),
1688 													*(m_secCmdBuffers[1])
1689 												  };
1690 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
1691 		const VkDeviceSize	vertexBufferOffset	= 0ull;
1692 
1693 		// secCmdBuffersFirst
1694 		beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1695 
1696 		beginRendering(secCmdBuffers[0],
1697 					   attachmentBindInfos,
1698 					   VK_RENDERING_SUSPENDING_BIT_KHR,
1699 					   colorAtchCount,
1700 					   imagesFormat,
1701 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1702 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1703 
1704 		vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1705 		vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1706 
1707 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
1708 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
1709 
1710 		vk.cmdEndRendering(secCmdBuffers[0]);
1711 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1712 
1713 		// secCmdBuffersSecond
1714 		beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1715 
1716 		beginRendering(secCmdBuffers[1],
1717 					   attachmentBindInfos,
1718 					   VK_RENDERING_RESUMING_BIT_KHR,
1719 					   colorAtchCount,
1720 					   imagesFormat,
1721 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1722 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1723 
1724 		vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1725 		vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1726 
1727 		vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
1728 
1729 		vk.cmdEndRendering(secCmdBuffers[1]);
1730 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1731 
1732 		// Primary commandBuffer
1733 		beginCommandBuffer(vk, *m_cmdBuffer);
1734 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
1735 
1736 		vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
1737 
1738 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1739 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1740 
1741 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1742 
1743 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1744 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1745 		{
1746 			verifyResults(colorAtchCount, imagesFormat);
1747 
1748 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1749 
1750 		// secCmdBuffersFirst
1751 			beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1752 
1753 			beginRendering(secCmdBuffers[0],
1754 						   attachmentBindInfos,
1755 						   VK_RENDERING_SUSPENDING_BIT_KHR,
1756 						   colorAtchCount,
1757 						   imagesFormat,
1758 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1759 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1760 
1761 			if (clearData.colorDepthClear1.size() != 0)
1762 			{
1763 				vk.cmdClearAttachments(secCmdBuffers[0],
1764 									   static_cast<deUint32>(clearData.colorDepthClear1.size()),
1765 									   clearData.colorDepthClear1.data(),
1766 									   1, &clearData.rectColorDepth1);
1767 			}
1768 
1769 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1770 				vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1771 
1772 			vk.cmdEndRendering(secCmdBuffers[0]);
1773 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1774 
1775 			// secCmdBuffersSecond
1776 			beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1777 
1778 			beginRendering(secCmdBuffers[1],
1779 						   attachmentBindInfos,
1780 						   VK_RENDERING_RESUMING_BIT_KHR,
1781 						   colorAtchCount,
1782 						   imagesFormat,
1783 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1784 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1785 
1786 			if (clearData.colorDepthClear2.size() != 0)
1787 			{
1788 				vk.cmdClearAttachments(secCmdBuffers[1],
1789 									   static_cast<deUint32>(clearData.colorDepthClear2.size()),
1790 									   clearData.colorDepthClear2.data(),
1791 									   1, &clearData.rectColorDepth2);
1792 			}
1793 
1794 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1795 				vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1796 
1797 			vk.cmdEndRendering(secCmdBuffers[1]);
1798 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1799 
1800 			// Primary commandBuffer
1801 			beginCommandBuffer(vk, *m_cmdBuffer);
1802 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
1803 
1804 			vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
1805 
1806 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1807 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1808 
1809 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1810 
1811 			verifyResults(colorAtchCount, imagesFormat);
1812 		}
1813 	}
1814 }
1815 
1816 class TwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
1817 {
1818 public:
1819 			TwoSecondaryTwoPrimaryCmdBufferResuming	(Context&							context,
1820 													 const TestParameters&				parameters);
1821 protected:
1822 	void	rendering								(const VkPipeline					pipeline,
1823 													 const std::vector<VkImageView>&	attachmentBindInfos,
1824 													 const deUint32						colorAtchCount,
1825 													 ImagesLayout&						imagesLayout,
1826 													 const ImagesFormat&				imagesFormat) override;
1827 
1828 	Move<VkCommandBuffer>	m_cmdBuffer2;
1829 	Move<VkCommandBuffer>	m_secCmdBuffers[2];
1830 };
1831 
TwoSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)1832 TwoSecondaryTwoPrimaryCmdBufferResuming::TwoSecondaryTwoPrimaryCmdBufferResuming (Context&				context,
1833 																				  const TestParameters&	parameters)
1834 	: DynamicRenderingTestInstance(context, parameters)
1835 {
1836 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1837 	const VkDevice			device	= m_context.getDevice();
1838 
1839 	m_cmdBuffer2		= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
1840 	m_secCmdBuffers[0]	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1841 	m_secCmdBuffers[1]	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1842 }
1843 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1844 void	TwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline				pipeline,
1845 															const std::vector<VkImageView>&	attachmentBindInfos,
1846 															const deUint32					colorAtchCount,
1847 															ImagesLayout&					imagesLayout,
1848 															const ImagesFormat&				imagesFormat)
1849 {
1850 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
1851 	const VkDevice			device	= m_context.getDevice();
1852 	const VkQueue			queue	= m_context.getUniversalQueue();
1853 
1854 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
1855 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1856 	{
1857 		VkCommandBuffer		secCmdBuffers[2]	= {
1858 													*(m_secCmdBuffers[0]),
1859 													*(m_secCmdBuffers[1])
1860 												  };
1861 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
1862 		const VkDeviceSize	vertexBufferOffset	= 0ull;
1863 
1864 		// secCmdBuffersFirst
1865 		beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1866 
1867 		beginRendering(secCmdBuffers[0],
1868 					   attachmentBindInfos,
1869 					   VK_RENDERING_SUSPENDING_BIT_KHR,
1870 					   colorAtchCount,
1871 					   imagesFormat,
1872 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1873 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1874 
1875 		vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1876 		vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1877 
1878 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
1879 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
1880 
1881 		vk.cmdEndRendering(secCmdBuffers[0]);
1882 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1883 
1884 
1885 		// secCmdBuffersSecond
1886 		beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1887 
1888 		beginRendering(secCmdBuffers[1],
1889 					   attachmentBindInfos,
1890 					   VK_RENDERING_RESUMING_BIT_KHR,
1891 					   colorAtchCount,
1892 					   imagesFormat,
1893 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1894 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1895 
1896 		vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1897 		vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1898 
1899 		vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
1900 
1901 		vk.cmdEndRendering(secCmdBuffers[1]);
1902 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1903 
1904 		// Primary commandBuffer
1905 		beginCommandBuffer(vk, *m_cmdBuffer);
1906 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
1907 
1908 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
1909 
1910 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1911 
1912 		// Primary commandBuffer2
1913 		beginCommandBuffer(vk, *m_cmdBuffer2);
1914 
1915 		vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
1916 
1917 		copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1918 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1919 
1920 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1921 
1922 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1923 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1924 		{
1925 			verifyResults(colorAtchCount, imagesFormat);
1926 
1927 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1928 
1929 			// secCmdBuffersFirst
1930 			beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1931 
1932 			beginRendering(secCmdBuffers[0],
1933 						   attachmentBindInfos,
1934 						   VK_RENDERING_SUSPENDING_BIT_KHR,
1935 						   colorAtchCount,
1936 						   imagesFormat,
1937 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1938 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1939 
1940 			if (clearData.colorDepthClear1.size() != 0)
1941 			{
1942 				vk.cmdClearAttachments(secCmdBuffers[0],
1943 									   static_cast<deUint32>(clearData.colorDepthClear1.size()),
1944 									   clearData.colorDepthClear1.data(),
1945 									   1, &clearData.rectColorDepth1);
1946 			}
1947 
1948 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1949 				vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1950 
1951 			vk.cmdEndRendering(secCmdBuffers[0]);
1952 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1953 
1954 			// secCmdBuffersSecond
1955 			beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1956 
1957 			beginRendering(secCmdBuffers[1],
1958 						   attachmentBindInfos,
1959 						   VK_RENDERING_RESUMING_BIT_KHR,
1960 						   colorAtchCount,
1961 						   imagesFormat,
1962 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1963 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1964 
1965 			if (clearData.colorDepthClear2.size() != 0)
1966 			{
1967 				vk.cmdClearAttachments(secCmdBuffers[1],
1968 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
1969 										clearData.colorDepthClear2.data(),
1970 										1, &clearData.rectColorDepth2);
1971 			}
1972 
1973 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1974 				vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1975 
1976 			vk.cmdEndRendering(secCmdBuffers[1]);
1977 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1978 
1979 			// Primary commandBuffer
1980 			beginCommandBuffer(vk, *m_cmdBuffer);
1981 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
1982 
1983 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
1984 
1985 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1986 
1987 			// Primary commandBuffer2
1988 			beginCommandBuffer(vk, *m_cmdBuffer2);
1989 
1990 			vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
1991 
1992 			copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1993 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1994 
1995 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1996 
1997 			verifyResults(colorAtchCount, imagesFormat);
1998 		}
1999 	}
2000 }
2001 
2002 class ContentsSecondaryCmdBuffer : public DynamicRenderingTestInstance
2003 {
2004 public:
2005 			ContentsSecondaryCmdBuffer	(Context&							context,
2006 										 const TestParameters&				parameters);
2007 protected:
2008 	void	rendering					(const VkPipeline					pipeline,
2009 										 const std::vector<VkImageView>&	attachmentBindInfos,
2010 										 const deUint32						colorAtchCount,
2011 										 ImagesLayout&						imagesLayout,
2012 										 const ImagesFormat&				imagesFormat) override;
2013 
2014 	Move<VkCommandBuffer>	m_secCmdBuffers;
2015 };
2016 
ContentsSecondaryCmdBuffer(Context & context,const TestParameters & parameters)2017 ContentsSecondaryCmdBuffer::ContentsSecondaryCmdBuffer (Context&				context,
2018 														const TestParameters&	parameters)
2019 	: DynamicRenderingTestInstance(context, parameters)
2020 {
2021 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2022 	const VkDevice			device	= m_context.getDevice();
2023 
2024 	m_secCmdBuffers	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2025 }
2026 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2027 void	ContentsSecondaryCmdBuffer::rendering (const VkPipeline					pipeline,
2028 											   const std::vector<VkImageView>&	attachmentBindInfos,
2029 											   const deUint32					colorAtchCount,
2030 											   ImagesLayout&					imagesLayout,
2031 											   const ImagesFormat&				imagesFormat)
2032 {
2033 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2034 	const VkDevice			device	= m_context.getDevice();
2035 	const VkQueue			queue	= m_context.getUniversalQueue();
2036 
2037 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2038 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2039 	{
2040 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2041 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2042 
2043 		// secCmdBuffers
2044 		beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2045 
2046 		vk.cmdBindPipeline(*m_secCmdBuffers, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2047 		vk.cmdBindVertexBuffers(*m_secCmdBuffers, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2048 
2049 		vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 8u, 0u);
2050 		vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 0u, 0u);
2051 		vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 4u, 0u);
2052 
2053 		VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
2054 
2055 		// Primary commandBuffer
2056 		beginCommandBuffer(vk, *m_cmdBuffer);
2057 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2058 
2059 		beginRendering(*m_cmdBuffer,
2060 					   attachmentBindInfos,
2061 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2062 					   colorAtchCount,
2063 					   imagesFormat,
2064 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2065 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2066 
2067 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
2068 
2069 		vk.cmdEndRendering(*m_cmdBuffer);
2070 
2071 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2072 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2073 
2074 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2075 
2076 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2077 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2078 		{
2079 			verifyResults(colorAtchCount, imagesFormat);
2080 
2081 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2082 
2083 			// secCmdBuffers
2084 			beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2085 
2086 			if (clearData.colorDepthClear1.size() != 0)
2087 			{
2088 				vk.cmdClearAttachments(*m_secCmdBuffers,
2089 									   static_cast<deUint32>(clearData.colorDepthClear1.size()),
2090 									   clearData.colorDepthClear1.data(),
2091 									   1, &clearData.rectColorDepth1);
2092 			}
2093 
2094 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2095 				vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2096 
2097 			if (clearData.colorDepthClear2.size() != 0)
2098 			{
2099 				vk.cmdClearAttachments(*m_secCmdBuffers,
2100 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2101 										clearData.colorDepthClear2.data(),
2102 										1, &clearData.rectColorDepth2);
2103 			}
2104 
2105 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2106 				vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2107 
2108 			VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
2109 
2110 			// Primary commandBuffer
2111 			beginCommandBuffer(vk, *m_cmdBuffer);
2112 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2113 
2114 			beginRendering(*m_cmdBuffer,
2115 						   attachmentBindInfos,
2116 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2117 						   colorAtchCount,
2118 						   imagesFormat,
2119 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2120 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2121 
2122 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
2123 
2124 			vk.cmdEndRendering(*m_cmdBuffer);
2125 
2126 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2127 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2128 
2129 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2130 
2131 			verifyResults(colorAtchCount, imagesFormat);
2132 		}
2133 	}
2134 }
2135 
2136 class ContentsTwoSecondaryCmdBuffer : public DynamicRenderingTestInstance
2137 {
2138 public:
2139 			ContentsTwoSecondaryCmdBuffer		(Context&							context,
2140 												 const TestParameters&				parameters);
2141 protected:
2142 	void	rendering							(const VkPipeline					pipeline,
2143 												 const std::vector<VkImageView>&	attachmentBindInfos,
2144 												 const deUint32						colorAtchCount,
2145 												 ImagesLayout&						imagesLayout,
2146 												 const ImagesFormat&				imagesFormat) override;
2147 
2148 	Move<VkCommandBuffer>	m_secCmdBuffers[2];
2149 };
2150 
ContentsTwoSecondaryCmdBuffer(Context & context,const TestParameters & parameters)2151 ContentsTwoSecondaryCmdBuffer::ContentsTwoSecondaryCmdBuffer (Context&				context,
2152 															  const TestParameters&	parameters)
2153 	: DynamicRenderingTestInstance(context, parameters)
2154 {
2155 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2156 	const VkDevice			device	= m_context.getDevice();
2157 
2158 	m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2159 	m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2160 }
2161 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2162 void	ContentsTwoSecondaryCmdBuffer::rendering (const VkPipeline					pipeline,
2163 												  const std::vector<VkImageView>&	attachmentBindInfos,
2164 												  const deUint32					colorAtchCount,
2165 												  ImagesLayout&						imagesLayout,
2166 												  const ImagesFormat&				imagesFormat)
2167 {
2168 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2169 	const VkDevice			device	= m_context.getDevice();
2170 	const VkQueue			queue	= m_context.getUniversalQueue();
2171 
2172 	VkCommandBuffer		secCmdBuffers[2] = {
2173 												*(m_secCmdBuffers[0]),
2174 												*(m_secCmdBuffers[1])
2175 											};
2176 
2177 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2178 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2179 	{
2180 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2181 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2182 
2183 		// secCmdBuffers
2184 		beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2185 
2186 		vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2187 		vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2188 
2189 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2190 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2191 
2192 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2193 
2194 		// secCmdBuffers2
2195 		beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2196 
2197 		vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2198 		vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2199 
2200 		vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2201 
2202 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2203 
2204 		// Primary commandBuffer
2205 		beginCommandBuffer(vk, *m_cmdBuffer);
2206 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2207 
2208 		beginRendering(*m_cmdBuffer,
2209 					   attachmentBindInfos,
2210 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2211 					   colorAtchCount,
2212 					   imagesFormat,
2213 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2214 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2215 
2216 		vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
2217 
2218 		vk.cmdEndRendering(*m_cmdBuffer);
2219 
2220 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2221 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2222 
2223 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2224 
2225 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2226 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2227 		{
2228 			verifyResults(colorAtchCount, imagesFormat);
2229 
2230 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2231 
2232 			// secCmdBuffers
2233 			beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2234 
2235 			if (clearData.colorDepthClear1.size() != 0)
2236 			{
2237 				vk.cmdClearAttachments(secCmdBuffers[0],
2238 									   static_cast<deUint32>(clearData.colorDepthClear1.size()),
2239 									   clearData.colorDepthClear1.data(),
2240 									   1, &clearData.rectColorDepth1);
2241 			}
2242 
2243 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2244 				vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2245 
2246 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2247 
2248 			// secCmdBuffers2
2249 			beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2250 
2251 			if (clearData.colorDepthClear2.size() != 0)
2252 			{
2253 				vk.cmdClearAttachments(secCmdBuffers[1],
2254 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2255 										clearData.colorDepthClear2.data(),
2256 										1, &clearData.rectColorDepth2);
2257 			}
2258 
2259 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2260 				vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2261 
2262 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2263 
2264 			// Primary commandBuffer
2265 			beginCommandBuffer(vk, *m_cmdBuffer);
2266 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2267 
2268 			beginRendering(*m_cmdBuffer,
2269 						   attachmentBindInfos,
2270 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2271 						   colorAtchCount,
2272 						   imagesFormat,
2273 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2274 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2275 
2276 			vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
2277 
2278 			vk.cmdEndRendering(*m_cmdBuffer);
2279 
2280 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2281 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2282 
2283 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2284 
2285 			verifyResults(colorAtchCount, imagesFormat);
2286 		}
2287 	}
2288 }
2289 
2290 class ContentsTwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2291 {
2292 public:
2293 			ContentsTwoSecondaryCmdBufferResuming	(Context&							context,
2294 													 const TestParameters&				parameters);
2295 protected:
2296 	void	rendering								(const VkPipeline					pipeline,
2297 													 const std::vector<VkImageView>&	attachmentBindInfos,
2298 													 const deUint32						colorAtchCount,
2299 													 ImagesLayout&						imagesLayout,
2300 													 const ImagesFormat&				imagesFormat) override;
2301 
2302 	Move<VkCommandBuffer>	m_secCmdBuffers[2];
2303 };
2304 
ContentsTwoSecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)2305 ContentsTwoSecondaryCmdBufferResuming::ContentsTwoSecondaryCmdBufferResuming (Context&				context,
2306 																			  const TestParameters&	parameters)
2307 	: DynamicRenderingTestInstance(context, parameters)
2308 {
2309 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2310 	const VkDevice			device	= m_context.getDevice();
2311 
2312 	m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2313 	m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2314 }
2315 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2316 void	ContentsTwoSecondaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
2317 														  const std::vector<VkImageView>&	attachmentBindInfos,
2318 														  const deUint32					colorAtchCount,
2319 														  ImagesLayout&						imagesLayout,
2320 														  const ImagesFormat&				imagesFormat)
2321 {
2322 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2323 	const VkDevice			device	= m_context.getDevice();
2324 	const VkQueue			queue	= m_context.getUniversalQueue();
2325 
2326 	VkCommandBuffer		secCmdBuffers[2] = {
2327 												*(m_secCmdBuffers[0]),
2328 												*(m_secCmdBuffers[1])
2329 											};
2330 
2331 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2332 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2333 	{
2334 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2335 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2336 
2337 		// secCmdBuffers
2338 		beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2339 
2340 		vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2341 		vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2342 
2343 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2344 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2345 
2346 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2347 
2348 		// secCmdBuffers2
2349 		beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2350 
2351 		vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2352 		vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2353 
2354 		vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2355 
2356 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2357 
2358 		// Primary commandBuffer
2359 		beginCommandBuffer(vk, *m_cmdBuffer);
2360 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2361 
2362 		beginRendering(*m_cmdBuffer,
2363 					   attachmentBindInfos,
2364 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2365 					   VK_RENDERING_SUSPENDING_BIT_KHR,
2366 					   colorAtchCount,
2367 					   imagesFormat,
2368 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2369 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2370 
2371 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2372 
2373 		vk.cmdEndRendering(*m_cmdBuffer);
2374 
2375 		beginRendering(*m_cmdBuffer,
2376 					   attachmentBindInfos,
2377 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2378 					   VK_RENDERING_RESUMING_BIT_KHR,
2379 					   colorAtchCount,
2380 					   imagesFormat,
2381 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2382 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2383 
2384 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
2385 
2386 		vk.cmdEndRendering(*m_cmdBuffer);
2387 
2388 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2389 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2390 
2391 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2392 
2393 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2394 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2395 		{
2396 			verifyResults(colorAtchCount, imagesFormat);
2397 
2398 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2399 
2400 			// secCmdBuffers
2401 			beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2402 
2403 			if (clearData.colorDepthClear1.size() != 0)
2404 			{
2405 				vk.cmdClearAttachments(secCmdBuffers[0],
2406 									   static_cast<deUint32>(clearData.colorDepthClear1.size()),
2407 									   clearData.colorDepthClear1.data(),
2408 									   1, &clearData.rectColorDepth1);
2409 			}
2410 
2411 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2412 				vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2413 
2414 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2415 
2416 			// secCmdBuffers2
2417 			beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2418 
2419 			if (clearData.colorDepthClear2.size() != 0)
2420 			{
2421 				vk.cmdClearAttachments(secCmdBuffers[1],
2422 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2423 										clearData.colorDepthClear2.data(),
2424 										1, &clearData.rectColorDepth2);
2425 			}
2426 
2427 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2428 				vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2429 
2430 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2431 
2432 			// Primary commandBuffer
2433 			beginCommandBuffer(vk, *m_cmdBuffer);
2434 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2435 
2436 			beginRendering(*m_cmdBuffer,
2437 						   attachmentBindInfos,
2438 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2439 						   VK_RENDERING_SUSPENDING_BIT_KHR,
2440 						   colorAtchCount,
2441 						   imagesFormat,
2442 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2443 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2444 
2445 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2446 
2447 			vk.cmdEndRendering(*m_cmdBuffer);
2448 
2449 			beginRendering(*m_cmdBuffer,
2450 						   attachmentBindInfos,
2451 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2452 						   VK_RENDERING_RESUMING_BIT_KHR,
2453 						   colorAtchCount,
2454 						   imagesFormat,
2455 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2456 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2457 
2458 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
2459 
2460 			vk.cmdEndRendering(*m_cmdBuffer);
2461 
2462 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2463 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2464 
2465 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2466 
2467 			verifyResults(colorAtchCount, imagesFormat);
2468 		}
2469 	}
2470 }
2471 
2472 class ContentsTwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
2473 {
2474 public:
2475 			ContentsTwoSecondaryTwoPrimaryCmdBufferResuming	(Context&							context,
2476 															 const TestParameters&				parameters);
2477 protected:
2478 	void	rendering										(const VkPipeline					pipeline,
2479 															 const std::vector<VkImageView>&	attachmentBindInfos,
2480 															 const deUint32						colorAtchCount,
2481 															 ImagesLayout&						imagesLayout,
2482 															 const ImagesFormat&				imagesFormat) override;
2483 
2484 	Move<VkCommandBuffer>	m_cmdBuffer2;
2485 	Move<VkCommandBuffer>	m_secCmdBuffers[2];
2486 };
2487 
ContentsTwoSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)2488 ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::ContentsTwoSecondaryTwoPrimaryCmdBufferResuming	(Context&				context,
2489 																									 const TestParameters&	parameters)
2490 	: DynamicRenderingTestInstance(context, parameters)
2491 {
2492 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2493 	const VkDevice			device	= m_context.getDevice();
2494 
2495 	m_cmdBuffer2		= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
2496 	m_secCmdBuffers[0]	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2497 	m_secCmdBuffers[1]	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2498 }
2499 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2500 void	ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline				pipeline,
2501 																	const std::vector<VkImageView>&	attachmentBindInfos,
2502 																	const deUint32					colorAtchCount,
2503 																	ImagesLayout&					imagesLayout,
2504 																	const ImagesFormat&				imagesFormat)
2505 {
2506 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2507 	const VkDevice			device	= m_context.getDevice();
2508 	const VkQueue			queue	= m_context.getUniversalQueue();
2509 
2510 	VkCommandBuffer		secCmdBuffers[2] = {
2511 												*(m_secCmdBuffers[0]),
2512 												*(m_secCmdBuffers[1])
2513 											};
2514 
2515 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2516 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2517 	{
2518 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2519 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2520 
2521 		// secCmdBuffers
2522 		beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2523 
2524 		vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2525 		vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2526 
2527 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2528 		vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2529 
2530 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2531 
2532 		// secCmdBuffers2
2533 		beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2534 
2535 		vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2536 		vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2537 
2538 		vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2539 
2540 		VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2541 
2542 		// Primary commandBuffer
2543 		beginCommandBuffer(vk, *m_cmdBuffer);
2544 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2545 
2546 		beginRendering(*m_cmdBuffer,
2547 					   attachmentBindInfos,
2548 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2549 					   VK_RENDERING_SUSPENDING_BIT_KHR,
2550 					   colorAtchCount,
2551 					   imagesFormat,
2552 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2553 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2554 
2555 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2556 
2557 		vk.cmdEndRendering(*m_cmdBuffer);
2558 
2559 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2560 
2561 		// Primary commandBuffer2
2562 		beginCommandBuffer(vk, *m_cmdBuffer2);
2563 
2564 		beginRendering(*m_cmdBuffer2,
2565 					   attachmentBindInfos,
2566 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2567 					   VK_RENDERING_RESUMING_BIT_KHR,
2568 					   colorAtchCount,
2569 					   imagesFormat,
2570 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2571 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2572 
2573 		vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
2574 
2575 		vk.cmdEndRendering(*m_cmdBuffer2);
2576 
2577 		copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
2578 
2579 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
2580 
2581 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
2582 
2583 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2584 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2585 		{
2586 			verifyResults(colorAtchCount, imagesFormat);
2587 
2588 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2589 
2590 			// secCmdBuffers
2591 			beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2592 
2593 			if (clearData.colorDepthClear1.size() != 0)
2594 			{
2595 				vk.cmdClearAttachments(secCmdBuffers[0],
2596 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
2597 										clearData.colorDepthClear1.data(),
2598 										1, &clearData.rectColorDepth1);
2599 			}
2600 
2601 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2602 				vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2603 
2604 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2605 
2606 			// secCmdBuffers2
2607 			beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2608 
2609 			if (clearData.colorDepthClear2.size() != 0)
2610 			{
2611 				vk.cmdClearAttachments(secCmdBuffers[1],
2612 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2613 										clearData.colorDepthClear2.data(),
2614 										1, &clearData.rectColorDepth2);
2615 			}
2616 
2617 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2618 				vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2619 
2620 			VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2621 
2622 			// Primary commandBuffer
2623 			beginCommandBuffer(vk, *m_cmdBuffer);
2624 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2625 
2626 			beginRendering(*m_cmdBuffer,
2627 						   attachmentBindInfos,
2628 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2629 						   VK_RENDERING_SUSPENDING_BIT_KHR,
2630 						   colorAtchCount,
2631 						   imagesFormat,
2632 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2633 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2634 
2635 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2636 
2637 			vk.cmdEndRendering(*m_cmdBuffer);
2638 
2639 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2640 
2641 			// Primary commandBuffer2
2642 			beginCommandBuffer(vk, *m_cmdBuffer2);
2643 
2644 			beginRendering(*m_cmdBuffer2,
2645 						   attachmentBindInfos,
2646 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2647 						   VK_RENDERING_RESUMING_BIT_KHR,
2648 						   colorAtchCount,
2649 						   imagesFormat,
2650 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2651 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2652 
2653 			vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
2654 
2655 			vk.cmdEndRendering(*m_cmdBuffer2);
2656 
2657 			copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
2658 
2659 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
2660 
2661 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
2662 
2663 			verifyResults(colorAtchCount, imagesFormat);
2664 		}
2665 	}
2666 }
2667 
2668 class ContentsPrimarySecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2669 {
2670 public:
2671 			ContentsPrimarySecondaryCmdBufferResuming	(Context&							context,
2672 														 const TestParameters&				parameters);
2673 protected:
2674 	void	rendering									(const VkPipeline					pipeline,
2675 														 const std::vector<VkImageView>&	attachmentBindInfos,
2676 														 const deUint32						colorAtchCount,
2677 														 ImagesLayout&						imagesLayout,
2678 														 const ImagesFormat&				imagesFormat) override;
2679 
2680 	Move<VkCommandBuffer>	m_secCmdBuffer;
2681 };
2682 
ContentsPrimarySecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)2683 ContentsPrimarySecondaryCmdBufferResuming::ContentsPrimarySecondaryCmdBufferResuming (Context&				context,
2684 																					  const TestParameters&	parameters)
2685 	: DynamicRenderingTestInstance(context, parameters)
2686 {
2687 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2688 	const VkDevice			device	= m_context.getDevice();
2689 
2690 	m_secCmdBuffer	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2691 }
2692 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2693 void	ContentsPrimarySecondaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
2694 															  const std::vector<VkImageView>&	attachmentBindInfos,
2695 															  const deUint32					colorAtchCount,
2696 															  ImagesLayout&						imagesLayout,
2697 															  const ImagesFormat&				imagesFormat)
2698 {
2699 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2700 	const VkDevice			device	= m_context.getDevice();
2701 	const VkQueue			queue	= m_context.getUniversalQueue();
2702 
2703 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2704 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2705 	{
2706 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2707 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2708 
2709 		// secCmdBuffer
2710 		beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2711 
2712 		vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2713 		vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2714 
2715 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 4u, 0u);
2716 
2717 		VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2718 
2719 		// Primary commandBuffer
2720 		beginCommandBuffer(vk, *m_cmdBuffer);
2721 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2722 
2723 		beginRendering(*m_cmdBuffer,
2724 					   attachmentBindInfos,
2725 					   VK_RENDERING_SUSPENDING_BIT_KHR,
2726 					   colorAtchCount,
2727 					   imagesFormat,
2728 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2729 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2730 
2731 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2732 		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2733 
2734 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
2735 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
2736 
2737 		vk.cmdEndRendering(*m_cmdBuffer);
2738 
2739 		beginRendering(*m_cmdBuffer,
2740 					   attachmentBindInfos,
2741 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2742 					   VK_RENDERING_RESUMING_BIT_KHR,
2743 					   colorAtchCount,
2744 					   imagesFormat,
2745 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2746 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2747 
2748 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2749 
2750 		vk.cmdEndRendering(*m_cmdBuffer);
2751 
2752 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2753 
2754 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2755 
2756 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2757 
2758 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2759 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2760 		{
2761 			verifyResults(colorAtchCount, imagesFormat);
2762 
2763 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2764 
2765 			// secCmdBuffer
2766 			beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2767 
2768 			if (clearData.colorDepthClear1.size() != 0)
2769 			{
2770 				vk.cmdClearAttachments(*m_secCmdBuffer,
2771 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
2772 										clearData.colorDepthClear1.data(),
2773 										1, &clearData.rectColorDepth1);
2774 			}
2775 
2776 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2777 				vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2778 
2779 			VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2780 
2781 			// Primary commandBuffer
2782 			beginCommandBuffer(vk, *m_cmdBuffer);
2783 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2784 
2785 			beginRendering(*m_cmdBuffer,
2786 						   attachmentBindInfos,
2787 						   VK_RENDERING_SUSPENDING_BIT_KHR,
2788 						   colorAtchCount,
2789 						   imagesFormat,
2790 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2791 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2792 
2793 			if (clearData.colorDepthClear2.size() != 0)
2794 			{
2795 				vk.cmdClearAttachments(*m_cmdBuffer,
2796 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2797 										clearData.colorDepthClear2.data(),
2798 										1, &clearData.rectColorDepth2);
2799 			}
2800 
2801 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2802 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2803 
2804 			vk.cmdEndRendering(*m_cmdBuffer);
2805 
2806 			beginRendering(*m_cmdBuffer,
2807 						   attachmentBindInfos,
2808 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2809 						   VK_RENDERING_RESUMING_BIT_KHR,
2810 						   colorAtchCount,
2811 						   imagesFormat,
2812 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2813 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2814 
2815 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2816 
2817 			vk.cmdEndRendering(*m_cmdBuffer);
2818 
2819 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2820 
2821 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2822 
2823 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2824 
2825 			verifyResults(colorAtchCount, imagesFormat);
2826 		}
2827 	}
2828 }
2829 
2830 class ContentsSecondaryPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
2831 {
2832 public:
2833 			ContentsSecondaryPrimaryCmdBufferResuming	(Context&							context,
2834 														 const TestParameters&				parameters);
2835 protected:
2836 	void	rendering									(const VkPipeline					pipeline,
2837 														 const std::vector<VkImageView>&	attachmentBindInfos,
2838 														 const deUint32						colorAtchCount,
2839 														 ImagesLayout&						imagesLayout,
2840 														 const ImagesFormat&				imagesFormat) override;
2841 
2842 	Move<VkCommandBuffer>	m_secCmdBuffer;
2843 };
2844 
ContentsSecondaryPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)2845 ContentsSecondaryPrimaryCmdBufferResuming::ContentsSecondaryPrimaryCmdBufferResuming (Context&				context,
2846 																					  const TestParameters&	parameters)
2847 	: DynamicRenderingTestInstance(context, parameters)
2848 {
2849 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2850 	const VkDevice			device	= m_context.getDevice();
2851 
2852 	m_secCmdBuffer	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2853 }
2854 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2855 void	ContentsSecondaryPrimaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
2856 															  const std::vector<VkImageView>&	attachmentBindInfos,
2857 															  const deUint32					colorAtchCount,
2858 															  ImagesLayout&						imagesLayout,
2859 															  const ImagesFormat&				imagesFormat)
2860 {
2861 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
2862 	const VkDevice			device	= m_context.getDevice();
2863 	const VkQueue			queue	= m_context.getUniversalQueue();
2864 
2865 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
2866 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2867 	{
2868 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2869 		const VkDeviceSize	vertexBufferOffset	= 0ull;
2870 
2871 		// secCmdBuffer
2872 		beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2873 
2874 		vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2875 		vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2876 
2877 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 8u, 0u);
2878 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 0u, 0u);
2879 
2880 		VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2881 
2882 		// Primary commandBuffer
2883 		beginCommandBuffer(vk, *m_cmdBuffer);
2884 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
2885 
2886 		beginRendering(*m_cmdBuffer,
2887 					   attachmentBindInfos,
2888 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2889 					   VK_RENDERING_SUSPENDING_BIT_KHR,
2890 					   colorAtchCount,
2891 					   imagesFormat,
2892 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2893 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2894 
2895 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2896 
2897 		vk.cmdEndRendering(*m_cmdBuffer);
2898 
2899 		beginRendering(*m_cmdBuffer,
2900 					   attachmentBindInfos,
2901 					   VK_RENDERING_RESUMING_BIT_KHR,
2902 					   colorAtchCount,
2903 					   imagesFormat,
2904 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2905 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2906 
2907 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2908 		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2909 
2910 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
2911 
2912 		vk.cmdEndRendering(*m_cmdBuffer);
2913 
2914 		copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2915 
2916 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2917 
2918 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2919 
2920 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2921 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2922 		{
2923 			verifyResults(colorAtchCount, imagesFormat);
2924 
2925 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2926 
2927 			// secCmdBuffer
2928 			beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2929 
2930 			if (clearData.colorDepthClear1.size() != 0)
2931 			{
2932 				vk.cmdClearAttachments(*m_secCmdBuffer,
2933 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
2934 										clearData.colorDepthClear1.data(),
2935 										1, &clearData.rectColorDepth1);
2936 			}
2937 
2938 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2939 				vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2940 
2941 			VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2942 
2943 			// Primary commandBuffer
2944 			beginCommandBuffer(vk, *m_cmdBuffer);
2945 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
2946 
2947 			beginRendering(*m_cmdBuffer,
2948 						   attachmentBindInfos,
2949 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2950 						   VK_RENDERING_SUSPENDING_BIT_KHR,
2951 						   colorAtchCount,
2952 						   imagesFormat,
2953 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2954 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2955 
2956 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2957 
2958 			vk.cmdEndRendering(*m_cmdBuffer);
2959 
2960 			beginRendering(*m_cmdBuffer,
2961 						   attachmentBindInfos,
2962 						   VK_RENDERING_RESUMING_BIT_KHR,
2963 						   colorAtchCount,
2964 						   imagesFormat,
2965 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2966 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2967 
2968 			if (clearData.colorDepthClear2.size() != 0)
2969 			{
2970 				vk.cmdClearAttachments(*m_cmdBuffer,
2971 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
2972 										clearData.colorDepthClear2.data(),
2973 										1, &clearData.rectColorDepth2);
2974 			}
2975 
2976 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2977 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2978 
2979 			vk.cmdEndRendering(*m_cmdBuffer);
2980 
2981 			copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2982 
2983 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2984 
2985 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2986 
2987 			verifyResults(colorAtchCount, imagesFormat);
2988 		}
2989 	}
2990 }
2991 
2992 class ContentsTwoPrimarySecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2993 {
2994 public:
2995 			ContentsTwoPrimarySecondaryCmdBufferResuming	(Context&							context,
2996 															 const TestParameters&				parameters);
2997 protected:
2998 	void	rendering										(const VkPipeline					pipeline,
2999 															 const std::vector<VkImageView>&	attachmentBindInfos,
3000 															 const deUint32						colorAtchCount,
3001 															 ImagesLayout&						imagesLayout,
3002 															 const ImagesFormat&				imagesFormat) override;
3003 
3004 	Move<VkCommandBuffer>	m_cmdBuffer2;
3005 	Move<VkCommandBuffer>	m_secCmdBuffer;
3006 };
3007 
ContentsTwoPrimarySecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)3008 ContentsTwoPrimarySecondaryCmdBufferResuming::ContentsTwoPrimarySecondaryCmdBufferResuming (Context&				context,
3009 																							const TestParameters&	parameters)
3010 	: DynamicRenderingTestInstance(context, parameters)
3011 {
3012 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
3013 	const VkDevice			device	= m_context.getDevice();
3014 
3015 	m_cmdBuffer2	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
3016 	m_secCmdBuffer	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
3017 }
3018 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)3019 void	ContentsTwoPrimarySecondaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
3020 																 const std::vector<VkImageView>&	attachmentBindInfos,
3021 																 const deUint32						colorAtchCount,
3022 																 ImagesLayout&						imagesLayout,
3023 																 const ImagesFormat&				imagesFormat)
3024 {
3025 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
3026 	const VkDevice			device	= m_context.getDevice();
3027 	const VkQueue			queue	= m_context.getUniversalQueue();
3028 
3029 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
3030 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
3031 	{
3032 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
3033 		const VkDeviceSize	vertexBufferOffset	= 0ull;
3034 
3035 		// secCmdBuffer
3036 		beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
3037 
3038 		vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3039 		vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3040 
3041 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 4u, 0u);
3042 
3043 		VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3044 
3045 		// Primary commandBuffer
3046 		beginCommandBuffer(vk, *m_cmdBuffer);
3047 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
3048 
3049 		beginRendering(*m_cmdBuffer,
3050 					   attachmentBindInfos,
3051 					   VK_RENDERING_SUSPENDING_BIT_KHR,
3052 					   colorAtchCount,
3053 					   imagesFormat,
3054 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3055 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3056 
3057 		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3058 		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3059 
3060 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
3061 		vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
3062 
3063 		vk.cmdEndRendering(*m_cmdBuffer);
3064 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3065 
3066 		// Primary commandBuffer2
3067 		beginCommandBuffer(vk, *m_cmdBuffer2);
3068 
3069 		beginRendering(*m_cmdBuffer2,
3070 					   attachmentBindInfos,
3071 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3072 					   VK_RENDERING_RESUMING_BIT_KHR,
3073 					   colorAtchCount,
3074 					   imagesFormat,
3075 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3076 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3077 
3078 		vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &(*m_secCmdBuffer));
3079 
3080 		vk.cmdEndRendering(*m_cmdBuffer2);
3081 
3082 		copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3083 
3084 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3085 
3086 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3087 
3088 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
3089 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
3090 		{
3091 			verifyResults(colorAtchCount, imagesFormat);
3092 
3093 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
3094 
3095 			// secCmdBuffer
3096 			beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
3097 
3098 			if (clearData.colorDepthClear1.size() != 0)
3099 			{
3100 				vk.cmdClearAttachments(*m_secCmdBuffer,
3101 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
3102 										clearData.colorDepthClear1.data(),
3103 										1, &clearData.rectColorDepth1);
3104 			}
3105 
3106 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3107 				vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
3108 
3109 			VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3110 
3111 			// Primary commandBuffer
3112 			beginCommandBuffer(vk, *m_cmdBuffer);
3113 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
3114 
3115 			beginRendering(*m_cmdBuffer,
3116 						   attachmentBindInfos,
3117 						   VK_RENDERING_SUSPENDING_BIT_KHR,
3118 						   colorAtchCount,
3119 						   imagesFormat,
3120 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3121 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3122 
3123 			if (clearData.colorDepthClear2.size() != 0)
3124 			{
3125 				vk.cmdClearAttachments(*m_cmdBuffer,
3126 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
3127 										clearData.colorDepthClear2.data(),
3128 										1, &clearData.rectColorDepth2);
3129 			}
3130 
3131 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3132 				vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
3133 
3134 			vk.cmdEndRendering(*m_cmdBuffer);
3135 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3136 
3137 			// Primary commandBuffer2
3138 			beginCommandBuffer(vk, *m_cmdBuffer2);
3139 
3140 			beginRendering(*m_cmdBuffer2,
3141 						   attachmentBindInfos,
3142 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3143 						   VK_RENDERING_RESUMING_BIT_KHR,
3144 						   colorAtchCount,
3145 						   imagesFormat,
3146 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3147 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3148 
3149 			vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &(*m_secCmdBuffer));
3150 
3151 			vk.cmdEndRendering(*m_cmdBuffer2);
3152 
3153 			copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3154 
3155 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3156 
3157 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3158 
3159 			verifyResults(colorAtchCount, imagesFormat);
3160 		}
3161 	}
3162 }
3163 
3164 class ContentsSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
3165 {
3166 public:
3167 			ContentsSecondaryTwoPrimaryCmdBufferResuming	(Context&							context,
3168 															 const TestParameters&				parameters);
3169 protected:
3170 	void	rendering										(const VkPipeline					pipeline,
3171 															 const std::vector<VkImageView>&	attachmentBindInfos,
3172 															 const deUint32						colorAtchCount,
3173 															 ImagesLayout&						imagesLayout,
3174 															 const ImagesFormat&				imagesFormat) override;
3175 
3176 	Move<VkCommandBuffer>	m_cmdBuffer2;
3177 	Move<VkCommandBuffer>	m_secCmdBuffer;
3178 };
3179 
ContentsSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)3180 ContentsSecondaryTwoPrimaryCmdBufferResuming::ContentsSecondaryTwoPrimaryCmdBufferResuming (Context&				context,
3181 																							const TestParameters&	parameters)
3182 	: DynamicRenderingTestInstance(context, parameters)
3183 {
3184 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
3185 	const VkDevice			device	= m_context.getDevice();
3186 
3187 	m_cmdBuffer2	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
3188 	m_secCmdBuffer	= allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
3189 }
3190 
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)3191 void	ContentsSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline					pipeline,
3192 																 const std::vector<VkImageView>&	attachmentBindInfos,
3193 																 const deUint32						colorAtchCount,
3194 																 ImagesLayout&						imagesLayout,
3195 																 const ImagesFormat&				imagesFormat)
3196 {
3197 	const DeviceInterface&	vk		= m_context.getDeviceInterface();
3198 	const VkDevice			device	= m_context.getDevice();
3199 	const VkQueue			queue	= m_context.getUniversalQueue();
3200 
3201 	for (deUint32 attachmentLoadOp  = 0; attachmentLoadOp  < TEST_ATTACHMENT_LOAD_OP_LAST;  ++attachmentLoadOp)
3202 	for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
3203 	{
3204 		const VkBuffer		vertexBuffer		= m_vertexBuffer->object();
3205 		const VkDeviceSize	vertexBufferOffset	= 0ull;
3206 
3207 		// secCmdBuffer
3208 		beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
3209 
3210 		vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3211 		vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3212 
3213 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 8u, 0u);
3214 		vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 0u, 0u);
3215 
3216 		VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3217 
3218 		// Primary commandBuffer
3219 		beginCommandBuffer(vk, *m_cmdBuffer);
3220 		preBarier(colorAtchCount, imagesLayout, imagesFormat);
3221 
3222 		beginRendering(*m_cmdBuffer,
3223 					   attachmentBindInfos,
3224 					   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3225 					   VK_RENDERING_SUSPENDING_BIT_KHR,
3226 					   colorAtchCount,
3227 					   imagesFormat,
3228 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3229 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3230 
3231 		vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
3232 
3233 		vk.cmdEndRendering(*m_cmdBuffer);
3234 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3235 
3236 		// Primary commandBuffer2
3237 		beginCommandBuffer(vk, *m_cmdBuffer2);
3238 
3239 		beginRendering(*m_cmdBuffer2,
3240 					   attachmentBindInfos,
3241 					   VK_RENDERING_RESUMING_BIT_KHR,
3242 					   colorAtchCount,
3243 					   imagesFormat,
3244 					   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3245 					   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3246 
3247 		vk.cmdBindPipeline(*m_cmdBuffer2, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3248 		vk.cmdBindVertexBuffers(*m_cmdBuffer2, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3249 
3250 		vk.cmdDraw(*m_cmdBuffer2, 4u, 1u, 4u, 0u);
3251 
3252 		vk.cmdEndRendering(*m_cmdBuffer2);
3253 
3254 		copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3255 
3256 		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3257 
3258 		submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3259 
3260 		if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp)   == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
3261 			(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
3262 		{
3263 			verifyResults(colorAtchCount, imagesFormat);
3264 
3265 			const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
3266 
3267 			// secCmdBuffer
3268 			beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
3269 
3270 			if (clearData.colorDepthClear1.size() != 0)
3271 			{
3272 				vk.cmdClearAttachments(*m_secCmdBuffer,
3273 										static_cast<deUint32>(clearData.colorDepthClear1.size()),
3274 										clearData.colorDepthClear1.data(),
3275 										1, &clearData.rectColorDepth1);
3276 			}
3277 
3278 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3279 				vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
3280 
3281 			VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3282 
3283 			// Primary commandBuffer
3284 			beginCommandBuffer(vk, *m_cmdBuffer);
3285 			preBarier(colorAtchCount, imagesLayout, imagesFormat);
3286 
3287 			beginRendering(*m_cmdBuffer,
3288 						   attachmentBindInfos,
3289 						   VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3290 						   VK_RENDERING_SUSPENDING_BIT_KHR,
3291 						   colorAtchCount,
3292 						   imagesFormat,
3293 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3294 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3295 
3296 			vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
3297 
3298 			vk.cmdEndRendering(*m_cmdBuffer);
3299 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3300 
3301 			// Primary commandBuffer2
3302 			beginCommandBuffer(vk, *m_cmdBuffer2);
3303 
3304 			beginRendering(*m_cmdBuffer2,
3305 						   attachmentBindInfos,
3306 						   VK_RENDERING_RESUMING_BIT_KHR,
3307 						   colorAtchCount,
3308 						   imagesFormat,
3309 						   static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3310 						   static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3311 
3312 			if (clearData.colorDepthClear2.size() != 0)
3313 			{
3314 				vk.cmdClearAttachments(*m_cmdBuffer2,
3315 										static_cast<deUint32>(clearData.colorDepthClear2.size()),
3316 										clearData.colorDepthClear2.data(),
3317 										1, &clearData.rectColorDepth2);
3318 			}
3319 
3320 			if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3321 				vk.cmdClearAttachments(*m_cmdBuffer2, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
3322 
3323 			vk.cmdEndRendering(*m_cmdBuffer2);
3324 
3325 			copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3326 
3327 			VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3328 
3329 			submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3330 
3331 			verifyResults(colorAtchCount, imagesFormat);
3332 		}
3333 	}
3334 }
3335 
3336 class BaseTestCase : public TestCase
3337 {
3338 public:
3339 							BaseTestCase	(tcu::TestContext&		context,
3340 											 const std::string&		name,
3341 											 const std::string&		description,
3342 											 const TestParameters&	parameters);
3343 	virtual					~BaseTestCase	(void);
3344 
3345 protected:
3346 	virtual void			checkSupport	(Context&				context) const;
3347 	virtual void			initPrograms	(SourceCollections&		programCollection) const;
3348 	virtual TestInstance*	createInstance	(Context&				context) const;
3349 
3350 	const TestParameters	m_parameters;
3351 };
3352 
BaseTestCase(tcu::TestContext & context,const std::string & name,const std::string & description,const TestParameters & parameters)3353 BaseTestCase::BaseTestCase (tcu::TestContext&		context,
3354 							const std::string&		name,
3355 							const std::string&		description,
3356 							const TestParameters&	parameters)
3357 	: TestCase		(context, name, description)
3358 	, m_parameters	(parameters)
3359 {
3360 }
3361 
~BaseTestCase()3362 BaseTestCase::~BaseTestCase ()
3363 {
3364 }
3365 
checkSupport(Context & context) const3366 void BaseTestCase::checkSupport (Context& context) const
3367 {
3368 	if(!context.requireDeviceFunctionality("VK_KHR_dynamic_rendering"))
3369 		TCU_THROW(NotSupportedError, "VK_KHR_dynamic_rendering not supported");
3370 }
3371 
initPrograms(SourceCollections & programCollection) const3372 void BaseTestCase::initPrograms (SourceCollections& programCollection) const
3373 {
3374 	// Vertex
3375 	{
3376 		std::ostringstream src;
3377 		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
3378 			<< "\n"
3379 			<< "layout(location = 0) in highp vec4 position;\n"
3380 			<< "layout(location = 0) out highp vec4 vsColor;\n"
3381 			<< "\n"
3382 			<< "out gl_PerVertex {\n"
3383 			<< "   vec4 gl_Position;\n"
3384 			<< "};\n"
3385 			<< "\n"
3386 			<< "void main (void)\n"
3387 			<< "{\n"
3388 			<< "    gl_Position = position;\n"
3389 			<< "    vsColor     = vec4(gl_Position.z * 5.0f, 1.0f, 0.0f, 1.0f);\n"
3390 			<< "}\n";
3391 		programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
3392 	}
3393 
3394 	// Fragment multi color attachment
3395 	{
3396 		std::ostringstream src;
3397 		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
3398 			<< "\n"
3399 			<< "layout(location = 0) in highp vec4 vsColor;\n";
3400 
3401 			for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
3402 				src << "layout(location = " << ndx << ") out highp vec4 fsColor" << ndx << ";\n";
3403 
3404 		src << "\n"
3405 			<< "void main (void)\n"
3406 			<< "{\n"
3407 			<< "    vec4 color   = vsColor;\n";
3408 		for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
3409 		{
3410 			src << "    color.z      = 0.15f * " << ndx << ".0f;\n"
3411 				<< "    fsColor" << ndx << "     = color;\n";
3412 		}
3413 		src << "}\n";
3414 		programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
3415 	}
3416 }
3417 
createInstance(Context & context) const3418 TestInstance*	BaseTestCase::createInstance (Context& context) const
3419 {
3420 	switch(m_parameters.testType)
3421 	{
3422 		case TEST_TYPE_SINGLE_CMDBUF:
3423 		{
3424 			return new DynamicRenderingTestInstance(context, m_parameters);
3425 		}
3426 		case TEST_TYPE_SINGLE_CMDBUF_RESUMING:
3427 		{
3428 			return new SingleCmdBufferResuming(context, m_parameters);
3429 		}
3430 		case TEST_TYPE_TWO_CMDBUF_RESUMING:
3431 		{
3432 			return new TwoPrimaryCmdBufferResuming(context, m_parameters);
3433 		}
3434 		case TEST_TYPE_SECONDARY_CMDBUF_RESUMING:
3435 		{
3436 			return new TwoSecondaryCmdBufferResuming(context, m_parameters);
3437 		}
3438 		case TEST_TYPE_SECONDARY_CMDBUF_TWO_PRIMARY_RESUMING:
3439 		{
3440 			return new TwoSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3441 		}
3442 		case TEST_TYPE_CONTENTS_SECONDARY_COMMAND_BUFFER:
3443 		{
3444 			return new ContentsSecondaryCmdBuffer(context, m_parameters);
3445 		}
3446 		case TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER:
3447 		{
3448 			return new ContentsTwoSecondaryCmdBuffer(context, m_parameters);
3449 		}
3450 		case TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER_RESUMING:
3451 		{
3452 			return new ContentsTwoSecondaryCmdBufferResuming(context, m_parameters);
3453 		}
3454 		case TEST_TYPE_CONTENTS_2_SECONDARY_2_PRIMARY_COMDBUF_RESUMING:
3455 		{
3456 			return new ContentsTwoSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3457 		}
3458 		case TEST_TYPE_CONTENTS_PRIMARY_SECONDARY_COMDBUF_RESUMING:
3459 		{
3460 			return new ContentsPrimarySecondaryCmdBufferResuming(context, m_parameters);
3461 		}
3462 		case TEST_TYPE_CONTENTS_SECONDARY_PRIMARY_COMDBUF_RESUMING:
3463 		{
3464 			return new ContentsSecondaryPrimaryCmdBufferResuming(context, m_parameters);
3465 		}
3466 		case TEST_TYPE_CONTENTS_2_PRIMARY_SECONDARY_COMDBUF_RESUMING:
3467 		{
3468 			return new ContentsTwoPrimarySecondaryCmdBufferResuming(context, m_parameters);
3469 		}
3470 		case TEST_TYPE_CONTENTS_SECONDARY_2_PRIMARY_COMDBUF_RESUMING:
3471 		{
3472 			return new ContentsSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3473 		}
3474 		default:
3475 			DE_FATAL("Impossible");
3476 	}
3477 	return nullptr;
3478 }
3479 
dynamicRenderingTests(tcu::TestContext & testCtx,const TestParameters & parameters)3480 tcu::TestNode* dynamicRenderingTests (tcu::TestContext& testCtx, const TestParameters& parameters)
3481 {
3482 	const std::string testName[TEST_TYPE_LAST] =
3483 	{
3484 		"single_cmdbuffer",
3485 		"single_cmdbuffer_resuming",
3486 		"2_cmdbuffers_resuming",
3487 		"2_secondary_cmdbuffers_resuming",
3488 		"2_secondary_2_primary_cmdbuffers_resuming",
3489 		"contents_secondary_cmdbuffers",
3490 		"contents_2_secondary_cmdbuffers",
3491 		"contents_2_secondary_cmdbuffers_resuming",
3492 		"contents_2_secondary_2_primary_cmdbuffers_resuming",
3493 		"contents_primary_secondary_cmdbuffers_resuming",
3494 		"contents_secondary_primary_cmdbuffers_resuming",
3495 		"contents_2_primary_secondary_cmdbuffers_resuming",
3496 		"contents_secondary_2_primary_cmdbuffers_resuming",
3497 	};
3498 
3499 	return new BaseTestCase(testCtx, testName[parameters.testType], "Dynamic Rendering tests", parameters);
3500 }
3501 
3502 }	// anonymous
3503 
createDynamicRenderingBasicTests(tcu::TestContext & testCtx)3504 tcu::TestCaseGroup* createDynamicRenderingBasicTests(tcu::TestContext& testCtx)
3505 {
3506 	de::MovePtr<tcu::TestCaseGroup> dynamicRenderingGroup (new tcu::TestCaseGroup(testCtx, "basic", "Basic dynamic rendering tests"));
3507 
3508 	for (int testType = 0; testType < TEST_TYPE_LAST; ++testType)
3509 	{
3510 		const TestParameters	parameters =
3511 		{
3512 			static_cast<TestType>(testType),	// TestType			testType;
3513 			Vec4(0.0f, 0.0f, 0.0f, 1.0f),		// const Vec4		clearColor;
3514 			VK_FORMAT_R8G8B8A8_UNORM,			// const VkFormat	imageFormat;
3515 			(UVec2(32, 32))						// const UVec2		renderSize;
3516 		};
3517 
3518 		dynamicRenderingGroup->addChild(dynamicRenderingTests(testCtx, parameters));
3519 	}
3520 
3521 	return dynamicRenderingGroup.release();
3522 }
3523 
3524 } // renderpass
3525 } // vkt
3526