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