/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
* Copyright (c) 2019 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 Vulkan Decriptor Indexing Tests
*//*--------------------------------------------------------------------*/

#include <algorithm>
#include <iostream>
#include <iterator>
#include <functional>
#include <sstream>
#include <utility>
#include <vector>

#include "vktDescriptorSetsIndexingTests.hpp"

#include "vkBuilderUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkDefs.hpp"
#include "vkObjUtil.hpp"
#include "vkPlatform.hpp"
#include "vkPrograms.hpp"
#include "vkQueryUtil.hpp"
#include "vkTypeUtil.hpp"

#include "tcuTestLog.hpp"
#include "tcuResource.hpp"
#include "tcuImageCompare.hpp"
#include "tcuCommandLine.hpp"
#include "tcuStringTemplate.hpp"

#include "deRandom.hpp"
#include "deMath.h"
#include "deStringUtil.hpp"

namespace vkt
{
namespace DescriptorIndexing
{
using namespace vk;
namespace ut
{

ImageHandleAlloc::ImageHandleAlloc	(Move<VkImage>&					image_,
									 AllocMv&						alloc_,
									 const VkExtent3D&				extent_,
									 VkFormat						format_,
									 bool							usesMipMaps_)
	: image		(image_)
	, alloc		(alloc_)
	, extent	(extent_)
	, format	(format_)
	, levels	(usesMipMaps_ ? computeMipMapCount(extent_) : 1)
{
}

std::string buildShaderName			(VkShaderStageFlagBits			stage,
									 VkDescriptorType				descriptorType,
									 deBool							updateAfterBind,
									 bool							calculateInLoop,
									 bool							minNonUniform,
									 bool							performWritesInVertex)
{
	const char* stageName = DE_NULL;
	switch (stage)
	{
	case VK_SHADER_STAGE_VERTEX_BIT:					stageName = "vert"; break;
	case VK_SHADER_STAGE_FRAGMENT_BIT:					stageName = "frag"; break;
	case VK_SHADER_STAGE_COMPUTE_BIT:					stageName = "comp"; break;
	case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:		stageName = "tesc"; break;
	case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:	stageName = "tese";	break;
	case VK_SHADER_STAGE_GEOMETRY_BIT:					stageName = "geom"; break;
	default:											stageName = "any";	break;
	}
	DE_ASSERT(stageName);

	std::map<std::string, std::string> m;
	m["STAGE"]	= stageName;
	m["DESC"]	= de::toString(deUint32(descriptorType));
	m["ABIND"]	= updateAfterBind		? "_afterBind"		: "";
	m["LOOP"]	= calculateInLoop		? "_inLoop"			: "";
	m["MINNU"]	= minNonUniform			? "_minNonUniform"	: "";
	m["SHWR"]	= performWritesInVertex	? "_shaderWrites"	: "";

	return tcu::StringTemplate("descriptorIndexing_${STAGE}${DESC}${ABIND}${LOOP}${MINNU}${SHWR}").specialize(m);
}

std::vector<deUint32> generatePrimes (deUint32						limit)
{
	deUint32 i, j, *data;
	std::vector<deUint32> v(limit);

	data = v.data();

	for (i = 0; i < limit; ++i)
		data[i] = i;

	for (i = 2; i < limit; ++i)
	{
		if (data[i])
		{
			for (j = i*2; j < limit; j += i)
				data[j] = 0;
		}
	}

	std::vector<deUint32>::iterator x = std::stable_partition(v.begin(), v.end(), [](deUint32 value) { return value >= 2; });

	return std::vector<deUint32>(v.begin(), x);
}

deUint32 computePrimeCount			(deUint32						limit)
{
	deUint32 i, j, k, *data;
	std::vector<deUint32> v(limit);

	data = v.data();

	for (i = 0; i < limit; ++i)
		data[i] = i;

	k = 0;
	for (i = 2; i < limit; ++i)
	{
		if (data[i])
		{
			++k;
			for (j = i*2; j < limit; j += i)
				data[j] = 0;
		}
	}
	return k;
}

deUint32 computeMipMapCount			(const VkExtent3D&				extent)
{
	return deUint32(floor(log2(std::max(extent.width, extent.height)))) + 1;
}

deUint32 computeImageSize			(const VkExtent3D&				extent,
									 VkFormat						format,
									 bool							withMipMaps,
									 deUint32						level)
{
	deUint32 mipSize = extent.width * extent.height * extent.depth * vk::mapVkFormat(format).getPixelSize();
	if (withMipMaps)
	{
		deUint32		mipIdx		= 0u;
		deUint32		width		= extent.width;
		deUint32		height		= extent.height;
		const deUint32	mipCount	= computeMipMapCount(extent) - 1;
		do
		{
			width /= 2;
			height /= 2;
			deUint32 tmpSize = width * height * extent.depth * vk::mapVkFormat(format).getPixelSize();

			if (level == mipIdx)
			{
				break;
			}
			else if (level == maxDeUint32)
			{
				mipSize += tmpSize;
			}
			else
			{
				mipSize = tmpSize;
			}

		} while (++mipIdx < mipCount);
	}
	return mipSize;
}

deUint32 computeImageSize			(const ImageHandleAllocSp&		image)
{
	return computeImageSize(image->extent, image->format);
}

void createImageAndBind				(ut::ImageHandleAllocSp&		output,
									 const vkt::Context&			ctx,
									 VkFormat						colorFormat,
									 const VkExtent3D&				extent,
									 VkImageLayout					initialLayout,
									 bool							withMipMaps,
									 VkImageType					imageType)
{
	const bool						isDepthStencilFormat = vk::isDepthStencilFormat(colorFormat);

	const VkImageUsageFlags			imageUsageFlagsDependent = isDepthStencilFormat
		? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
		: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;

	const VkImageUsageFlags			imageUsageFlags = imageUsageFlagsDependent
		| VK_IMAGE_USAGE_TRANSFER_SRC_BIT
		| VK_IMAGE_USAGE_TRANSFER_DST_BIT
		| VK_IMAGE_USAGE_SAMPLED_BIT
		| VK_IMAGE_USAGE_STORAGE_BIT
		| VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;

	const deUint32 mipLevels = withMipMaps ? computeMipMapCount(extent) : 1;
	const VkImageCreateInfo			createInfo =
	{
		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,	// sType
		DE_NULL,								// pNext
		(VkImageCreateFlags)0,					// flags
		imageType,								// imageType
		colorFormat,							// format
		extent,									// extent
		mipLevels,								// mipLevels
		(deUint32)1,							// arrayLayers
		VK_SAMPLE_COUNT_1_BIT,					// samples
		VK_IMAGE_TILING_OPTIMAL,				// tiling
		imageUsageFlags,						// usage
		VK_SHARING_MODE_EXCLUSIVE,				// sharingMode
		(deUint32)0,							// queueFamilyCount
		DE_NULL,								// pQueueFamilyIndices
		initialLayout							// initialLayout
	};

	Allocator&						allocator	= ctx.getDefaultAllocator();
	VkDevice						device		= ctx.getDevice();
	const DeviceInterface&			dinterface	= ctx.getDeviceInterface();

	Move<VkImage>					image		= vk::createImage(dinterface, device, &createInfo);

	const VkMemoryRequirements		memReqs		= vk::getImageMemoryRequirements(dinterface, device, *image);
	de::MovePtr<Allocation>			allocation	= allocator.allocate(memReqs, MemoryRequirement::Any);

	VK_CHECK(dinterface.bindImageMemory(device, *image, allocation->getMemory(), allocation->getOffset()));

	output = ImageHandleAllocSp(new ImageHandleAlloc(image, allocation, extent, colorFormat, withMipMaps));
}

void recordCopyBufferToImage		(VkCommandBuffer				cmd,
									 const DeviceInterface&			interface,
									 VkPipelineStageFlagBits		srcStageMask,
									 VkPipelineStageFlagBits		dstStageMask,
									 const VkDescriptorBufferInfo&	bufferInfo,
									 VkImage						image,
									 const VkExtent3D&				imageExtent,
									 VkFormat						imageFormat,
									 VkImageLayout					oldImageLayout,
									 VkImageLayout					newImageLayout,
									 deUint32						mipLevelCount)
{
	const VkImageAspectFlags imageAspect = vk::isDepthStencilFormat(imageFormat)
		? VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT
		: VK_IMAGE_ASPECT_COLOR_BIT;

	std::vector<VkBufferImageCopy>	copyRegions;
	{
		deUint32		width			= imageExtent.width;
		deUint32		height			= imageExtent.height;
		VkDeviceSize	bufferOffset	= bufferInfo.offset;

		for (deUint32 mipIdx = 0; mipIdx < mipLevelCount; ++mipIdx)
		{
			VkDeviceSize	imageSize = computeImageSize(imageExtent, imageFormat, true, mipIdx);

			const VkBufferImageCopy		copyRegion =
			{
				bufferOffset,							// bufferOffset
				width,									// bufferRowLength
				height,									// bufferImageHeight
				{
					imageAspect,						// aspect
					mipIdx,								// mipLevel
					0u,									// baseArrayLayer
					1u,									// layerCount
				},										// VkImageSubresourceLayers imageSubresource
				{ 0,0,0 },								// VkOffset3D				imageOffset
				{ width, height, 1 }					// VkExtent3D				imageExtent
			};

			copyRegions.push_back(copyRegion);

			bufferOffset	+= imageSize;
			width			/= 2;
			height			/= 2;
		}
	}

	const VkImageSubresourceRange		subresourceRange =
	{
		imageAspect,									// aspectMask
		0u,												// baseMipLevel
		mipLevelCount,									// levelCount
		0u,												// baseArrayLayer
		1u,												// layerCount
	};

	const VkImageMemoryBarrier	barrierBefore =
	{
		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType;
		DE_NULL,										// pNext;
		0,												// srcAccessMask;
		VK_ACCESS_TRANSFER_WRITE_BIT,					// dstAccessMask;
		oldImageLayout,									// oldLayout;
		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,			// newLayout;
		VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
		VK_QUEUE_FAMILY_IGNORED,						// dstQueueFamilyIndex;
		image,											// image
		subresourceRange								// subresourceRange
	};

	const VkBufferMemoryBarrier	bufferBarrier =
	{
		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,		// sType;
		DE_NULL,										// pNext;
		pipelineAccessFromStage(srcStageMask, false),	// srcAccessMask;
		VK_ACCESS_TRANSFER_READ_BIT,					// dstAccessMask;
		VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
		VK_QUEUE_FAMILY_IGNORED,						// dstQueueFamilyIndex;
		bufferInfo.buffer,								// buffer;
		bufferInfo.offset,								// offset;
		bufferInfo.range								// size;
	};

	const VkImageMemoryBarrier	barrierAfter =
	{
		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType;
		DE_NULL,										// pNext;
		VK_ACCESS_TRANSFER_WRITE_BIT,					// srcAccessMask;
		pipelineAccessFromStage(dstStageMask, true)
		| pipelineAccessFromStage(dstStageMask, false),	// dstAccessMask;
		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,			// oldLayout;
		newImageLayout,									// newLayout;
		VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
		VK_QUEUE_FAMILY_IGNORED,						// dstQueueFamilyIndex;
		image,											// image
		subresourceRange								// subresourceRange
	};

	interface.cmdPipelineBarrier(cmd,
		srcStageMask, VK_PIPELINE_STAGE_TRANSFER_BIT,	// srcStageMask, dstStageMask
		(VkDependencyFlags)0,							// dependencyFlags
		0u, DE_NULL,									// memoryBarrierCount, pMemoryBarriers
		1u, &bufferBarrier,								// bufferBarrierCount, pBufferBarriers
		1u, &barrierBefore);							// imageBarrierCount, pImageBarriers

	interface.cmdCopyBufferToImage(cmd, bufferInfo.buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, static_cast<deUint32>(copyRegions.size()), copyRegions.data());

	interface.cmdPipelineBarrier(cmd,
		VK_PIPELINE_STAGE_TRANSFER_BIT, dstStageMask,	// srcStageMask, dstStageMask
		(VkDependencyFlags)0,							// dependencyFlags
		0u, DE_NULL,									// memoryBarrierCount, pMemoryBarriers
		0u, DE_NULL,									// bufferBarrierCount, pBufferBarriers
		1u, &barrierAfter);								// imageBarrierCount, pImageBarriers
}

void recordCopyImageToBuffer		(VkCommandBuffer				cmd,
									 const DeviceInterface&			interface,
									 VkPipelineStageFlagBits		srcStageMask,
									 VkPipelineStageFlagBits		dstStageMask,
									 VkImage						image,
									 const VkExtent3D&				imageExtent,
									 VkFormat						imageFormat,
									 VkImageLayout					oldImageLayout,
									 VkImageLayout					newImageLayout,
									 const VkDescriptorBufferInfo&	bufferInfo)
{
	const VkImageAspectFlags imageAspect = vk::isDepthStencilFormat(imageFormat)
		? VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT
		: VK_IMAGE_ASPECT_COLOR_BIT;

	const VkBufferImageCopy		copyRegion =
	{
		bufferInfo.offset,								// bufferOffset
		imageExtent.width,								// bufferRowLength
		imageExtent.height,								// bufferImageHeight
		{
			imageAspect,								// aspect
			0u,											// mipLevel
			0u,											// baseArrayLayer
			1u,											// layerCount
		},												// VkImageSubresourceLayers
		{ 0, 0, 0 },									// imageOffset
		imageExtent										// imageExtent
	};

	VkImageSubresourceRange		subresourceRange =
	{
		VK_IMAGE_ASPECT_COLOR_BIT,						// aspectMask
		0u,												// baseMipLevel
		1u,												// levelCount
		0u,												// baseArrayLayer
		1u,												// layerCount
	};

	const VkImageMemoryBarrier	barrierBefore =
	{
		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType;
		DE_NULL,										// pNext;
		pipelineAccessFromStage(srcStageMask, false),	// srcAccessMask;
		VK_ACCESS_TRANSFER_READ_BIT,					// dstAccessMask;
		oldImageLayout,									// oldLayout
		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,			// newLayout;
		VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
		VK_QUEUE_FAMILY_IGNORED,						// dstQueueFamilyIndex;
		image,											// image;
		subresourceRange,								// subresourceRange;
	};

	const VkImageMemoryBarrier	barrierAfter =
	{
		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType;
		DE_NULL,										// pNext;
		VK_ACCESS_TRANSFER_READ_BIT,					// srcAccessMask;
		pipelineAccessFromStage(dstStageMask, true)
		| pipelineAccessFromStage(dstStageMask, false),	// dstAccessMask;
		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,			// oldLayout;
		newImageLayout,									// newLayout;
		VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
		VK_QUEUE_FAMILY_IGNORED,						// dstQueueFamilyIndex;
		image,											// image
		subresourceRange								// subresourceRange
	};

	interface.cmdPipelineBarrier(cmd,					// commandBuffer
		srcStageMask, VK_PIPELINE_STAGE_TRANSFER_BIT,	// srcStageMask, dstStageMask
		(VkDependencyFlags)0,							// dependencyFlags
		0u, DE_NULL,									// memoryBarrierCount, pMemoryBarriers
		0u, DE_NULL,									// bufferBarrierCount, pBufferBarriers
		1u, &barrierBefore);							// imageBarrierCount, pImageBarriers

	interface.cmdCopyImageToBuffer(cmd, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bufferInfo.buffer, 1u, &copyRegion);

	interface.cmdPipelineBarrier(cmd,
		VK_PIPELINE_STAGE_TRANSFER_BIT, dstStageMask,
		(VkDependencyFlags)0,
		0u, DE_NULL,
		0u, DE_NULL,
		0u, &barrierAfter);
}

VkAccessFlags pipelineAccessFromStage (VkPipelineStageFlagBits stage, bool readORwrite)
{
	VkAccessFlags access[2];
	VkAccessFlags& readAccess = access[1];
	VkAccessFlags& writeAccess = access[0];
	readAccess = writeAccess = static_cast<VkAccessFlagBits>(0);

	switch (stage)
	{
	case VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT:
	case VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT:
		readAccess = VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
		break;

	case VK_PIPELINE_STAGE_VERTEX_INPUT_BIT:
		readAccess = static_cast<VkAccessFlagBits>(VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT);
		break;

	case VK_PIPELINE_STAGE_VERTEX_SHADER_BIT:
	case VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT:
	case VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT:
	case VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT:
	case VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT:
		readAccess = VK_ACCESS_SHADER_READ_BIT;
		writeAccess = VK_ACCESS_SHADER_WRITE_BIT;
		break;

	case VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT:
		readAccess = static_cast<VkAccessFlagBits>(VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT);
		writeAccess = VK_ACCESS_SHADER_READ_BIT;
		break;

	case VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT:
		readAccess = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
		writeAccess = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
		break;

	case VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT:
	case VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT:
		readAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
		writeAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
		break;

	case VK_PIPELINE_STAGE_TRANSFER_BIT:
		readAccess = VK_ACCESS_TRANSFER_READ_BIT;
		writeAccess = VK_ACCESS_TRANSFER_WRITE_BIT;
		break;

	case VK_PIPELINE_STAGE_HOST_BIT:
		readAccess = VK_ACCESS_HOST_READ_BIT;
		writeAccess = VK_ACCESS_HOST_WRITE_BIT;
		break;

	default:
		if (stage == 0)
		{
			readAccess = VK_ACCESS_MEMORY_READ_BIT;
			writeAccess = VK_ACCESS_MEMORY_WRITE_BIT;
			break;
		}

		DE_ASSERT(DE_FALSE);
	}
	return access[readORwrite ? 1 : 0];
}

void createFrameBuffer				(FrameBufferSp&					outputFB,
									 const vkt::Context&			context,
									 const VkExtent3D&				extent,
									 VkFormat						colorFormat,
									 VkRenderPass					renderpass,
									 deUint32						additionalAttachmentCount,
									 const VkImageView				additionalAttachments[])
{
	outputFB						= FrameBufferSp(new ut::FrameBuffer);
	VkDevice						device = context.getDevice();
	const DeviceInterface&			interface = context.getDeviceInterface();
	createImageAndBind(outputFB->image, context, colorFormat, extent, VK_IMAGE_LAYOUT_UNDEFINED);

	// create and attachment0
	{
		const VkImageViewCreateInfo viewCreateInfo =
		{
			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// sType
			DE_NULL,									// pNext
			(VkImageViewCreateFlags)0,					// flags
			*outputFB->image->image,						// image
			VK_IMAGE_VIEW_TYPE_2D,						// viewType
			colorFormat,								// format
			vk::makeComponentMappingRGBA(),				// components
			{
				VK_IMAGE_ASPECT_COLOR_BIT,	// aspectMask
				(deUint32)0,				// baseMipLevel
				(deUint32)1,				// mipLevels
				(deUint32)0,				// baseArrayLayer
				(deUint32)1u,				// arraySize
			},
		};

		outputFB->attachment0 = vk::createImageView(interface, device, &viewCreateInfo);

		std::vector<VkImageView>& attachments(outputFB->attachments);
		attachments.push_back(*outputFB->attachment0);
		if (additionalAttachments && additionalAttachmentCount)
		{
			attachments.insert(attachments.end(), additionalAttachments, additionalAttachments + additionalAttachmentCount);
		}
	}

	// create a frame buffer
	{
		std::vector<VkImageView>& attachments(outputFB->attachments);

		const VkFramebufferCreateInfo	framebufferCreateInfo =
		{
			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// sType
			DE_NULL,									// pNext
			(VkFramebufferCreateFlags)0,				// flags
			renderpass,									// renderPass
			static_cast<deUint32>(attachments.size()),	// attachmentCount
			attachments.data(),							// pAttachments
			extent.width,								// width
			extent.height,								// height
			(deUint32)1									// layers
		};

		outputFB->buffer = vk::createFramebuffer(interface, device, &framebufferCreateInfo);
	}
}

VkDeviceSize createBufferAndBind	(ut::BufferHandleAllocSp&	output,
									 const vkt::Context&		ctx,
									 VkBufferUsageFlags			usage,
									 VkDeviceSize				desiredSize)
{
	const size_t				nonCoherentAtomSize	(static_cast<size_t>(ctx.getDeviceProperties().limits.nonCoherentAtomSize));
	const VkDeviceSize			roundedSize			(deAlignSize(static_cast<size_t>(desiredSize), nonCoherentAtomSize));
	Allocator&					allocator			(ctx.getDefaultAllocator());
	VkDevice					device				(ctx.getDevice());
	const DeviceInterface&		interface			(ctx.getDeviceInterface());

	const VkBufferCreateInfo	createInfo =
	{
		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// sType
		DE_NULL,									// pNext
		(VkBufferCreateFlags)0,						// flags
		roundedSize,								// size
		usage,										// usage
		VK_SHARING_MODE_EXCLUSIVE,					// sharingMode
		0u,											// queueFamilyIndexCount
		DE_NULL,									// pQueueFamilyIndices
	};

	Move<VkBuffer>				buffer				= vk::createBuffer(interface, device, &createInfo);

	const VkMemoryRequirements	memRequirements		= vk::getBufferMemoryRequirements(interface, device, *buffer);
	de::MovePtr<Allocation>		allocation			= allocator.allocate(memRequirements, MemoryRequirement::HostVisible);

	VK_CHECK(interface.bindBufferMemory(device, *buffer, allocation->getMemory(), allocation->getOffset()));

	output = BufferHandleAllocSp(new BufferHandleAlloc(buffer, allocation));

	return roundedSize;
}

std::vector<tcu::Vec4> createVertices (deUint32 width, deUint32 height, float& xSize, float& ySize)
{
	std::vector<tcu::Vec4> result;

	const float		xStep = 2.0f / static_cast<float>(width);
	const float		yStep = 2.0f / static_cast<float>(height);
	const float		xStart = -1.0f + xStep / 2.0f;
	const float		yStart = -1.0f + yStep / 2.0f;

	xSize = xStep;
	ySize = yStep;

	float x = xStart;
	float y = yStart;

	result.reserve(width * height);

	for (deUint32 row = 0u; row < height; ++row)
	{
		for (deUint32 col = 0u; col < width; ++col)
		{
			result.push_back(tcu::Vec4(x, y, 1.0f, 1.0f));
			x += xStep;
		}

		y += yStep;
		x = xStart;
	}

	return result;
}

bool isDynamicDescriptor (VkDescriptorType descriptorType)
{
	return descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
}

DeviceProperties::DeviceProperties (const DeviceProperties& src)
{
	m_descriptorIndexingFeatures = src.m_descriptorIndexingFeatures;
	m_features2 = src.m_features2;

	m_descriptorIndexingProperties = src.m_descriptorIndexingProperties;
	m_properties2 = src.m_properties2;
}

DeviceProperties::DeviceProperties (const vkt::Context& testContext)
{
	VkPhysicalDevice device = testContext.getPhysicalDevice();
	const InstanceInterface& interface = testContext.getInstanceInterface();

	deMemset(&m_descriptorIndexingFeatures, 0, sizeof(m_descriptorIndexingFeatures));
	m_descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
	m_descriptorIndexingFeatures.pNext = DE_NULL;

	deMemset(&m_features2, 0, sizeof(m_features2));
	m_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
	m_features2.pNext = &m_descriptorIndexingFeatures;

	interface.getPhysicalDeviceFeatures2(device, &m_features2);

	deMemset(&m_descriptorIndexingProperties, 0, sizeof(m_descriptorIndexingProperties));
	m_descriptorIndexingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES;
	m_descriptorIndexingProperties.pNext = DE_NULL;

	deMemset(&m_properties2, 0, sizeof(m_properties2));
	m_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
	m_properties2.pNext = &m_descriptorIndexingProperties;

	interface.getPhysicalDeviceProperties2(device, &m_properties2);
}

deUint32 DeviceProperties::computeMaxPerStageDescriptorCount	(VkDescriptorType	descriptorType,
																 bool				enableUpdateAfterBind,
																 bool				reserveUniformTexelBuffer) const
{
	const VkPhysicalDeviceDescriptorIndexingProperties&		descriptorProps = descriptorIndexingProperties();
	const VkPhysicalDeviceProperties&						deviceProps = physicalDeviceProperties();

	deUint32		result					= 0;
	deUint32		samplers				= 0;
	deUint32		uniformBuffers			= 0;
	deUint32		uniformBuffersDynamic	= 0;
	deUint32		storageBuffers			= 0;
	deUint32		storageBuffersDynamic	= 0;
	deUint32		sampledImages			= 0;
	deUint32		storageImages			= 0;
	deUint32		inputAttachments		= 0;
	deUint32		inlineUniforms			= 0;

	// in_loop tests use an additional single texel buffer, which is calculated against the limits below
	const deUint32	reservedCount			= (reserveUniformTexelBuffer ? 1u : 0u);

	const deUint32	resources				= deviceProps.limits.maxPerStageResources - reservedCount;

	if (enableUpdateAfterBind)
	{
		samplers				= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindSamplers,			descriptorProps.maxDescriptorSetUpdateAfterBindSamplers);				// 1048576
		uniformBuffers			= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindUniformBuffers,		descriptorProps.maxDescriptorSetUpdateAfterBindUniformBuffers);			// 15
		uniformBuffersDynamic	= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindUniformBuffers,		descriptorProps.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);	// 8
		storageBuffers			= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindStorageBuffers,		descriptorProps.maxDescriptorSetUpdateAfterBindStorageBuffers);			// 1048576
		storageBuffersDynamic	= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindStorageBuffers,		descriptorProps.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);	// 8
		sampledImages			= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindSampledImages,		descriptorProps.maxDescriptorSetUpdateAfterBindSampledImages);			// 1048576
		storageImages			= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindStorageImages,		descriptorProps.maxDescriptorSetUpdateAfterBindStorageImages);			// 1048576
		inputAttachments		= deMinu32(	descriptorProps.maxPerStageDescriptorUpdateAfterBindInputAttachments,	descriptorProps.maxDescriptorSetUpdateAfterBindInputAttachments);		// 1048576
	}
	else
	{
		samplers				= deMinu32(	deviceProps.limits.maxPerStageDescriptorSamplers,						deviceProps.limits.maxDescriptorSetSamplers);							// 1048576
		uniformBuffers			= deMinu32(	deviceProps.limits.maxPerStageDescriptorUniformBuffers,					deviceProps.limits.maxDescriptorSetUniformBuffers);						// 15
		uniformBuffersDynamic	= deMinu32(	deviceProps.limits.maxPerStageDescriptorUniformBuffers,					deviceProps.limits.maxDescriptorSetUniformBuffersDynamic);				// 8
		storageBuffers			= deMinu32(	deviceProps.limits.maxPerStageDescriptorStorageBuffers,					deviceProps.limits.maxDescriptorSetStorageBuffers);						// 1048576
		storageBuffersDynamic	= deMinu32(	deviceProps.limits.maxPerStageDescriptorStorageBuffers,					deviceProps.limits.maxDescriptorSetStorageBuffersDynamic);				// 8
		sampledImages			= deMinu32(	deviceProps.limits.maxPerStageDescriptorSampledImages - reservedCount,	deviceProps.limits.maxDescriptorSetSampledImages - reservedCount);		// 1048576.
		storageImages			= deMinu32(	deviceProps.limits.maxPerStageDescriptorStorageImages,					deviceProps.limits.maxDescriptorSetStorageImages);						// 1048576
		inputAttachments		= deMinu32(	deviceProps.limits.maxPerStageDescriptorInputAttachments - 1,			deviceProps.limits.maxDescriptorSetInputAttachments - 1);				// 1048576. -1 because tests use a prime number + 1 to reference subpass input attachment in shader
	}

	// adding arbitrary upper bound limits to restrain the size of the test ( we are testing big arrays, not the maximum size arrays )
	samplers					= deMinu32(	samplers,				4096);
	uniformBuffers				= deMinu32(	uniformBuffers,			16);
	uniformBuffersDynamic		= deMinu32( uniformBuffersDynamic,	16);
	storageBuffers				= deMinu32(	storageBuffers,			8192);
	storageBuffersDynamic		= deMinu32(	storageBuffersDynamic,	8192);
	sampledImages				= deMinu32(	sampledImages,			8192);
	storageImages				= deMinu32(	storageImages,			8192);
	inputAttachments			= deMinu32(	inputAttachments,		16);

	switch (descriptorType)
	{
	case VK_DESCRIPTOR_TYPE_SAMPLER:					result = samplers;													break;
	case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:		result = deMinu32(resources, deMinu32(samplers, sampledImages));	break;
	case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:				result = deMinu32(resources, sampledImages);						break;
	case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:				result = deMinu32(resources, storageImages);						break;
	case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:		result = deMinu32(resources, sampledImages);						break;
	case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:		result = deMinu32(resources, storageImages);						break;
	case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:				result = deMinu32(resources, uniformBuffers);						break;
	case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:				result = deMinu32(resources, storageBuffers);						break;
	case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:		result = deMinu32(resources, uniformBuffersDynamic);				break;
	case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:		result = deMinu32(resources, storageBuffersDynamic);				break;
	case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:			result = deMinu32(resources, inputAttachments);						break;
	case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:	result = deMinu32(resources, inlineUniforms);						break;
	default: DE_ASSERT(0);
	}

	DE_ASSERT(result);

	return result;
}

} // - namespace ut
} // - namespace DescriptorIndexing
} // - namespace vkt
