/*------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2021 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *	  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
  * \brief  VkDeviceObjectReservationCreateInfo tests
*//*--------------------------------------------------------------------*/

#include "vktDeviceObjectReservationTests.hpp"

#include <vector>
#include <string>

#include "tcuTestCase.hpp"

#include "vkDefs.hpp"
#include "vkDeviceUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkSafetyCriticalUtil.hpp"
#include "vkImageWithMemory.hpp"
#include "vkBufferWithMemory.hpp"
#include "vkObjUtil.hpp"

#include "vktTestCaseUtil.hpp"
#include "vktCustomInstancesDevices.hpp"

using namespace vk;

namespace vkt
{
namespace sc
{
namespace
{

enum TestMaxValues
{
	TMV_UNDEFINED = 0,
	TMV_DESCRIPTOR_SET_LAYOUT_BINDING_LIMIT,
	TMV_MAX_IMAGEVIEW_MIPLEVELS,
	TMV_MAX_IMAGEVIEW_ARRAYLAYERS,
	TMV_MAX_LAYEREDIMAGEVIEW_MIPLEVELS,
	TMV_MAX_OCCLUSION_QUERIES_PER_POOL,
	TMV_MAX_PIPELINESTATISTICS_QUERIES_PER_POOL,
	TMV_MAX_TIMESTAMP_QUERIES_PER_POOL
};

const deUint32	VERIFYMAXVALUES_OBJECT_COUNT	= 5U;
const deUint32	VERIFYMAXVALUES_ARRAYLAYERS		= 8U;
const deUint32	VERIFYMAXVALUES_MIPLEVELS		= 5U;

enum TestRequestCounts
{
	TRC_UNDEFINED = 0,
	TRC_SEMAPHORE,
	TRC_COMMAND_BUFFER,
	TRC_FENCE,
	TRC_DEVICE_MEMORY,
	TRC_BUFFER,
	TRC_IMAGE,
	TRC_EVENT,
	TRC_QUERY_POOL,
	TRC_BUFFER_VIEW,
	TRC_IMAGE_VIEW,
	TRC_LAYERED_IMAGE_VIEW,
	TRC_PIPELINE_LAYOUT,
	TRC_RENDER_PASS,
	TRC_GRAPHICS_PIPELINE,
	TRC_COMPUTE_PIPELINE,
	TRC_DESCRIPTORSET_LAYOUT,
	TRC_SAMPLER,
	TRC_DESCRIPTOR_POOL,
	TRC_DESCRIPTORSET,
	TRC_FRAMEBUFFER,
	TRC_COMMANDPOOL,
	TRC_SAMPLERYCBCRCONVERSION,
	TRC_SURFACE,
	TRC_SWAPCHAIN,
	TRC_DISPLAY_MODE,
};

enum TestPoolSizes
{
	PST_UNDEFINED = 0,
	PST_NONE,
	PST_ZERO,
	PST_TOO_SMALL_SIZE,
	PST_ONE_FITS,
	PST_MULTIPLE_FIT,
};

struct TestParams
{
	TestParams (const TestMaxValues& testMaxValues_ = TMV_UNDEFINED, const TestRequestCounts& testRequestCounts_ = TRC_UNDEFINED, const TestPoolSizes& testPoolSizeType_ = PST_UNDEFINED)
		: testMaxValues		{ testMaxValues_ }
		, testRequestCounts	{ testRequestCounts_ }
		, testPoolSizeType	{ testPoolSizeType_ }
	{
	}
	TestMaxValues			testMaxValues;
	TestRequestCounts		testRequestCounts;
	TestPoolSizes			testPoolSizeType;
};

typedef de::SharedPtr<Unique<VkSemaphore>>					SemaphoreSp;
typedef de::SharedPtr<Unique<VkCommandBuffer>>				CommandBufferSp;
typedef de::SharedPtr<Unique<VkFence>>						FenceSp;
typedef de::SharedPtr<Unique<VkDeviceMemory> >				DeviceMemorySp;
typedef de::SharedPtr<Unique<VkBuffer>>						BufferSp;
typedef de::SharedPtr<Unique<VkImage>>						ImageSp;
typedef de::SharedPtr<Unique<VkEvent>>						EventSp;
typedef de::SharedPtr<Unique<VkQueryPool>>					QueryPoolSp;
typedef de::SharedPtr<Unique<VkBufferView>>					BufferViewSp;
typedef de::SharedPtr<Unique<VkImageView>>					ImageViewSp;
typedef de::SharedPtr<Unique<VkPipelineLayout>>				PipelineLayoutSp;
typedef de::SharedPtr<Unique<VkRenderPass>>					RenderPassSp;
typedef de::SharedPtr<Unique<VkPipeline>>					PipelineSp;
typedef de::SharedPtr<Unique<VkDescriptorSetLayout>>		DescriptorSetLayoutSp;
typedef de::SharedPtr<Unique<VkSampler>>					SamplerSp;
typedef de::SharedPtr<Unique<VkDescriptorPool>>				DescriptorPoolSp;
typedef de::SharedPtr<Unique<VkDescriptorSet>>				DescriptorSetSp;
typedef de::SharedPtr<Unique<VkFramebuffer>>				FramebufferSp;
typedef de::SharedPtr<Unique<VkCommandPool>>				CommandPoolSp;
typedef de::SharedPtr<Unique<VkSamplerYcbcrConversion>>		SamplerYcbcrConversionSp;
//typedef de::SharedPtr<Unique<VkSurfaceKHR>>					SurfaceSp;
//typedef de::SharedPtr<Unique<VkSwapchainKHR>>					SwapchainSp;
//typedef de::SharedPtr<Unique<VkDisplayModeKHR>>				DisplayModeSp;
typedef de::SharedPtr<Unique<VkSubpassDescription>>			SubpassDescriptionSp;
typedef de::SharedPtr<Unique<VkAttachmentDescription>>		AttachmentDescriptionSp;


void createSemaphores		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<SemaphoreSp>::iterator		begin,
							 std::vector<SemaphoreSp>::iterator		end)
{
	for(std::vector<SemaphoreSp>::iterator it=begin; it!=end; ++it)
		*it = SemaphoreSp(new Unique<VkSemaphore>(createSemaphore(vkd, device)));
}

void createCommandBuffers	(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 const VkCommandPool					commandPool,
							 std::vector<CommandBufferSp>::iterator	begin,
							 std::vector<CommandBufferSp>::iterator	end)
{
	for (std::vector<CommandBufferSp>::iterator it = begin; it != end; ++it)
	{
		const vk::VkCommandBufferAllocateInfo commandBufferAI =
		{
			vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,				// sType
			DE_NULL,														// pNext
			commandPool,													// commandPool
			vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY,							// level
			1u																// commandBufferCount
		};
		*it = CommandBufferSp(new Unique<VkCommandBuffer>(allocateCommandBuffer(vkd, device, &commandBufferAI)));
	}
}

void createFences			(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<FenceSp>::iterator			begin,
							 std::vector<FenceSp>::iterator			end)
{
	for (std::vector<FenceSp>::iterator it = begin; it != end; ++it)
	{
		const VkFenceCreateInfo fenceCI =
		{
			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,							// VkStructureType		sType
			DE_NULL,														// const void*			pNext
			0u																// VkFenceCreateFlags	flags
		};
		*it = FenceSp(new Unique<VkFence>(createFence(vkd, device, &fenceCI)));
	}
}

void allocateDeviceMemory	(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 VkDeviceSize							size,
							 std::vector<DeviceMemorySp>::iterator	begin,
							 std::vector<DeviceMemorySp>::iterator	end)
{
	for (std::vector<DeviceMemorySp>::iterator it = begin; it != end; ++it)
	{
		VkMemoryAllocateInfo alloc =
		{
			VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,							// sType
			DE_NULL,														// pNext
			size,															// allocationSize
			0U																// memoryTypeIndex;
		};
		*it = DeviceMemorySp(new Unique<VkDeviceMemory>(allocateMemory(vkd, device, &alloc)));
	}
}

void createBuffers			(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 VkDeviceSize							size,
							 std::vector<BufferSp>::iterator		begin,
							 std::vector<BufferSp>::iterator		end)
{
	deUint32 queueFamilyIndex = 0u;
	for (std::vector<BufferSp>::iterator it = begin; it != end; ++it)
	{
		const VkBufferCreateInfo	bufferCI =
		{
			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,							// sType
			DE_NULL,														// pNext
			0u,																// flags
			size,															// size
			VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,								// usage
			VK_SHARING_MODE_EXCLUSIVE,										// sharingMode
			1u,																// queueFamilyIndexCount
			&queueFamilyIndex,												// pQueueFamilyIndices
		};
		*it = BufferSp(new Unique<VkBuffer>(createBuffer(vkd, device, &bufferCI)));
	}
}

void createImages			(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 deUint32								size,
							 std::vector<ImageSp>::iterator			begin,
							 std::vector<ImageSp>::iterator			end)
{
	deUint32 queueFamilyIndex = 0u;
	for (std::vector<ImageSp>::iterator it = begin; it != end; ++it)
	{
		const VkImageCreateInfo			imageCI =
		{
			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,							// VkStructureType			sType
			DE_NULL,														// const void*				pNext
			(VkImageCreateFlags)0u,											// VkImageCreateFlags		flags
			VK_IMAGE_TYPE_2D,												// VkImageType				imageType
			VK_FORMAT_R8_UNORM,												// VkFormat					format
			{
				size,														// deUint32	width
				size,														// deUint32	height
				1u															// deUint32	depth
			},																// VkExtent3D				extent
			1u,																// deUint32					mipLevels
			1u,																// deUint32					arrayLayers
			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits	samples
			VK_IMAGE_TILING_OPTIMAL,										// VkImageTiling			tiling
			VK_IMAGE_USAGE_SAMPLED_BIT,										// VkImageUsageFlags		usage
			VK_SHARING_MODE_EXCLUSIVE,										// VkSharingMode			sharingMode
			1u,																// deUint32					queueFamilyIndexCount
			&queueFamilyIndex,												// const deUint32*			pQueueFamilyIndices
			VK_IMAGE_LAYOUT_UNDEFINED										// VkImageLayout			initialLayout
		};
		*it = ImageSp(new Unique<VkImage>(createImage(vkd, device, &imageCI)));
	}
}

void createEvents			(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<EventSp>::iterator			begin,
							 std::vector<EventSp>::iterator			end)
{
	for(std::vector<EventSp>::iterator it=begin; it!=end; ++it)
		*it = EventSp(new Unique<VkEvent>(createEvent(vkd, device)));
}

void createQueryPools		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<QueryPoolSp>::iterator		begin,
							 std::vector<QueryPoolSp>::iterator		end)
{
	for (std::vector<QueryPoolSp>::iterator it = begin; it != end; ++it)
	{
		const VkQueryPoolCreateInfo	queryPoolCI =
		{
			VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,						//  VkStructureType					sType
			DE_NULL,														//  const void*						pNext
			(VkQueryPoolCreateFlags)0,										//  VkQueryPoolCreateFlags			flags
			VK_QUERY_TYPE_OCCLUSION,										//  VkQueryType						queryType
			1u,																//  deUint32						queryCount
			0u,																//  VkQueryPipelineStatisticFlags	pipelineStatistics
		};
		*it = QueryPoolSp(new Unique<VkQueryPool>(createQueryPool(vkd, device, &queryPoolCI)));
	}
}

void createBufferViews		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 const VkBuffer							buffer,
							 const VkDeviceSize						size,
							 std::vector<BufferViewSp>::iterator	begin,
							 std::vector<BufferViewSp>::iterator	end)
{
	for (std::vector<BufferViewSp>::iterator it = begin; it != end; ++it)
	{
		const VkBufferViewCreateInfo bufferViewCI =
		{
			VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,						// VkStructureType			sType
			DE_NULL,														// const void*				pNext
			0u,																// VkBufferViewCreateFlags	flags
			buffer,															// VkBuffer					buffer
			VK_FORMAT_R8_UNORM,												// VkFormat					format
			0ull,															// VkDeviceSize				offset
			size															// VkDeviceSize				range
		};
		*it = BufferViewSp(new Unique<VkBufferView>(createBufferView(vkd, device, &bufferViewCI)));
	}
}

void createImageViews		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 const VkImage							image,
							 std::vector<ImageViewSp>::iterator		begin,
							 std::vector<ImageViewSp>::iterator		end)
{
	for (std::vector<ImageViewSp>::iterator it = begin; it != end; ++it)
	{
		VkComponentMapping componentMapping { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY };
		VkImageViewCreateInfo imageViewCI =
		{
			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,						// VkStructureType          sType
			DE_NULL,														// const void*              pNext
			0u,																// VkImageViewCreateFlags   flags
			image,															// VkImage                  image
			VK_IMAGE_VIEW_TYPE_2D,											// VkImageViewType          viewType
			VK_FORMAT_R8_UNORM,												// VkFormat                 format
			componentMapping,												// VkComponentMapping       components
			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u },					// VkImageSubresourceRange  subresourceRange
		};
		*it = ImageViewSp(new Unique<VkImageView>(createImageView(vkd, device, &imageViewCI)));
	}
}

void createPipelineLayouts	(const DeviceInterface&						vkd,
							 const VkDevice								device,
							 std::vector<PipelineLayoutSp>::iterator	begin,
							 std::vector<PipelineLayoutSp>::iterator	end)
{
	for (std::vector<PipelineLayoutSp>::iterator it = begin; it != end; ++it)
	{
		const VkPipelineLayoutCreateInfo pipelineLayoutCI =
		{
			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,					// VkStructureType					sType
			DE_NULL,														// const void*						pNext
			0u,																// VkPipelineLayoutCreateFlags		flags
			0u,																// deUint32							setLayoutCount
			DE_NULL,														// const VkDescriptorSetLayout*		pSetLayouts
			0u,																// deUint32							pushConstantRangeCount
			DE_NULL															// const VkPushConstantRange*		pPushConstantRanges
		};
		*it = PipelineLayoutSp(new Unique<VkPipelineLayout>(createPipelineLayout(vkd, device, &pipelineLayoutCI)));
	}
}

void createRenderPasses		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 VkAttachmentDescription*				colorAttachment,
							 std::vector<RenderPassSp>::iterator	begin,
							 std::vector<RenderPassSp>::iterator	end)
{
	for (std::vector<RenderPassSp>::iterator it = begin; it != end; ++it)
	{
		const VkAttachmentReference		colorAttachmentRef =
		{
			0u,																// deUint32			attachment
			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL						// VkImageLayout	layout
		};

		const VkSubpassDescription		subpassDescription =
		{
			0u,																// VkSubpassDescriptionFlags	flags
			VK_PIPELINE_BIND_POINT_GRAPHICS,								// VkPipelineBindPoint			pipelineBindPoint
			0u,																// deUint32						inputAttachmentCount
			DE_NULL,														// const VkAttachmentReference*	pInputAttachments
			1u,																// deUint32						colorAttachmentCount
			&colorAttachmentRef,											// const VkAttachmentReference*	pColorAttachments
			DE_NULL,														// const VkAttachmentReference*	pResolveAttachments
			DE_NULL,														// const VkAttachmentReference*	pDepthStencilAttachment
			0u,																// deUint32						preserveAttachmentCount
			DE_NULL															// const deUint32*				pPreserveAttachments
		};

		const VkRenderPassCreateInfo	renderPassCI =
		{
			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,	// VkStructureType					sType
			DE_NULL,									// const void*						pNext
			0u,											// VkRenderPassCreateFlags			flags
			1u,											// deUint32							attachmentCount
			colorAttachment,							// const VkAttachmentDescription*	pAttachments
			1u,											// deUint32							subpassCount
			&subpassDescription,						// const VkSubpassDescription*		pSubpasses
			0u,											// deUint32							dependencyCount
			DE_NULL										// const VkSubpassDependency*		pDependencies
		};
		*it = RenderPassSp(new Unique<VkRenderPass>(createRenderPass(vkd, device, &renderPassCI)));
	}
}

void createGraphicsPipelines (const DeviceInterface&				vkd,
							  const VkDevice						device,
							  VkShaderModule						vertexShaderModule,
							  VkShaderModule						fragmentShaderModule,
							  VkRenderPass							renderPass,
							  VkPipelineLayout						pipelineLayout,
							  VkDeviceSize							poolEntrySize,
							  de::SharedPtr<vk::ResourceInterface>	resourceInterface,
							  std::vector<PipelineSp>::iterator		begin,
							  std::vector<PipelineSp>::iterator		end)
{
	std::vector<VkPipelineShaderStageCreateInfo> shaderStageCreateInfos;
	shaderStageCreateInfos.push_back
	(
		{
			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType                     sType;
			DE_NULL,														// const void*                         pNext;
			(VkPipelineShaderStageCreateFlags)0,							// VkPipelineShaderStageCreateFlags    flags;
			VK_SHADER_STAGE_VERTEX_BIT,										// VkShaderStageFlagBits               stage;
			vertexShaderModule,												// VkShaderModule                      shader;
			"main",															// const char*                         pName;
			DE_NULL,														// const VkSpecializationInfo*         pSpecializationInfo;
		}
	);

	shaderStageCreateInfos.push_back
	(
		{
			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType                     sType;
			DE_NULL,														// const void*                         pNext;
			(VkPipelineShaderStageCreateFlags)0,							// VkPipelineShaderStageCreateFlags    flags;
			VK_SHADER_STAGE_FRAGMENT_BIT,									// VkShaderStageFlagBits               stage;
			fragmentShaderModule,											// VkShaderModule                      shader;
			"main",															// const char*                         pName;
			DE_NULL,														// const VkSpecializationInfo*         pSpecializationInfo;
		}
	);

	for (std::vector<PipelineSp>::iterator it = begin; it != end; ++it)
	{
		const VkPipelineVertexInputStateCreateInfo		vertexInputStateCreateInfo		=
		{
			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType                             sType;
			DE_NULL,														// const void*                                 pNext;
			(VkPipelineVertexInputStateCreateFlags)0,						// VkPipelineVertexInputStateCreateFlags       flags;
			0u,																// deUint32                                    vertexBindingDescriptionCount;
			DE_NULL,														// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
			0u,																// deUint32                                    vertexAttributeDescriptionCount;
			DE_NULL															// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
		};

		const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyStateCreateInfo	=
		{
			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                            sType;
			DE_NULL,														// const void*                                pNext;
			(VkPipelineInputAssemblyStateCreateFlags)0,						// VkPipelineInputAssemblyStateCreateFlags    flags;
			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,							// VkPrimitiveTopology                        topology;
			VK_FALSE														// VkBool32                                   primitiveRestartEnable;
		};

		const VkPipelineViewportStateCreateInfo			viewPortStateCreateInfo			=
		{
			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType                       sType;
			DE_NULL,														// const void*                           pNext;
			(VkPipelineViewportStateCreateFlags)0,							// VkPipelineViewportStateCreateFlags    flags;
			1,																// deUint32                              viewportCount;
			DE_NULL,														// const VkViewport*                     pViewports;
			1,																// deUint32                              scissorCount;
			DE_NULL															// const VkRect2D*                       pScissors;
		};

		const VkPipelineRasterizationStateCreateInfo	rasterizationStateCreateInfo	=
		{
			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType                            sType;
			DE_NULL,														// const void*                                pNext;
			(VkPipelineRasterizationStateCreateFlags)0,						// VkPipelineRasterizationStateCreateFlags    flags;
			VK_FALSE,														// VkBool32                                   depthClampEnable;
			VK_FALSE,														// VkBool32                                   rasterizerDiscardEnable;
			VK_POLYGON_MODE_FILL,											// VkPolygonMode                              polygonMode;
			VK_CULL_MODE_BACK_BIT,											// VkCullModeFlags                            cullMode;
			VK_FRONT_FACE_CLOCKWISE,										// VkFrontFace                                frontFace;
			VK_FALSE,														// VkBool32                                   depthBiasEnable;
			0.0f,															// float                                      depthBiasConstantFactor;
			0.0f,															// float                                      depthBiasClamp;
			0.0f,															// float                                      depthBiasSlopeFactor;
			1.0f															// float                                      lineWidth;
		};

		const VkPipelineMultisampleStateCreateInfo		multisampleStateCreateInfo		=
		{
			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType                          sType;
			DE_NULL,														// const void*                              pNext;
			(VkPipelineMultisampleStateCreateFlags)0,						// VkPipelineMultisampleStateCreateFlags    flags;
			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits                    rasterizationSamples;
			VK_FALSE,														// VkBool32                                 sampleShadingEnable;
			0.0f,															// float                                    minSampleShading;
			DE_NULL,														// const VkSampleMask*                      pSampleMask;
			VK_FALSE,														// VkBool32                                 alphaToCoverageEnable;
			VK_FALSE														// VkBool32                                 alphaToOneEnable;
		};

		const VkPipelineColorBlendAttachmentState		colorBlendAttachmentState		=
		{
			VK_FALSE,														// VkBool32                 blendEnable;
			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor            srcColorBlendFactor;
			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor            dstColorBlendFactor;
			VK_BLEND_OP_ADD,												// VkBlendOp                colorBlendOp;
			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor            srcAlphaBlendFactor;
			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor            dstAlphaBlendFactor;
			VK_BLEND_OP_ADD,												// VkBlendOp                alphaBlendOp;
			(VkColorComponentFlags)0xFu										// VkColorComponentFlags    colorWriteMask;
		};

		const VkPipelineColorBlendStateCreateInfo		colorBlendStateCreateInfo		=
		{
			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,		// VkStructureType                               sType;
			DE_NULL,														// const void*                                   pNext;
			(VkPipelineColorBlendStateCreateFlags)0,						// VkPipelineColorBlendStateCreateFlags          flags;
			DE_FALSE,														// VkBool32                                      logicOpEnable;
			VK_LOGIC_OP_CLEAR,												// VkLogicOp                                     logicOp;
			1,																// deUint32                                      attachmentCount;
			&colorBlendAttachmentState,										// const VkPipelineColorBlendAttachmentState*    pAttachments;
			{ 1.0f, 1.0f, 1.0f, 1.0f }										// float                                         blendConstants[4];
		};

		const VkDynamicState							dynamicStates[]					=
		{
			VK_DYNAMIC_STATE_VIEWPORT,
			VK_DYNAMIC_STATE_SCISSOR
		};

		const VkPipelineDynamicStateCreateInfo			dynamicStateCreateInfo			=
		{
			VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,			// VkStructureType                      sType;
			DE_NULL,														// const void*                          pNext;
			(VkPipelineDynamicStateCreateFlags)0u,							// VkPipelineDynamicStateCreateFlags    flags;
			DE_LENGTH_OF_ARRAY(dynamicStates),								// deUint32                             dynamicStateCount;
			dynamicStates													// const VkDynamicState*                pDynamicStates;
		};

		VkGraphicsPipelineCreateInfo					graphicsPipelineCI				=
		{
			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,				// VkStructureType                                  sType;
			DE_NULL,														// const void*                                      pNext;
			(VkPipelineCreateFlags)0,										// VkPipelineCreateFlags                            flags;
			deUint32(shaderStageCreateInfos.size()),						// deUint32                                         stageCount;
			shaderStageCreateInfos.data(),									// const VkPipelineShaderStageCreateInfo*           pStages;
			&vertexInputStateCreateInfo,									// const VkPipelineVertexInputStateCreateInfo*      pVertexInputState;
			&inputAssemblyStateCreateInfo,									// const VkPipelineInputAssemblyStateCreateInfo*    pInputAssemblyState;
			DE_NULL,														// const VkPipelineTessellationStateCreateInfo*     pTessellationState;
			&viewPortStateCreateInfo,										// const VkPipelineViewportStateCreateInfo*         pViewportState;
			&rasterizationStateCreateInfo,									// const VkPipelineRasterizationStateCreateInfo*    pRasterizationState;
			&multisampleStateCreateInfo,									// const VkPipelineMultisampleStateCreateInfo*      pMultisampleState;
			DE_NULL,														// const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState;
			&colorBlendStateCreateInfo,										// const VkPipelineColorBlendStateCreateInfo*       pColorBlendState;
			&dynamicStateCreateInfo,										// const VkPipelineDynamicStateCreateInfo*          pDynamicState;
			pipelineLayout,													// VkPipelineLayout                                 layout;
			renderPass,														// VkRenderPass                                     renderPass;
			0u,																// deUint32                                         subpass;
			DE_NULL,														// VkPipeline                                       basePipelineHandle;
			0																// int                                              basePipelineIndex;
		};

		// we have to ensure that proper poolEntrySize is used
		VkPipelineOfflineCreateInfo						pipelineOfflineCreateInfo;
		if (poolEntrySize != 0u)
		{
			pipelineOfflineCreateInfo				= resetPipelineOfflineCreateInfo();
			std::size_t					hashValue	= calculateGraphicsPipelineHash(graphicsPipelineCI, resourceInterface->getObjectHashes());
			memcpy(pipelineOfflineCreateInfo.pipelineIdentifier, &hashValue, sizeof(std::size_t));
			pipelineOfflineCreateInfo.poolEntrySize = poolEntrySize;
			graphicsPipelineCI.pNext				= &pipelineOfflineCreateInfo;
		}

		*it = PipelineSp(new Unique<VkPipeline>(createGraphicsPipeline(vkd, device, (VkPipelineCache)0u, &graphicsPipelineCI)));
	}
}

void createComputePipelines (const DeviceInterface&					vkd,
							 const VkDevice							device,
							 VkShaderModule							shaderModule,
							 VkPipelineLayout						pipelineLayout,
							 VkDeviceSize							poolEntrySize,
							 de::SharedPtr<vk::ResourceInterface>	resourceInterface,
							 std::vector<PipelineSp>::iterator		begin,
							 std::vector<PipelineSp>::iterator		end)
{
	for (std::vector<PipelineSp>::iterator it = begin; it != end; ++it)
	{
		VkPipelineShaderStageCreateInfo				shaderStageCreateInfo	=
		{
			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType                     sType;
			DE_NULL,														// const void*                         pNext;
			(VkPipelineShaderStageCreateFlags)0,							// VkPipelineShaderStageCreateFlags    flags;
			VK_SHADER_STAGE_COMPUTE_BIT,									// VkShaderStageFlagBits               stage;
			shaderModule,													// VkShaderModule                      shader;
			"main",															// const char*                         pName;
			DE_NULL,														// const VkSpecializationInfo*         pSpecializationInfo;
		};

		VkComputePipelineCreateInfo						computePipelineCI	=
		{
			VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,					// VkStructureType					sType
			DE_NULL,														// const void*						pNext
			0u,																// VkPipelineCreateFlags			flags
			shaderStageCreateInfo,											// VkPipelineShaderStageCreateInfo	stage
			pipelineLayout,													// VkPipelineLayout					layout
			(vk::VkPipeline)0,												// VkPipeline						basePipelineHandle
			0u,																// deInt32							basePipelineIndex
		};

		// we have to ensure that proper poolEntrySize is used
		VkPipelineOfflineCreateInfo						pipelineOfflineCreateInfo;
		if (poolEntrySize != 0u)
		{
			pipelineOfflineCreateInfo				= resetPipelineOfflineCreateInfo();
			std::size_t					hashValue	= calculateComputePipelineHash(computePipelineCI, resourceInterface->getObjectHashes());
			memcpy(pipelineOfflineCreateInfo.pipelineIdentifier, &hashValue, sizeof(std::size_t));
			pipelineOfflineCreateInfo.poolEntrySize = poolEntrySize;
			computePipelineCI.pNext					= &pipelineOfflineCreateInfo;
		}

		*it = PipelineSp(new Unique<VkPipeline>(createComputePipeline(vkd, device, (VkPipelineCache)0u, &computePipelineCI)));
	}
}

void createDescriptorSetLayouts	(const DeviceInterface&							vkd,
								 const VkDevice									device,
								 std::vector<DescriptorSetLayoutSp>::iterator	begin,
								 std::vector<DescriptorSetLayoutSp>::iterator	end)
{
	for (std::vector<DescriptorSetLayoutSp>::iterator it = begin; it != end; ++it)
	{
		const VkDescriptorSetLayoutBinding descriptorSetLayoutBinding =
		{
			0,																// binding
			VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,								// descriptorType
			1u,																// descriptorCount
			VK_SHADER_STAGE_ALL,											// stageFlags
			NULL															// pImmutableSamplers
		};

		const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI =
		{
			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,			// sType
			NULL,															// pNext
			(VkDescriptorSetLayoutCreateFlags)0u,							// flags
			1u,																// bindingCount
			&descriptorSetLayoutBinding										// pBindings
		};
		*it = DescriptorSetLayoutSp(new Unique<VkDescriptorSetLayout>(createDescriptorSetLayout(vkd, device, &descriptorSetLayoutCI)));
	}
}

void createSamplers			(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<SamplerSp>::iterator		begin,
							 std::vector<SamplerSp>::iterator		end)
{
	for (std::vector<SamplerSp>::iterator it = begin; it != end; ++it)
	{
		const VkSamplerCreateInfo samplerCI =
		{
			VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,							//VkStructureType		sType
			DE_NULL,														//const void*			pNext
			0u,																//VkSamplerCreateFlags	flags
			VK_FILTER_NEAREST,												//VkFilter				magFilter
			VK_FILTER_NEAREST,												//VkFilter				minFilter
			VK_SAMPLER_MIPMAP_MODE_NEAREST,									//VkSamplerMipmapMode	mipmapMode
			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeU
			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeV
			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeW
			0.0f,															//float					mipLodBias
			VK_FALSE,														//VkBool32				anisotropyEnable
			1.0f,															//float					maxAnisotropy
			VK_FALSE,														//VkBool32				compareEnable
			VK_COMPARE_OP_EQUAL,											//VkCompareOp			compareOp
			0.0f,															//float					minLod
			0.0f,															//float					maxLod
			VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,						//VkBorderColor			borderColor
			VK_TRUE,														//VkBool32				unnormalizedCoordinates
		};
		*it = SamplerSp(new Unique<VkSampler>(createSampler(vkd, device, &samplerCI)));
	}
}

void createDescriptorPools	(const DeviceInterface&						vkd,
							 const VkDevice								device,
							 deUint32									maxSets,
							 std::vector<DescriptorPoolSp>::iterator	begin,
							 std::vector<DescriptorPoolSp>::iterator	end)
{
	for (std::vector<DescriptorPoolSp>::iterator it = begin; it != end; ++it)
	{
		const VkDescriptorPoolSize			poolSizes =
		{
			VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
			1u
		};
		const VkDescriptorPoolCreateInfo	descriptorPoolCI =
		{
			VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,					// sType
			DE_NULL,														// pNext
			(VkDescriptorPoolCreateFlags)0u,								// flags
			maxSets,														// maxSets
			1u,																// poolSizeCount
			&poolSizes,														// pPoolSizes
		};
		*it = DescriptorPoolSp(new Unique<VkDescriptorPool>(createDescriptorPool(vkd, device, &descriptorPoolCI)));
	}
}

void createDescriptorSets	(const DeviceInterface&						vkd,
							 const VkDevice								device,
							 const VkDescriptorPool						descriptorPool,
							 const VkDescriptorSetLayout				setLayout,
							 std::vector<DescriptorSetSp>::iterator		begin,
							 std::vector<DescriptorSetSp>::iterator		end)
{
	for (std::vector<DescriptorSetSp>::iterator it = begin; it != end; ++it)
	{
		const VkDescriptorSetAllocateInfo descriptorSetAI =
		{
			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,					// VkStructureType                 sType
			DE_NULL,														// const void*                     pNext
			descriptorPool,													// VkDescriptorPool                descriptorPool
			1u,																// deUint32                        descriptorSetCount
			&setLayout														// const VkDescriptorSetLayout*    pSetLayouts
		};
		*it = DescriptorSetSp(new Unique<VkDescriptorSet>(allocateDescriptorSet(vkd, device, &descriptorSetAI)));
	}
}

void createFramebuffers		(const DeviceInterface&						vkd,
							 const VkDevice								device,
							 const VkRenderPass							renderPass,
							 const VkImageView							imageView,
							 std::vector<FramebufferSp>::iterator		begin,
							 std::vector<FramebufferSp>::iterator		end)
{
	for (std::vector<FramebufferSp>::iterator it = begin; it != end; ++it)
	{
		const VkFramebufferCreateInfo framebufferCi =
		{
			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,						// VkStructureType			sType
			DE_NULL,														// const void*				pNext
			0u,																// VkFramebufferCreateFlags	flags
			renderPass,														// VkRenderPass				renderPass
			1u,																// uint32_t					attachmentCount
			&imageView,														// const VkImageView*		pAttachments
			8u,																// uint32_t					width
			8u,																// uint32_t					height
			1u																// uint32_t					layers
		};

		*it = FramebufferSp(new Unique<VkFramebuffer>(createFramebuffer(vkd, device, &framebufferCi)));
	}
}

void createCommandPools		(const DeviceInterface&					vkd,
							 const VkDevice							device,
							 std::vector<CommandPoolSp>::iterator	begin,
							 std::vector<CommandPoolSp>::iterator	end)
{
	for (std::vector<CommandPoolSp>::iterator it = begin; it != end; ++it)
	{
		const VkCommandPoolCreateInfo			commandPoolCI =
		{
			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,						// sType
			DE_NULL,														// pNext
			0u,																// flags
			0u,																// queueFamilyIndex
		};
		*it = CommandPoolSp(new Unique<VkCommandPool>(createCommandPool(vkd, device, &commandPoolCI)));
	}
}

void createSamplerYcbcrConversions (const DeviceInterface&							vkd,
									const VkDevice									device,
									std::vector<SamplerYcbcrConversionSp>::iterator	begin,
									std::vector<SamplerYcbcrConversionSp>::iterator	end)
{
	for (std::vector<SamplerYcbcrConversionSp>::iterator it = begin; it != end; ++it)
	{
		const VkSamplerYcbcrConversionCreateInfo	ycbcrConversionCI =
		{
			VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,			// sType
			DE_NULL,														// pNext
			VK_FORMAT_G8B8G8R8_422_UNORM,									// format
			VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,					// ycbcrModel
			VK_SAMPLER_YCBCR_RANGE_ITU_FULL,								// ycbcrRange
			{
				VK_COMPONENT_SWIZZLE_IDENTITY,								// r
				VK_COMPONENT_SWIZZLE_IDENTITY,								// g
				VK_COMPONENT_SWIZZLE_IDENTITY,								// b
				VK_COMPONENT_SWIZZLE_IDENTITY,								// a
			},																// components
			VK_CHROMA_LOCATION_MIDPOINT,									// xChromaOffset
			VK_CHROMA_LOCATION_MIDPOINT,									// yChromaOffset
			VK_FILTER_NEAREST,												// chromaFilter
			VK_FALSE,														// forceExplicitReconstruction
			};
		*it = SamplerYcbcrConversionSp(new Unique<VkSamplerYcbcrConversion>(createSamplerYcbcrConversion(vkd, device, &ycbcrConversionCI)));
	}
}

// Base class for all VkDeviceObjectReservationCreateInfo tests.
// Creates a device with 0 for all "max" values / and "RequestCounts"
class DeviceObjectReservationInstance : public vkt::TestInstance
{
public:
										DeviceObjectReservationInstance		(Context&								context,
																			 const TestParams&						testParams_);
	tcu::TestStatus						iterate								(void) override;

	virtual Move<VkDevice>				createTestDevice					(VkDeviceCreateInfo&					deviceCreateInfo,
																			 VkDeviceObjectReservationCreateInfo&	objectInfo,
																			 VkPhysicalDeviceVulkanSC10Features&	sc10Features);
	virtual void						performTest							(const DeviceInterface&					vkd,
																			 VkDevice								device);
	virtual bool						verifyTestResults					(const DeviceInterface&					vkd,
																			 VkDevice								device);

protected:
	TestParams							testParams;
	vkt::CustomInstance					instance;
	VkPhysicalDevice					physicalDevice;
};

DeviceObjectReservationInstance::DeviceObjectReservationInstance (Context&			context,
																  const TestParams&	testParams_)
	: vkt::TestInstance				( context )
	, testParams					( testParams_ )
	, instance						( vkt::createCustomInstanceFromContext(context) )
	, physicalDevice				( chooseDevice(instance.getDriver(), instance, context.getTestContext().getCommandLine()) )
{
}

tcu::TestStatus DeviceObjectReservationInstance::iterate (void)
{
	const float						queuePriority		= 1.0f;

	const VkDeviceQueueCreateInfo	deviceQueueCI		=
	{
		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,							// sType
		DE_NULL,															// pNext
		(VkDeviceQueueCreateFlags)0u,										// flags
		0,																	//queueFamilyIndex;
		1,																	//queueCount;
		&queuePriority,														//pQueuePriorities;
	};

	VkDeviceCreateInfo				deviceCreateInfo	=
	{
		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,								// sType;
		DE_NULL,															// pNext;
		(VkDeviceCreateFlags)0u,											// flags
		1,																	// queueRecordCount;
		&deviceQueueCI,														// pRequestedQueues;
		0,																	// layerCount;
		DE_NULL,															// ppEnabledLayerNames;
		0,																	// extensionCount;
		DE_NULL,															// ppEnabledExtensionNames;
		DE_NULL,															// pEnabledFeatures;
	};

	void* pNext = DE_NULL;

	VkDeviceObjectReservationCreateInfo	objectInfo		= resetDeviceObjectReservationCreateInfo();
	objectInfo.pipelineCacheRequestCount				= 1u;
	objectInfo.pNext									= pNext;
	pNext												= &objectInfo;

	VkPhysicalDeviceVulkanSC10Features	sc10Features	= createDefaultSC10Features();
	sc10Features.pNext									= pNext;
	pNext												= &sc10Features;

	deviceCreateInfo.pNext								= pNext;

	Move<VkDevice>					device				= createTestDevice(deviceCreateInfo, objectInfo, sc10Features);
	de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>
									deviceDriver		= de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(m_context.getPlatformInterface(), instance, *device, m_context.getTestContext().getCommandLine(), m_context.getResourceInterface(), m_context.getDeviceVulkanSC10Properties()),
															DeinitDeviceDeleter(m_context.getResourceInterface().get(), *device));

	performTest(*deviceDriver, *device);

	const VkQueue					queue				= getDeviceQueue(*deviceDriver, *device,  0, 0);
	VK_CHECK(deviceDriver->queueWaitIdle(queue));

	if (!verifyTestResults(*deviceDriver, *device))
		return tcu::TestStatus::fail("Failed");
	return tcu::TestStatus::pass("Pass");
}

Move<VkDevice> DeviceObjectReservationInstance::createTestDevice (VkDeviceCreateInfo&					deviceCreateInfo,
																  VkDeviceObjectReservationCreateInfo&	objectInfo,
																  VkPhysicalDeviceVulkanSC10Features&	sc10Features)
{
	DE_UNREF(sc10Features);

	// perform any non pipeline operations - create 2 semaphores
	objectInfo.semaphoreRequestCount = 2u;

	return createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instance.getDriver(), physicalDevice, &deviceCreateInfo);
}

void DeviceObjectReservationInstance::performTest (const DeviceInterface&				vkd,
												   VkDevice								device)
{
	std::vector<SemaphoreSp> semaphores(2u);
	createSemaphores(vkd, device, begin(semaphores), end(semaphores));
}

bool DeviceObjectReservationInstance::verifyTestResults (const DeviceInterface&			vkd,
														 VkDevice						device)
{
	DE_UNREF(vkd);
	DE_UNREF(device);
	return true;
}

// Creates device with multiple VkDeviceObjectReservationCreateInfo and ensures that the limits of an individual VkDeviceObjectReservationCreateInfo can be exceeded.
class MultipleReservation : public DeviceObjectReservationInstance
{
public:
	MultipleReservation (Context&			context,
						 const TestParams&	testParams_)
		: DeviceObjectReservationInstance(context, testParams_)
	{
	}
	Move<VkDevice> createTestDevice (VkDeviceCreateInfo&					deviceCreateInfo,
									 VkDeviceObjectReservationCreateInfo&	objectInfo,
									 VkPhysicalDeviceVulkanSC10Features&	sc10Features) override
	{
		DE_UNREF(sc10Features);

		VkDeviceObjectReservationCreateInfo  thirdObjectInfo	= resetDeviceObjectReservationCreateInfo();
		thirdObjectInfo.deviceMemoryRequestCount				= 2;

		VkDeviceObjectReservationCreateInfo  secondObjectInfo	= resetDeviceObjectReservationCreateInfo();
		secondObjectInfo.deviceMemoryRequestCount				= 2;
		secondObjectInfo.pNext									= &thirdObjectInfo;

		objectInfo.deviceMemoryRequestCount						= 2;
		objectInfo.pNext										= &secondObjectInfo;

		return createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instance.getDriver(), physicalDevice, &deviceCreateInfo);
	}

	void performTest (const DeviceInterface&				vkd,
					  VkDevice								device) override
	{
		std::vector<VkDeviceMemory>	memoryObjects(6, (VkDeviceMemory)0);
		for (size_t ndx = 0; ndx < 6; ndx++)
		{
			VkMemoryAllocateInfo alloc =
			{
				VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,						// sType
				DE_NULL,													// pNext
				128U,														// allocationSize
				0U															// memoryTypeIndex;
			};

			VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &memoryObjects[ndx]));

			TCU_CHECK(!!memoryObjects[ndx]);
		}
	}
};

void checkSupportVerifyMaxValues (vkt::Context& context, TestParams testParams)
{
	if (testParams.testMaxValues == TMV_MAX_PIPELINESTATISTICS_QUERIES_PER_POOL && context.getDeviceFeatures().pipelineStatisticsQuery == VK_FALSE)
		TCU_THROW(NotSupportedError, "pipelineStatisticsQuery is not supported");
}

// For each of the various resource "max" values, create resources that exercise the maximum values requested

class VerifyMaxValues : public DeviceObjectReservationInstance
{
public:
	VerifyMaxValues					(Context&								context,
									 const TestParams&						testParams_)
		: DeviceObjectReservationInstance(context, testParams_)
	{
	}
	Move<VkDevice> createTestDevice (VkDeviceCreateInfo&					deviceCreateInfo,
									 VkDeviceObjectReservationCreateInfo&	objectInfo,
									 VkPhysicalDeviceVulkanSC10Features&	sc10Features) override
	{
		DE_UNREF(sc10Features);
		switch (testParams.testMaxValues)
		{
			case TMV_DESCRIPTOR_SET_LAYOUT_BINDING_LIMIT:
				objectInfo.descriptorSetLayoutBindingLimit			= VERIFYMAXVALUES_OBJECT_COUNT+1u;
				objectInfo.descriptorSetLayoutBindingRequestCount	= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.descriptorSetLayoutRequestCount			= 1u;
				break;
			case TMV_MAX_IMAGEVIEW_MIPLEVELS:
				objectInfo.maxImageViewMipLevels					= VERIFYMAXVALUES_MIPLEVELS;
				objectInfo.maxImageViewArrayLayers					= 1u;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.deviceMemoryRequestCount					= 1u;
				break;
			case TMV_MAX_IMAGEVIEW_ARRAYLAYERS:
				objectInfo.maxImageViewMipLevels					= 1u;
				objectInfo.maxImageViewArrayLayers					= VERIFYMAXVALUES_ARRAYLAYERS;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.deviceMemoryRequestCount					= 1u;
				break;
			case TMV_MAX_LAYEREDIMAGEVIEW_MIPLEVELS:
				objectInfo.maxLayeredImageViewMipLevels				= VERIFYMAXVALUES_MIPLEVELS;
				objectInfo.maxImageViewArrayLayers					= VERIFYMAXVALUES_ARRAYLAYERS;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.deviceMemoryRequestCount					= 1u;
				break;
			case TMV_MAX_OCCLUSION_QUERIES_PER_POOL:
				objectInfo.maxOcclusionQueriesPerPool				= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.queryPoolRequestCount					= 1u;
				break;
			case TMV_MAX_PIPELINESTATISTICS_QUERIES_PER_POOL:
				objectInfo.maxPipelineStatisticsQueriesPerPool		= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.queryPoolRequestCount					= 1u;
				break;
			case TMV_MAX_TIMESTAMP_QUERIES_PER_POOL:
				objectInfo.maxTimestampQueriesPerPool				= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.queryPoolRequestCount					= 1u;
				break;
			default:
				TCU_THROW(InternalError, "Unsupported max value");
		}

		return createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instance.getDriver(), physicalDevice, &deviceCreateInfo);
	}

	void performTest (const DeviceInterface&				vkd,
					  VkDevice								device) override
	{
		SimpleAllocator					allocator(vkd, device, getPhysicalDeviceMemoryProperties(instance.getDriver(), physicalDevice));
		de::MovePtr<ImageWithMemory>	image;
		Move<VkQueryPool>				queryPool;
		Move<VkDescriptorSetLayout>		descriptorSetLayout;
		deUint32						queueFamilyIndex = 0u;

		switch (testParams.testMaxValues)
		{
			case TMV_DESCRIPTOR_SET_LAYOUT_BINDING_LIMIT:
			{
				const VkDescriptorSetLayoutBinding	binding =
				{
					VERIFYMAXVALUES_OBJECT_COUNT,							// binding
					VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,						// descriptorType
					1u,														// descriptorCount
					VK_SHADER_STAGE_ALL,									// stageFlags
					DE_NULL,												// pImmutableSamplers
				};

				const VkDescriptorSetLayoutCreateInfo	layoutCreateInfo =
				{
					VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
					DE_NULL,												// pNext
					0u,														// flags
					1u,														// bindingCount
					&binding,												// pBindings
				};
				descriptorSetLayout = createDescriptorSetLayout(vkd, device, &layoutCreateInfo);
				break;
			}
			case TMV_MAX_IMAGEVIEW_MIPLEVELS:
			{
				const VkImageCreateInfo			imageCreateInfo =
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
					DE_NULL,												// const void*				pNext;
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags;
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType;
					VK_FORMAT_R8_UNORM,										// VkFormat					format;
					{
						1 << VERIFYMAXVALUES_MIPLEVELS,						// deUint32	width;
						1 << VERIFYMAXVALUES_MIPLEVELS,						// deUint32	height;
						1u													// deUint32	depth;
					},														// VkExtent3D				extent;
					VERIFYMAXVALUES_MIPLEVELS,								// deUint32					mipLevels;
					1u,														// deUint32					arrayLayers;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
					VK_IMAGE_USAGE_SAMPLED_BIT,								// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED								// VkImageLayout			initialLayout;
				};
				image = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, imageCreateInfo, MemoryRequirement::Any));
				break;
			}
			case TMV_MAX_IMAGEVIEW_ARRAYLAYERS:
			{
				const VkImageCreateInfo			imageCreateInfo =
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
					DE_NULL,												// const void*				pNext;
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags;
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType;
					VK_FORMAT_R8_UNORM,										// VkFormat					format;
					{
						16U,												// deUint32	width;
						16U,												// deUint32	height;
						1u													// deUint32	depth;
					},														// VkExtent3D				extent;
					1u,														// deUint32					mipLevels;
					VERIFYMAXVALUES_ARRAYLAYERS,							// deUint32					arrayLayers;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
					VK_IMAGE_USAGE_SAMPLED_BIT,								// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED								// VkImageLayout			initialLayout;
				};
				image = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, imageCreateInfo, MemoryRequirement::Any));
				break;
			}
			case TMV_MAX_LAYEREDIMAGEVIEW_MIPLEVELS:
			{
				const VkImageCreateInfo			imageCreateInfo =
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
					DE_NULL,												// const void*				pNext;
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags;
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType;
					VK_FORMAT_R8_UNORM,										// VkFormat					format;
					{
						1 << VERIFYMAXVALUES_MIPLEVELS,						// deUint32	width;
						1 << VERIFYMAXVALUES_MIPLEVELS,						// deUint32	height;
						1u													// deUint32	depth;
					},														// VkExtent3D				extent;
					VERIFYMAXVALUES_MIPLEVELS,								// deUint32					mipLevels;
					VERIFYMAXVALUES_ARRAYLAYERS,							// deUint32					arrayLayers;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
					VK_IMAGE_USAGE_SAMPLED_BIT,								// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED								// VkImageLayout			initialLayout;
				};
				image = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, imageCreateInfo, MemoryRequirement::Any));
				break;
			}
			case TMV_MAX_OCCLUSION_QUERIES_PER_POOL:
			{
				const VkQueryPoolCreateInfo	queryPoolCreateInfo =
				{
					VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,				//  VkStructureType					sType;
					DE_NULL,												//  const void*						pNext;
					(VkQueryPoolCreateFlags)0,								//  VkQueryPoolCreateFlags			flags;
					VK_QUERY_TYPE_OCCLUSION,								//  VkQueryType						queryType;
					VERIFYMAXVALUES_OBJECT_COUNT,							//  deUint32						queryCount;
					0u,														//  VkQueryPipelineStatisticFlags	pipelineStatistics;
				};
				queryPool = createQueryPool(vkd, device, &queryPoolCreateInfo);
				break;
			}
			case TMV_MAX_PIPELINESTATISTICS_QUERIES_PER_POOL:
			{
				const VkQueryPoolCreateInfo	queryPoolCreateInfo =
				{
					VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,				//  VkStructureType					sType;
					DE_NULL,												//  const void*						pNext;
					(VkQueryPoolCreateFlags)0,								//  VkQueryPoolCreateFlags			flags;
					VK_QUERY_TYPE_PIPELINE_STATISTICS,						//  VkQueryType						queryType;
					VERIFYMAXVALUES_OBJECT_COUNT,							//  deUint32						queryCount;
					0u,														//  VkQueryPipelineStatisticFlags	pipelineStatistics;
				};
				queryPool = createQueryPool(vkd, device, &queryPoolCreateInfo);
				break;
			}
			case TMV_MAX_TIMESTAMP_QUERIES_PER_POOL:
			{
				const VkQueryPoolCreateInfo	queryPoolCreateInfo =
				{
					VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,				//  VkStructureType					sType;
					DE_NULL,												//  const void*						pNext;
					(VkQueryPoolCreateFlags)0,								//  VkQueryPoolCreateFlags			flags;
					VK_QUERY_TYPE_TIMESTAMP,								//  VkQueryType						queryType;
					VERIFYMAXVALUES_OBJECT_COUNT,							//  deUint32						queryCount;
					0u,														//  VkQueryPipelineStatisticFlags	pipelineStatistics;
				};
				queryPool = createQueryPool(vkd, device, &queryPoolCreateInfo);
				break;
			}
			default:
				TCU_THROW(InternalError, "Unsupported max value");
		}
	}
};

void checkSupportVerifyRequestCounts (vkt::Context& context, TestParams testParams)
{
	if (testParams.testRequestCounts == TRC_SAMPLERYCBCRCONVERSION && context.getDeviceVulkan11Features().samplerYcbcrConversion == VK_FALSE)
		TCU_THROW(NotSupportedError, "samplerYcbcrConversion is not supported");
}

// create programs for VerifyRequestCounts tests
struct ProgramsVerifyLimits
{
	void init(SourceCollections& dst, TestParams testParams) const
	{
		if (testParams.testRequestCounts == TRC_GRAPHICS_PIPELINE || testParams.testPoolSizeType != PST_UNDEFINED)
		{
			dst.glslSources.add("vertex") << glu::VertexSource(
				"#version 450\n"
				"\n"
				"void main (void)\n"
				"{\n"
				"   gl_Position = vec4(0);\n"
				"}\n");
			dst.glslSources.add("fragment") << glu::FragmentSource(
				"#version 450\n"
				"\n"
				"layout(location=0) out vec4 x;\n"
				"void main (void)\n"
				"{\n"
				"   x = vec4(1);\n"
				"}\n");
		}
		else if (testParams.testRequestCounts == TRC_COMPUTE_PIPELINE)
		{
			dst.glslSources.add("compute") << glu::ComputeSource(
				"#version 450\n"
				"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
				"void main (void)\n"
				"{\n"
				"	uvec4 x = uvec4(0);\n"
				"}\n");
		}
	}
};

// For each of the various resource "max" values, create resources that exercise the maximum values requested
class VerifyRequestCounts : public DeviceObjectReservationInstance
{
public:
	VerifyRequestCounts				(Context&								context,
									 const TestParams&						testParams_)
		: DeviceObjectReservationInstance(context, testParams_)
	{
	}


	Move<VkDevice> createTestDevice (VkDeviceCreateInfo&					deviceCreateInfo,
									 VkDeviceObjectReservationCreateInfo&	objectInfo,
									 VkPhysicalDeviceVulkanSC10Features&	sc10Features) override
	{
		DE_UNREF(sc10Features);

		std::vector<VkPipelinePoolSize>	poolSizes;
		VkDeviceSize					pipelineDefaultSize			= VkDeviceSize(m_context.getTestContext().getCommandLine().getPipelineDefaultSize());

		switch (testParams.testRequestCounts)
		{
			case TRC_SEMAPHORE:
				objectInfo.semaphoreRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_COMMAND_BUFFER:
				objectInfo.commandPoolRequestCount					= 1u;
				objectInfo.commandBufferRequestCount				= 2 * VERIFYMAXVALUES_OBJECT_COUNT + (VERIFYMAXVALUES_OBJECT_COUNT - VERIFYMAXVALUES_OBJECT_COUNT / 2) ;
				break;
			case TRC_FENCE:
				objectInfo.fenceRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_DEVICE_MEMORY:
				objectInfo.deviceMemoryRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_BUFFER:
				objectInfo.bufferRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_IMAGE:
				objectInfo.imageRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.maxImageViewMipLevels					= 1u;
				objectInfo.maxImageViewArrayLayers					= 1u;
				break;
			case TRC_EVENT:
				objectInfo.eventRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_QUERY_POOL:
				objectInfo.queryPoolRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_BUFFER_VIEW:
				objectInfo.deviceMemoryRequestCount					= 1u;
				objectInfo.bufferRequestCount						= 1u;
				objectInfo.bufferViewRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_IMAGE_VIEW:
				objectInfo.deviceMemoryRequestCount					= 1u;
				objectInfo.imageViewRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.maxImageViewMipLevels					= 1u;
				objectInfo.maxImageViewArrayLayers					= 1u;
				break;
			case TRC_LAYERED_IMAGE_VIEW:
				objectInfo.deviceMemoryRequestCount					= 1u;
				objectInfo.imageViewRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.layeredImageViewRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.maxImageViewMipLevels					= 1u;
				objectInfo.maxImageViewArrayLayers					= VERIFYMAXVALUES_ARRAYLAYERS;
				break;
			case TRC_PIPELINE_LAYOUT:
				objectInfo.pipelineLayoutRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_RENDER_PASS:
				objectInfo.renderPassRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.subpassDescriptionRequestCount			= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.attachmentDescriptionRequestCount		= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_GRAPHICS_PIPELINE:
				objectInfo.pipelineLayoutRequestCount				= 1u;
				objectInfo.renderPassRequestCount					= 1u;
				objectInfo.subpassDescriptionRequestCount			= 1u;
				objectInfo.attachmentDescriptionRequestCount		= 1u;
				objectInfo.graphicsPipelineRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, pipelineDefaultSize, VERIFYMAXVALUES_OBJECT_COUNT });
				break;
			case TRC_COMPUTE_PIPELINE:
				objectInfo.pipelineLayoutRequestCount				= 1u;
				objectInfo.computePipelineRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, pipelineDefaultSize, VERIFYMAXVALUES_OBJECT_COUNT });
				break;
			case TRC_DESCRIPTORSET_LAYOUT:
				objectInfo.descriptorSetLayoutRequestCount			= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.descriptorSetLayoutBindingRequestCount	= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.descriptorSetLayoutBindingLimit			= 2u;
				break;
			case TRC_SAMPLER:
				objectInfo.samplerRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_DESCRIPTOR_POOL:
				objectInfo.descriptorPoolRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_DESCRIPTORSET:
				objectInfo.descriptorSetLayoutRequestCount			= 1u;
				objectInfo.descriptorSetLayoutBindingRequestCount	= 1u;
				objectInfo.descriptorSetLayoutBindingLimit			= 2u;
				objectInfo.descriptorPoolRequestCount				= 1u;
				objectInfo.descriptorSetRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_FRAMEBUFFER:
				objectInfo.deviceMemoryRequestCount					= 1u;
				objectInfo.imageViewRequestCount					= 1u;
				objectInfo.imageRequestCount						= 1u;
				objectInfo.maxImageViewMipLevels					= 1u;
				objectInfo.maxImageViewArrayLayers					= 1u;
				objectInfo.renderPassRequestCount					= 1u;
				objectInfo.subpassDescriptionRequestCount			= 1u;
				objectInfo.attachmentDescriptionRequestCount		= 1u;
				objectInfo.framebufferRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_COMMANDPOOL:
				objectInfo.commandPoolRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
				objectInfo.commandBufferRequestCount				= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
			case TRC_SAMPLERYCBCRCONVERSION:
				objectInfo.samplerYcbcrConversionRequestCount		= VERIFYMAXVALUES_OBJECT_COUNT;
				break;
//			case TRC_SURFACE:
//				objectInfo.surfaceRequestCount						= VERIFYMAXVALUES_OBJECT_COUNT;
//				break;
//			case TRC_SWAPCHAIN:
//				objectInfo.swapchainRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
//				break;
//			case TRC_DISPLAY_MODE:
//				objectInfo.displayModeRequestCount					= VERIFYMAXVALUES_OBJECT_COUNT;
//				break;
			default:
				TCU_THROW(InternalError, "Unsupported request count");
		}

		objectInfo.pipelinePoolSizeCount = deUint32(poolSizes.size());
		objectInfo.pPipelinePoolSizes = poolSizes.empty() ? DE_NULL : poolSizes.data();

		return createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instance.getDriver(), physicalDevice, &deviceCreateInfo);
	}


	void performTest (const DeviceInterface&				vkd,
					  VkDevice								device) override
	{
		SimpleAllocator	allocator			(vkd, device, getPhysicalDeviceMemoryProperties(instance.getDriver(), physicalDevice));
		VkDeviceSize	pipelineDefaultSize	= VkDeviceSize(m_context.getTestContext().getCommandLine().getPipelineDefaultSize());
		deUint32		queueFamilyIndex	= 0u;

		switch (testParams.testRequestCounts)
		{
			case TRC_SEMAPHORE:
			{
				std::vector<SemaphoreSp> semaphores(VERIFYMAXVALUES_OBJECT_COUNT);
				createSemaphores(vkd, device, begin(semaphores), end(semaphores));
				std::fill(begin(semaphores) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(semaphores), SemaphoreSp());
				createSemaphores(vkd, device, begin(semaphores) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(semaphores));
				std::fill(begin(semaphores), end(semaphores), SemaphoreSp());
				createSemaphores(vkd, device, begin(semaphores), end(semaphores));
				break;
			}
			case TRC_COMMAND_BUFFER:
			{
				std::vector<CommandPoolSp> commandPools(1u);
				createCommandPools(vkd, device, begin(commandPools), end(commandPools));

				std::vector<CommandBufferSp> commandBuffers(VERIFYMAXVALUES_OBJECT_COUNT);
				createCommandBuffers(vkd, device, commandPools[0]->get(), begin(commandBuffers), end(commandBuffers));
				std::fill(begin(commandBuffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(commandBuffers), CommandBufferSp());
				createCommandBuffers(vkd, device, commandPools[0]->get(), begin(commandBuffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(commandBuffers));
				std::fill(begin(commandBuffers), end(commandBuffers), CommandBufferSp());
				createCommandBuffers(vkd, device, commandPools[0]->get(), begin(commandBuffers), end(commandBuffers));
				break;
			}
			case TRC_FENCE:
			{
				std::vector<FenceSp> fences(VERIFYMAXVALUES_OBJECT_COUNT);
				createFences(vkd, device, begin(fences), end(fences));
				std::fill(begin(fences) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(fences), FenceSp());
				createFences(vkd, device, begin(fences) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(fences));
				std::fill(begin(fences), end(fences), FenceSp());
				createFences(vkd, device, begin(fences), end(fences));
				break;
			}
			case TRC_DEVICE_MEMORY:
			{
				std::vector<DeviceMemorySp> mems(VERIFYMAXVALUES_OBJECT_COUNT);
				allocateDeviceMemory(vkd, device, 16U, begin(mems), end(mems));
				break;
			}
			case TRC_BUFFER:
			{
				std::vector<BufferSp> buffers(VERIFYMAXVALUES_OBJECT_COUNT);
				createBuffers(vkd, device, 32ull, begin(buffers), end(buffers));
				std::fill(begin(buffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(buffers), BufferSp());
				createBuffers(vkd, device, 32ull, begin(buffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(buffers));
				std::fill(begin(buffers), end(buffers), BufferSp());
				createBuffers(vkd, device, 32ull, begin(buffers), end(buffers));
				break;
			}
			case TRC_IMAGE:
			{
				std::vector<ImageSp> images(VERIFYMAXVALUES_OBJECT_COUNT);
				createImages(vkd, device, 16u, begin(images), end(images));
				std::fill(begin(images) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(images), ImageSp());
				createImages(vkd, device, 16u, begin(images) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(images));
				std::fill(begin(images), end(images), ImageSp());
				createImages(vkd, device, 16u, begin(images), end(images));
				break;
			}
			case TRC_EVENT:
			{
				std::vector<EventSp> events(VERIFYMAXVALUES_OBJECT_COUNT);
				createEvents(vkd, device, begin(events), end(events));
				std::fill(begin(events) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(events), EventSp());
				createEvents(vkd, device, begin(events) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(events));
				std::fill(begin(events), end(events), EventSp());
				createEvents(vkd, device, begin(events), end(events));
				break;
			}
			case TRC_QUERY_POOL:
			{
				std::vector<QueryPoolSp> queryPools(VERIFYMAXVALUES_OBJECT_COUNT);
				createQueryPools(vkd, device, begin(queryPools), end(queryPools));
				break;
			}
			case TRC_BUFFER_VIEW:
			{
				const VkBufferCreateInfo bufferCI = makeBufferCreateInfo(128ull, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
				BufferWithMemory buffer(vkd, device, allocator, bufferCI, MemoryRequirement::HostVisible);

				std::vector<BufferViewSp> bufferViews(VERIFYMAXVALUES_OBJECT_COUNT);
				createBufferViews(vkd, device, buffer.get(), 128ull, begin(bufferViews), end(bufferViews));
				std::fill(begin(bufferViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(bufferViews), BufferViewSp());
				createBufferViews(vkd, device, buffer.get(), 128ull, begin(bufferViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(bufferViews));
				std::fill(begin(bufferViews), end(bufferViews), BufferViewSp());
				createBufferViews(vkd, device, buffer.get(), 128ull, begin(bufferViews), end(bufferViews));
				break;
			}
			case TRC_IMAGE_VIEW:
			{
				const VkImageCreateInfo			imageCI =
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
					DE_NULL,												// const void*				pNext;
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags;
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType;
					VK_FORMAT_R8_UNORM,										// VkFormat					format;
					{
						8u,													// deUint32	width;
						8u,													// deUint32	height;
						1u													// deUint32	depth;
					},														// VkExtent3D				extent;
					1u,														// deUint32					mipLevels;
					1u,														// deUint32					arrayLayers;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
					VK_IMAGE_USAGE_SAMPLED_BIT,								// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED								// VkImageLayout			initialLayout;
				};
				ImageWithMemory image(vkd, device, allocator, imageCI, MemoryRequirement::Any);

				std::vector<ImageViewSp> imageViews(VERIFYMAXVALUES_OBJECT_COUNT);
				createImageViews(vkd, device, image.get(), begin(imageViews), end(imageViews));
				std::fill(begin(imageViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(imageViews), ImageViewSp());
				createImageViews(vkd, device, image.get(), begin(imageViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(imageViews));
				std::fill(begin(imageViews), end(imageViews), ImageViewSp());
				createImageViews(vkd, device, image.get(), begin(imageViews), end(imageViews));
				break;
			}
			case TRC_LAYERED_IMAGE_VIEW:
			{
				const VkImageCreateInfo			imageCI =
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
					DE_NULL,												// const void*				pNext;
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags;
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType;
					VK_FORMAT_R8_UNORM,										// VkFormat					format;
					{
						8u,													// deUint32	width;
						8u,													// deUint32	height;
						1u													// deUint32	depth;
					},														// VkExtent3D				extent;
					1u,														// deUint32					mipLevels;
					VERIFYMAXVALUES_ARRAYLAYERS,							// deUint32					arrayLayers;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
					VK_IMAGE_USAGE_SAMPLED_BIT,								// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED								// VkImageLayout			initialLayout;
				};
				ImageWithMemory image(vkd, device, allocator, imageCI, MemoryRequirement::Any);

				std::vector<ImageViewSp> imageViews(VERIFYMAXVALUES_OBJECT_COUNT);
				createImageViews(vkd, device, image.get(), begin(imageViews), end(imageViews));
				std::fill(begin(imageViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(imageViews), ImageViewSp());
				createImageViews(vkd, device, image.get(), begin(imageViews) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(imageViews));
				std::fill(begin(imageViews), end(imageViews), ImageViewSp());
				createImageViews(vkd, device, image.get(), begin(imageViews), end(imageViews));
				break;
			}
			case TRC_PIPELINE_LAYOUT:
			{
				std::vector<PipelineLayoutSp> pipelineLayouts(VERIFYMAXVALUES_OBJECT_COUNT);
				createPipelineLayouts(vkd, device, begin(pipelineLayouts), end(pipelineLayouts));
				std::fill(begin(pipelineLayouts) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelineLayouts), PipelineLayoutSp());
				createPipelineLayouts(vkd, device, begin(pipelineLayouts) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelineLayouts));
				std::fill(begin(pipelineLayouts), end(pipelineLayouts), PipelineLayoutSp());
				createPipelineLayouts(vkd, device, begin(pipelineLayouts), end(pipelineLayouts));
				break;
			}
			case TRC_RENDER_PASS:
			{
				VkAttachmentDescription	attachmentDescription =
				{
					0u,														// VkAttachmentDescriptionFlags	flags;
					VK_FORMAT_R8G8B8A8_UNORM,								// VkFormat						format;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits		samples;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			loadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			storeOp;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			stencilLoadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			stencilStoreOp;
					VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout				initialLayout;
					VK_IMAGE_LAYOUT_GENERAL,								// VkImageLayout				finalLayout;
				};

				std::vector<RenderPassSp> renderPasses(VERIFYMAXVALUES_OBJECT_COUNT);
				createRenderPasses(vkd, device, &attachmentDescription, begin(renderPasses), end(renderPasses));
				std::fill(begin(renderPasses) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(renderPasses), RenderPassSp());
				createRenderPasses(vkd, device, &attachmentDescription, begin(renderPasses) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(renderPasses));
				std::fill(begin(renderPasses), end(renderPasses), RenderPassSp());
				createRenderPasses(vkd, device, &attachmentDescription, begin(renderPasses), end(renderPasses));
				break;
			}
			case TRC_GRAPHICS_PIPELINE:
			{
				VkAttachmentDescription	attachmentDescription =
				{
					0u,														// VkAttachmentDescriptionFlags	flags;
					VK_FORMAT_R8G8B8A8_UNORM,								// VkFormat						format;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits		samples;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			loadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			storeOp;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			stencilLoadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			stencilStoreOp;
					VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout				initialLayout;
					VK_IMAGE_LAYOUT_GENERAL,								// VkImageLayout				finalLayout;
				};
				std::vector<RenderPassSp> renderPasses(1u);
				createRenderPasses(vkd, device, &attachmentDescription, begin(renderPasses), end(renderPasses));
				std::vector<PipelineLayoutSp>	pipelineLayouts(1u);
				createPipelineLayouts(vkd, device, begin(pipelineLayouts), end(pipelineLayouts));
				Move<VkShaderModule>			vertexShaderModule		= createShaderModule(vkd, device, m_context.getBinaryCollection().get("vertex"), 0u);
				Move<VkShaderModule>			fragmentShaderModule	= createShaderModule(vkd, device, m_context.getBinaryCollection().get("fragment"), 0u);

				std::vector<PipelineSp> pipelines(VERIFYMAXVALUES_OBJECT_COUNT);
				createGraphicsPipelines(vkd, device, vertexShaderModule.get(), fragmentShaderModule.get(), renderPasses[0]->get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines), end(pipelines));

				if (m_context.getDeviceVulkanSC10Properties().recyclePipelineMemory)
				{
					std::fill(begin(pipelines) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelines), PipelineSp());
					createGraphicsPipelines(vkd, device, vertexShaderModule.get(), fragmentShaderModule.get(), renderPasses[0]->get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelines));
					std::fill(begin(pipelines), end(pipelines), PipelineSp());
					createGraphicsPipelines(vkd, device, vertexShaderModule.get(), fragmentShaderModule.get(), renderPasses[0]->get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines), end(pipelines));
				}

				break;
			}
			case TRC_COMPUTE_PIPELINE:
			{
				std::vector<PipelineLayoutSp>	pipelineLayouts	(1u);
				createPipelineLayouts(vkd, device, begin(pipelineLayouts), end(pipelineLayouts));
				Move<VkShaderModule>			shaderModule	= createShaderModule(vkd, device, m_context.getBinaryCollection().get("compute"), 0u);

				std::vector<PipelineSp> pipelines(VERIFYMAXVALUES_OBJECT_COUNT);
				createComputePipelines(vkd, device, shaderModule.get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines), end(pipelines));

				if (m_context.getDeviceVulkanSC10Properties().recyclePipelineMemory)
				{
					std::fill(begin(pipelines) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelines), PipelineSp());
					createComputePipelines(vkd, device, shaderModule.get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(pipelines));
					std::fill(begin(pipelines), end(pipelines), PipelineSp());
					createComputePipelines(vkd, device, shaderModule.get(), pipelineLayouts[0]->get(), pipelineDefaultSize, m_context.getResourceInterface(), begin(pipelines), end(pipelines));
				}
				break;
			}
			case TRC_DESCRIPTORSET_LAYOUT:
			{
				std::vector<DescriptorSetLayoutSp> descriptorSetLayouts(VERIFYMAXVALUES_OBJECT_COUNT);
				createDescriptorSetLayouts(vkd, device, begin(descriptorSetLayouts), end(descriptorSetLayouts));
				std::fill(begin(descriptorSetLayouts) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(descriptorSetLayouts), DescriptorSetLayoutSp());
				createDescriptorSetLayouts(vkd, device, begin(descriptorSetLayouts) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(descriptorSetLayouts));
				std::fill(begin(descriptorSetLayouts), end(descriptorSetLayouts), DescriptorSetLayoutSp());
				createDescriptorSetLayouts(vkd, device, begin(descriptorSetLayouts), end(descriptorSetLayouts));
				break;
			}
			case TRC_SAMPLER:
			{
				std::vector<SamplerSp> samplers(VERIFYMAXVALUES_OBJECT_COUNT);
				createSamplers(vkd, device, begin(samplers), end(samplers));
				std::fill(begin(samplers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(samplers), SamplerSp());
				createSamplers(vkd, device, begin(samplers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(samplers));
				std::fill(begin(samplers), end(samplers), SamplerSp());
				createSamplers(vkd, device, begin(samplers), end(samplers));
				break;
			}
			case TRC_DESCRIPTOR_POOL:
			{
				std::vector<DescriptorPoolSp> descriptorPools(VERIFYMAXVALUES_OBJECT_COUNT);
				createDescriptorPools(vkd, device, 1u, begin(descriptorPools), end(descriptorPools));
				break;
			}
			case TRC_DESCRIPTORSET:
			{
				std::vector<DescriptorSetLayoutSp> descriptorSetLayouts(1u);
				createDescriptorSetLayouts(vkd, device, begin(descriptorSetLayouts), end(descriptorSetLayouts));
				std::vector<DescriptorPoolSp> descriptorPools(1u);
				createDescriptorPools(vkd, device, VERIFYMAXVALUES_OBJECT_COUNT, begin(descriptorPools), end(descriptorPools));

				std::vector<DescriptorSetSp> descriptorSets(VERIFYMAXVALUES_OBJECT_COUNT);
				createDescriptorSets(vkd, device, descriptorPools[0]->get(), descriptorSetLayouts[0]->get(), begin(descriptorSets), end(descriptorSets));
				if (m_context.getDeviceVulkanSC10Properties().recycleDescriptorSetMemory)
				{
					std::fill(begin(descriptorSets) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(descriptorSets), DescriptorSetSp());
					createDescriptorSets(vkd, device, descriptorPools[0]->get(), descriptorSetLayouts[0]->get(), begin(descriptorSets) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(descriptorSets));
					std::fill(begin(descriptorSets), end(descriptorSets), DescriptorSetSp());
					createDescriptorSets(vkd, device, descriptorPools[0]->get(), descriptorSetLayouts[0]->get(), begin(descriptorSets), end(descriptorSets));
				}
				break;
			}
			case TRC_FRAMEBUFFER:
			{
				VkImageCreateInfo	imageCI	=
				{
					VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType
					DE_NULL,												// const void*				pNext
					(VkImageCreateFlags)0u,									// VkImageCreateFlags		flags
					VK_IMAGE_TYPE_2D,										// VkImageType				imageType
					VK_FORMAT_R8G8B8A8_UNORM,								// VkFormat					format
					{
						8u,													// deUint32	width
						8u,													// deUint32	height
						1u													// deUint32	depth
					},														// VkExtent3D				extent
					1u,														// deUint32					mipLevels
					1u,														// deUint32					arrayLayers
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples
					VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling
					VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,					// VkImageUsageFlags		usage;
					VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
					1u,														// deUint32					queueFamilyIndexCount;
					&queueFamilyIndex,										// const deUint32*			pQueueFamilyIndices;
					VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout			initialLayout;
				};
				ImageWithMemory image(vkd, device, allocator, imageCI, MemoryRequirement::Any);

				VkAttachmentDescription	attachmentDescription =
				{
					0u,														// VkAttachmentDescriptionFlags	flags;
					VK_FORMAT_R8G8B8A8_UNORM,								// VkFormat						format;
					VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits		samples;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			loadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			storeOp;
					VK_ATTACHMENT_LOAD_OP_DONT_CARE,						// VkAttachmentLoadOp			stencilLoadOp;
					VK_ATTACHMENT_STORE_OP_DONT_CARE,						// VkAttachmentStoreOp			stencilStoreOp;
					VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout				initialLayout;
					VK_IMAGE_LAYOUT_GENERAL,								// VkImageLayout				finalLayout;
				};

				std::vector<RenderPassSp> renderPasses(1u);
				createRenderPasses(vkd, device, &attachmentDescription, begin(renderPasses), end(renderPasses));

				std::vector<ImageViewSp> imageViews(1u);
				createImageViews(vkd, device, image.get(), begin(imageViews), end(imageViews));

				std::vector<FramebufferSp> framebuffers(VERIFYMAXVALUES_OBJECT_COUNT);
				createFramebuffers(vkd, device, renderPasses[0]->get(), imageViews[0]->get(), begin(framebuffers), end(framebuffers));
				std::fill(begin(framebuffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(framebuffers), FramebufferSp());
				createFramebuffers(vkd, device, renderPasses[0]->get(), imageViews[0]->get(), begin(framebuffers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(framebuffers));
				std::fill(begin(framebuffers), end(framebuffers), FramebufferSp());
				createFramebuffers(vkd, device, renderPasses[0]->get(), imageViews[0]->get(), begin(framebuffers), end(framebuffers));
				break;
			}
			case TRC_COMMANDPOOL:
			{
				std::vector<CommandPoolSp> commandPools(VERIFYMAXVALUES_OBJECT_COUNT);
				createCommandPools(vkd, device, begin(commandPools), end(commandPools));
				break;
			}
			case TRC_SAMPLERYCBCRCONVERSION:
			{
				std::vector<SamplerYcbcrConversionSp> samplers(VERIFYMAXVALUES_OBJECT_COUNT);
				createSamplerYcbcrConversions(vkd, device, begin(samplers), end(samplers));
				std::fill(begin(samplers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(samplers), SamplerYcbcrConversionSp());
				createSamplerYcbcrConversions(vkd, device, begin(samplers) + VERIFYMAXVALUES_OBJECT_COUNT / 2, end(samplers));
				std::fill(begin(samplers), end(samplers), SamplerYcbcrConversionSp());
				createSamplerYcbcrConversions(vkd, device, begin(samplers), end(samplers));
				break;
			}
//			case TRC_SURFACE:
//				break;
//			case TRC_SWAPCHAIN:
//				break;
//			case TRC_DISPLAY_MODE:
//				break;
			default:
				TCU_THROW(InternalError, "Unsupported max value");
		}
	}
};

// test pipeline pool sizes
class VerifyPipelinePoolSizes : public DeviceObjectReservationInstance
{
public:
	VerifyPipelinePoolSizes			(Context&								context,
									 const TestParams&						testParams_)
		: DeviceObjectReservationInstance(context, testParams_)
	{
	}

	Move<VkDevice> createTestDevice (VkDeviceCreateInfo&					deviceCreateInfo,
									 VkDeviceObjectReservationCreateInfo&	objectInfo,
									 VkPhysicalDeviceVulkanSC10Features&	sc10Features) override
	{
		DE_UNREF(sc10Features);

		std::vector<VkPipelinePoolSize> poolSizes;

		const VkDeviceSize psTooSmall		= 64u;
		const VkDeviceSize psForOnePipeline	= VkDeviceSize(m_context.getTestContext().getCommandLine().getPipelineDefaultSize());

		switch (testParams.testPoolSizeType)
		{
		case PST_NONE:
			objectInfo.graphicsPipelineRequestCount = 1u;
			break;
		case PST_ZERO:
			objectInfo.graphicsPipelineRequestCount = 1u;
			poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, 0u, 1u });
			break;
		case PST_TOO_SMALL_SIZE:
			poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, psTooSmall, 1u });
			objectInfo.graphicsPipelineRequestCount = 1u;
			break;
		case PST_ONE_FITS:
			poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, psForOnePipeline, 1u });
			objectInfo.graphicsPipelineRequestCount = 1u;
			break;
		case PST_MULTIPLE_FIT:
			poolSizes.push_back({ VK_STRUCTURE_TYPE_PIPELINE_POOL_SIZE, DE_NULL, psForOnePipeline, 16u });
			objectInfo.graphicsPipelineRequestCount = 16u;
			break;
		default:
			TCU_THROW(InternalError, "Unsupported pool size type");
		}

		objectInfo.pipelinePoolSizeCount					= deUint32(poolSizes.size());
		objectInfo.pPipelinePoolSizes						= poolSizes.empty() ? DE_NULL : poolSizes.data();
		objectInfo.pipelineLayoutRequestCount				= 1u;
		objectInfo.renderPassRequestCount					= 1u;
		objectInfo.subpassDescriptionRequestCount			= 1u;
		objectInfo.attachmentDescriptionRequestCount		= 1u;

		return createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instance.getDriver(), physicalDevice, &deviceCreateInfo);
	}

	void performTest (const DeviceInterface&				vk,
					  VkDevice								device) override
	{
		const vk::PlatformInterface&					vkp								= m_context.getPlatformInterface();
		const InstanceInterface&						vki								= instance.getDriver();

		Move<VkShaderModule>							vertexShader					= createShaderModule(vk, device, m_context.getBinaryCollection().get("vertex"), 0);
		Move<VkShaderModule>							fragmentShader					= createShaderModule(vk, device, m_context.getBinaryCollection().get("fragment"), 0);

		std::vector<VkPipelineShaderStageCreateInfo>	shaderStageCreateInfos			=
		{
			{
				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,						// VkStructureType                     sType;
				DE_NULL,																	// const void*                         pNext;
				(VkPipelineShaderStageCreateFlags)0,										// VkPipelineShaderStageCreateFlags    flags;
				VK_SHADER_STAGE_VERTEX_BIT,													// VkShaderStageFlagBits               stage;
				*vertexShader,																// VkShaderModule                      shader;
				"main",																		// const char*                         pName;
				DE_NULL,																	// const VkSpecializationInfo*         pSpecializationInfo;
			},
			{
				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,						// VkStructureType                     sType;
				DE_NULL,																	// const void*                         pNext;
				(VkPipelineShaderStageCreateFlags)0,										// VkPipelineShaderStageCreateFlags    flags;
				VK_SHADER_STAGE_FRAGMENT_BIT,												// VkShaderStageFlagBits               stage;
				*fragmentShader,																// VkShaderModule                      shader;
				"main",																		// const char*                         pName;
				DE_NULL,																	// const VkSpecializationInfo*         pSpecializationInfo;
			}
		};

		VkPipelineVertexInputStateCreateInfo			vertexInputStateCreateInfo;
		VkPipelineInputAssemblyStateCreateInfo			inputAssemblyStateCreateInfo;
		VkPipelineViewportStateCreateInfo				viewPortStateCreateInfo;
		VkPipelineRasterizationStateCreateInfo			rasterizationStateCreateInfo;
		VkPipelineMultisampleStateCreateInfo			multisampleStateCreateInfo;
		VkPipelineColorBlendAttachmentState				colorBlendAttachmentState;
		VkPipelineColorBlendStateCreateInfo				colorBlendStateCreateInfo;
		VkPipelineDynamicStateCreateInfo				dynamicStateCreateInfo;
		std::vector<VkDynamicState>						dynamicStates					= { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };

		const VkPipelineLayoutCreateInfo				pipelineLayoutCreateInfo		=
		{
			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,										// VkStructureType                     sType;
			DE_NULL,																			// const void*                         pNext;
			(VkPipelineLayoutCreateFlags)0u,													// VkPipelineLayoutCreateFlags         flags;
			0u,																					// deUint32                            setLayoutCount;
			DE_NULL,																			// const VkDescriptorSetLayout*        pSetLayouts;
			0u,																					// deUint32                            pushConstantRangeCount;
			DE_NULL																				// const VkPushConstantRange*          pPushConstantRanges;
		};
		Move<VkPipelineLayout>							pipelineLayout					= createPipelineLayout(vk, device, &pipelineLayoutCreateInfo);

		const VkFormat									format							= getRenderTargetFormat(vki, physicalDevice);

		VkAttachmentDescription							attachmentDescription;
		VkAttachmentReference							attachmentReference;
		VkSubpassDescription							subpassDescription;
		VkRenderPassCreateInfo							renderPassCreateInfo			= prepareSimpleRenderPassCI(format, attachmentDescription, attachmentReference, subpassDescription);
		Move<VkRenderPass>								renderPass						= createRenderPass(vk, device, &renderPassCreateInfo);

		VkGraphicsPipelineCreateInfo					graphicsPipelineCreateInfo		= prepareSimpleGraphicsPipelineCI(vertexInputStateCreateInfo, shaderStageCreateInfos,
				inputAssemblyStateCreateInfo, viewPortStateCreateInfo, rasterizationStateCreateInfo, multisampleStateCreateInfo, colorBlendAttachmentState, colorBlendStateCreateInfo,
				dynamicStateCreateInfo, dynamicStates, *pipelineLayout, *renderPass);

		// create custom VkPipelineIdentifierInfo
		VkPipelineOfflineCreateInfo						pipelineID						= resetPipelineOfflineCreateInfo();
		applyPipelineIdentifier(pipelineID, "ID_DR_PS_00");
		pipelineID.pNext																= graphicsPipelineCreateInfo.pNext;
		graphicsPipelineCreateInfo.pNext												= &pipelineID;

		if (m_context.getTestContext().getCommandLine().isSubProcess())
		{
			pipelineID.poolEntrySize = VkDeviceSize(m_context.getTestContext().getCommandLine().getPipelineDefaultSize());
		}

		std::size_t										pipelineCount					= 0u;
		switch (testParams.testPoolSizeType)
		{
		case PST_NONE:
		case PST_ZERO:
		case PST_TOO_SMALL_SIZE:
		case PST_ONE_FITS:
			pipelineCount = 1u;
			break;
		case PST_MULTIPLE_FIT:
			pipelineCount = 16u;
			break;
		default:
			TCU_THROW(InternalError, "Unsupported pool size type");
		};

		if (!m_context.getTestContext().getCommandLine().isSubProcess())
		{
			std::vector<Move<VkPipeline>> pipelines;
			for (deUint32 i = 0; i < pipelineCount; ++i)
				pipelines.emplace_back(createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineCreateInfo));
			return;
		}

		GetDeviceProcAddrFunc				getDeviceProcAddrFunc			= (GetDeviceProcAddrFunc)vkp.getInstanceProcAddr(instance, "vkGetDeviceProcAddr");
		CreateGraphicsPipelinesFunc			createGraphicsPipelinesFunc		= (CreateGraphicsPipelinesFunc)getDeviceProcAddrFunc(device, "vkCreateGraphicsPipelines");
		DestroyPipelineFunc					destroyPipelineFunc				= (DestroyPipelineFunc)getDeviceProcAddrFunc(device, "vkDestroyPipeline");
		VkPipelineCache						pipelineCache					= m_context.getResourceInterface()->getPipelineCache(device);
		std::vector<VkPipeline>				pipelines						(pipelineCount, VkPipeline(DE_NULL));
		deUint32							iterations						= m_context.getDeviceVulkanSC10Properties().recyclePipelineMemory ? 1u : 4u;

		// if recyclePipelineMemory is set then we are able to create the same pipelines again
		for (deUint32 iter = 0; iter < iterations; ++iter)
		{
			for (deUint32 i = 0; i < pipelineCount; ++i)
			{
				VkResult result = createGraphicsPipelinesFunc(device, pipelineCache, 1u, &graphicsPipelineCreateInfo, DE_NULL, &pipelines[i]);
				results.push_back(result);
				if (result != VK_SUCCESS)
				{
					for (deUint32 j = 0; j < pipelineCount; ++j)
						if (pipelines[j].getInternal() != DE_NULL)
							destroyPipelineFunc(device, pipelines[j], DE_NULL);
					return;
				}
			}

			for (deUint32 i = 0; i < pipelineCount; ++i)
			{
				destroyPipelineFunc(device, pipelines[i], DE_NULL);
				pipelines[i] = VkPipeline(DE_NULL);
			}
		}
	}

	bool verifyTestResults	(const DeviceInterface&					vkd,
							 VkDevice								device) override
	{
		DE_UNREF(vkd);
		DE_UNREF(device);

		if (!m_context.getTestContext().getCommandLine().isSubProcess())
			return true;

		switch (testParams.testPoolSizeType)
		{
		case PST_NONE:
		case PST_ZERO:
		case PST_TOO_SMALL_SIZE:
			return (results.back() == VK_ERROR_OUT_OF_POOL_MEMORY);
		case PST_ONE_FITS:
			return (results.back() == VK_SUCCESS);
		case PST_MULTIPLE_FIT:
			return (results.back() == VK_SUCCESS);
		default:
			TCU_THROW(InternalError, "Unsupported pool size type");
		};
		return true;
	}

	std::vector<VkResult> results;
};

} // anonymous

tcu::TestCaseGroup*	createDeviceObjectReservationTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "device_object_reservation", "Tests verifying VkDeviceObjectReservationCreateInfo"));

	// add basic tests
	{
		de::MovePtr<tcu::TestCaseGroup> basicGroup(new tcu::TestCaseGroup(group->getTestContext(), "basic", ""));

		basicGroup->addChild(new InstanceFactory1<DeviceObjectReservationInstance, TestParams>(testCtx, tcu::NODETYPE_SELF_VALIDATE, "create_device", "", TestParams()));
		basicGroup->addChild(new InstanceFactory1<MultipleReservation, TestParams>(testCtx, tcu::NODETYPE_SELF_VALIDATE, "multiple_device_object_reservation", "", TestParams()));

		group->addChild(basicGroup.release());
	}

	// add tests verifying device limits
	{
		de::MovePtr<tcu::TestCaseGroup> limitGroup(new tcu::TestCaseGroup(group->getTestContext(), "limits", ""));
		struct TestMaxValuesData
		{
			TestMaxValues							testMaxValues;
			const char*								name;
		} testMaxValues[] =
		{
			{ TMV_DESCRIPTOR_SET_LAYOUT_BINDING_LIMIT,		"descriptor_set_layout_binding_limit" },
			{ TMV_MAX_IMAGEVIEW_MIPLEVELS,					"max_imageview_miplevels" },
			{ TMV_MAX_IMAGEVIEW_ARRAYLAYERS,				"max_imageview_arraylayers" },
			{ TMV_MAX_LAYEREDIMAGEVIEW_MIPLEVELS,			"max_layeredimageview_miplevels" },
			{ TMV_MAX_OCCLUSION_QUERIES_PER_POOL,			"max_occlusion_queries_per_pool" },
			{ TMV_MAX_PIPELINESTATISTICS_QUERIES_PER_POOL,	"max_pipelinestatistics_queries_per_pool" },
			{ TMV_MAX_TIMESTAMP_QUERIES_PER_POOL,			"max_timestamp_queries_per_pool" },
		};
		{
			de::MovePtr<tcu::TestCaseGroup> maxValGroup(new tcu::TestCaseGroup(group->getTestContext(), "max_values", ""));

			for (deInt32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(testMaxValues); ndx++)
			{
				TestParams testParams
				{
					testMaxValues[ndx].testMaxValues,
					TRC_UNDEFINED
				};
				maxValGroup->addChild(new InstanceFactory1WithSupport<VerifyMaxValues, TestParams, FunctionSupport1<TestParams>>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testMaxValues[ndx].name, "", testParams,
					typename FunctionSupport1<TestParams>::Args(checkSupportVerifyMaxValues, testParams)));
			}

			limitGroup->addChild(maxValGroup.release());
		}

		struct TestRequestCountData
		{
			TestRequestCounts						requestCount;
			const char*								name;
		} testRequestCounts[] =
		{
			{ TRC_SEMAPHORE,					"semaphore" },
			{ TRC_COMMAND_BUFFER,				"command_buffer" },
			{ TRC_FENCE,						"fence" },
			{ TRC_DEVICE_MEMORY,				"device_memory" },
			{ TRC_BUFFER,						"buffer" },
			{ TRC_IMAGE,						"image" },
			{ TRC_EVENT,						"event" },
			{ TRC_QUERY_POOL,					"query_pool" },
			{ TRC_BUFFER_VIEW,					"buffer_view" },
			{ TRC_IMAGE_VIEW,					"image_view" },
			{ TRC_LAYERED_IMAGE_VIEW,			"layered_image_view" },
			{ TRC_PIPELINE_LAYOUT,				"pipeline_layout" },
			{ TRC_RENDER_PASS,					"render_pass" },
			{ TRC_GRAPHICS_PIPELINE,			"graphics_pipeline" },
			{ TRC_COMPUTE_PIPELINE,				"compute_pipeline" },
			{ TRC_DESCRIPTORSET_LAYOUT,			"descriptorset_layout" },
			{ TRC_SAMPLER,						"sampler" },
			{ TRC_DESCRIPTOR_POOL,				"descriptor_pool" },
			{ TRC_DESCRIPTORSET,				"descriptorset" },
			{ TRC_FRAMEBUFFER,					"framebuffer" },
			{ TRC_COMMANDPOOL,					"commandpool" },
			{ TRC_SAMPLERYCBCRCONVERSION,		"samplerycbcrconversion" },
//			{ TRC_SURFACE,						"surface" },
//			{ TRC_SWAPCHAIN,					"swapchain" },
//			{ TRC_DISPLAY_MODE,					"display_mode" },
		};
		{
			de::MovePtr<tcu::TestCaseGroup> requestCountGroup(new tcu::TestCaseGroup(group->getTestContext(), "request_count", ""));

			for (deInt32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(testRequestCounts); ndx++)
			{
				TestParams testParams
				{
					TMV_UNDEFINED,
					testRequestCounts[ndx].requestCount
				};
				requestCountGroup->addChild(new InstanceFactory1WithSupport<VerifyRequestCounts, TestParams, FunctionSupport1<TestParams>, ProgramsVerifyLimits>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testRequestCounts[ndx].name, "",
					ProgramsVerifyLimits(), testParams, typename FunctionSupport1<TestParams>::Args(checkSupportVerifyRequestCounts, testParams)));
			}

			limitGroup->addChild(requestCountGroup.release());
		}

		group->addChild(limitGroup.release());
	}

	// add tests verifying pipeline pool sizes
	{
		de::MovePtr<tcu::TestCaseGroup> ppsGroup(new tcu::TestCaseGroup(group->getTestContext(), "pipeline_pool_size", ""));


		struct PoolSizesData
		{
			TestPoolSizes					type;
			const char*						name;
		} poolSizes[] =
		{
			{ PST_NONE,					"none" },
			{ PST_ZERO,					"zero" },
			{ PST_TOO_SMALL_SIZE,		"too_small_size" },
			{ PST_ONE_FITS,				"one_fits" },
			{ PST_MULTIPLE_FIT,			"multiple_fit" },
		};

		for (deInt32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(poolSizes); ndx++)
		{
			TestParams testParams(TMV_UNDEFINED, TRC_UNDEFINED, poolSizes[ndx].type);

			ppsGroup->addChild(new InstanceFactory1<VerifyPipelinePoolSizes, TestParams, ProgramsVerifyLimits>(testCtx, tcu::NODETYPE_SELF_VALIDATE, poolSizes[ndx].name, "", ProgramsVerifyLimits(), testParams));
		}


		group->addChild(ppsGroup.release());
	}

	return group.release();
}

}	// sc

}	// vkt
