Home | History | Annotate | Download | only in api
      1 /*-------------------------------------------------------------------------
      2  * Vulkan Conformance Tests
      3  * ------------------------
      4  *
      5  * Copyright (c) 2015 The Khronos Group Inc.
      6  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
      7  * Copyright (c) 2015 Google Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*--------------------------------------------------------------------*/
     22 
     23 #include "vkDefs.hpp"
     24 #include "vktTestCaseUtil.hpp"
     25 #include "vkBuilderUtil.hpp"
     26 #include "vkPlatform.hpp"
     27 #include "vkRefUtil.hpp"
     28 #include "vkQueryUtil.hpp"
     29 #include "vkMemUtil.hpp"
     30 #include "vkDeviceUtil.hpp"
     31 #include "tcuTextureUtil.hpp"
     32 #include "vkImageUtil.hpp"
     33 #include "vkPrograms.hpp"
     34 #include "vkTypeUtil.hpp"
     35 #include "vkAllocationCallbackUtil.hpp"
     36 #include "vktApiCommandBuffersTests.hpp"
     37 #include "vktApiBufferComputeInstance.hpp"
     38 #include "vktApiComputeInstanceResultBuffer.hpp"
     39 #include "deSharedPtr.hpp"
     40 #include <sstream>
     41 
     42 namespace vkt
     43 {
     44 namespace api
     45 {
     46 namespace
     47 {
     48 
     49 using namespace vk;
     50 
     51 typedef de::SharedPtr<vk::Unique<vk::VkEvent> >	VkEventSp;
     52 
     53 // Global variables
     54 const deUint64								INFINITE_TIMEOUT		= ~(deUint64)0u;
     55 
     56 
     57 template <deUint32 NumBuffers>
     58 class CommandBufferBareTestEnvironment
     59 {
     60 public:
     61 											CommandBufferBareTestEnvironment	(Context&						context,
     62 																				 VkCommandPoolCreateFlags		commandPoolCreateFlags);
     63 
     64 	VkCommandPool							getCommandPool						(void) const					{ return *m_commandPool; }
     65 	VkCommandBuffer							getCommandBuffer					(deUint32 bufferIndex) const;
     66 
     67 protected:
     68 	Context&								m_context;
     69 	const VkDevice							m_device;
     70 	const DeviceInterface&					m_vkd;
     71 	const VkQueue							m_queue;
     72 	const deUint32							m_queueFamilyIndex;
     73 	Allocator&								m_allocator;
     74 
     75 	// \note All VkCommandBuffers are allocated from m_commandPool so there is no need
     76 	//       to free them separately as the auto-generated dtor will do that through
     77 	//       destroying the pool.
     78 	Move<VkCommandPool>						m_commandPool;
     79 	VkCommandBuffer							m_primaryCommandBuffers[NumBuffers];
     80 };
     81 
     82 template <deUint32 NumBuffers>
     83 CommandBufferBareTestEnvironment<NumBuffers>::CommandBufferBareTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags)
     84 	: m_context								(context)
     85 	, m_device								(context.getDevice())
     86 	, m_vkd									(context.getDeviceInterface())
     87 	, m_queue								(context.getUniversalQueue())
     88 	, m_queueFamilyIndex					(context.getUniversalQueueFamilyIndex())
     89 	, m_allocator							(context.getDefaultAllocator())
     90 {
     91 	m_commandPool = createCommandPool(m_vkd, m_device, commandPoolCreateFlags, m_queueFamilyIndex);
     92 
     93 	const VkCommandBufferAllocateInfo		cmdBufferAllocateInfo	=
     94 	{
     95 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// VkStructureType             sType;
     96 		DE_NULL,													// const void*                 pNext;
     97 		*m_commandPool,												// VkCommandPool               commandPool;
     98 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// VkCommandBufferLevel        level;
     99 		NumBuffers												// deUint32                    commandBufferCount;
    100 	};
    101 
    102 	VK_CHECK(m_vkd.allocateCommandBuffers(m_device, &cmdBufferAllocateInfo, m_primaryCommandBuffers));
    103 }
    104 
    105 template <deUint32 NumBuffers>
    106 VkCommandBuffer CommandBufferBareTestEnvironment<NumBuffers>::getCommandBuffer(deUint32 bufferIndex) const
    107 {
    108 	DE_ASSERT(bufferIndex < NumBuffers);
    109 	return m_primaryCommandBuffers[bufferIndex];
    110 }
    111 
    112 class CommandBufferRenderPassTestEnvironment : public CommandBufferBareTestEnvironment<1>
    113 {
    114 public:
    115 											CommandBufferRenderPassTestEnvironment	(Context&						context,
    116 																					 VkCommandPoolCreateFlags		commandPoolCreateFlags);
    117 
    118 	VkRenderPass							getRenderPass							(void) const { return *m_renderPass; }
    119 	VkFramebuffer							getFrameBuffer							(void) const { return *m_frameBuffer; }
    120 	VkCommandBuffer							getPrimaryCommandBuffer					(void) const { return getCommandBuffer(0); }
    121 	VkCommandBuffer							getSecondaryCommandBuffer				(void) const { return *m_secondaryCommandBuffer; }
    122 
    123 	void									beginPrimaryCommandBuffer				(VkCommandBufferUsageFlags usageFlags);
    124 	void									beginSecondaryCommandBuffer				(VkCommandBufferUsageFlags usageFlags);
    125 	void									beginRenderPass							(VkSubpassContents content);
    126 	void									submitPrimaryCommandBuffer				(void);
    127 	de::MovePtr<tcu::TextureLevel>			readColorAttachment						(void);
    128 
    129 	static const VkImageType				DEFAULT_IMAGE_TYPE;
    130 	static const VkFormat					DEFAULT_IMAGE_FORMAT;
    131 	static const VkExtent3D					DEFAULT_IMAGE_SIZE;
    132 	static const VkRect2D					DEFAULT_IMAGE_AREA;
    133 
    134 protected:
    135 
    136 	Move<VkImage>							m_colorImage;
    137 	Move<VkImageView>						m_colorImageView;
    138 	Move<VkRenderPass>						m_renderPass;
    139 	Move<VkFramebuffer>						m_frameBuffer;
    140 	de::MovePtr<Allocation>					m_colorImageMemory;
    141 	Move<VkCommandBuffer>					m_secondaryCommandBuffer;
    142 
    143 };
    144 
    145 const VkImageType		CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_TYPE		= VK_IMAGE_TYPE_2D;
    146 const VkFormat			CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_FORMAT	= VK_FORMAT_R8G8B8A8_UINT;
    147 const VkExtent3D		CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE		= {255, 255, 1};
    148 const VkRect2D			CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA		=
    149 {
    150 	{ 0u, 0u, },												//	VkOffset2D	offset;
    151 	{ DEFAULT_IMAGE_SIZE.width,	DEFAULT_IMAGE_SIZE.height },	//	VkExtent2D	extent;
    152 };
    153 
    154 CommandBufferRenderPassTestEnvironment::CommandBufferRenderPassTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags)
    155 	: CommandBufferBareTestEnvironment<1>		(context, commandPoolCreateFlags)
    156 {
    157 	{
    158 		const VkAttachmentDescription			colorAttDesc			=
    159 		{
    160 			0u,													// VkAttachmentDescriptionFlags		flags;
    161 			DEFAULT_IMAGE_FORMAT,								// VkFormat							format;
    162 			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
    163 			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp				loadOp;
    164 			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
    165 			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
    166 			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
    167 			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout					initialLayout;
    168 			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					finalLayout;
    169 		};
    170 
    171 		const VkAttachmentDescription			attachments[1]			=
    172 		{
    173 			colorAttDesc
    174 		};
    175 
    176 		const VkAttachmentReference				colorAttRef				=
    177 		{
    178 			0u,													// deUint32							attachment;
    179 			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					layout;
    180 		};
    181 
    182 		const VkSubpassDescription				subpassDesc[1]			=
    183 		{
    184 			{
    185 				0u,												// VkSubpassDescriptionFlags		flags;
    186 				VK_PIPELINE_BIND_POINT_GRAPHICS,				// VkPipelineBindPoint				pipelineBindPoint;
    187 				0u,												// deUint32							inputAttachmentCount;
    188 				DE_NULL,										// const VkAttachmentReference*		pInputAttachments;
    189 				1u,												// deUint32							colorAttachmentCount;
    190 				&colorAttRef,									// const VkAttachmentReference*		pColorAttachments;
    191 				DE_NULL,										// const VkAttachmentReference*		pResolveAttachments;
    192 				DE_NULL,										// const VkAttachmentReference*		depthStencilAttachment;
    193 				0u,												// deUint32							preserveAttachmentCount;
    194 				DE_NULL,										// const VkAttachmentReference*		pPreserveAttachments;
    195 			}
    196 		};
    197 
    198 		const VkRenderPassCreateInfo			renderPassCreateInfo	=
    199 		{
    200 			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
    201 			DE_NULL,											// const void*						pNext;
    202 			0u,													// VkRenderPassCreateFlags			flags;
    203 			1u,													// deUint32							attachmentCount;
    204 			attachments,										// const VkAttachmentDescription*	pAttachments;
    205 			1u,													// deUint32							subpassCount;
    206 			subpassDesc,										// const VkSubpassDescription*		pSubpasses;
    207 			0u,													// deUint32							dependencyCount;
    208 			DE_NULL,											// const VkSubpassDependency*		pDependencies;
    209 		};
    210 
    211 		m_renderPass = createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
    212 	}
    213 
    214 	{
    215 		const VkImageCreateInfo					imageCreateInfo			=
    216 		{
    217 			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType			sType;
    218 			DE_NULL,									// const void*				pNext;
    219 			0u,											// VkImageCreateFlags		flags;
    220 			DEFAULT_IMAGE_TYPE,							// VkImageType				imageType;
    221 			DEFAULT_IMAGE_FORMAT,						// VkFormat					format;
    222 			DEFAULT_IMAGE_SIZE,							// VkExtent3D				extent;
    223 			1,											// deUint32					mipLevels;
    224 			1,											// deUint32					arrayLayers;
    225 			VK_SAMPLE_COUNT_1_BIT,						// VkSampleCountFlagBits	samples;
    226 			VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling			tiling;
    227 			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
    228 			VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
    229 			VK_IMAGE_USAGE_TRANSFER_DST_BIT,			// VkImageUsageFlags		usage;
    230 			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode			sharingMode;
    231 			1,											// deUint32					queueFamilyIndexCount;
    232 			&m_queueFamilyIndex,						// const deUint32*			pQueueFamilyIndices;
    233 			VK_IMAGE_LAYOUT_UNDEFINED					// VkImageLayout			initialLayout;
    234 		};
    235 
    236 		m_colorImage = createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
    237 	}
    238 
    239 	m_colorImageMemory = m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, *m_colorImage), MemoryRequirement::Any);
    240 	VK_CHECK(m_vkd.bindImageMemory(m_device, *m_colorImage, m_colorImageMemory->getMemory(), m_colorImageMemory->getOffset()));
    241 
    242 	{
    243 		const VkImageViewCreateInfo				imageViewCreateInfo		=
    244 		{
    245 			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType				sType;
    246 			DE_NULL,									// const void*					pNext;
    247 			0u,											// VkImageViewCreateFlags		flags;
    248 			*m_colorImage,								// VkImage						image;
    249 			VK_IMAGE_VIEW_TYPE_2D,						// VkImageViewType				viewType;
    250 			DEFAULT_IMAGE_FORMAT,						// VkFormat						format;
    251 			{
    252 				VK_COMPONENT_SWIZZLE_R,
    253 				VK_COMPONENT_SWIZZLE_G,
    254 				VK_COMPONENT_SWIZZLE_B,
    255 				VK_COMPONENT_SWIZZLE_A
    256 			},											// VkComponentMapping			components;
    257 			{
    258 				VK_IMAGE_ASPECT_COLOR_BIT,					// VkImageAspectFlags			aspectMask;
    259 				0u,											// deUint32						baseMipLevel;
    260 				1u,											// deUint32						mipLevels;
    261 				0u,											// deUint32						baseArrayLayer;
    262 				1u,											// deUint32						arraySize;
    263 			},											// VkImageSubresourceRange		subresourceRange;
    264 		};
    265 
    266 		m_colorImageView = createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL);
    267 	}
    268 
    269 	{
    270 		const VkImageView						attachmentViews[1]		=
    271 		{
    272 			*m_colorImageView
    273 		};
    274 
    275 		const VkFramebufferCreateInfo			framebufferCreateInfo	=
    276 		{
    277 			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// VkStructureType			sType;
    278 			DE_NULL,									// const void*				pNext;
    279 			0u,											// VkFramebufferCreateFlags	flags;
    280 			*m_renderPass,								// VkRenderPass				renderPass;
    281 			1,											// deUint32					attachmentCount;
    282 			attachmentViews,							// const VkImageView*		pAttachments;
    283 			DEFAULT_IMAGE_SIZE.width,					// deUint32					width;
    284 			DEFAULT_IMAGE_SIZE.height,					// deUint32					height;
    285 			1u,											// deUint32					layers;
    286 		};
    287 
    288 		m_frameBuffer = createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL);
    289 	}
    290 
    291 	{
    292 		const VkCommandBufferAllocateInfo		cmdBufferAllocateInfo	=
    293 		{
    294 			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// VkStructureType             sType;
    295 			DE_NULL,													// const void*                 pNext;
    296 			*m_commandPool,												// VkCommandPool               commandPool;
    297 			VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// VkCommandBufferLevel        level;
    298 			1u															// deUint32                    commandBufferCount;
    299 		};
    300 
    301 		m_secondaryCommandBuffer = allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo);
    302 
    303 	}
    304 }
    305 
    306 void CommandBufferRenderPassTestEnvironment::beginRenderPass(VkSubpassContents content)
    307 {
    308 	const VkClearValue						clearValues[1]			=
    309 	{
    310 		makeClearValueColorU32(17, 59, 163, 251),
    311 	};
    312 
    313 	const VkRenderPassBeginInfo				renderPassBeginInfo		=
    314 	{
    315 		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
    316 		DE_NULL,												// const void*			pNext;
    317 		*m_renderPass,											// VkRenderPass			renderPass;
    318 		*m_frameBuffer,											// VkFramebuffer		framebuffer;
    319 		DEFAULT_IMAGE_AREA,										// VkRect2D				renderArea;
    320 		1u,														// deUint32				clearValueCount;
    321 		clearValues												// const VkClearValue*	pClearValues;
    322 	};
    323 
    324 	m_vkd.cmdBeginRenderPass(m_primaryCommandBuffers[0], &renderPassBeginInfo, content);
    325 }
    326 
    327 void CommandBufferRenderPassTestEnvironment::beginPrimaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
    328 {
    329 	const VkCommandBufferBeginInfo			commandBufferBeginInfo	=
    330 	{
    331 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// VkStructureType                          sType;
    332 		DE_NULL,												// const void*                              pNext;
    333 		usageFlags,												// VkCommandBufferUsageFlags                flags;
    334 		DE_NULL													// const VkCommandBufferInheritanceInfo*    pInheritanceInfo;
    335 	};
    336 
    337 	VK_CHECK(m_vkd.beginCommandBuffer(m_primaryCommandBuffers[0], &commandBufferBeginInfo));
    338 
    339 }
    340 
    341 
    342 void CommandBufferRenderPassTestEnvironment::beginSecondaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
    343 {
    344 	const VkCommandBufferInheritanceInfo	commandBufferInheritanceInfo =
    345 	{
    346 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,		// VkStructureType                  sType;
    347 		DE_NULL,												// const void*                      pNext;
    348 		*m_renderPass,											// VkRenderPass                     renderPass;
    349 		0u,														// deUint32                         subpass;
    350 		*m_frameBuffer,											// VkFramebuffer                    framebuffer;
    351 		VK_FALSE,												// VkBool32                         occlusionQueryEnable;
    352 		0u,														// VkQueryControlFlags              queryFlags;
    353 		0u														// VkQueryPipelineStatisticFlags    pipelineStatistics;
    354 	};
    355 
    356 	const VkCommandBufferBeginInfo			commandBufferBeginInfo	=
    357 	{
    358 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// VkStructureType                          sType;
    359 		DE_NULL,												// const void*                              pNext;
    360 		usageFlags,												// VkCommandBufferUsageFlags                flags;
    361 		&commandBufferInheritanceInfo							// const VkCommandBufferInheritanceInfo*    pInheritanceInfo;
    362 	};
    363 
    364 	VK_CHECK(m_vkd.beginCommandBuffer(*m_secondaryCommandBuffer, &commandBufferBeginInfo));
    365 
    366 }
    367 
    368 void CommandBufferRenderPassTestEnvironment::submitPrimaryCommandBuffer(void)
    369 {
    370 	const Unique<VkFence>					fence					(createFence(m_vkd, m_device));
    371 	const VkSubmitInfo						submitInfo				=
    372 	{
    373 		VK_STRUCTURE_TYPE_SUBMIT_INFO,							// VkStructureType                sType;
    374 		DE_NULL,												// const void*                    pNext;
    375 		0u,														// deUint32                       waitSemaphoreCount;
    376 		DE_NULL,												// const VkSemaphore*             pWaitSemaphores;
    377 		DE_NULL,												// const VkPipelineStageFlags*    pWaitDstStageMask;
    378 		1u,														// deUint32                       commandBufferCount;
    379 		m_primaryCommandBuffers,								// const VkCommandBuffer*         pCommandBuffers;
    380 		0u,														// deUint32                       signalSemaphoreCount;
    381 		DE_NULL													// const VkSemaphore*             pSignalSemaphores;
    382 	};
    383 
    384 	VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence));
    385 
    386 	VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull));
    387 
    388 }
    389 
    390 de::MovePtr<tcu::TextureLevel> CommandBufferRenderPassTestEnvironment::readColorAttachment ()
    391 {
    392 	Move<VkBuffer>					buffer;
    393 	de::MovePtr<Allocation>			bufferAlloc;
    394 	const tcu::TextureFormat		tcuFormat		= mapVkFormat(DEFAULT_IMAGE_FORMAT);
    395 	const VkDeviceSize				pixelDataSize	= DEFAULT_IMAGE_SIZE.height * DEFAULT_IMAGE_SIZE.height * tcuFormat.getPixelSize();
    396 	de::MovePtr<tcu::TextureLevel>	resultLevel		(new tcu::TextureLevel(tcuFormat, DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height));
    397 
    398 	// Create destination buffer
    399 	{
    400 		const VkBufferCreateInfo bufferParams =
    401 		{
    402 			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
    403 			DE_NULL,									// const void*			pNext;
    404 			0u,											// VkBufferCreateFlags	flags;
    405 			pixelDataSize,								// VkDeviceSize			size;
    406 			VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// VkBufferUsageFlags	usage;
    407 			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
    408 			0u,											// deUint32				queueFamilyIndexCount;
    409 			DE_NULL										// const deUint32*		pQueueFamilyIndices;
    410 		};
    411 
    412 		buffer		= createBuffer(m_vkd, m_device, &bufferParams);
    413 		bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible);
    414 		VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
    415 	}
    416 
    417 	// Barriers for copying image to buffer
    418 
    419 	const VkImageMemoryBarrier imageBarrier =
    420 	{
    421 		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType			sType;
    422 		DE_NULL,									// const void*				pNext;
    423 		VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// VkAccessFlags			srcAccessMask;
    424 		VK_ACCESS_TRANSFER_READ_BIT,				// VkAccessFlags			dstAccessMask;
    425 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout			oldLayout;
    426 		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// VkImageLayout			newLayout;
    427 		VK_QUEUE_FAMILY_IGNORED,					// deUint32					srcQueueFamilyIndex;
    428 		VK_QUEUE_FAMILY_IGNORED,					// deUint32					dstQueueFamilyIndex;
    429 		*m_colorImage,								// VkImage					image;
    430 		{											// VkImageSubresourceRange	subresourceRange;
    431 			VK_IMAGE_ASPECT_COLOR_BIT,	// VkImageAspectFlags	aspectMask;
    432 			0u,							// deUint32				baseMipLevel;
    433 			1u,							// deUint32				mipLevels;
    434 			0u,							// deUint32				baseArraySlice;
    435 			1u							// deUint32				arraySize;
    436 		}
    437 	};
    438 
    439 	const VkBufferMemoryBarrier bufferBarrier =
    440 	{
    441 		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
    442 		DE_NULL,									// const void*		pNext;
    443 		VK_ACCESS_TRANSFER_WRITE_BIT,				// VkAccessFlags	srcAccessMask;
    444 		VK_ACCESS_HOST_READ_BIT,					// VkAccessFlags	dstAccessMask;
    445 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
    446 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			dstQueueFamilyIndex;
    447 		*buffer,									// VkBuffer			buffer;
    448 		0u,											// VkDeviceSize		offset;
    449 		pixelDataSize								// VkDeviceSize		size;
    450 	};
    451 
    452 	// Copy image to buffer
    453 
    454 	const VkBufferImageCopy copyRegion =
    455 	{
    456 		0u,												// VkDeviceSize				bufferOffset;
    457 		DEFAULT_IMAGE_SIZE.width,						// deUint32					bufferRowLength;
    458 		DEFAULT_IMAGE_SIZE.height,						// deUint32					bufferImageHeight;
    459 		{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u },		// VkImageSubresourceLayers	imageSubresource;
    460 		{ 0, 0, 0 },									// VkOffset3D				imageOffset;
    461 		DEFAULT_IMAGE_SIZE								// VkExtent3D				imageExtent;
    462 	};
    463 
    464 	beginPrimaryCommandBuffer(0);
    465 	m_vkd.cmdPipelineBarrier(m_primaryCommandBuffers[0], VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
    466 	m_vkd.cmdCopyImageToBuffer(m_primaryCommandBuffers[0], *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, &copyRegion);
    467 	m_vkd.cmdPipelineBarrier(m_primaryCommandBuffers[0], VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
    468 	VK_CHECK(m_vkd.endCommandBuffer(m_primaryCommandBuffers[0]));
    469 
    470 	submitPrimaryCommandBuffer();
    471 
    472 	// Read buffer data
    473 	invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
    474 	tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
    475 
    476 	return resultLevel;
    477 }
    478 
    479 
    480 // Testcases
    481 /********* 19.1. Command Pools (5.1 in VK 1.0 Spec) ***************************/
    482 tcu::TestStatus createPoolNullParamsTest(Context& context)
    483 {
    484 	const VkDevice							vkDevice				= context.getDevice();
    485 	const DeviceInterface&					vk						= context.getDeviceInterface();
    486 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    487 
    488 	createCommandPool(vk, vkDevice, 0u, queueFamilyIndex);
    489 
    490 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    491 }
    492 
    493 tcu::TestStatus createPoolNonNullAllocatorTest(Context& context)
    494 {
    495 	const VkDevice							vkDevice				= context.getDevice();
    496 	const DeviceInterface&					vk						= context.getDeviceInterface();
    497 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    498 	const VkAllocationCallbacks*			allocationCallbacks		= getSystemAllocator();
    499 
    500 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    501 	{
    502 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    503 		DE_NULL,													// pNext;
    504 		0u,															// flags;
    505 		queueFamilyIndex,											// queueFamilyIndex;
    506 	};
    507 
    508 	createCommandPool(vk, vkDevice, &cmdPoolParams, allocationCallbacks);
    509 
    510 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    511 }
    512 
    513 tcu::TestStatus createPoolTransientBitTest(Context& context)
    514 {
    515 	const VkDevice							vkDevice				= context.getDevice();
    516 	const DeviceInterface&					vk						= context.getDeviceInterface();
    517 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    518 
    519 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    520 	{
    521 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    522 		DE_NULL,													// pNext;
    523 		VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,						// flags;
    524 		queueFamilyIndex,											// queueFamilyIndex;
    525 	};
    526 
    527 	createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
    528 
    529 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    530 }
    531 
    532 tcu::TestStatus createPoolResetBitTest(Context& context)
    533 {
    534 	const VkDevice							vkDevice				= context.getDevice();
    535 	const DeviceInterface&					vk						= context.getDeviceInterface();
    536 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    537 
    538 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    539 	{
    540 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    541 		DE_NULL,													// pNext;
    542 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
    543 		queueFamilyIndex,											// queueFamilyIndex;
    544 	};
    545 
    546 	createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
    547 
    548 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    549 }
    550 
    551 tcu::TestStatus resetPoolReleaseResourcesBitTest(Context& context)
    552 {
    553 	const VkDevice							vkDevice				= context.getDevice();
    554 	const DeviceInterface&					vk						= context.getDeviceInterface();
    555 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    556 
    557 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    558 	{
    559 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    560 		DE_NULL,													// pNext;
    561 		0u,															// flags;
    562 		queueFamilyIndex,											// queueFamilyIndex;
    563 	};
    564 
    565 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
    566 
    567 	VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
    568 
    569 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    570 }
    571 
    572 tcu::TestStatus resetPoolNoFlagsTest(Context& context)
    573 {
    574 	const VkDevice							vkDevice				= context.getDevice();
    575 	const DeviceInterface&					vk						= context.getDeviceInterface();
    576 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    577 
    578 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    579 	{
    580 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    581 		DE_NULL,													// pNext;
    582 		0u,															// flags;
    583 		queueFamilyIndex,											// queueFamilyIndex;
    584 	};
    585 
    586 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
    587 
    588 	VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, 0u));
    589 
    590 	return tcu::TestStatus::pass("Command Pool allocated correctly.");
    591 }
    592 
    593 bool executeCommandBuffer (const VkDevice			device,
    594 						   const DeviceInterface&	vk,
    595 						   const VkQueue			queue,
    596 						   const VkCommandBuffer	commandBuffer,
    597 						   const bool				exitBeforeEndCommandBuffer = false)
    598 {
    599 	const Unique<VkEvent>			event					(createEvent(vk, device));
    600 	const VkCommandBufferBeginInfo	commandBufferBeginInfo	=
    601 	{
    602 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	//VkStructureType						sType;
    603 		DE_NULL,										//const void*							pNext;
    604 		0u,												//VkCommandBufferUsageFlags				flags;
    605 		(const VkCommandBufferInheritanceInfo*)DE_NULL	//const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
    606 	};
    607 
    608 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufferBeginInfo));
    609 	{
    610 		const VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
    611 		vk.cmdSetEvent(commandBuffer, *event, stageMask);
    612 		if (exitBeforeEndCommandBuffer)
    613 			return exitBeforeEndCommandBuffer;
    614 	}
    615 	VK_CHECK(vk.endCommandBuffer(commandBuffer));
    616 
    617 	{
    618 		const Unique<VkFence>					fence			(createFence(vk, device));
    619 		const VkSubmitInfo						submitInfo		=
    620 		{
    621 			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// sType
    622 			DE_NULL,								// pNext
    623 			0u,										// waitSemaphoreCount
    624 			DE_NULL,								// pWaitSemaphores
    625 			(const VkPipelineStageFlags*)DE_NULL,	// pWaitDstStageMask
    626 			1u,										// commandBufferCount
    627 			&commandBuffer,							// pCommandBuffers
    628 			0u,										// signalSemaphoreCount
    629 			DE_NULL									// pSignalSemaphores
    630 		};
    631 
    632 		// Submit the command buffer to the queue
    633 		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
    634 		// wait for end of execution of queue
    635 		VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
    636 	}
    637 	// check if buffer has been executed
    638 	const VkResult result = vk.getEventStatus(device, *event);
    639 	return result == VK_EVENT_SET;
    640 }
    641 
    642 tcu::TestStatus resetPoolReuseTest (Context& context)
    643 {
    644 	const VkDevice						vkDevice			= context.getDevice();
    645 	const DeviceInterface&				vk					= context.getDeviceInterface();
    646 	const deUint32						queueFamilyIndex	= context.getUniversalQueueFamilyIndex();
    647 	const VkQueue						queue				= context.getUniversalQueue();
    648 
    649 	const VkCommandPoolCreateInfo		cmdPoolParams		=
    650 	{
    651 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,	// sType;
    652 		DE_NULL,									// pNext;
    653 		0u,											// flags;
    654 		queueFamilyIndex							// queueFamilyIndex;
    655 	};
    656 	const Unique<VkCommandPool>			cmdPool				(createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
    657 	const VkCommandBufferAllocateInfo	cmdBufParams		=
    658 	{
    659 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// sType;
    660 		DE_NULL,										// pNext;
    661 		*cmdPool,										// commandPool;
    662 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// level;
    663 		1u												// bufferCount;
    664 	};
    665 	const Move<VkCommandBuffer>			commandBuffers[]	=
    666 	{
    667 		allocateCommandBuffer(vk, vkDevice, &cmdBufParams),
    668 		allocateCommandBuffer(vk, vkDevice, &cmdBufParams)
    669 	};
    670 
    671 	if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
    672 		return tcu::TestStatus::fail("Failed");
    673 	if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1]), true))
    674 		return tcu::TestStatus::fail("Failed");
    675 
    676 	VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
    677 
    678 	if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
    679 		return tcu::TestStatus::fail("Failed");
    680 	if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1])))
    681 		return tcu::TestStatus::fail("Failed");
    682 
    683 	{
    684 		const Unique<VkCommandBuffer> afterResetCommandBuffers(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
    685 		if (!executeCommandBuffer(vkDevice, vk, queue, *afterResetCommandBuffers))
    686 			return tcu::TestStatus::fail("Failed");
    687 	}
    688 
    689 	return tcu::TestStatus::pass("Passed");
    690 }
    691 
    692 /******** 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) ******************/
    693 tcu::TestStatus allocatePrimaryBufferTest(Context& context)
    694 {
    695 	const VkDevice							vkDevice				= context.getDevice();
    696 	const DeviceInterface&					vk						= context.getDeviceInterface();
    697 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    698 
    699 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    700 	{
    701 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    702 		DE_NULL,													// pNext;
    703 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
    704 		queueFamilyIndex,											// queueFamilyIndex;
    705 	};
    706 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    707 
    708 	// Command buffer
    709 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    710 	{
    711 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
    712 		DE_NULL,													// pNext;
    713 		*cmdPool,													// commandPool;
    714 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
    715 		1u,															// bufferCount;
    716 	};
    717 	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
    718 
    719 	return tcu::TestStatus::pass("Buffer was created correctly.");
    720 }
    721 
    722 tcu::TestStatus allocateManyPrimaryBuffersTest(Context& context)
    723 {
    724 
    725 	const VkDevice							vkDevice				= context.getDevice();
    726 	const DeviceInterface&					vk						= context.getDeviceInterface();
    727 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    728 
    729 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    730 	{
    731 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
    732 		DE_NULL,													//	const void*					pNext;
    733 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
    734 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
    735 	};
    736 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    737 
    738 	// \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
    739 #if (DE_PTR_SIZE == 4)
    740 	const unsigned minCommandBuffer = 1024;
    741 #else
    742 	const unsigned minCommandBuffer = 10000;
    743 #endif
    744 
    745 	// Command buffer
    746 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    747 	{
    748 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
    749 		DE_NULL,													//	const void*					pNext;
    750 		*cmdPool,													//	VkCommandPool				pool;
    751 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
    752 		minCommandBuffer,											//	uint32_t					bufferCount;
    753 	};
    754 
    755 	// do not keep the handles to buffers, as they will be freed with command pool
    756 
    757 	// allocate the minimum required amount of buffers
    758 	VkCommandBuffer cmdBuffers[minCommandBuffer];
    759 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
    760 
    761 	std::ostringstream out;
    762 	out << "allocateManyPrimaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
    763 
    764 	return tcu::TestStatus::pass(out.str());
    765 }
    766 
    767 tcu::TestStatus allocateSecondaryBufferTest(Context& context)
    768 {
    769 	const VkDevice							vkDevice				= context.getDevice();
    770 	const DeviceInterface&					vk						= context.getDeviceInterface();
    771 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    772 
    773 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    774 	{
    775 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
    776 		DE_NULL,													// pNext;
    777 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
    778 		queueFamilyIndex,											// queueFamilyIndex;
    779 	};
    780 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    781 
    782 	// Command buffer
    783 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    784 	{
    785 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
    786 		DE_NULL,													// pNext;
    787 		*cmdPool,													// commandPool;
    788 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// level;
    789 		1u,															// bufferCount;
    790 	};
    791 	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
    792 
    793 	return tcu::TestStatus::pass("Buffer was created correctly.");
    794 }
    795 
    796 tcu::TestStatus allocateManySecondaryBuffersTest(Context& context)
    797 {
    798 
    799 	const VkDevice							vkDevice				= context.getDevice();
    800 	const DeviceInterface&					vk						= context.getDeviceInterface();
    801 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    802 
    803 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    804 	{
    805 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
    806 		DE_NULL,													//	const void*					pNext;
    807 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
    808 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
    809 	};
    810 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    811 
    812 	// \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
    813 #if (DE_PTR_SIZE == 4)
    814 	const unsigned minCommandBuffer = 1024;
    815 #else
    816 	const unsigned minCommandBuffer = 10000;
    817 #endif
    818 
    819 	// Command buffer
    820 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    821 	{
    822 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
    823 		DE_NULL,													//	const void*					pNext;
    824 		*cmdPool,													//	VkCommandPool				pool;
    825 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
    826 		minCommandBuffer,											//	uint32_t					bufferCount;
    827 	};
    828 
    829 	// do not keep the handles to buffers, as they will be freed with command pool
    830 
    831 	// allocate the minimum required amount of buffers
    832 	VkCommandBuffer cmdBuffers[minCommandBuffer];
    833 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
    834 
    835 	std::ostringstream out;
    836 	out << "allocateManySecondaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
    837 
    838 	return tcu::TestStatus::pass(out.str());
    839 }
    840 
    841 tcu::TestStatus executePrimaryBufferTest(Context& context)
    842 {
    843 	const VkDevice							vkDevice				= context.getDevice();
    844 	const DeviceInterface&					vk						= context.getDeviceInterface();
    845 	const VkQueue							queue					= context.getUniversalQueue();
    846 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    847 
    848 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    849 	{
    850 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
    851 		DE_NULL,													//	const void*					pNext;
    852 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
    853 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
    854 	};
    855 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    856 
    857 	// Command buffer
    858 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    859 	{
    860 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
    861 		DE_NULL,													//	const void*					pNext;
    862 		*cmdPool,													//	VkCommandPool				pool;
    863 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
    864 		1u,															//	uint32_t					bufferCount;
    865 	};
    866 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
    867 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
    868 	{
    869 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
    870 		DE_NULL,
    871 		0,															// flags
    872 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
    873 	};
    874 
    875 	// create event that will be used to check if secondary command buffer has been executed
    876 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
    877 
    878 	// reset event
    879 	VK_CHECK(vk.resetEvent(vkDevice, *event));
    880 
    881 	// record primary command buffer
    882 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
    883 	{
    884 		// allow execution of event during every stage of pipeline
    885 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
    886 
    887 		// record setting event
    888 		vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
    889 	}
    890 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
    891 
    892 	// create fence to wait for execution of queue
    893 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
    894 
    895 	const VkSubmitInfo						submitInfo				=
    896 	{
    897 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
    898 		DE_NULL,													// pNext
    899 		0u,															// waitSemaphoreCount
    900 		DE_NULL,													// pWaitSemaphores
    901 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
    902 		1,															// commandBufferCount
    903 		&primCmdBuf.get(),											// pCommandBuffers
    904 		0u,															// signalSemaphoreCount
    905 		DE_NULL,													// pSignalSemaphores
    906 	};
    907 
    908 	// Submit the command buffer to the queue
    909 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
    910 
    911 	// wait for end of execution of queue
    912 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
    913 
    914 	// check if buffer has been executed
    915 	VkResult result = vk.getEventStatus(vkDevice,*event);
    916 	if (result == VK_EVENT_SET)
    917 		return tcu::TestStatus::pass("Execute Primary Command Buffer succeeded");
    918 
    919 	return tcu::TestStatus::fail("Execute Primary Command Buffer FAILED");
    920 }
    921 
    922 tcu::TestStatus executeLargePrimaryBufferTest(Context& context)
    923 {
    924 	const VkDevice							vkDevice				= context.getDevice();
    925 	const DeviceInterface&					vk						= context.getDeviceInterface();
    926 	const VkQueue							queue					= context.getUniversalQueue();
    927 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
    928 	const deUint32							LARGE_BUFFER_SIZE		= 10000;
    929 
    930 	const VkCommandPoolCreateInfo			cmdPoolParams			=
    931 	{
    932 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
    933 		DE_NULL,													//	const void*					pNext;
    934 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
    935 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
    936 	};
    937 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
    938 
    939 	// Command buffer
    940 	const VkCommandBufferAllocateInfo		cmdBufParams			=
    941 	{
    942 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
    943 		DE_NULL,													//	const void*					pNext;
    944 		*cmdPool,													//	VkCommandPool				pool;
    945 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
    946 		1u,															//	uint32_t					bufferCount;
    947 	};
    948 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
    949 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
    950 	{
    951 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
    952 		DE_NULL,
    953 		0,															// flags
    954 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
    955 	};
    956 
    957 	std::vector<VkEventSp>					events;
    958 	for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
    959 		events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
    960 
    961 	// record primary command buffer
    962 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
    963 	{
    964 		// set all the events
    965 		for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
    966 		{
    967 			vk.cmdSetEvent(*primCmdBuf, events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
    968 		}
    969 	}
    970 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
    971 
    972 	// create fence to wait for execution of queue
    973 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
    974 
    975 	const VkSubmitInfo						submitInfo				=
    976 	{
    977 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
    978 		DE_NULL,													// pNext
    979 		0u,															// waitSemaphoreCount
    980 		DE_NULL,													// pWaitSemaphores
    981 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
    982 		1,															// commandBufferCount
    983 		&primCmdBuf.get(),											// pCommandBuffers
    984 		0u,															// signalSemaphoreCount
    985 		DE_NULL,													// pSignalSemaphores
    986 	};
    987 
    988 	// Submit the command buffer to the queue
    989 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
    990 
    991 	// wait for end of execution of queue
    992 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
    993 
    994 	// check if the buffer was executed correctly - all events had their status
    995 	// changed
    996 	tcu::TestStatus testResult = tcu::TestStatus::incomplete();
    997 
    998 	for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
    999 	{
   1000 		if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
   1001 		{
   1002 			testResult = tcu::TestStatus::fail("An event was not set.");
   1003 			break;
   1004 		}
   1005 	}
   1006 
   1007 	if (!testResult.isComplete())
   1008 		testResult = tcu::TestStatus::pass("All events set correctly.");
   1009 
   1010 	return testResult;
   1011 }
   1012 
   1013 tcu::TestStatus resetBufferImplicitlyTest(Context& context)
   1014 {
   1015 	const VkDevice							vkDevice				= context.getDevice();
   1016 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1017 	const VkQueue							queue					= context.getUniversalQueue();
   1018 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1019 
   1020 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1021 	{
   1022 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   1023 		DE_NULL,													// pNext;
   1024 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   1025 		queueFamilyIndex,											// queueFamilyIndex;
   1026 	};
   1027 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1028 
   1029 	// Command buffer
   1030 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1031 	{
   1032 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   1033 		DE_NULL,													// pNext;
   1034 		*cmdPool,													// pool;
   1035 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   1036 		1u,															// bufferCount;
   1037 	};
   1038 	const Unique<VkCommandBuffer>			cmdBuf						(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1039 
   1040 	const VkCommandBufferBeginInfo			cmdBufBeginInfo			=
   1041 	{
   1042 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   1043 		DE_NULL,													// pNext
   1044 		0u,															// flags
   1045 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1046 	};
   1047 
   1048 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1049 
   1050 	// Put the command buffer in recording state.
   1051 	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
   1052 	{
   1053 		// Set the event
   1054 		vk.cmdSetEvent(*cmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   1055 	}
   1056 	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
   1057 
   1058 	// We'll use a fence to wait for the execution of the queue
   1059 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1060 
   1061 	const VkSubmitInfo						submitInfo				=
   1062 	{
   1063 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1064 		DE_NULL,													// pNext
   1065 		0u,															// waitSemaphoreCount
   1066 		DE_NULL,													// pWaitSemaphores
   1067 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1068 		1u,															// commandBufferCount
   1069 		&cmdBuf.get(),												// pCommandBuffers
   1070 		0u,															// signalSemaphoreCount
   1071 		DE_NULL,													// pSignalSemaphores
   1072 	};
   1073 
   1074 	// Submitting the command buffer that sets the event to the queue
   1075 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
   1076 
   1077 	// Waiting for the queue to finish executing
   1078 	VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
   1079 	// Reset the fence so that we can reuse it
   1080 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   1081 
   1082 	// Check if the buffer was executed
   1083 	if (vk.getEventStatus(vkDevice, *event) != VK_EVENT_SET)
   1084 		return tcu::TestStatus::fail("Failed to set the event.");
   1085 
   1086 	// Reset the event
   1087 	vk.resetEvent(vkDevice, *event);
   1088 	if(vk.getEventStatus(vkDevice, *event) != VK_EVENT_RESET)
   1089 		return tcu::TestStatus::fail("Failed to reset the event.");
   1090 
   1091 	// Reset the command buffer by putting it in recording state again. This
   1092 	// should empty the command buffer.
   1093 	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
   1094 	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
   1095 
   1096 	// Submit the command buffer after resetting. It should have no commands
   1097 	// recorded, so the event should remain unsignaled.
   1098 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
   1099 	// Waiting for the queue to finish executing
   1100 	VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
   1101 
   1102 	// Check if the event remained unset.
   1103 	if(vk.getEventStatus(vkDevice, *event) == VK_EVENT_RESET)
   1104 		return tcu::TestStatus::pass("Buffer was reset correctly.");
   1105 	else
   1106 		return tcu::TestStatus::fail("Buffer was not reset correctly.");
   1107 }
   1108 
   1109 using  de::SharedPtr;
   1110 typedef SharedPtr<Unique<VkEvent> >			VkEventShared;
   1111 
   1112 template<typename T>
   1113 inline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move)
   1114 {
   1115 	return SharedPtr<Unique<T> >(new Unique<T>(move));
   1116 }
   1117 
   1118 bool submitAndCheck (Context& context, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
   1119 {
   1120 	const VkDevice						vkDevice	= context.getDevice();
   1121 	const DeviceInterface&				vk			= context.getDeviceInterface();
   1122 	const VkQueue						queue		= context.getUniversalQueue();
   1123 	const Unique<VkFence>				fence		(createFence(vk, vkDevice));
   1124 
   1125 	const VkSubmitInfo					submitInfo	=
   1126 	{
   1127 		VK_STRUCTURE_TYPE_SUBMIT_INFO,				// sType
   1128 		DE_NULL,									// pNext
   1129 		0u,											// waitSemaphoreCount
   1130 		DE_NULL,									// pWaitSemaphores
   1131 		(const VkPipelineStageFlags*)DE_NULL,		// pWaitDstStageMask
   1132 		static_cast<deUint32>(cmdBuffers.size()),	// commandBufferCount
   1133 		&cmdBuffers[0],								// pCommandBuffers
   1134 		0u,											// signalSemaphoreCount
   1135 		DE_NULL,									// pSignalSemaphores
   1136 	};
   1137 
   1138 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
   1139 	VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
   1140 
   1141 	for(int eventNdx = 0; eventNdx < static_cast<int>(events.size()); ++eventNdx)
   1142 	{
   1143 		if (vk.getEventStatus(vkDevice, **events[eventNdx]) != VK_EVENT_SET)
   1144 			return false;
   1145 		vk.resetEvent(vkDevice, **events[eventNdx]);
   1146 	}
   1147 
   1148 	return true;
   1149 }
   1150 
   1151 void createCommadBuffers (const DeviceInterface&		vk,
   1152 						  const VkDevice				vkDevice,
   1153 						  deUint32						bufferCount,
   1154 						  VkCommandPool					pool,
   1155 						  const VkCommandBufferLevel	cmdBufferLevel,
   1156 						  VkCommandBuffer*				pCommandBuffers)
   1157 {
   1158 	const VkCommandBufferAllocateInfo		cmdBufParams	=
   1159 	{
   1160 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	//	VkStructureType				sType;
   1161 		DE_NULL,										//	const void*					pNext;
   1162 		pool,											//	VkCommandPool				pool;
   1163 		cmdBufferLevel,									//	VkCommandBufferLevel		level;
   1164 		bufferCount,									//	uint32_t					bufferCount;
   1165 	};
   1166 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, pCommandBuffers));
   1167 }
   1168 
   1169 void addCommandsToBuffer (const DeviceInterface& vk, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
   1170 {
   1171 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   1172 	{
   1173 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   1174 		DE_NULL,
   1175 		(VkRenderPass)0u,								// renderPass
   1176 		0u,												// subpass
   1177 		(VkFramebuffer)0u,								// framebuffer
   1178 		VK_FALSE,										// occlusionQueryEnable
   1179 		(VkQueryControlFlags)0u,						// queryFlags
   1180 		(VkQueryPipelineStatisticFlags)0u,				// pipelineStatistics
   1181 	};
   1182 
   1183 	const VkCommandBufferBeginInfo		cmdBufBeginInfo	=
   1184 	{
   1185 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// sType
   1186 		DE_NULL,										// pNext
   1187 		0u,												// flags
   1188 		&secCmdBufInheritInfo,							// pInheritanceInfo;
   1189 	};
   1190 
   1191 	for(int bufferNdx = 0; bufferNdx < static_cast<int>(cmdBuffers.size()); ++bufferNdx)
   1192 	{
   1193 		VK_CHECK(vk.beginCommandBuffer(cmdBuffers[bufferNdx], &cmdBufBeginInfo));
   1194 		vk.cmdSetEvent(cmdBuffers[bufferNdx], **events[bufferNdx % events.size()], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   1195 		VK_CHECK(vk.endCommandBuffer(cmdBuffers[bufferNdx]));
   1196 	}
   1197 }
   1198 
   1199 bool executeSecondaryCmdBuffer (Context&						context,
   1200 								VkCommandPool					pool,
   1201 								std::vector<VkCommandBuffer>&	cmdBuffersSecondary,
   1202 								std::vector <VkEventShared>&	events)
   1203 {
   1204 	const VkDevice					vkDevice		= context.getDevice();
   1205 	const DeviceInterface&			vk				= context.getDeviceInterface();
   1206 	std::vector<VkCommandBuffer>	cmdBuffer		(1);
   1207 	const VkCommandBufferBeginInfo	cmdBufBeginInfo	=
   1208 	{
   1209 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// sType
   1210 		DE_NULL,										// pNext
   1211 		0u,												// flags
   1212 		(const VkCommandBufferInheritanceInfo*)DE_NULL,	// pInheritanceInfo;
   1213 	};
   1214 
   1215 	createCommadBuffers(vk, vkDevice, 1u, pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, &cmdBuffer[0]);
   1216 	VK_CHECK(vk.beginCommandBuffer(cmdBuffer[0], &cmdBufBeginInfo));
   1217 	vk.cmdExecuteCommands(cmdBuffer[0], static_cast<deUint32>(cmdBuffersSecondary.size()), &cmdBuffersSecondary[0]);
   1218 	VK_CHECK(vk.endCommandBuffer(cmdBuffer[0]));
   1219 
   1220 	bool returnValue = submitAndCheck(context, cmdBuffer, events);
   1221 	vk.freeCommandBuffers(vkDevice, pool, 1u, &cmdBuffer[0]);
   1222 	return returnValue;
   1223 }
   1224 
   1225 tcu::TestStatus trimCommandPoolTest (Context& context, const VkCommandBufferLevel cmdBufferLevel)
   1226 {
   1227 	if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance1"))
   1228 		TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
   1229 
   1230 	const VkDevice							vkDevice				= context.getDevice();
   1231 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1232 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1233 
   1234 	//test parameters
   1235 	const deUint32							cmdBufferIterationCount	= 300u;
   1236 	const deUint32							cmdBufferCount			= 10u;
   1237 
   1238 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1239 	{
   1240 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   1241 		DE_NULL,													// pNext;
   1242 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   1243 		queueFamilyIndex,											// queueFamilyIndex;
   1244 	};
   1245 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1246 
   1247 	std::vector <VkEventShared>				events;
   1248 	for (deUint32 ndx = 0u; ndx < cmdBufferCount; ++ndx)
   1249 		events.push_back(makeSharedPtr(createEvent(vk, vkDevice)));
   1250 
   1251 	{
   1252 		std::vector<VkCommandBuffer> cmdBuffers(cmdBufferCount);
   1253 		createCommadBuffers(vk, vkDevice, cmdBufferCount, *cmdPool, cmdBufferLevel, &cmdBuffers[0]);
   1254 
   1255 		for (deUint32 cmdBufferIterationrNdx = 0; cmdBufferIterationrNdx < cmdBufferIterationCount; ++cmdBufferIterationrNdx)
   1256 		{
   1257 			addCommandsToBuffer(vk, cmdBuffers, events);
   1258 
   1259 			//Peak, situation when we use a lot more command buffers
   1260 			if (cmdBufferIterationrNdx % 10u == 0)
   1261 			{
   1262 				std::vector<VkCommandBuffer> cmdBuffersPeak(cmdBufferCount * 10u);
   1263 				createCommadBuffers(vk, vkDevice, static_cast<deUint32>(cmdBuffersPeak.size()), *cmdPool, cmdBufferLevel, &cmdBuffersPeak[0]);
   1264 				addCommandsToBuffer(vk, cmdBuffersPeak, events);
   1265 
   1266 				switch(cmdBufferLevel)
   1267 				{
   1268 					case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
   1269 						if (!submitAndCheck(context, cmdBuffersPeak, events))
   1270 							return tcu::TestStatus::fail("Fail");
   1271 						break;
   1272 					case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
   1273 						if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffersPeak, events))
   1274 							return tcu::TestStatus::fail("Fail");
   1275 						break;
   1276 					default:
   1277 						DE_ASSERT(0);
   1278 				}
   1279 				vk.freeCommandBuffers(vkDevice, *cmdPool, static_cast<deUint32>(cmdBuffersPeak.size()), &cmdBuffersPeak[0]);
   1280 			}
   1281 
   1282 			vk.trimCommandPoolKHR(vkDevice, *cmdPool, (VkCommandPoolTrimFlagsKHR)0);
   1283 
   1284 			switch(cmdBufferLevel)
   1285 			{
   1286 				case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
   1287 					if (!submitAndCheck(context, cmdBuffers, events))
   1288 						return tcu::TestStatus::fail("Fail");
   1289 					break;
   1290 				case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
   1291 					if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffers, events))
   1292 						return tcu::TestStatus::fail("Fail");
   1293 					break;
   1294 				default:
   1295 					DE_ASSERT(0);
   1296 			}
   1297 
   1298 			for (deUint32 bufferNdx = cmdBufferIterationrNdx % 3u; bufferNdx < cmdBufferCount; bufferNdx+=2u)
   1299 			{
   1300 				vk.freeCommandBuffers(vkDevice, *cmdPool, 1u, &cmdBuffers[bufferNdx]);
   1301 				createCommadBuffers(vk, vkDevice, 1u, *cmdPool, cmdBufferLevel, &cmdBuffers[bufferNdx]);
   1302 			}
   1303 		}
   1304 	}
   1305 
   1306 	return tcu::TestStatus::pass("Pass");
   1307 }
   1308 
   1309 /******** 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) *****************/
   1310 tcu::TestStatus recordSinglePrimaryBufferTest(Context& context)
   1311 {
   1312 	const VkDevice							vkDevice				= context.getDevice();
   1313 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1314 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1315 
   1316 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1317 	{
   1318 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1319 		DE_NULL,													//	const void*					pNext;
   1320 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1321 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1322 	};
   1323 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1324 
   1325 	// Command buffer
   1326 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1327 	{
   1328 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   1329 		DE_NULL,													//	const void*					pNext;
   1330 		*cmdPool,													//	VkCommandPool				pool;
   1331 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1332 		1u,															//	uint32_t					bufferCount;
   1333 	};
   1334 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1335 
   1336 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1337 	{
   1338 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1339 		DE_NULL,
   1340 		0,															// flags
   1341 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1342 	};
   1343 
   1344 	// create event that will be used to check if secondary command buffer has been executed
   1345 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1346 
   1347 	// record primary command buffer
   1348 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1349 	{
   1350 		// record setting event
   1351 		vk.cmdSetEvent(*primCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   1352 	}
   1353 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1354 
   1355 	return tcu::TestStatus::pass("Primary buffer recorded successfully.");
   1356 }
   1357 
   1358 tcu::TestStatus recordLargePrimaryBufferTest(Context &context)
   1359 {
   1360 
   1361 	const VkDevice							vkDevice				= context.getDevice();
   1362 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1363 	const VkQueue							queue					= context.getUniversalQueue();
   1364 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1365 
   1366 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1367 	{
   1368 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1369 		DE_NULL,													//	const void*					pNext;
   1370 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1371 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1372 	};
   1373 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1374 
   1375 	// Command buffer
   1376 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1377 	{
   1378 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   1379 		DE_NULL,													//	const void*					pNext;
   1380 		*cmdPool,													//	VkCommandPool				pool;
   1381 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1382 		1u,															//	uint32_t					bufferCount;
   1383 	};
   1384 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1385 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1386 	{
   1387 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1388 		DE_NULL,
   1389 		0,															// flags
   1390 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1391 	};
   1392 
   1393 	// create event that will be used to check if secondary command buffer has been executed
   1394 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1395 
   1396 	// reset event
   1397 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1398 
   1399 	// record primary command buffer
   1400 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1401 	{
   1402 		// allow execution of event during every stage of pipeline
   1403 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1404 
   1405 		// define minimal amount of commands to accept
   1406 		const long long unsigned minNumCommands = 10000llu;
   1407 
   1408 		for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
   1409 		{
   1410 			// record setting event
   1411 			vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   1412 
   1413 			// record resetting event
   1414 			vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
   1415 		};
   1416 
   1417 	}
   1418 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1419 
   1420 	// create fence to wait for execution of queue
   1421 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1422 
   1423 	const VkSubmitInfo						submitInfo				=
   1424 	{
   1425 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1426 		DE_NULL,													// pNext
   1427 		0u,															// waitSemaphoreCount
   1428 		DE_NULL,													// pWaitSemaphores
   1429 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1430 		1,															// commandBufferCount
   1431 		&primCmdBuf.get(),											// pCommandBuffers
   1432 		0u,															// signalSemaphoreCount
   1433 		DE_NULL,													// pSignalSemaphores
   1434 	};
   1435 
   1436 	// Submit the command buffer to the queue
   1437 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1438 
   1439 	// wait for end of execution of queue
   1440 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1441 
   1442 	return tcu::TestStatus::pass("hugeTest succeeded");
   1443 }
   1444 
   1445 tcu::TestStatus recordSingleSecondaryBufferTest(Context& context)
   1446 {
   1447 	const VkDevice							vkDevice				= context.getDevice();
   1448 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1449 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1450 
   1451 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1452 	{
   1453 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1454 		DE_NULL,													//	const void*					pNext;
   1455 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1456 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1457 	};
   1458 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1459 
   1460 	// Command buffer
   1461 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1462 	{
   1463 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   1464 		DE_NULL,													//	const void*					pNext;
   1465 		*cmdPool,													//	VkCommandPool				pool;
   1466 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   1467 		1u,															//	uint32_t					bufferCount;
   1468 	};
   1469 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1470 
   1471 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   1472 	{
   1473 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   1474 		DE_NULL,
   1475 		(VkRenderPass)0u,											// renderPass
   1476 		0u,															// subpass
   1477 		(VkFramebuffer)0u,											// framebuffer
   1478 		VK_FALSE,													// occlusionQueryEnable
   1479 		(VkQueryControlFlags)0u,									// queryFlags
   1480 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   1481 	};
   1482 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   1483 	{
   1484 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1485 		DE_NULL,
   1486 		0,															// flags
   1487 		&secCmdBufInheritInfo,
   1488 	};
   1489 
   1490 	// create event that will be used to check if secondary command buffer has been executed
   1491 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1492 
   1493 	// record primary command buffer
   1494 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   1495 	{
   1496 		// record setting event
   1497 		vk.cmdSetEvent(*secCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   1498 	}
   1499 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   1500 
   1501 	return tcu::TestStatus::pass("Secondary buffer recorded successfully.");
   1502 }
   1503 
   1504 tcu::TestStatus recordLargeSecondaryBufferTest(Context &context)
   1505 {
   1506 
   1507 	const VkDevice							vkDevice				= context.getDevice();
   1508 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1509 	const VkQueue							queue					= context.getUniversalQueue();
   1510 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1511 
   1512 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1513 	{
   1514 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1515 		DE_NULL,													//	const void*					pNext;
   1516 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1517 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1518 	};
   1519 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1520 
   1521 	// Command buffer
   1522 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1523 	{
   1524 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   1525 		DE_NULL,													//	const void*					pNext;
   1526 		*cmdPool,													//	VkCommandPool				pool;
   1527 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1528 		1u,															//	uint32_t					bufferCount;
   1529 	};
   1530 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1531 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1532 	{
   1533 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1534 		DE_NULL,
   1535 		0,															// flags
   1536 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1537 	};
   1538 
   1539 	// create event that will be used to check if secondary command buffer has been executed
   1540 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1541 
   1542 	// reset event
   1543 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1544 
   1545 	// record primary command buffer
   1546 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1547 	{
   1548 		// allow execution of event during every stage of pipeline
   1549 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1550 
   1551 		// define minimal amount of commands to accept
   1552 		const long long unsigned minNumCommands = 10000llu;
   1553 
   1554 		for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
   1555 		{
   1556 			// record setting event
   1557 			vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   1558 
   1559 			// record resetting event
   1560 			vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
   1561 		};
   1562 
   1563 
   1564 	}
   1565 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1566 
   1567 	// create fence to wait for execution of queue
   1568 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1569 
   1570 	const VkSubmitInfo						submitInfo				=
   1571 	{
   1572 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1573 		DE_NULL,													// pNext
   1574 		0u,															// waitSemaphoreCount
   1575 		DE_NULL,													// pWaitSemaphores
   1576 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1577 		1,															// commandBufferCount
   1578 		&primCmdBuf.get(),											// pCommandBuffers
   1579 		0u,															// signalSemaphoreCount
   1580 		DE_NULL,													// pSignalSemaphores
   1581 	};
   1582 
   1583 	// Submit the command buffer to the queue
   1584 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1585 
   1586 	// wait for end of execution of queue
   1587 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1588 
   1589 	return tcu::TestStatus::pass("hugeTest succeeded");
   1590 }
   1591 
   1592 tcu::TestStatus submitPrimaryBufferTwiceTest(Context& context)
   1593 {
   1594 
   1595 	const VkDevice							vkDevice				= context.getDevice();
   1596 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1597 	const VkQueue							queue					= context.getUniversalQueue();
   1598 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1599 
   1600 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1601 	{
   1602 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1603 		DE_NULL,													//	const void*					pNext;
   1604 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1605 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1606 	};
   1607 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1608 
   1609 	// Command buffer
   1610 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1611 	{
   1612 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   1613 		DE_NULL,													//	const void*				pNext;
   1614 		*cmdPool,													//	VkCommandPool				pool;
   1615 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1616 		1u,															//	uint32_t					bufferCount;
   1617 	};
   1618 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1619 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1620 	{
   1621 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1622 		DE_NULL,
   1623 		0,															// flags
   1624 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1625 	};
   1626 
   1627 	// create event that will be used to check if secondary command buffer has been executed
   1628 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1629 
   1630 	// reset event
   1631 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1632 
   1633 	// record primary command buffer
   1634 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1635 	{
   1636 		// allow execution of event during every stage of pipeline
   1637 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1638 
   1639 		// record setting event
   1640 		vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   1641 	}
   1642 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1643 
   1644 	// create fence to wait for execution of queue
   1645 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1646 
   1647 	const VkSubmitInfo						submitInfo				=
   1648 	{
   1649 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1650 		DE_NULL,													// pNext
   1651 		0u,															// waitSemaphoreCount
   1652 		DE_NULL,													// pWaitSemaphores
   1653 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1654 		1,															// commandBufferCount
   1655 		&primCmdBuf.get(),											// pCommandBuffers
   1656 		0u,															// signalSemaphoreCount
   1657 		DE_NULL,													// pSignalSemaphores
   1658 	};
   1659 
   1660 	// submit primary buffer
   1661 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1662 
   1663 	// wait for end of execution of queue
   1664 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1665 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   1666 	// check if buffer has been executed
   1667 	VkResult result = vk.getEventStatus(vkDevice,*event);
   1668 	if (result != VK_EVENT_SET)
   1669 		return tcu::TestStatus::fail("Submit Twice Test FAILED");
   1670 
   1671 	// reset event
   1672 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1673 
   1674 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1675 
   1676 	// wait for end of execution of queue
   1677 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1678 
   1679 	// check if buffer has been executed
   1680 	result = vk.getEventStatus(vkDevice,*event);
   1681 	if (result != VK_EVENT_SET)
   1682 		return tcu::TestStatus::fail("Submit Twice Test FAILED");
   1683 	else
   1684 		return tcu::TestStatus::pass("Submit Twice Test succeeded");
   1685 }
   1686 
   1687 tcu::TestStatus submitSecondaryBufferTwiceTest(Context& context)
   1688 {
   1689 
   1690 	const VkDevice							vkDevice				= context.getDevice();
   1691 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1692 	const VkQueue							queue					= context.getUniversalQueue();
   1693 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1694 
   1695 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1696 	{
   1697 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1698 		DE_NULL,													//	const void*					pNext;
   1699 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1700 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1701 	};
   1702 
   1703 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1704 
   1705 	// Command buffer
   1706 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1707 	{
   1708 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   1709 		DE_NULL,													//	const void*				pNext;
   1710 		*cmdPool,													//	VkCommandPool				pool;
   1711 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1712 		1u,															//	uint32_t					bufferCount;
   1713 	};
   1714 
   1715 	const Unique<VkCommandBuffer>			primCmdBuf1				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1716 	const Unique<VkCommandBuffer>			primCmdBuf2				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1717 
   1718 	// Secondary Command buffer
   1719 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   1720 	{
   1721 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   1722 		DE_NULL,													//	const void*				pNext;
   1723 		*cmdPool,													//	VkCommandPool				pool;
   1724 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   1725 		1u,															//	uint32_t					bufferCount;
   1726 	};
   1727 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   1728 
   1729 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1730 	{
   1731 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1732 		DE_NULL,
   1733 		0,															// flags
   1734 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1735 	};
   1736 
   1737 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   1738 	{
   1739 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   1740 		DE_NULL,
   1741 		(VkRenderPass)0u,											// renderPass
   1742 		0u,															// subpass
   1743 		(VkFramebuffer)0u,											// framebuffer
   1744 		VK_FALSE,													// occlusionQueryEnable
   1745 		(VkQueryControlFlags)0u,									// queryFlags
   1746 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   1747 	};
   1748 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   1749 	{
   1750 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1751 		DE_NULL,
   1752 		0u,															// flags
   1753 		&secCmdBufInheritInfo,
   1754 	};
   1755 
   1756 	// create event that will be used to check if secondary command buffer has been executed
   1757 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1758 
   1759 	// reset event
   1760 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1761 
   1762 	// record first primary command buffer
   1763 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
   1764 	{
   1765 		// record secondary command buffer
   1766 		VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   1767 		{
   1768 			// allow execution of event during every stage of pipeline
   1769 			VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1770 
   1771 			// record setting event
   1772 			vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
   1773 		}
   1774 
   1775 		// end recording of secondary buffers
   1776 		VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   1777 
   1778 		// execute secondary buffer
   1779 		vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
   1780 	}
   1781 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
   1782 
   1783 	// create fence to wait for execution of queue
   1784 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1785 
   1786 	const VkSubmitInfo						submitInfo1				=
   1787 	{
   1788 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1789 		DE_NULL,													// pNext
   1790 		0u,															// waitSemaphoreCount
   1791 		DE_NULL,													// pWaitSemaphores
   1792 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1793 		1,															// commandBufferCount
   1794 		&primCmdBuf1.get(),											// pCommandBuffers
   1795 		0u,															// signalSemaphoreCount
   1796 		DE_NULL,													// pSignalSemaphores
   1797 	};
   1798 
   1799 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
   1800 
   1801 	// wait for end of execution of queue
   1802 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1803 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   1804 
   1805 	// check if secondary buffer has been executed
   1806 	VkResult result = vk.getEventStatus(vkDevice,*event);
   1807 	if (result != VK_EVENT_SET)
   1808 		return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
   1809 
   1810 	// reset first primary buffer
   1811 	vk.resetCommandBuffer( *primCmdBuf1, 0u);
   1812 
   1813 	// reset event to allow receiving it again
   1814 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1815 
   1816 	// record second primary command buffer
   1817 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
   1818 	{
   1819 		// execute secondary buffer
   1820 		vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
   1821 	}
   1822 	// end recording
   1823 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
   1824 
   1825 	// submit second primary buffer, the secondary should be executed too
   1826 	const VkSubmitInfo						submitInfo2				=
   1827 	{
   1828 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1829 		DE_NULL,													// pNext
   1830 		0u,															// waitSemaphoreCount
   1831 		DE_NULL,													// pWaitSemaphores
   1832 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1833 		1,															// commandBufferCount
   1834 		&primCmdBuf2.get(),											// pCommandBuffers
   1835 		0u,															// signalSemaphoreCount
   1836 		DE_NULL,													// pSignalSemaphores
   1837 	};
   1838 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
   1839 
   1840 	// wait for end of execution of queue
   1841 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1842 
   1843 	// check if secondary buffer has been executed
   1844 	result = vk.getEventStatus(vkDevice,*event);
   1845 	if (result != VK_EVENT_SET)
   1846 		return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
   1847 	else
   1848 		return tcu::TestStatus::pass("Submit Twice Secondary Command Buffer succeeded");
   1849 }
   1850 
   1851 tcu::TestStatus oneTimeSubmitFlagPrimaryBufferTest(Context& context)
   1852 {
   1853 
   1854 	const VkDevice							vkDevice				= context.getDevice();
   1855 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1856 	const VkQueue							queue					= context.getUniversalQueue();
   1857 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1858 
   1859 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1860 	{
   1861 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1862 		DE_NULL,													//	const void*					pNext;
   1863 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1864 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1865 	};
   1866 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1867 
   1868 	// Command buffer
   1869 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1870 	{
   1871 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   1872 		DE_NULL,													//	const void*					pNext;
   1873 		*cmdPool,													//	VkCommandPool				pool;
   1874 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1875 		1u,															//	uint32_t					bufferCount;
   1876 	};
   1877 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1878 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   1879 	{
   1880 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   1881 		DE_NULL,
   1882 		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,				// flags
   1883 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   1884 	};
   1885 
   1886 	// create event that will be used to check if secondary command buffer has been executed
   1887 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   1888 
   1889 	// reset event
   1890 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1891 
   1892 	// record primary command buffer
   1893 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1894 	{
   1895 		// allow execution of event during every stage of pipeline
   1896 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1897 
   1898 		// record setting event
   1899 		vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   1900 	}
   1901 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1902 
   1903 	// create fence to wait for execution of queue
   1904 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   1905 
   1906 	const VkSubmitInfo						submitInfo				=
   1907 	{
   1908 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   1909 		DE_NULL,													// pNext
   1910 		0u,															// waitSemaphoreCount
   1911 		DE_NULL,													// pWaitSemaphores
   1912 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   1913 		1,															// commandBufferCount
   1914 		&primCmdBuf.get(),											// pCommandBuffers
   1915 		0u,															// signalSemaphoreCount
   1916 		DE_NULL,													// pSignalSemaphores
   1917 	};
   1918 
   1919 	// submit primary buffer
   1920 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1921 
   1922 	// wait for end of execution of queue
   1923 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1924 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   1925 
   1926 	// check if buffer has been executed
   1927 	VkResult result = vk.getEventStatus(vkDevice,*event);
   1928 	if (result != VK_EVENT_SET)
   1929 		return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
   1930 
   1931 	// record primary command buffer again - implicit reset because of VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
   1932 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   1933 	{
   1934 		// allow execution of event during every stage of pipeline
   1935 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   1936 
   1937 		// record setting event
   1938 		vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   1939 	}
   1940 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   1941 
   1942 	// reset event
   1943 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   1944 
   1945 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   1946 
   1947 	// wait for end of execution of queue
   1948 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   1949 
   1950 	// check if buffer has been executed
   1951 	result = vk.getEventStatus(vkDevice,*event);
   1952 	if (result != VK_EVENT_SET)
   1953 		return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
   1954 	else
   1955 		return tcu::TestStatus::pass("oneTimeSubmitFlagPrimaryBufferTest succeeded");
   1956 }
   1957 
   1958 tcu::TestStatus oneTimeSubmitFlagSecondaryBufferTest(Context& context)
   1959 {
   1960 
   1961 	const VkDevice							vkDevice				= context.getDevice();
   1962 	const DeviceInterface&					vk						= context.getDeviceInterface();
   1963 	const VkQueue							queue					= context.getUniversalQueue();
   1964 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   1965 
   1966 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   1967 	{
   1968 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   1969 		DE_NULL,													//	const void*					pNext;
   1970 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   1971 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   1972 	};
   1973 
   1974 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   1975 
   1976 	// Command buffer
   1977 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   1978 	{
   1979 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   1980 		DE_NULL,													//	const void*				pNext;
   1981 		*cmdPool,													//	VkCommandPool				pool;
   1982 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   1983 		1u,															//	uint32_t					bufferCount;
   1984 	};
   1985 
   1986 	const Unique<VkCommandBuffer>			primCmdBuf1				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1987 	const Unique<VkCommandBuffer>			primCmdBuf2				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   1988 
   1989 	// Secondary Command buffer
   1990 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   1991 	{
   1992 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   1993 		DE_NULL,													//	const void*				pNext;
   1994 		*cmdPool,													//	VkCommandPool				pool;
   1995 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   1996 		1u,															//	uint32_t					bufferCount;
   1997 	};
   1998 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   1999 
   2000 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   2001 	{
   2002 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2003 		DE_NULL,
   2004 		0,															// flags
   2005 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2006 	};
   2007 
   2008 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   2009 	{
   2010 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2011 		DE_NULL,
   2012 		(VkRenderPass)0u,											// renderPass
   2013 		0u,															// subpass
   2014 		(VkFramebuffer)0u,											// framebuffer
   2015 		VK_FALSE,													// occlusionQueryEnable
   2016 		(VkQueryControlFlags)0u,									// queryFlags
   2017 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   2018 	};
   2019 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   2020 	{
   2021 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2022 		DE_NULL,
   2023 		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,				// flags
   2024 		&secCmdBufInheritInfo,
   2025 	};
   2026 
   2027 	// create event that will be used to check if secondary command buffer has been executed
   2028 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   2029 
   2030 	// reset event
   2031 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   2032 
   2033 	// record first primary command buffer
   2034 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
   2035 	{
   2036 		// record secondary command buffer
   2037 		VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   2038 		{
   2039 			// allow execution of event during every stage of pipeline
   2040 			VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   2041 
   2042 			// record setting event
   2043 			vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
   2044 		}
   2045 
   2046 		// end recording of secondary buffers
   2047 		VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   2048 
   2049 		// execute secondary buffer
   2050 		vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
   2051 	}
   2052 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
   2053 
   2054 	// create fence to wait for execution of queue
   2055 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   2056 
   2057 	const VkSubmitInfo						submitInfo1				=
   2058 	{
   2059 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2060 		DE_NULL,													// pNext
   2061 		0u,															// waitSemaphoreCount
   2062 		DE_NULL,													// pWaitSemaphores
   2063 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2064 		1,															// commandBufferCount
   2065 		&primCmdBuf1.get(),											// pCommandBuffers
   2066 		0u,															// signalSemaphoreCount
   2067 		DE_NULL,													// pSignalSemaphores
   2068 	};
   2069 
   2070 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
   2071 
   2072 	// wait for end of execution of queue
   2073 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   2074 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   2075 
   2076 	// check if secondary buffer has been executed
   2077 	VkResult result = vk.getEventStatus(vkDevice,*event);
   2078 	if (result != VK_EVENT_SET)
   2079 		return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
   2080 
   2081 	// reset first primary buffer
   2082 	vk.resetCommandBuffer( *primCmdBuf1, 0u);
   2083 
   2084 	// reset event to allow receiving it again
   2085 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   2086 
   2087 	// record secondary command buffer again
   2088 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   2089 	{
   2090 		// allow execution of event during every stage of pipeline
   2091 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   2092 
   2093 		// record setting event
   2094 		vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
   2095 	}
   2096 	// end recording of secondary buffers
   2097 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   2098 
   2099 	// record second primary command buffer
   2100 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
   2101 	{
   2102 		// execute secondary buffer
   2103 		vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
   2104 	}
   2105 	// end recording
   2106 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
   2107 
   2108 	// submit second primary buffer, the secondary should be executed too
   2109 	const VkSubmitInfo						submitInfo2				=
   2110 	{
   2111 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2112 		DE_NULL,													// pNext
   2113 		0u,															// waitSemaphoreCount
   2114 		DE_NULL,													// pWaitSemaphores
   2115 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2116 		1,															// commandBufferCount
   2117 		&primCmdBuf2.get(),											// pCommandBuffers
   2118 		0u,															// signalSemaphoreCount
   2119 		DE_NULL,													// pSignalSemaphores
   2120 	};
   2121 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
   2122 
   2123 	// wait for end of execution of queue
   2124 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   2125 
   2126 	// check if secondary buffer has been executed
   2127 	result = vk.getEventStatus(vkDevice,*event);
   2128 	if (result != VK_EVENT_SET)
   2129 		return tcu::TestStatus::fail("oneTimeSubmitFlagSecondaryBufferTest FAILED");
   2130 	else
   2131 		return tcu::TestStatus::pass("oneTimeSubmitFlagSecondaryBufferTest succeeded");
   2132 }
   2133 
   2134 tcu::TestStatus renderPassContinueTest(Context& context)
   2135 {
   2136 	const DeviceInterface&					vkd						= context.getDeviceInterface();
   2137 	CommandBufferRenderPassTestEnvironment	env						(context, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
   2138 
   2139 	VkCommandBuffer							primaryCommandBuffer	= env.getPrimaryCommandBuffer();
   2140 	VkCommandBuffer							secondaryCommandBuffer	= env.getSecondaryCommandBuffer();
   2141 	const deUint32							clearColor[4]			= { 2, 47, 131, 211 };
   2142 
   2143 	const VkClearAttachment					clearAttachment			=
   2144 	{
   2145 		VK_IMAGE_ASPECT_COLOR_BIT,									// VkImageAspectFlags	aspectMask;
   2146 		0,															// deUint32				colorAttachment;
   2147 		makeClearValueColorU32(clearColor[0],
   2148 							   clearColor[1],
   2149 							   clearColor[2],
   2150 							   clearColor[3])						// VkClearValue			clearValue;
   2151 	};
   2152 
   2153 	const VkClearRect						clearRect				=
   2154 	{
   2155 		CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA,	// VkRect2D	rect;
   2156 		0u,															// deUint32	baseArrayLayer;
   2157 		1u															// deUint32	layerCount;
   2158 	};
   2159 
   2160 	env.beginSecondaryCommandBuffer(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
   2161 	vkd.cmdClearAttachments(secondaryCommandBuffer, 1, &clearAttachment, 1, &clearRect);
   2162 	VK_CHECK(vkd.endCommandBuffer(secondaryCommandBuffer));
   2163 
   2164 
   2165 	env.beginPrimaryCommandBuffer(0);
   2166 	env.beginRenderPass(VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
   2167 	vkd.cmdExecuteCommands(primaryCommandBuffer, 1, &secondaryCommandBuffer);
   2168 	vkd.cmdEndRenderPass(primaryCommandBuffer);
   2169 
   2170 	VK_CHECK(vkd.endCommandBuffer(primaryCommandBuffer));
   2171 
   2172 	env.submitPrimaryCommandBuffer();
   2173 
   2174 	de::MovePtr<tcu::TextureLevel>			result					= env.readColorAttachment();
   2175 	tcu::PixelBufferAccess					pixelBufferAccess		= result->getAccess();
   2176 
   2177 	for (deUint32 i = 0; i < (CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.width * CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.height); ++i)
   2178 	{
   2179 		deUint8* colorData = reinterpret_cast<deUint8*>(pixelBufferAccess.getDataPtr());
   2180 		for (int colorComponent = 0; colorComponent < 4; ++colorComponent)
   2181 			if (colorData[i * 4 + colorComponent] != clearColor[colorComponent])
   2182 				return tcu::TestStatus::fail("clear value mismatch");
   2183 	}
   2184 
   2185 	return tcu::TestStatus::pass("render pass continue test passed");
   2186 }
   2187 
   2188 tcu::TestStatus simultaneousUsePrimaryBufferTest(Context& context)
   2189 {
   2190 
   2191 	const VkDevice							vkDevice				= context.getDevice();
   2192 	const DeviceInterface&					vk						= context.getDeviceInterface();
   2193 	const VkQueue							queue					= context.getUniversalQueue();
   2194 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   2195 
   2196 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   2197 	{
   2198 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   2199 		DE_NULL,													//	const void*					pNext;
   2200 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   2201 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   2202 	};
   2203 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2204 
   2205 	// Command buffer
   2206 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   2207 	{
   2208 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType				sType;
   2209 		DE_NULL,													//	const void*					pNext;
   2210 		*cmdPool,													//	VkCommandPool				pool;
   2211 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   2212 		1u,															//	uint32_t					bufferCount;
   2213 	};
   2214 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   2215 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   2216 	{
   2217 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2218 		DE_NULL,
   2219 		VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,				// flags
   2220 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2221 	};
   2222 
   2223 	// create event that will be used to check if secondary command buffer has been executed
   2224 	const Unique<VkEvent>					eventOne				(createEvent(vk, vkDevice));
   2225 	const Unique<VkEvent>					eventTwo				(createEvent(vk, vkDevice));
   2226 
   2227 	// reset event
   2228 	VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
   2229 
   2230 	// record primary command buffer
   2231 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   2232 	{
   2233 		// wait for event
   2234 		vk.cmdWaitEvents(*primCmdBuf, 1u, &eventOne.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
   2235 
   2236 		// Set the second event
   2237 		vk.cmdSetEvent(*primCmdBuf, eventTwo.get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   2238 	}
   2239 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   2240 
   2241 	// create fence to wait for execution of queue
   2242 	const Unique<VkFence>					fence1					(createFence(vk, vkDevice));
   2243 	const Unique<VkFence>					fence2					(createFence(vk, vkDevice));
   2244 
   2245 
   2246 	const VkSubmitInfo						submitInfo				=
   2247 	{
   2248 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2249 		DE_NULL,													// pNext
   2250 		0u,															// waitSemaphoreCount
   2251 		DE_NULL,													// pWaitSemaphores
   2252 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2253 		1,															// commandBufferCount
   2254 		&primCmdBuf.get(),											// pCommandBuffers
   2255 		0u,															// signalSemaphoreCount
   2256 		DE_NULL,													// pSignalSemaphores
   2257 	};
   2258 
   2259 	// submit first buffer
   2260 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence1));
   2261 
   2262 	// submit second buffer
   2263 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence2));
   2264 
   2265 	// wait for both buffer to stop at event for 100 microseconds
   2266 	vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, 100000);
   2267 	vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, 100000);
   2268 
   2269 	// set event
   2270 	VK_CHECK(vk.setEvent(vkDevice, *eventOne));
   2271 
   2272 	// wait for end of execution of the first buffer
   2273 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, INFINITE_TIMEOUT));
   2274 	// wait for end of execution of the second buffer
   2275 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, INFINITE_TIMEOUT));
   2276 
   2277 	// TODO: this will be true if the command buffer was executed only once
   2278 	// TODO: add some test that will say if it was executed twice
   2279 
   2280 	// check if buffer has been executed
   2281 	VkResult result = vk.getEventStatus(vkDevice, *eventTwo);
   2282 	if (result == VK_EVENT_SET)
   2283 		return tcu::TestStatus::pass("simultaneous use - primary buffers test succeeded");
   2284 	else
   2285 		return tcu::TestStatus::fail("simultaneous use - primary buffers test FAILED");
   2286 }
   2287 
   2288 tcu::TestStatus simultaneousUseSecondaryBufferTest(Context& context)
   2289 {
   2290 	const VkDevice							vkDevice				= context.getDevice();
   2291 	const DeviceInterface&					vk						= context.getDeviceInterface();
   2292 	const VkQueue							queue					= context.getUniversalQueue();
   2293 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   2294 
   2295 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   2296 	{
   2297 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   2298 		DE_NULL,													//	const void*					pNext;
   2299 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   2300 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   2301 	};
   2302 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2303 
   2304 	// Command buffer
   2305 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   2306 	{
   2307 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2308 		DE_NULL,													//	const void*				pNext;
   2309 		*cmdPool,													//	VkCommandPool				pool;
   2310 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   2311 		1u,															//	uint32_t					bufferCount;
   2312 	};
   2313 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   2314 
   2315 	// Secondary Command buffer params
   2316 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   2317 	{
   2318 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2319 		DE_NULL,													//	const void*				pNext;
   2320 		*cmdPool,													//	VkCommandPool				pool;
   2321 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   2322 		1u,															//	uint32_t					bufferCount;
   2323 	};
   2324 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2325 
   2326 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   2327 	{
   2328 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2329 		DE_NULL,
   2330 		0,															// flags
   2331 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2332 	};
   2333 
   2334 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   2335 	{
   2336 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2337 		DE_NULL,
   2338 		(VkRenderPass)0u,											// renderPass
   2339 		0u,															// subpass
   2340 		(VkFramebuffer)0u,											// framebuffer
   2341 		VK_FALSE,													// occlusionQueryEnable
   2342 		(VkQueryControlFlags)0u,									// queryFlags
   2343 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   2344 	};
   2345 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   2346 	{
   2347 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2348 		DE_NULL,
   2349 		VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,				// flags
   2350 		&secCmdBufInheritInfo,
   2351 	};
   2352 
   2353 	// create event that will be used to check if secondary command buffer has been executed
   2354 	const Unique<VkEvent>					eventOne				(createEvent(vk, vkDevice));
   2355 	const Unique<VkEvent>					eventTwo				(createEvent(vk, vkDevice));
   2356 
   2357 	// reset event
   2358 	VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
   2359 	VK_CHECK(vk.resetEvent(vkDevice, *eventTwo));
   2360 
   2361 	// record secondary command buffer
   2362 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   2363 	{
   2364 		// allow execution of event during every stage of pipeline
   2365 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   2366 
   2367 		// wait for event
   2368 		vk.cmdWaitEvents(*secCmdBuf, 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
   2369 
   2370 		// reset event
   2371 		vk.cmdSetEvent(*secCmdBuf, *eventTwo, stageMask);
   2372 	}
   2373 	// end recording of secondary buffers
   2374 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   2375 
   2376 	// record primary command buffer
   2377 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   2378 	{
   2379 		// execute secondary buffer
   2380 		vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
   2381 	}
   2382 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   2383 
   2384 	// create fence to wait for execution of queue
   2385 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   2386 
   2387 	const VkSubmitInfo						submitInfo				=
   2388 	{
   2389 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2390 		DE_NULL,													// pNext
   2391 		0u,															// waitSemaphoreCount
   2392 		DE_NULL,													// pWaitSemaphores
   2393 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2394 		1,															// commandBufferCount
   2395 		&primCmdBuf.get(),											// pCommandBuffers
   2396 		0u,															// signalSemaphoreCount
   2397 		DE_NULL,													// pSignalSemaphores
   2398 	};
   2399 
   2400 	// submit primary buffer, the secondary should be executed too
   2401 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   2402 
   2403 	// wait for both buffers to stop at event for 100 microseconds
   2404 	vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 100000);
   2405 
   2406 	// set event
   2407 	VK_CHECK(vk.setEvent(vkDevice, *eventOne));
   2408 
   2409 	// wait for end of execution of queue
   2410 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   2411 
   2412 	// TODO: this will be true if the command buffer was executed only once
   2413 	// TODO: add some test that will say if it was executed twice
   2414 
   2415 	// check if secondary buffer has been executed
   2416 	VkResult result = vk.getEventStatus(vkDevice,*eventTwo);
   2417 	if (result == VK_EVENT_SET)
   2418 		return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
   2419 	else
   2420 		return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
   2421 }
   2422 
   2423 tcu::TestStatus simultaneousUseSecondaryBufferOnePrimaryBufferTest(Context& context)
   2424 {
   2425 	const VkDevice							vkDevice = context.getDevice();
   2426 	const DeviceInterface&					vk = context.getDeviceInterface();
   2427 	const VkQueue							queue = context.getUniversalQueue();
   2428 	const deUint32							queueFamilyIndex = context.getUniversalQueueFamilyIndex();
   2429 	Allocator&								allocator = context.getDefaultAllocator();
   2430 	const ComputeInstanceResultBuffer		result(vk, vkDevice, allocator, 0.0f);
   2431 
   2432 	const VkCommandPoolCreateInfo			cmdPoolParams =
   2433 	{
   2434 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   2435 		DE_NULL,													//	const void*					pNext;
   2436 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   2437 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   2438 	};
   2439 	const Unique<VkCommandPool>				cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2440 
   2441 	// Command buffer
   2442 	const VkCommandBufferAllocateInfo		cmdBufParams =
   2443 	{
   2444 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2445 		DE_NULL,													//	const void*				pNext;
   2446 		*cmdPool,													//	VkCommandPool				pool;
   2447 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   2448 		1u,															//	uint32_t					bufferCount;
   2449 	};
   2450 	const Unique<VkCommandBuffer>			primCmdBuf(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   2451 
   2452 	// Secondary Command buffer params
   2453 	const VkCommandBufferAllocateInfo		secCmdBufParams =
   2454 	{
   2455 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2456 		DE_NULL,													//	const void*				pNext;
   2457 		*cmdPool,													//	VkCommandPool				pool;
   2458 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   2459 		1u,															//	uint32_t					bufferCount;
   2460 	};
   2461 	const Unique<VkCommandBuffer>			secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2462 
   2463 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo =
   2464 	{
   2465 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2466 		DE_NULL,
   2467 		0,															// flags
   2468 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2469 	};
   2470 
   2471 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo =
   2472 	{
   2473 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2474 		DE_NULL,
   2475 		(VkRenderPass)0u,
   2476 		0u,															// subpass
   2477 		(VkFramebuffer)0u,
   2478 		VK_FALSE,													// occlusionQueryEnable
   2479 		(VkQueryControlFlags)0u,
   2480 		(VkQueryPipelineStatisticFlags)0u,
   2481 	};
   2482 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo =
   2483 	{
   2484 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2485 		DE_NULL,
   2486 		VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,				// flags
   2487 		&secCmdBufInheritInfo,
   2488 	};
   2489 
   2490 	const deUint32							offset = (0u);
   2491 	const deUint32							addressableSize = 256;
   2492 	const deUint32							dataSize = 8;
   2493 	de::MovePtr<Allocation>					bufferMem;
   2494 	const Unique<VkBuffer>					buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
   2495 	// Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
   2496 	const Unique<VkDescriptorSetLayout>		descriptorSetLayout(createDescriptorSetLayout(context));
   2497 	const Unique<VkDescriptorPool>			descriptorPool(createDescriptorPool(context));
   2498 	const Unique<VkDescriptorSet>			descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
   2499 	const VkDescriptorSet					descriptorSets[] = { *descriptorSet };
   2500 	const int								numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
   2501 
   2502 	const VkPipelineLayoutCreateInfo layoutCreateInfo =
   2503 	{
   2504 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,				// sType
   2505 		DE_NULL,													// pNext
   2506 		(VkPipelineLayoutCreateFlags)0,
   2507 		numDescriptorSets,											// setLayoutCount
   2508 		&descriptorSetLayout.get(),									// pSetLayouts
   2509 		0u,															// pushConstantRangeCount
   2510 		DE_NULL,													// pPushConstantRanges
   2511 	};
   2512 	Unique<VkPipelineLayout>				pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
   2513 
   2514 	const Unique<VkShaderModule>			computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
   2515 
   2516 	const VkPipelineShaderStageCreateInfo	shaderCreateInfo =
   2517 	{
   2518 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   2519 		DE_NULL,
   2520 		(VkPipelineShaderStageCreateFlags)0,
   2521 		VK_SHADER_STAGE_COMPUTE_BIT,								// stage
   2522 		*computeModule,												// shader
   2523 		"main",
   2524 		DE_NULL,													// pSpecializationInfo
   2525 	};
   2526 
   2527 	const VkComputePipelineCreateInfo		pipelineCreateInfo =
   2528 	{
   2529 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
   2530 		DE_NULL,
   2531 		0u,															// flags
   2532 		shaderCreateInfo,											// cs
   2533 		*pipelineLayout,											// layout
   2534 		(vk::VkPipeline)0,											// basePipelineHandle
   2535 		0u,															// basePipelineIndex
   2536 	};
   2537 
   2538 	const Unique<VkPipeline>				pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
   2539 
   2540 	// record secondary command buffer
   2541 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   2542 	{
   2543 		vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
   2544 		vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
   2545 		vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
   2546 	}
   2547 	// end recording of secondary buffer
   2548 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   2549 
   2550 	// record primary command buffer
   2551 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   2552 	{
   2553 		// execute secondary buffer twice in same primary
   2554 		vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
   2555 		vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
   2556 	}
   2557 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   2558 
   2559 	// create fence to wait for execution of queue
   2560 	const Unique<VkFence>					fence(createFence(vk, vkDevice));
   2561 
   2562 	const VkSubmitInfo						submitInfo =
   2563 	{
   2564 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2565 		DE_NULL,													// pNext
   2566 		0u,															// waitSemaphoreCount
   2567 		DE_NULL,													// pWaitSemaphores
   2568 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2569 		1,															// commandBufferCount
   2570 		&primCmdBuf.get(),											// pCommandBuffers
   2571 		0u,															// signalSemaphoreCount
   2572 		DE_NULL,													// pSignalSemaphores
   2573 	};
   2574 
   2575 	// submit primary buffer, the secondary should be executed too
   2576 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   2577 
   2578 	// wait for end of execution of queue
   2579 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   2580 
   2581 	deUint32 resultCount;
   2582 	result.readResultContentsTo(&resultCount);
   2583 	// check if secondary buffer has been executed
   2584 	if (resultCount == 2)
   2585 		return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
   2586 	else
   2587 		return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
   2588 }
   2589 
   2590 tcu::TestStatus simultaneousUseSecondaryBufferTwoPrimaryBuffersTest(Context& context)
   2591 {
   2592 	const VkDevice							vkDevice = context.getDevice();
   2593 	const DeviceInterface&					vk = context.getDeviceInterface();
   2594 	const VkQueue							queue = context.getUniversalQueue();
   2595 	const deUint32							queueFamilyIndex = context.getUniversalQueueFamilyIndex();
   2596 	Allocator&								allocator = context.getDefaultAllocator();
   2597 	const ComputeInstanceResultBuffer		result(vk, vkDevice, allocator, 0.0f);
   2598 
   2599 	const VkCommandPoolCreateInfo			cmdPoolParams =
   2600 	{
   2601 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   2602 		DE_NULL,													//	const void*					pNext;
   2603 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   2604 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   2605 	};
   2606 	const Unique<VkCommandPool>				cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2607 
   2608 	// Command buffer
   2609 	const VkCommandBufferAllocateInfo		cmdBufParams =
   2610 	{
   2611 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2612 		DE_NULL,													//	const void*				pNext;
   2613 		*cmdPool,													//	VkCommandPool				pool;
   2614 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   2615 		1u,															//	uint32_t					bufferCount;
   2616 	};
   2617 	// Two separate primary cmd buffers that will be executed with the same secondary cmd buffer
   2618 	const deUint32 numPrimCmdBufs = 2;
   2619 	const Unique<VkCommandBuffer>			primCmdBufOne(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   2620 	const Unique<VkCommandBuffer>			primCmdBufTwo(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   2621 	VkCommandBuffer primCmdBufs[numPrimCmdBufs];
   2622 	primCmdBufs[0] = primCmdBufOne.get();
   2623 	primCmdBufs[1] = primCmdBufTwo.get();
   2624 
   2625 	// Secondary Command buffer params
   2626 	const VkCommandBufferAllocateInfo		secCmdBufParams =
   2627 	{
   2628 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   2629 		DE_NULL,													//	const void*				pNext;
   2630 		*cmdPool,													//	VkCommandPool				pool;
   2631 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   2632 		1u,															//	uint32_t					bufferCount;
   2633 	};
   2634 	const Unique<VkCommandBuffer>			secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2635 
   2636 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo =
   2637 	{
   2638 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2639 		DE_NULL,
   2640 		0,															// flags
   2641 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2642 	};
   2643 
   2644 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo =
   2645 	{
   2646 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2647 		DE_NULL,
   2648 		(VkRenderPass)0u,											// renderPass
   2649 		0u,															// subpass
   2650 		(VkFramebuffer)0u,											// framebuffer
   2651 		VK_FALSE,													// occlusionQueryEnable
   2652 		(VkQueryControlFlags)0u,									// queryFlags
   2653 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   2654 	};
   2655 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo =
   2656 	{
   2657 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   2658 		DE_NULL,
   2659 		VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,				// flags
   2660 		&secCmdBufInheritInfo,
   2661 	};
   2662 
   2663 	const deUint32							offset = (0u);
   2664 	const deUint32							addressableSize = 256;
   2665 	const deUint32							dataSize = 8;
   2666 	de::MovePtr<Allocation>					bufferMem;
   2667 	const Unique<VkBuffer>					buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
   2668 	// Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
   2669 	const Unique<VkDescriptorSetLayout>		descriptorSetLayout(createDescriptorSetLayout(context));
   2670 	const Unique<VkDescriptorPool>			descriptorPool(createDescriptorPool(context));
   2671 	const Unique<VkDescriptorSet>			descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
   2672 	const VkDescriptorSet					descriptorSets[] = { *descriptorSet };
   2673 	const int								numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
   2674 
   2675 	const VkPipelineLayoutCreateInfo layoutCreateInfo =
   2676 	{
   2677 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,				// sType
   2678 		DE_NULL,													// pNext
   2679 		(VkPipelineLayoutCreateFlags)0,
   2680 		numDescriptorSets,											// setLayoutCount
   2681 		&descriptorSetLayout.get(),									// pSetLayouts
   2682 		0u,															// pushConstantRangeCount
   2683 		DE_NULL,													// pPushConstantRanges
   2684 	};
   2685 	Unique<VkPipelineLayout>				pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
   2686 
   2687 	const Unique<VkShaderModule>			computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
   2688 
   2689 	const VkPipelineShaderStageCreateInfo	shaderCreateInfo =
   2690 	{
   2691 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   2692 		DE_NULL,
   2693 		(VkPipelineShaderStageCreateFlags)0,
   2694 		VK_SHADER_STAGE_COMPUTE_BIT,								// stage
   2695 		*computeModule,												// shader
   2696 		"main",
   2697 		DE_NULL,													// pSpecializationInfo
   2698 	};
   2699 
   2700 	const VkComputePipelineCreateInfo		pipelineCreateInfo =
   2701 	{
   2702 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
   2703 		DE_NULL,
   2704 		0u,															// flags
   2705 		shaderCreateInfo,											// cs
   2706 		*pipelineLayout,											// layout
   2707 		(vk::VkPipeline)0,											// basePipelineHandle
   2708 		0u,															// basePipelineIndex
   2709 	};
   2710 
   2711 	const Unique<VkPipeline>				pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
   2712 
   2713 	// record secondary command buffer
   2714 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   2715 	{
   2716 		vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
   2717 		vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
   2718 		vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
   2719 	}
   2720 	// end recording of secondary buffer
   2721 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   2722 
   2723 	// record primary command buffers
   2724 	// Insert one instance of same secondary command buffer into two separate primary command buffers
   2725 	VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
   2726 	{
   2727 		vk.cmdExecuteCommands(*primCmdBufOne, 1, &secCmdBuf.get());
   2728 	}
   2729 	VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
   2730 
   2731 	VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
   2732 	{
   2733 		vk.cmdExecuteCommands(*primCmdBufTwo, 1, &secCmdBuf.get());
   2734 	}
   2735 	VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
   2736 
   2737 	// create fence to wait for execution of queue
   2738 	const Unique<VkFence>					fence(createFence(vk, vkDevice));
   2739 
   2740 	const VkSubmitInfo						submitInfo =
   2741 	{
   2742 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   2743 		DE_NULL,													// pNext
   2744 		0u,															// waitSemaphoreCount
   2745 		DE_NULL,													// pWaitSemaphores
   2746 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   2747 		numPrimCmdBufs,												// commandBufferCount
   2748 		primCmdBufs,												// pCommandBuffers
   2749 		0u,															// signalSemaphoreCount
   2750 		DE_NULL,													// pSignalSemaphores
   2751 	};
   2752 
   2753 	// submit primary buffers, the secondary should be executed too
   2754 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
   2755 
   2756 	// wait for end of execution of queue
   2757 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   2758 
   2759 	deUint32 resultCount;
   2760 	result.readResultContentsTo(&resultCount);
   2761 	// check if secondary buffer has been executed
   2762 	if (resultCount == 2)
   2763 		return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
   2764 	else
   2765 		return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
   2766 }
   2767 
   2768 tcu::TestStatus recordBufferQueryPreciseWithFlagTest(Context& context)
   2769 {
   2770 	const VkDevice							vkDevice				= context.getDevice();
   2771 	const DeviceInterface&					vk						= context.getDeviceInterface();
   2772 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   2773 
   2774 	if (!context.getDeviceFeatures().inheritedQueries)
   2775 		TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
   2776 
   2777 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   2778 	{
   2779 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   2780 		DE_NULL,													// pNext;
   2781 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   2782 		queueFamilyIndex,											// queueFamilyIndex;
   2783 	};
   2784 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2785 
   2786 	// Command buffer
   2787 	const VkCommandBufferAllocateInfo		primCmdBufParams		=
   2788 	{
   2789 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2790 		DE_NULL,													// pNext;
   2791 		*cmdPool,													// pool;
   2792 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   2793 		1u,															// flags;
   2794 	};
   2795 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
   2796 
   2797 	// Secondary Command buffer params
   2798 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   2799 	{
   2800 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2801 		DE_NULL,													// pNext;
   2802 		*cmdPool,													// pool;
   2803 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// level;
   2804 		1u,															// flags;
   2805 	};
   2806 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2807 
   2808 	const VkCommandBufferBeginInfo			primBufferBeginInfo		=
   2809 	{
   2810 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   2811 		DE_NULL,													// pNext
   2812 		0u,															// flags
   2813 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2814 	};
   2815 
   2816 	const VkCommandBufferInheritanceInfo	secBufferInheritInfo	=
   2817 	{
   2818 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2819 		DE_NULL,
   2820 		0u,															// renderPass
   2821 		0u,															// subpass
   2822 		0u,															// framebuffer
   2823 		VK_TRUE,													// occlusionQueryEnable
   2824 		VK_QUERY_CONTROL_PRECISE_BIT,								// queryFlags
   2825 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   2826 	};
   2827 	const VkCommandBufferBeginInfo			secBufferBeginInfo		=
   2828 	{
   2829 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   2830 		DE_NULL,													// pNext
   2831 		0u,															// flags
   2832 		&secBufferInheritInfo,
   2833 	};
   2834 
   2835 	const VkQueryPoolCreateInfo				queryPoolCreateInfo		=
   2836 	{
   2837 		VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,					// sType
   2838 		DE_NULL,													// pNext
   2839 		(VkQueryPoolCreateFlags)0,									// flags
   2840 		VK_QUERY_TYPE_OCCLUSION,									// queryType
   2841 		1u,															// entryCount
   2842 		0u,															// pipelineStatistics
   2843 	};
   2844 	Unique<VkQueryPool>						queryPool				(createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
   2845 
   2846 	VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
   2847 	VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
   2848 
   2849 	VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
   2850 	{
   2851 		vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
   2852 		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
   2853 		{
   2854 			vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
   2855 		}
   2856 		vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
   2857 	}
   2858 	VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
   2859 
   2860 	return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
   2861 }
   2862 
   2863 tcu::TestStatus recordBufferQueryImpreciseWithFlagTest(Context& context)
   2864 {
   2865 	const VkDevice							vkDevice				= context.getDevice();
   2866 	const DeviceInterface&					vk						= context.getDeviceInterface();
   2867 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   2868 
   2869 	if (!context.getDeviceFeatures().inheritedQueries)
   2870 		TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
   2871 
   2872 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   2873 	{
   2874 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   2875 		DE_NULL,													// pNext;
   2876 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   2877 		queueFamilyIndex,											// queueFamilyIndex;
   2878 	};
   2879 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2880 
   2881 	// Command buffer
   2882 	const VkCommandBufferAllocateInfo		primCmdBufParams		=
   2883 	{
   2884 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2885 		DE_NULL,													// pNext;
   2886 		*cmdPool,													// pool;
   2887 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   2888 		1u,															// flags;
   2889 	};
   2890 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
   2891 
   2892 	// Secondary Command buffer params
   2893 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   2894 	{
   2895 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2896 		DE_NULL,													// pNext;
   2897 		*cmdPool,													// pool;
   2898 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// level;
   2899 		1u,															// flags;
   2900 	};
   2901 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2902 
   2903 	const VkCommandBufferBeginInfo			primBufferBeginInfo		=
   2904 	{
   2905 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   2906 		DE_NULL,													// pNext
   2907 		0u,															// flags
   2908 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   2909 	};
   2910 
   2911 	const VkCommandBufferInheritanceInfo	secBufferInheritInfo	=
   2912 	{
   2913 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   2914 		DE_NULL,
   2915 		0u,															// renderPass
   2916 		0u,															// subpass
   2917 		0u,															// framebuffer
   2918 		VK_TRUE,													// occlusionQueryEnable
   2919 		VK_QUERY_CONTROL_PRECISE_BIT,								// queryFlags
   2920 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   2921 	};
   2922 	const VkCommandBufferBeginInfo			secBufferBeginInfo		=
   2923 	{
   2924 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   2925 		DE_NULL,													// pNext
   2926 		0u,															// flags
   2927 		&secBufferInheritInfo,
   2928 	};
   2929 
   2930 	// Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
   2931 	const VkQueryPoolCreateInfo				queryPoolCreateInfo		=
   2932 	{
   2933 		VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,					// sType
   2934 		DE_NULL,													// pNext
   2935 		0u,															// flags
   2936 		VK_QUERY_TYPE_OCCLUSION,									// queryType
   2937 		1u,															// entryCount
   2938 		0u,															// pipelineStatistics
   2939 	};
   2940 	Unique<VkQueryPool>						queryPool				(createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
   2941 
   2942 	VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
   2943 	VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
   2944 
   2945 	VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
   2946 	{
   2947 		vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
   2948 		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
   2949 		{
   2950 			vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
   2951 		}
   2952 		vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
   2953 	}
   2954 	VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
   2955 
   2956 	return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
   2957 }
   2958 
   2959 tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context)
   2960 {
   2961 	const VkDevice							vkDevice				= context.getDevice();
   2962 	const DeviceInterface&					vk						= context.getDeviceInterface();
   2963 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   2964 
   2965 	if (!context.getDeviceFeatures().inheritedQueries)
   2966 		TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
   2967 
   2968 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   2969 	{
   2970 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   2971 		DE_NULL,													// pNext;
   2972 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   2973 		queueFamilyIndex,											// queueFamilyIndex;
   2974 	};
   2975 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   2976 
   2977 	// Command buffer
   2978 	const VkCommandBufferAllocateInfo		primCmdBufParams		=
   2979 	{
   2980 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2981 		DE_NULL,													// pNext;
   2982 		*cmdPool,													// pool;
   2983 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   2984 		1u,															// flags;
   2985 	};
   2986 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
   2987 
   2988 	// Secondary Command buffer params
   2989 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   2990 	{
   2991 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   2992 		DE_NULL,													// pNext;
   2993 		*cmdPool,													// pool;
   2994 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// level;
   2995 		1u,															// flags;
   2996 	};
   2997 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   2998 
   2999 	const VkCommandBufferBeginInfo			primBufferBeginInfo		=
   3000 	{
   3001 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3002 		DE_NULL,													// pNext
   3003 		0u,															// flags
   3004 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3005 	};
   3006 
   3007 	const VkCommandBufferInheritanceInfo	secBufferInheritInfo	=
   3008 	{
   3009 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   3010 		DE_NULL,
   3011 		0u,															// renderPass
   3012 		0u,															// subpass
   3013 		0u,															// framebuffer
   3014 		VK_TRUE,													// occlusionQueryEnable
   3015 		0u,															// queryFlags
   3016 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   3017 	};
   3018 	const VkCommandBufferBeginInfo			secBufferBeginInfo		=
   3019 	{
   3020 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3021 		DE_NULL,													// pNext
   3022 		0u,															// flags
   3023 		&secBufferInheritInfo,
   3024 	};
   3025 
   3026 	// Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
   3027 	const VkQueryPoolCreateInfo				queryPoolCreateInfo		=
   3028 	{
   3029 		VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,					// sType
   3030 		DE_NULL,													// pNext
   3031 		(VkQueryPoolCreateFlags)0,
   3032 		VK_QUERY_TYPE_OCCLUSION,
   3033 		1u,
   3034 		0u,
   3035 	};
   3036 	Unique<VkQueryPool>						queryPool				(createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
   3037 
   3038 	VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
   3039 	VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
   3040 
   3041 	VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
   3042 	{
   3043 		vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
   3044 		vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
   3045 		{
   3046 			vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
   3047 		}
   3048 		vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
   3049 	}
   3050 	VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
   3051 
   3052 	return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
   3053 }
   3054 
   3055 /******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/
   3056 tcu::TestStatus submitBufferCountNonZero(Context& context)
   3057 {
   3058 	const VkDevice							vkDevice				= context.getDevice();
   3059 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3060 	const VkQueue							queue					= context.getUniversalQueue();
   3061 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3062 
   3063 	const deUint32							BUFFER_COUNT			= 5u;
   3064 
   3065 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3066 	{
   3067 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   3068 		DE_NULL,													// pNext;
   3069 		0u,															// flags;
   3070 		queueFamilyIndex,											// queueFamilyIndex;
   3071 	};
   3072 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3073 
   3074 	// Command buffer
   3075 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3076 	{
   3077 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   3078 		DE_NULL,													// pNext;
   3079 		*cmdPool,													// pool;
   3080 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   3081 		BUFFER_COUNT,												// bufferCount;
   3082 	};
   3083 	VkCommandBuffer cmdBuffers[BUFFER_COUNT];
   3084 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
   3085 
   3086 	const VkCommandBufferBeginInfo			cmdBufBeginInfo			=
   3087 	{
   3088 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3089 		DE_NULL,													// pNext
   3090 		0u,															// flags
   3091 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3092 	};
   3093 
   3094 	std::vector<VkEventSp>					events;
   3095 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3096 	{
   3097 		events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
   3098 	}
   3099 
   3100 	// Record the command buffers
   3101 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3102 	{
   3103 		VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
   3104 		{
   3105 			vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   3106 		}
   3107 		VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
   3108 	}
   3109 
   3110 	// We'll use a fence to wait for the execution of the queue
   3111 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   3112 
   3113 	const VkSubmitInfo						submitInfo				=
   3114 	{
   3115 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3116 		DE_NULL,													// pNext
   3117 		0u,															// waitSemaphoreCount
   3118 		DE_NULL,													// pWaitSemaphores
   3119 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3120 		BUFFER_COUNT,												// commandBufferCount
   3121 		cmdBuffers,													// pCommandBuffers
   3122 		0u,															// signalSemaphoreCount
   3123 		DE_NULL,													// pSignalSemaphores
   3124 	};
   3125 
   3126 	// Submit the alpha command buffer to the queue
   3127 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
   3128 	// Wait for the queue
   3129 	VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
   3130 
   3131 	// Check if the buffers were executed
   3132 	tcu::TestStatus testResult = tcu::TestStatus::incomplete();
   3133 
   3134 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3135 	{
   3136 		if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
   3137 		{
   3138 			testResult = tcu::TestStatus::fail("Failed to set the event.");
   3139 			break;
   3140 		}
   3141 	}
   3142 
   3143 	if (!testResult.isComplete())
   3144 		testResult = tcu::TestStatus::pass("All buffers were submitted and executed correctly.");
   3145 
   3146 	return testResult;
   3147 }
   3148 
   3149 tcu::TestStatus submitBufferCountEqualZero(Context& context)
   3150 {
   3151 	const VkDevice							vkDevice				= context.getDevice();
   3152 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3153 	const VkQueue							queue					= context.getUniversalQueue();
   3154 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3155 
   3156 	const deUint32							BUFFER_COUNT			= 2u;
   3157 
   3158 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3159 	{
   3160 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   3161 		DE_NULL,													// pNext;
   3162 		0u,															// flags;
   3163 		queueFamilyIndex,											// queueFamilyIndex;
   3164 	};
   3165 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3166 
   3167 	// Command buffer
   3168 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3169 	{
   3170 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   3171 		DE_NULL,													// pNext;
   3172 		*cmdPool,													// pool;
   3173 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   3174 		BUFFER_COUNT,												// bufferCount;
   3175 	};
   3176 	VkCommandBuffer cmdBuffers[BUFFER_COUNT];
   3177 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
   3178 
   3179 	const VkCommandBufferBeginInfo			cmdBufBeginInfo			=
   3180 	{
   3181 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3182 		DE_NULL,													// pNext
   3183 		0u,															// flags
   3184 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3185 	};
   3186 
   3187 	std::vector<VkEventSp>					events;
   3188 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3189 		events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
   3190 
   3191 	// Record the command buffers
   3192 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3193 	{
   3194 		VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
   3195 		{
   3196 			vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   3197 		}
   3198 		VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
   3199 	}
   3200 
   3201 	// We'll use a fence to wait for the execution of the queue
   3202 	const Unique<VkFence>					fenceZero				(createFence(vk, vkDevice));
   3203 	const Unique<VkFence>					fenceOne				(createFence(vk, vkDevice));
   3204 
   3205 	const VkSubmitInfo						submitInfoCountZero		=
   3206 	{
   3207 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3208 		DE_NULL,													// pNext
   3209 		0u,															// waitSemaphoreCount
   3210 		DE_NULL,													// pWaitSemaphores
   3211 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3212 		1u,															// commandBufferCount
   3213 		&cmdBuffers[0],												// pCommandBuffers
   3214 		0u,															// signalSemaphoreCount
   3215 		DE_NULL,													// pSignalSemaphores
   3216 	};
   3217 
   3218 	const VkSubmitInfo						submitInfoCountOne		=
   3219 	{
   3220 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3221 		DE_NULL,													// pNext
   3222 		0u,															// waitSemaphoreCount
   3223 		DE_NULL,													// pWaitSemaphores
   3224 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3225 		1u,															// commandBufferCount
   3226 		&cmdBuffers[1],												// pCommandBuffers
   3227 		0u,															// signalSemaphoreCount
   3228 		DE_NULL,													// pSignalSemaphores
   3229 	};
   3230 
   3231 	// Submit the command buffers to the queue
   3232 	// We're performing two submits to make sure that the first one has
   3233 	// a chance to be processed before we check the event's status
   3234 	VK_CHECK(vk.queueSubmit(queue, 0, &submitInfoCountZero, fenceZero.get()));
   3235 	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfoCountOne, fenceOne.get()));
   3236 
   3237 	const VkFence							fences[]				=
   3238 	{
   3239 		fenceZero.get(),
   3240 		fenceOne.get(),
   3241 	};
   3242 
   3243 	// Wait for the queue
   3244 	VK_CHECK(vk.waitForFences(vkDevice, (deUint32)DE_LENGTH_OF_ARRAY(fences), fences, VK_TRUE, INFINITE_TIMEOUT));
   3245 
   3246 	// Check if the first buffer was executed
   3247 	tcu::TestStatus testResult = tcu::TestStatus::incomplete();
   3248 
   3249 	if (vk.getEventStatus(vkDevice, events[0]->get()) == VK_EVENT_SET)
   3250 		testResult = tcu::TestStatus::fail("The first event was signaled.");
   3251 	else
   3252 		testResult = tcu::TestStatus::pass("The first submission was ignored.");
   3253 
   3254 	return testResult;
   3255 }
   3256 
   3257 tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context)
   3258 {
   3259 	const VkDevice							vkDevice				= context.getDevice();
   3260 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3261 	const VkQueue							queue					= context.getUniversalQueue();
   3262 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3263 
   3264 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3265 	{
   3266 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// VkStructureType				sType;
   3267 		DE_NULL,													// const void*					pNext;
   3268 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// VkCommandPoolCreateFlags		flags;
   3269 		queueFamilyIndex,											// deUint32						queueFamilyIndex;
   3270 	};
   3271 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3272 
   3273 	// Command buffer
   3274 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3275 	{
   3276 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// VkStructureType				sType;
   3277 		DE_NULL,													// const void*					pNext;
   3278 		*cmdPool,													// VkCommandPool				pool;
   3279 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// VkCommandBufferLevel			level;
   3280 		1u,															// uint32_t						bufferCount;
   3281 	};
   3282 
   3283 	// Create two command buffers
   3284 	const Unique<VkCommandBuffer>			primCmdBuf1				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3285 	const Unique<VkCommandBuffer>			primCmdBuf2				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3286 
   3287 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   3288 	{
   3289 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3290 		DE_NULL,													// pNext
   3291 		0,															// flags
   3292 		DE_NULL														// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
   3293 	};
   3294 
   3295 	// create two events that will be used to check if command buffers has been executed
   3296 	const Unique<VkEvent>					event1					(createEvent(vk, vkDevice));
   3297 	const Unique<VkEvent>					event2					(createEvent(vk, vkDevice));
   3298 
   3299 	// reset events
   3300 	VK_CHECK(vk.resetEvent(vkDevice, *event1));
   3301 	VK_CHECK(vk.resetEvent(vkDevice, *event2));
   3302 
   3303 	// record first command buffer
   3304 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
   3305 	{
   3306 		// allow execution of event during every stage of pipeline
   3307 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   3308 
   3309 		// record setting event
   3310 		vk.cmdSetEvent(*primCmdBuf1, *event1,stageMask);
   3311 	}
   3312 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
   3313 
   3314 	// record second command buffer
   3315 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
   3316 	{
   3317 		// allow execution of event during every stage of pipeline
   3318 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   3319 
   3320 		// record setting event
   3321 		vk.cmdSetEvent(*primCmdBuf2, *event2,stageMask);
   3322 	}
   3323 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
   3324 
   3325 	// create fence to wait for execution of queue
   3326 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   3327 
   3328 	// create semaphore for use in this test
   3329 	const Unique <VkSemaphore>				semaphore				(createSemaphore(vk, vkDevice));
   3330 
   3331 	// create submit info for first buffer - signalling semaphore
   3332 	const VkSubmitInfo						submitInfo1				=
   3333 	{
   3334 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3335 		DE_NULL,													// pNext
   3336 		0u,															// waitSemaphoreCount
   3337 		DE_NULL,													// pWaitSemaphores
   3338 		DE_NULL,													// pWaitDstStageMask
   3339 		1,															// commandBufferCount
   3340 		&primCmdBuf1.get(),											// pCommandBuffers
   3341 		1u,															// signalSemaphoreCount
   3342 		&semaphore.get(),											// pSignalSemaphores
   3343 	};
   3344 
   3345 	// Submit the command buffer to the queue
   3346 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
   3347 
   3348 	// wait for end of execution of queue
   3349 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   3350 
   3351 	// check if buffer has been executed
   3352 	VkResult result = vk.getEventStatus(vkDevice,*event1);
   3353 	if (result != VK_EVENT_SET)
   3354 		return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
   3355 
   3356 	const VkPipelineStageFlags				waitDstStageFlags		= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
   3357 
   3358 	// create submit info for second buffer - waiting for semaphore
   3359 	const VkSubmitInfo						submitInfo2				=
   3360 	{
   3361 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3362 		DE_NULL,													// pNext
   3363 		1u,															// waitSemaphoreCount
   3364 		&semaphore.get(),											// pWaitSemaphores
   3365 		&waitDstStageFlags,											// pWaitDstStageMask
   3366 		1,															// commandBufferCount
   3367 		&primCmdBuf2.get(),											// pCommandBuffers
   3368 		0u,															// signalSemaphoreCount
   3369 		DE_NULL,													// pSignalSemaphores
   3370 	};
   3371 
   3372 	// reset fence, so it can be used again
   3373 	VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   3374 
   3375 	// Submit the second command buffer to the queue
   3376 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
   3377 
   3378 	// wait for end of execution of queue
   3379 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   3380 
   3381 	// check if second buffer has been executed
   3382 	// if it has been executed, it means that the semaphore was signalled - so test if passed
   3383 	result = vk.getEventStatus(vkDevice,*event1);
   3384 	if (result != VK_EVENT_SET)
   3385 		return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
   3386 
   3387 	return tcu::TestStatus::pass("Submit Buffer and Wait for Single Semaphore Test succeeded");
   3388 }
   3389 
   3390 tcu::TestStatus submitBufferWaitManySemaphores(Context& context)
   3391 {
   3392 	// This test will create numSemaphores semaphores, and signal them in NUM_SEMAPHORES submits to queue
   3393 	// After that the numSubmissions queue submissions will wait for each semaphore
   3394 
   3395 	const deUint32							numSemaphores			= 10u;  // it must be multiply of numSubmission
   3396 	const deUint32							numSubmissions			= 2u;
   3397 	const VkDevice							vkDevice				= context.getDevice();
   3398 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3399 	const VkQueue							queue					= context.getUniversalQueue();
   3400 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3401 
   3402 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3403 	{
   3404 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// VkStructureType				sType;
   3405 		DE_NULL,													// const void*					pNext;
   3406 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// VkCommandPoolCreateFlags		flags;
   3407 		queueFamilyIndex,											// deUint32						queueFamilyIndex;
   3408 	};
   3409 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3410 
   3411 	// Command buffer
   3412 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3413 	{
   3414 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// VkStructureType				sType;
   3415 		DE_NULL,													// const void*					pNext;
   3416 		*cmdPool,													// VkCommandPool				pool;
   3417 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// VkCommandBufferLevel			level;
   3418 		1u,															// uint32_t						bufferCount;
   3419 	};
   3420 
   3421 	// Create command buffer
   3422 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3423 
   3424 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   3425 	{
   3426 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3427 		DE_NULL,													// pNext
   3428 		0,															// flags
   3429 		DE_NULL														// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
   3430 	};
   3431 
   3432 	// create event that will be used to check if command buffers has been executed
   3433 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   3434 
   3435 	// reset event - at creation state is undefined
   3436 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   3437 
   3438 	// record command buffer
   3439 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   3440 	{
   3441 		// allow execution of event during every stage of pipeline
   3442 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   3443 
   3444 		// record setting event
   3445 		vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
   3446 	}
   3447 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   3448 
   3449 	// create fence to wait for execution of queue
   3450 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   3451 
   3452 	// numSemaphores is declared const, so this array can be static
   3453 	// the semaphores will be destroyed automatically at end of scope
   3454 	Move <VkSemaphore>						semaphoreArray[numSemaphores];
   3455 	VkSemaphore								semaphores[numSemaphores];
   3456 
   3457 	for (deUint32 idx = 0; idx < numSemaphores; ++idx) {
   3458 		// create semaphores for use in this test
   3459 		semaphoreArray[idx] = createSemaphore(vk, vkDevice);
   3460 		semaphores[idx] = semaphoreArray[idx].get();
   3461 	};
   3462 
   3463 	{
   3464 		// create submit info for buffer - signal semaphores
   3465 		const VkSubmitInfo submitInfo1 =
   3466 		{
   3467 			VK_STRUCTURE_TYPE_SUBMIT_INFO,							// sType
   3468 			DE_NULL,												// pNext
   3469 			0u,														// waitSemaphoreCount
   3470 			DE_NULL,												// pWaitSemaphores
   3471 			DE_NULL,												// pWaitDstStageMask
   3472 			1,														// commandBufferCount
   3473 			&primCmdBuf.get(),										// pCommandBuffers
   3474 			numSemaphores,											// signalSemaphoreCount
   3475 			semaphores												// pSignalSemaphores
   3476 		};
   3477 		// Submit the command buffer to the queue
   3478 		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
   3479 
   3480 		// wait for end of execution of queue
   3481 		VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   3482 
   3483 		// check if buffer has been executed
   3484 		VkResult result = vk.getEventStatus(vkDevice,*event);
   3485 		if (result != VK_EVENT_SET)
   3486 			return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
   3487 
   3488 		// reset event, so next buffers can set it again
   3489 		VK_CHECK(vk.resetEvent(vkDevice, *event));
   3490 
   3491 		// reset fence, so it can be used again
   3492 		VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   3493 	}
   3494 
   3495 	const deUint32							numberOfSemaphoresToBeWaitedByOneSubmission	= numSemaphores / numSubmissions;
   3496 	const std::vector<VkPipelineStageFlags>	waitDstStageFlags							(numberOfSemaphoresToBeWaitedByOneSubmission, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
   3497 
   3498 	// the following code waits for the semaphores set above - numSubmissions queues will wait for each semaphore from above
   3499 	for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) {
   3500 
   3501 		// create submit info for buffer - waiting for semaphore
   3502 		const VkSubmitInfo				submitInfo2				=
   3503 		{
   3504 			VK_STRUCTURE_TYPE_SUBMIT_INFO,												// sType
   3505 			DE_NULL,																	// pNext
   3506 			numberOfSemaphoresToBeWaitedByOneSubmission,								// waitSemaphoreCount
   3507 			semaphores + (numberOfSemaphoresToBeWaitedByOneSubmission * idxSubmission),	// pWaitSemaphores
   3508 			waitDstStageFlags.data(),													// pWaitDstStageMask
   3509 			1,																			// commandBufferCount
   3510 			&primCmdBuf.get(),															// pCommandBuffers
   3511 			0u,																			// signalSemaphoreCount
   3512 			DE_NULL,																	// pSignalSemaphores
   3513 		};
   3514 
   3515 		// Submit the second command buffer to the queue
   3516 		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
   3517 
   3518 		// wait for 1 second.
   3519 		VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 1000 * 1000 * 1000));
   3520 
   3521 		// check if second buffer has been executed
   3522 		// if it has been executed, it means that the semaphore was signalled - so test if passed
   3523 		VkResult result = vk.getEventStatus(vkDevice,*event);
   3524 		if (result != VK_EVENT_SET)
   3525 			return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
   3526 
   3527 		// reset fence, so it can be used again
   3528 		VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
   3529 
   3530 		// reset event, so next buffers can set it again
   3531 		VK_CHECK(vk.resetEvent(vkDevice, *event));
   3532 	}
   3533 
   3534 	return tcu::TestStatus::pass("Submit Buffer and Wait for Many Semaphores Test succeeded");
   3535 }
   3536 
   3537 tcu::TestStatus submitBufferNullFence(Context& context)
   3538 {
   3539 	const VkDevice							vkDevice				= context.getDevice();
   3540 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3541 	const VkQueue							queue					= context.getUniversalQueue();
   3542 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3543 
   3544 	const short								BUFFER_COUNT			= 2;
   3545 
   3546 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3547 	{
   3548 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   3549 		DE_NULL,													// pNext;
   3550 		0u,															// flags;
   3551 		queueFamilyIndex,											// queueFamilyIndex;
   3552 	};
   3553 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3554 
   3555 	// Command buffer
   3556 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3557 	{
   3558 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   3559 		DE_NULL,													// pNext;
   3560 		*cmdPool,													// pool;
   3561 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   3562 		1u,															// bufferCount;
   3563 	};
   3564 	VkCommandBuffer cmdBuffers[BUFFER_COUNT];
   3565 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3566 		VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, &cmdBuffers[ndx]));
   3567 
   3568 	const VkCommandBufferBeginInfo			cmdBufBeginInfo			=
   3569 	{
   3570 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3571 		DE_NULL,													// pNext
   3572 		0u,															// flags
   3573 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3574 	};
   3575 
   3576 	std::vector<VkEventSp>					events;
   3577 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3578 		events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
   3579 
   3580 	// Record the command buffers
   3581 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3582 	{
   3583 		VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
   3584 		{
   3585 			vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   3586 		}
   3587 		VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
   3588 	}
   3589 
   3590 	// We'll use a fence to wait for the execution of the queue
   3591 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   3592 
   3593 	const VkSubmitInfo						submitInfoNullFence		=
   3594 	{
   3595 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3596 		DE_NULL,													// pNext
   3597 		0u,															// waitSemaphoreCount
   3598 		DE_NULL,													// pWaitSemaphores
   3599 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3600 		1u,															// commandBufferCount
   3601 		&cmdBuffers[0],												// pCommandBuffers
   3602 		0u,															// signalSemaphoreCount
   3603 		DE_NULL,													// pSignalSemaphores
   3604 	};
   3605 
   3606 	const VkSubmitInfo						submitInfoNonNullFence	=
   3607 	{
   3608 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3609 		DE_NULL,													// pNext
   3610 		0u,															// waitSemaphoreCount
   3611 		DE_NULL,													// pWaitSemaphores
   3612 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3613 		1u,															// commandBufferCount
   3614 		&cmdBuffers[1],												// pCommandBuffers
   3615 		0u,															// signalSemaphoreCount
   3616 		DE_NULL,													// pSignalSemaphores
   3617 	};
   3618 
   3619 	// Perform two submissions - one with no fence, the other one with a valid
   3620 	// fence Hoping submitting the other buffer will give the first one time to
   3621 	// execute
   3622 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNullFence, DE_NULL));
   3623 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNonNullFence, fence.get()));
   3624 
   3625 	// Wait for the queue
   3626 	VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
   3627 
   3628 
   3629 	tcu::TestStatus testResult = tcu::TestStatus::incomplete();
   3630 
   3631 	//Fence guaranteed that all buffers submited before fence were executed
   3632 	if (vk.getEventStatus(vkDevice, events[0]->get()) != VK_EVENT_SET || vk.getEventStatus(vkDevice, events[1]->get()) != VK_EVENT_SET)
   3633 	{
   3634 		testResult = tcu::TestStatus::fail("One of the buffers was not executed.");
   3635 	}
   3636 	else
   3637 	{
   3638 		testResult = tcu::TestStatus::pass("Buffers have been submitted and executed correctly.");
   3639 	}
   3640 
   3641 	vk.queueWaitIdle(queue);
   3642 	return testResult;
   3643 }
   3644 
   3645 /******** 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) *******/
   3646 tcu::TestStatus executeSecondaryBufferTest(Context& context)
   3647 {
   3648 	const VkDevice							vkDevice				= context.getDevice();
   3649 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3650 	const VkQueue							queue					= context.getUniversalQueue();
   3651 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3652 
   3653 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3654 	{
   3655 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   3656 		DE_NULL,													// pNext;
   3657 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags;
   3658 		queueFamilyIndex,											// queueFamilyIndex;
   3659 	};
   3660 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3661 
   3662 	// Command buffer
   3663 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3664 	{
   3665 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   3666 		DE_NULL,													// pNext;
   3667 		*cmdPool,													// commandPool;
   3668 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level;
   3669 		1u,															// bufferCount;
   3670 	};
   3671 	const Unique<VkCommandBuffer>			primCmdBuf				(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3672 
   3673 	// Secondary Command buffer
   3674 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   3675 	{
   3676 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType;
   3677 		DE_NULL,													// pNext;
   3678 		*cmdPool,													// commandPool;
   3679 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							// level;
   3680 		1u,															// bufferCount;
   3681 	};
   3682 	const Unique<VkCommandBuffer>			secCmdBuf				(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
   3683 
   3684 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   3685 	{
   3686 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3687 		DE_NULL,													// pNext
   3688 		0u,															// flags
   3689 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3690 	};
   3691 
   3692 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   3693 	{
   3694 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   3695 		DE_NULL,
   3696 		DE_NULL,													// renderPass
   3697 		0u,															// subpass
   3698 		DE_NULL,													// framebuffer
   3699 		VK_FALSE,													// occlusionQueryEnable
   3700 		(VkQueryControlFlags)0u,									// queryFlags
   3701 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   3702 	};
   3703 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   3704 	{
   3705 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   3706 		DE_NULL,													// pNext
   3707 		0u,															// flags
   3708 		&secCmdBufInheritInfo,
   3709 	};
   3710 
   3711 	// create event that will be used to check if secondary command buffer has been executed
   3712 	const Unique<VkEvent>					event					(createEvent(vk, vkDevice));
   3713 
   3714 	// reset event
   3715 	VK_CHECK(vk.resetEvent(vkDevice, *event));
   3716 
   3717 	// record secondary command buffer
   3718 	VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
   3719 	{
   3720 		// allow execution of event during every stage of pipeline
   3721 		VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   3722 		// record setting event
   3723 		vk.cmdSetEvent(*secCmdBuf, *event, stageMask);
   3724 	}
   3725 	// end recording of the secondary buffer
   3726 	VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
   3727 
   3728 	// record primary command buffer
   3729 	VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
   3730 	{
   3731 		// execute secondary buffer
   3732 		vk.cmdExecuteCommands(*primCmdBuf, 1u, &secCmdBuf.get());
   3733 	}
   3734 	VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
   3735 
   3736 	// create fence to wait for execution of queue
   3737 	const Unique<VkFence>					fence					(createFence(vk, vkDevice));
   3738 	const VkSubmitInfo						submitInfo				=
   3739 	{
   3740 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3741 		DE_NULL,													// pNext
   3742 		0u,															// waitSemaphoreCount
   3743 		DE_NULL,													// pWaitSemaphores
   3744 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3745 		1u,															// commandBufferCount
   3746 		&primCmdBuf.get(),											// pCommandBuffers
   3747 		0u,															// signalSemaphoreCount
   3748 		DE_NULL,													// pSignalSemaphores
   3749 	};
   3750 
   3751 	// submit primary buffer, the secondary should be executed too
   3752 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
   3753 
   3754 	// wait for end of execution of queue
   3755 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
   3756 
   3757 	// check if secondary buffer has been executed
   3758 	VkResult result = vk.getEventStatus(vkDevice, *event);
   3759 	if (result == VK_EVENT_SET)
   3760 		return tcu::TestStatus::pass("executeSecondaryBufferTest succeeded");
   3761 
   3762 	return tcu::TestStatus::fail("executeSecondaryBufferTest FAILED");
   3763 }
   3764 
   3765 tcu::TestStatus executeSecondaryBufferTwiceTest(Context& context)
   3766 {
   3767 	const deUint32							BUFFER_COUNT			= 10u;
   3768 	const VkDevice							vkDevice				= context.getDevice();
   3769 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3770 	const VkQueue							queue					= context.getUniversalQueue();
   3771 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3772 
   3773 	const VkCommandPoolCreateInfo			cmdPoolParams			=
   3774 	{
   3775 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					//	VkStructureType				sType;
   3776 		DE_NULL,													//	const void*					pNext;
   3777 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			//	VkCommandPoolCreateFlags	flags;
   3778 		queueFamilyIndex,											//	deUint32					queueFamilyIndex;
   3779 	};
   3780 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
   3781 
   3782 	// Command buffer
   3783 	const VkCommandBufferAllocateInfo		cmdBufParams			=
   3784 	{
   3785 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   3786 		DE_NULL,													//	const void*				pNext;
   3787 		*cmdPool,													//	VkCommandPool				pool;
   3788 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							//	VkCommandBufferLevel		level;
   3789 		1u,															//	uint32_t					bufferCount;
   3790 	};
   3791 	const Unique<VkCommandBuffer>			primCmdBufOne			(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3792 	const Unique<VkCommandBuffer>			primCmdBufTwo			(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
   3793 
   3794 	// Secondary Command buffers params
   3795 	const VkCommandBufferAllocateInfo		secCmdBufParams			=
   3796 	{
   3797 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				//	VkStructureType			sType;
   3798 		DE_NULL,													//	const void*				pNext;
   3799 		*cmdPool,													//	VkCommandPool				pool;
   3800 		VK_COMMAND_BUFFER_LEVEL_SECONDARY,							//	VkCommandBufferLevel		level;
   3801 		BUFFER_COUNT,												//	uint32_t					bufferCount;
   3802 	};
   3803 	VkCommandBuffer cmdBuffers[BUFFER_COUNT];
   3804 	VK_CHECK(vk.allocateCommandBuffers(vkDevice, &secCmdBufParams, cmdBuffers));
   3805 
   3806 	const VkCommandBufferBeginInfo			primCmdBufBeginInfo		=
   3807 	{
   3808 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   3809 		DE_NULL,
   3810 		0,															// flags
   3811 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   3812 	};
   3813 
   3814 	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
   3815 	{
   3816 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
   3817 		DE_NULL,
   3818 		(VkRenderPass)0u,											// renderPass
   3819 		0u,															// subpass
   3820 		(VkFramebuffer)0u,											// framebuffer
   3821 		VK_FALSE,													// occlusionQueryEnable
   3822 		(VkQueryControlFlags)0u,									// queryFlags
   3823 		(VkQueryPipelineStatisticFlags)0u,							// pipelineStatistics
   3824 	};
   3825 	const VkCommandBufferBeginInfo			secCmdBufBeginInfo		=
   3826 	{
   3827 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
   3828 		DE_NULL,
   3829 		VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,				// flags
   3830 		&secCmdBufInheritInfo,
   3831 	};
   3832 
   3833 	// create event that will be used to check if secondary command buffer has been executed
   3834 	const Unique<VkEvent>					eventOne				(createEvent(vk, vkDevice));
   3835 
   3836 	// reset event
   3837 	VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
   3838 
   3839 	for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
   3840 	{
   3841 		// record secondary command buffer
   3842 		VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &secCmdBufBeginInfo));
   3843 		{
   3844 			// allow execution of event during every stage of pipeline
   3845 			VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
   3846 
   3847 			// wait for event
   3848 			vk.cmdWaitEvents(cmdBuffers[ndx], 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
   3849 		}
   3850 		// end recording of secondary buffers
   3851 		VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
   3852 	};
   3853 
   3854 	// record primary command buffer one
   3855 	VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
   3856 	{
   3857 		// execute one secondary buffer
   3858 		vk.cmdExecuteCommands(*primCmdBufOne, 1, cmdBuffers );
   3859 	}
   3860 	VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
   3861 
   3862 	// record primary command buffer two
   3863 	VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
   3864 	{
   3865 		// execute one secondary buffer with all buffers
   3866 		vk.cmdExecuteCommands(*primCmdBufTwo, BUFFER_COUNT, cmdBuffers );
   3867 	}
   3868 	VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
   3869 
   3870 	// create fence to wait for execution of queue
   3871 	const Unique<VkFence>					fenceOne				(createFence(vk, vkDevice));
   3872 	const Unique<VkFence>					fenceTwo				(createFence(vk, vkDevice));
   3873 
   3874 	const VkSubmitInfo						submitInfoOne			=
   3875 	{
   3876 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3877 		DE_NULL,													// pNext
   3878 		0u,															// waitSemaphoreCount
   3879 		DE_NULL,													// pWaitSemaphores
   3880 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3881 		1,															// commandBufferCount
   3882 		&primCmdBufOne.get(),										// pCommandBuffers
   3883 		0u,															// signalSemaphoreCount
   3884 		DE_NULL,													// pSignalSemaphores
   3885 	};
   3886 
   3887 	// submit primary buffer, the secondary should be executed too
   3888 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoOne, *fenceOne));
   3889 
   3890 	// wait for buffer to stop at event for 100 microseconds
   3891 	vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
   3892 
   3893 	const VkSubmitInfo						submitInfoTwo			=
   3894 	{
   3895 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   3896 		DE_NULL,													// pNext
   3897 		0u,															// waitSemaphoreCount
   3898 		DE_NULL,													// pWaitSemaphores
   3899 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   3900 		1,															// commandBufferCount
   3901 		&primCmdBufTwo.get(),										// pCommandBuffers
   3902 		0u,															// signalSemaphoreCount
   3903 		DE_NULL,													// pSignalSemaphores
   3904 	};
   3905 
   3906 	// submit second primary buffer, the secondary should be executed too
   3907 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoTwo, *fenceTwo));
   3908 
   3909 	// wait for all buffers to stop at event for 100 microseconds
   3910 	vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
   3911 
   3912 	// now all buffers are waiting at eventOne
   3913 	// set event eventOne
   3914 	VK_CHECK(vk.setEvent(vkDevice, *eventOne));
   3915 
   3916 	// wait for end of execution of fenceOne
   3917 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, INFINITE_TIMEOUT));
   3918 
   3919 	// wait for end of execution of second queue
   3920 	VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceTwo.get(), 0u, INFINITE_TIMEOUT));
   3921 
   3922 	return tcu::TestStatus::pass("executeSecondaryBufferTwiceTest succeeded");
   3923 }
   3924 
   3925 /******** 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) **/
   3926 tcu::TestStatus orderBindPipelineTest(Context& context)
   3927 {
   3928 	const DeviceInterface&					vk						= context.getDeviceInterface();
   3929 	const VkDevice							device					= context.getDevice();
   3930 	const VkQueue							queue					= context.getUniversalQueue();
   3931 	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
   3932 	Allocator&								allocator				= context.getDefaultAllocator();
   3933 	const ComputeInstanceResultBuffer		result					(vk, device, allocator);
   3934 
   3935 	enum
   3936 	{
   3937 		ADDRESSABLE_SIZE = 256, // allocate a lot more than required
   3938 	};
   3939 
   3940 	const tcu::Vec4							colorA1					= tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
   3941 	const tcu::Vec4							colorA2					= tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f);
   3942 	const tcu::Vec4							colorB1					= tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
   3943 	const tcu::Vec4							colorB2					= tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f);
   3944 
   3945 	const deUint32							dataOffsetA				= (0u);
   3946 	const deUint32							dataOffsetB				= (0u);
   3947 	const deUint32							viewOffsetA				= (0u);
   3948 	const deUint32							viewOffsetB				= (0u);
   3949 	const deUint32							bufferSizeA				= dataOffsetA + ADDRESSABLE_SIZE;
   3950 	const deUint32							bufferSizeB				= dataOffsetB + ADDRESSABLE_SIZE;
   3951 
   3952 	de::MovePtr<Allocation>					bufferMemA;
   3953 	const Unique<VkBuffer>					bufferA					(createColorDataBuffer(dataOffsetA, bufferSizeA, colorA1, colorA2, &bufferMemA, context));
   3954 
   3955 	de::MovePtr<Allocation>					bufferMemB;
   3956 	const Unique<VkBuffer>					bufferB					(createColorDataBuffer(dataOffsetB, bufferSizeB, colorB1, colorB2, &bufferMemB, context));
   3957 
   3958 	const Unique<VkDescriptorSetLayout>		descriptorSetLayout		(createDescriptorSetLayout(context));
   3959 	const Unique<VkDescriptorPool>			descriptorPool			(createDescriptorPool(context));
   3960 	const Unique<VkDescriptorSet>			descriptorSet			(createDescriptorSet(*descriptorPool, *descriptorSetLayout, *bufferA, viewOffsetA, *bufferB, viewOffsetB, result.getBuffer(), context));
   3961 	const VkDescriptorSet					descriptorSets[]		= { *descriptorSet };
   3962 	const int								numDescriptorSets		= DE_LENGTH_OF_ARRAY(descriptorSets);
   3963 
   3964 	const VkPipelineLayoutCreateInfo layoutCreateInfo =
   3965 	{
   3966 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,				// sType
   3967 		DE_NULL,													// pNext
   3968 		(VkPipelineLayoutCreateFlags)0,
   3969 		numDescriptorSets,											// setLayoutCount
   3970 		&descriptorSetLayout.get(),									// pSetLayouts
   3971 		0u,															// pushConstantRangeCount
   3972 		DE_NULL,													// pPushConstantRanges
   3973 	};
   3974 	Unique<VkPipelineLayout>				pipelineLayout			(createPipelineLayout(vk, device, &layoutCreateInfo));
   3975 
   3976 	const Unique<VkShaderModule>			computeModuleGood		(createShaderModule(vk, device, context.getBinaryCollection().get("compute_good"), (VkShaderModuleCreateFlags)0u));
   3977 	const Unique<VkShaderModule>			computeModuleBad		(createShaderModule(vk, device, context.getBinaryCollection().get("compute_bad"),  (VkShaderModuleCreateFlags)0u));
   3978 
   3979 	const VkPipelineShaderStageCreateInfo	shaderCreateInfoGood	=
   3980 	{
   3981 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   3982 		DE_NULL,
   3983 		(VkPipelineShaderStageCreateFlags)0,
   3984 		VK_SHADER_STAGE_COMPUTE_BIT,								// stage
   3985 		*computeModuleGood,											// shader
   3986 		"main",
   3987 		DE_NULL,													// pSpecializationInfo
   3988 	};
   3989 
   3990 	const VkPipelineShaderStageCreateInfo	shaderCreateInfoBad	=
   3991 	{
   3992 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   3993 		DE_NULL,
   3994 		(vk::VkPipelineShaderStageCreateFlags)0,
   3995 		vk::VK_SHADER_STAGE_COMPUTE_BIT,							// stage
   3996 		*computeModuleBad,											// shader
   3997 		"main",
   3998 		DE_NULL,													// pSpecializationInfo
   3999 	};
   4000 
   4001 	const VkComputePipelineCreateInfo		createInfoGood			=
   4002 	{
   4003 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
   4004 		DE_NULL,
   4005 		0u,															// flags
   4006 		shaderCreateInfoGood,										// cs
   4007 		*pipelineLayout,											// layout
   4008 		(vk::VkPipeline)0,											// basePipelineHandle
   4009 		0u,															// basePipelineIndex
   4010 	};
   4011 
   4012 	const VkComputePipelineCreateInfo		createInfoBad			=
   4013 	{
   4014 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
   4015 		DE_NULL,
   4016 		0u,															// flags
   4017 		shaderCreateInfoBad,										// cs
   4018 		*pipelineLayout,											// descriptorSetLayout.get()
   4019 		(VkPipeline)0,												// basePipelineHandle
   4020 		0u,															// basePipelineIndex
   4021 	};
   4022 
   4023 	const Unique<VkPipeline>				pipelineGood			(createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoGood));
   4024 	const Unique<VkPipeline>				pipelineBad				(createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoBad));
   4025 
   4026 	const VkAccessFlags						inputBit				= (VK_ACCESS_UNIFORM_READ_BIT);
   4027 	const VkBufferMemoryBarrier				bufferBarriers[]		=
   4028 	{
   4029 		{
   4030 			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
   4031 			DE_NULL,
   4032 			VK_ACCESS_HOST_WRITE_BIT,									// outputMask
   4033 			inputBit,													// inputMask
   4034 			VK_QUEUE_FAMILY_IGNORED,									// srcQueueFamilyIndex
   4035 			VK_QUEUE_FAMILY_IGNORED,									// destQueueFamilyIndex
   4036 			*bufferA,													// buffer
   4037 			(VkDeviceSize)0u,											// offset
   4038 			(VkDeviceSize)bufferSizeA,									// size
   4039 		},
   4040 		{
   4041 			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
   4042 			DE_NULL,
   4043 			VK_ACCESS_HOST_WRITE_BIT,									// outputMask
   4044 			inputBit,													// inputMask
   4045 			VK_QUEUE_FAMILY_IGNORED,									// srcQueueFamilyIndex
   4046 			VK_QUEUE_FAMILY_IGNORED,									// destQueueFamilyIndex
   4047 			*bufferB,													// buffer
   4048 			(VkDeviceSize)0u,											// offset
   4049 			(VkDeviceSize)bufferSizeB,									// size
   4050 		}
   4051 	};
   4052 
   4053 	const deUint32							numSrcBuffers			= 1u;
   4054 
   4055 	const deUint32* const					dynamicOffsets			= (DE_NULL);
   4056 	const deUint32							numDynamicOffsets		= (0);
   4057 	const int								numPreBarriers			= numSrcBuffers;
   4058 	const vk::VkBufferMemoryBarrier* const	postBarriers			= result.getResultReadBarrier();
   4059 	const int								numPostBarriers			= 1;
   4060 	const tcu::Vec4							refQuadrantValue14		= (colorA2);
   4061 	const tcu::Vec4							refQuadrantValue23		= (colorA1);
   4062 	const tcu::Vec4							references[4]			=
   4063 	{
   4064 		refQuadrantValue14,
   4065 		refQuadrantValue23,
   4066 		refQuadrantValue23,
   4067 		refQuadrantValue14,
   4068 	};
   4069 	tcu::Vec4								results[4];
   4070 
   4071 	// submit and wait begin
   4072 
   4073 	const tcu::UVec3 numWorkGroups = tcu::UVec3(4, 1u, 1);
   4074 
   4075 	const VkCommandPoolCreateInfo			cmdPoolCreateInfo		=
   4076 	{
   4077 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType;
   4078 		DE_NULL,													// pNext
   4079 		VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,						// flags
   4080 		queueFamilyIndex,											// queueFamilyIndex
   4081 	};
   4082 	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, device, &cmdPoolCreateInfo));
   4083 	const VkCommandBufferAllocateInfo		cmdBufCreateInfo		=
   4084 	{
   4085 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType
   4086 		DE_NULL,													// pNext
   4087 		*cmdPool,													// commandPool
   4088 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level
   4089 		1u,															// bufferCount;
   4090 	};
   4091 
   4092 	const VkCommandBufferBeginInfo			cmdBufBeginInfo			=
   4093 	{
   4094 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,				// sType
   4095 		DE_NULL,													// pNext
   4096 		0u,															// flags
   4097 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
   4098 	};
   4099 
   4100 	const Unique<VkFence>					cmdCompleteFence		(createFence(vk, device));
   4101 	const Unique<VkCommandBuffer>			cmd						(allocateCommandBuffer(vk, device, &cmdBufCreateInfo));
   4102 
   4103 	VK_CHECK(vk.beginCommandBuffer(*cmd, &cmdBufBeginInfo));
   4104 
   4105 	vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineBad);
   4106 	vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineGood);
   4107 	vk.cmdBindDescriptorSets(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, numDynamicOffsets, dynamicOffsets);
   4108 
   4109 	if (numPreBarriers)
   4110 		vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
   4111 							  0, (const VkMemoryBarrier*)DE_NULL,
   4112 							  numPreBarriers, bufferBarriers,
   4113 							  0, (const VkImageMemoryBarrier*)DE_NULL);
   4114 
   4115 	vk.cmdDispatch(*cmd, numWorkGroups.x(), numWorkGroups.y(), numWorkGroups.z());
   4116 	vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
   4117 						  0, (const VkMemoryBarrier*)DE_NULL,
   4118 						  numPostBarriers, postBarriers,
   4119 						  0, (const VkImageMemoryBarrier*)DE_NULL);
   4120 	VK_CHECK(vk.endCommandBuffer(*cmd));
   4121 
   4122 	// run
   4123 	// submit second primary buffer, the secondary should be executed too
   4124 	const VkSubmitInfo						submitInfo				=
   4125 	{
   4126 		VK_STRUCTURE_TYPE_SUBMIT_INFO,								// sType
   4127 		DE_NULL,													// pNext
   4128 		0u,															// waitSemaphoreCount
   4129 		DE_NULL,													// pWaitSemaphores
   4130 		(const VkPipelineStageFlags*)DE_NULL,						// pWaitDstStageMask
   4131 		1,															// commandBufferCount
   4132 		&cmd.get(),													// pCommandBuffers
   4133 		0u,															// signalSemaphoreCount
   4134 		DE_NULL,													// pSignalSemaphores
   4135 	};
   4136 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *cmdCompleteFence));
   4137 
   4138 	VK_CHECK(vk.waitForFences(device, 1u, &cmdCompleteFence.get(), 0u, INFINITE_TIMEOUT)); // \note: timeout is failure
   4139 	VK_CHECK(vk.resetFences(device, 1u, &cmdCompleteFence.get()));
   4140 
   4141 	// submit and wait end
   4142 	result.readResultContentsTo(&results);
   4143 
   4144 	// verify
   4145 	if (results[0] == references[0] &&
   4146 		results[1] == references[1] &&
   4147 		results[2] == references[2] &&
   4148 		results[3] == references[3])
   4149 	{
   4150 		return tcu::TestStatus::pass("Pass");
   4151 	}
   4152 	else if (results[0] == tcu::Vec4(-1.0f) &&
   4153 			 results[1] == tcu::Vec4(-1.0f) &&
   4154 			 results[2] == tcu::Vec4(-1.0f) &&
   4155 			 results[3] == tcu::Vec4(-1.0f))
   4156 	{
   4157 		context.getTestContext().getLog()
   4158 		<< tcu::TestLog::Message
   4159 		<< "Result buffer was not written to."
   4160 		<< tcu::TestLog::EndMessage;
   4161 		return tcu::TestStatus::fail("Result buffer was not written to");
   4162 	}
   4163 	else
   4164 	{
   4165 		context.getTestContext().getLog()
   4166 		<< tcu::TestLog::Message
   4167 		<< "Error expected ["
   4168 		<< references[0] << ", "
   4169 		<< references[1] << ", "
   4170 		<< references[2] << ", "
   4171 		<< references[3] << "], got ["
   4172 		<< results[0] << ", "
   4173 		<< results[1] << ", "
   4174 		<< results[2] << ", "
   4175 		<< results[3] << "]"
   4176 		<< tcu::TestLog::EndMessage;
   4177 		return tcu::TestStatus::fail("Invalid result values");
   4178 	}
   4179 }
   4180 
   4181 // Shaders
   4182 void genComputeSource (SourceCollections& programCollection)
   4183 {
   4184 	const char* const						versionDecl				= glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   4185 	std::ostringstream						bufGood;
   4186 
   4187 	bufGood << versionDecl << "\n"
   4188 	<< ""
   4189 	<< "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
   4190 	<< "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
   4191 	<< "{\n"
   4192 	<< "	highp vec4 colorA;\n"
   4193 	<< "	highp vec4 colorB;\n"
   4194 	<< "} b_instance;\n"
   4195 	<< "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
   4196 	<< "{\n"
   4197 	<< "	highp vec4 read_colors[4];\n"
   4198 	<< "} b_out;\n"
   4199 	<< "void main(void)\n"
   4200 	<< "{\n"
   4201 	<< "	highp int quadrant_id = int(gl_WorkGroupID.x);\n"
   4202 	<< "	highp vec4 result_color;\n"
   4203 	<< "	if (quadrant_id == 1 || quadrant_id == 2)\n"
   4204 	<< "		result_color = b_instance.colorA;\n"
   4205 	<< "	else\n"
   4206 	<< "		result_color = b_instance.colorB;\n"
   4207 	<< "	b_out.read_colors[gl_WorkGroupID.x] = result_color;\n"
   4208 	<< "}\n";
   4209 
   4210 	programCollection.glslSources.add("compute_good") << glu::ComputeSource(bufGood.str());
   4211 
   4212 	std::ostringstream	bufBad;
   4213 
   4214 	bufBad	<< versionDecl << "\n"
   4215 	<< ""
   4216 	<< "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
   4217 	<< "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
   4218 	<< "{\n"
   4219 	<< "	highp vec4 colorA;\n"
   4220 	<< "	highp vec4 colorB;\n"
   4221 	<< "} b_instance;\n"
   4222 	<< "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
   4223 	<< "{\n"
   4224 	<< "	highp vec4 read_colors[4];\n"
   4225 	<< "} b_out;\n"
   4226 	<< "void main(void)\n"
   4227 	<< "{\n"
   4228 	<< "	highp int quadrant_id = int(gl_WorkGroupID.x);\n"
   4229 	<< "	highp vec4 result_color;\n"
   4230 	<< "	if (quadrant_id == 1 || quadrant_id == 2)\n"
   4231 	<< "		result_color = b_instance.colorA;\n"
   4232 	<< "	else\n"
   4233 	<< "		result_color = b_instance.colorB;\n"
   4234 	<< "	b_out.read_colors[gl_WorkGroupID.x] = vec4(0.0, 0.0, 0.0, 0.0);\n"
   4235 	<< "}\n";
   4236 
   4237 	programCollection.glslSources.add("compute_bad") << glu::ComputeSource(bufBad.str());
   4238 }
   4239 
   4240 void genComputeIncrementSource (SourceCollections& programCollection)
   4241 {
   4242 	const char* const						versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
   4243 	std::ostringstream						bufIncrement;
   4244 
   4245 	bufIncrement << versionDecl << "\n"
   4246 		<< ""
   4247 		<< "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
   4248 		<< "layout(set = 0, binding = 0, std140) buffer InOutBuf\n"
   4249 		<< "{\n"
   4250 		<< "    coherent uint count;\n"
   4251 		<< "} b_in_out;\n"
   4252 		<< "void main(void)\n"
   4253 		<< "{\n"
   4254 		<< "	atomicAdd(b_in_out.count, 1u);\n"
   4255 		<< "}\n";
   4256 
   4257 	programCollection.glslSources.add("compute_increment") << glu::ComputeSource(bufIncrement.str());
   4258 }
   4259 
   4260 } // anonymous
   4261 
   4262 tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx)
   4263 {
   4264 	de::MovePtr<tcu::TestCaseGroup>	commandBuffersTests	(new tcu::TestCaseGroup(testCtx, "command_buffers", "Command Buffers Tests"));
   4265 
   4266 	/* 19.1. Command Pools (5.1 in VK 1.0 Spec) */
   4267 	addFunctionCase				(commandBuffersTests.get(), "pool_create_null_params",			"",	createPoolNullParamsTest);
   4268 	addFunctionCase				(commandBuffersTests.get(), "pool_create_non_null_allocator",	"",	createPoolNonNullAllocatorTest);
   4269 	addFunctionCase				(commandBuffersTests.get(), "pool_create_transient_bit",		"",	createPoolTransientBitTest);
   4270 	addFunctionCase				(commandBuffersTests.get(), "pool_create_reset_bit",			"",	createPoolResetBitTest);
   4271 	addFunctionCase				(commandBuffersTests.get(), "pool_reset_release_res",			"",	resetPoolReleaseResourcesBitTest);
   4272 	addFunctionCase				(commandBuffersTests.get(), "pool_reset_no_flags_res",			"",	resetPoolNoFlagsTest);
   4273 	addFunctionCase				(commandBuffersTests.get(), "pool_reset_reuse",					"",	resetPoolReuseTest);
   4274 	/* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */
   4275 	addFunctionCase				(commandBuffersTests.get(), "allocate_single_primary",			"", allocatePrimaryBufferTest);
   4276 	addFunctionCase				(commandBuffersTests.get(), "allocate_many_primary",			"",	allocateManyPrimaryBuffersTest);
   4277 	addFunctionCase				(commandBuffersTests.get(), "allocate_single_secondary",		"", allocateSecondaryBufferTest);
   4278 	addFunctionCase				(commandBuffersTests.get(), "allocate_many_secondary",			"", allocateManySecondaryBuffersTest);
   4279 	addFunctionCase				(commandBuffersTests.get(), "execute_small_primary",			"",	executePrimaryBufferTest);
   4280 	addFunctionCase				(commandBuffersTests.get(), "execute_large_primary",			"",	executeLargePrimaryBufferTest);
   4281 	addFunctionCase				(commandBuffersTests.get(), "reset_implicit",					"", resetBufferImplicitlyTest);
   4282 	addFunctionCase				(commandBuffersTests.get(), "trim_command_pool",				"", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
   4283 	addFunctionCase				(commandBuffersTests.get(), "trim_command_pool_secondary",		"", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
   4284 	/* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */
   4285 	addFunctionCase				(commandBuffersTests.get(), "record_single_primary",			"",	recordSinglePrimaryBufferTest);
   4286 	addFunctionCase				(commandBuffersTests.get(), "record_many_primary",				"", recordLargePrimaryBufferTest);
   4287 	addFunctionCase				(commandBuffersTests.get(), "record_single_secondary",			"",	recordSingleSecondaryBufferTest);
   4288 	addFunctionCase				(commandBuffersTests.get(), "record_many_secondary",			"", recordLargeSecondaryBufferTest);
   4289 	addFunctionCase				(commandBuffersTests.get(), "submit_twice_primary",				"",	submitPrimaryBufferTwiceTest);
   4290 	addFunctionCase				(commandBuffersTests.get(), "submit_twice_secondary",			"",	submitSecondaryBufferTwiceTest);
   4291 	addFunctionCase				(commandBuffersTests.get(), "record_one_time_submit_primary",	"",	oneTimeSubmitFlagPrimaryBufferTest);
   4292 	addFunctionCase				(commandBuffersTests.get(), "record_one_time_submit_secondary",	"",	oneTimeSubmitFlagSecondaryBufferTest);
   4293 	addFunctionCase				(commandBuffersTests.get(), "render_pass_continue",				"",	renderPassContinueTest);
   4294 	addFunctionCase				(commandBuffersTests.get(), "record_simul_use_primary",			"",	simultaneousUsePrimaryBufferTest);
   4295 	addFunctionCase				(commandBuffersTests.get(), "record_simul_use_secondary",		"",	simultaneousUseSecondaryBufferTest);
   4296 	addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_one_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferOnePrimaryBufferTest);
   4297 	addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_two_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferTwoPrimaryBuffersTest);
   4298 	addFunctionCase				(commandBuffersTests.get(), "record_query_precise_w_flag",		"",	recordBufferQueryPreciseWithFlagTest);
   4299 	addFunctionCase				(commandBuffersTests.get(), "record_query_imprecise_w_flag",	"",	recordBufferQueryImpreciseWithFlagTest);
   4300 	addFunctionCase				(commandBuffersTests.get(), "record_query_imprecise_wo_flag",	"",	recordBufferQueryImpreciseWithoutFlagTest);
   4301 	/* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */
   4302 	addFunctionCase				(commandBuffersTests.get(), "submit_count_non_zero",			"", submitBufferCountNonZero);
   4303 	addFunctionCase				(commandBuffersTests.get(), "submit_count_equal_zero",			"", submitBufferCountEqualZero);
   4304 	addFunctionCase				(commandBuffersTests.get(), "submit_wait_single_semaphore",		"", submitBufferWaitSingleSemaphore);
   4305 	addFunctionCase				(commandBuffersTests.get(), "submit_wait_many_semaphores",		"", submitBufferWaitManySemaphores);
   4306 	addFunctionCase				(commandBuffersTests.get(), "submit_null_fence",				"", submitBufferNullFence);
   4307 	/* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */
   4308 	addFunctionCase				(commandBuffersTests.get(), "secondary_execute",				"",	executeSecondaryBufferTest);
   4309 	addFunctionCase				(commandBuffersTests.get(), "secondary_execute_twice",			"",	executeSecondaryBufferTwiceTest);
   4310 	/* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */
   4311 	addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline",				"", genComputeSource, orderBindPipelineTest);
   4312 
   4313 	return commandBuffersTests.release();
   4314 }
   4315 
   4316 } // api
   4317 } // vkt
   4318 
   4319