/*------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2015 The Khronos Group Inc.
 * Copyright (c) 2015 Intel Corporation
 *
 * 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 CreateInfo utilities
 *//*--------------------------------------------------------------------*/

#include "vktDrawCreateInfoUtil.hpp"

#include "vkImageUtil.hpp"

namespace vkt
{
namespace Draw
{

ImageSubresourceRange::ImageSubresourceRange (vk::VkImageAspectFlags	_aspectMask,
											  deUint32					_baseMipLevel,
											  deUint32					_levelCount,
											  deUint32					_baseArrayLayer,
											  deUint32					_layerCount)
{
	aspectMask		= _aspectMask;
	baseMipLevel	= _baseMipLevel;
	levelCount		= _levelCount;
	baseArrayLayer	= _baseArrayLayer;
	layerCount		= _layerCount;
}

ComponentMapping::ComponentMapping (vk::VkComponentSwizzle _r,
									vk::VkComponentSwizzle _g,
									vk::VkComponentSwizzle _b,
									vk::VkComponentSwizzle _a)
{
	r = _r;
	g = _g;
	b = _b;
	a = _a;
}

ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage							_image,
										  vk::VkImageViewType					_viewType,
										  vk::VkFormat							_format,
										  const vk::VkImageSubresourceRange&	_subresourceRange,
										  const vk::VkComponentMapping&			_components,
										  vk::VkImageViewCreateFlags			_flags)
{
	sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
	pNext = DE_NULL;
	flags				= 0u;
	image				= _image;
	viewType			= _viewType;
	format				= _format;
	components.r		= _components.r;
	components.g		= _components.g;
	components.b		= _components.b;
	components.a		= _components.a;
	subresourceRange	= _subresourceRange;
	flags				= _flags;
}

ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage					_image,
										  vk::VkImageViewType			_viewType,
										  vk::VkFormat					_format,
										  const vk::VkComponentMapping&	_components,
										  vk::VkImageViewCreateFlags	_flags)
{
	sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
	pNext = DE_NULL;
	flags			= 0u;
	image			= _image;
	viewType		= _viewType;
	format			= _format;
	components.r	= _components.r;
	components.g	= _components.g;
	components.b	= _components.b;
	components.a	= _components.a;

	vk::VkImageAspectFlags aspectFlags;
	const tcu::TextureFormat tcuFormat = vk::mapVkFormat(_format);

	switch (tcuFormat.order)
	{
		case tcu::TextureFormat::D:
			aspectFlags = vk::VK_IMAGE_ASPECT_DEPTH_BIT;
			break;
		case tcu::TextureFormat::S:
			aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT;
			break;
		case tcu::TextureFormat::DS:
			aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT | vk::VK_IMAGE_ASPECT_DEPTH_BIT;
			break;
		default:
			aspectFlags = vk::VK_IMAGE_ASPECT_COLOR_BIT;
			break;
	}

	subresourceRange = ImageSubresourceRange(aspectFlags);;
	flags = _flags;
}

BufferViewCreateInfo::BufferViewCreateInfo (vk::VkBuffer	_buffer,
											vk::VkFormat		_format,
											vk::VkDeviceSize _offset,
											vk::VkDeviceSize _range)
{
	sType = vk::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
	pNext = DE_NULL;

	flags	= 0;
	buffer	= _buffer;
	format	= _format;
	offset	= _offset;
	range	= _range;
}

BufferCreateInfo::BufferCreateInfo (vk::VkDeviceSize		_size,
									vk::VkBufferUsageFlags	_usage,
									vk::VkSharingMode		_sharingMode,
									deUint32				_queueFamilyIndexCount,
									const deUint32*			_pQueueFamilyIndices,
									vk::VkBufferCreateFlags _flags)
{
	sType = vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
	pNext = DE_NULL;
	size					= _size;
	usage					= _usage;
	flags					= _flags;
	sharingMode				= _sharingMode;
	queueFamilyIndexCount	= _queueFamilyIndexCount;

	if (_queueFamilyIndexCount)
	{
		m_queueFamilyIndices = std::vector<deUint32>(
			_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount);
		pQueueFamilyIndices = &m_queueFamilyIndices[0];
	}
	else
	{
		pQueueFamilyIndices = _pQueueFamilyIndices;
	}
}

BufferCreateInfo::BufferCreateInfo (const BufferCreateInfo &other)
{
	sType					= other.sType;
	pNext					= other.pNext;
	size					= other.size;
	usage					= other.usage;
	flags					= other.flags;
	sharingMode				= other.sharingMode;
	queueFamilyIndexCount	= other.queueFamilyIndexCount;

	m_queueFamilyIndices	= other.m_queueFamilyIndices;
	DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount);

	if (m_queueFamilyIndices.size())
	{
		pQueueFamilyIndices = &m_queueFamilyIndices[0];
	}
	else
	{
		pQueueFamilyIndices = DE_NULL;
	}
}

BufferCreateInfo & BufferCreateInfo::operator= (const BufferCreateInfo &other)
{
	sType						= other.sType;
	pNext						= other.pNext;
	size						= other.size;
	usage						= other.usage;
	flags						= other.flags;
	sharingMode					= other.sharingMode;
	queueFamilyIndexCount		= other.queueFamilyIndexCount;

	m_queueFamilyIndices		= other.m_queueFamilyIndices;

	DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount);

	if (m_queueFamilyIndices.size())
	{
		pQueueFamilyIndices = &m_queueFamilyIndices[0];
	}
	else
	{
		pQueueFamilyIndices = DE_NULL;
	}

	return *this;
}

ImageCreateInfo::ImageCreateInfo (vk::VkImageType			_imageType,
								  vk::VkFormat				_format,
								  vk::VkExtent3D			_extent,
								  deUint32					_mipLevels,
								  deUint32					_arrayLayers,
								  vk::VkSampleCountFlagBits	_samples,
								  vk::VkImageTiling			_tiling,
								  vk::VkImageUsageFlags		_usage,
								  vk::VkSharingMode			_sharingMode,
								  deUint32					_queueFamilyIndexCount,
								  const deUint32*			_pQueueFamilyIndices,
								  vk::VkImageCreateFlags	_flags,
								  vk::VkImageLayout			_initialLayout)
{
	if (_queueFamilyIndexCount)
	{
		m_queueFamilyIndices = std::vector<deUint32>(_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount);
	}

	sType = vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= _flags;
	imageType				= _imageType;
	format					= _format;
	extent					= _extent;
	mipLevels				= _mipLevels;
	arrayLayers				= _arrayLayers;
	samples					= _samples;
	tiling					= _tiling;
	usage					= _usage;
	sharingMode				= _sharingMode;
	queueFamilyIndexCount	= _queueFamilyIndexCount;

	if (m_queueFamilyIndices.size())
	{
		pQueueFamilyIndices = &m_queueFamilyIndices[0];
	}
	else
	{
		pQueueFamilyIndices = DE_NULL;
	}
	initialLayout	= _initialLayout;
}

FramebufferCreateInfo::FramebufferCreateInfo (vk::VkRenderPass						_renderPass,
											  const std::vector<vk::VkImageView>&	atachments,
											  deUint32								_width,
											  deUint32								_height,
											  deUint32								_layers)
{
	sType = vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
	pNext = DE_NULL;
	flags = 0u;

	renderPass		= _renderPass;
	attachmentCount	= static_cast<deUint32>(atachments.size());

	if (attachmentCount)
	{
		pAttachments = const_cast<vk::VkImageView *>(&atachments[0]);
	}

	width	= _width;
	height	= _height;
	layers	= _layers;
}

RenderPassCreateInfo::RenderPassCreateInfo (const std::vector<vk::VkAttachmentDescription>&	attachments,
											const std::vector<vk::VkSubpassDescription>&	subpasses,
											const std::vector<vk::VkSubpassDependency>&		dependiences)

	: m_attachments			(attachments.begin(), attachments.end())
	, m_subpasses			(subpasses.begin(), subpasses.end())
	, m_dependiences		(dependiences.begin(), dependiences.end())
	, m_attachmentsStructs	(m_attachments.begin(), m_attachments.end())
	, m_subpassesStructs	(m_subpasses.begin(), m_subpasses.end())
	, m_dependiencesStructs	(m_dependiences.begin(), m_dependiences.end())
{
	sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
	pNext = DE_NULL;
	flags = 0;

	attachmentCount = static_cast<deUint32>(m_attachments.size());
	pAttachments	= &m_attachmentsStructs[0];
	subpassCount	= static_cast<deUint32>(m_subpasses.size());
	pSubpasses		= &m_subpassesStructs[0];
	dependencyCount = static_cast<deUint32>(m_dependiences.size());
	pDependencies	= &m_dependiencesStructs[0];
}

RenderPassCreateInfo::RenderPassCreateInfo (deUint32							_attachmentCount,
											const vk::VkAttachmentDescription*	_pAttachments,
											deUint32							_subpassCount,
											const vk::VkSubpassDescription*		_pSubpasses,
											deUint32							_dependencyCount,
											const vk::VkSubpassDependency*		_pDependiences)
{

	m_attachments	= std::vector<AttachmentDescription>(_pAttachments, _pAttachments + _attachmentCount);
	m_subpasses		= std::vector<SubpassDescription>(_pSubpasses, _pSubpasses + _subpassCount);
	m_dependiences	= std::vector<SubpassDependency>(_pDependiences, _pDependiences + _dependencyCount);

	m_attachmentsStructs	= std::vector<vk::VkAttachmentDescription>	(m_attachments.begin(),		m_attachments.end());
	m_subpassesStructs		= std::vector<vk::VkSubpassDescription>		(m_subpasses.begin(),		m_subpasses.end());
	m_dependiencesStructs	= std::vector<vk::VkSubpassDependency>		(m_dependiences.begin(),	m_dependiences.end());

	sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
	pNext = DE_NULL;
	flags = 0;

	attachmentCount = static_cast<deUint32>(m_attachments.size());

	if (attachmentCount) {
		pAttachments = &m_attachmentsStructs[0];
	}
	else
	{
		pAttachments = DE_NULL;
	}

	subpassCount = static_cast<deUint32>(m_subpasses.size());

	if (subpassCount) {
		pSubpasses = &m_subpassesStructs[0];
	}
	else
	{
		pSubpasses = DE_NULL;
	}

	dependencyCount = static_cast<deUint32>(m_dependiences.size());

	if (dependencyCount) {
		pDependencies = &m_dependiencesStructs[0];
	}
	else
	{
		pDependencies = DE_NULL;
	}
}

void
RenderPassCreateInfo::addAttachment (vk::VkAttachmentDescription attachment)
{

	m_attachments.push_back(attachment);
	m_attachmentsStructs	= std::vector<vk::VkAttachmentDescription>(m_attachments.begin(), m_attachments.end());
	attachmentCount			= static_cast<deUint32>(m_attachments.size());
	pAttachments			= &m_attachmentsStructs[0];
}

void
RenderPassCreateInfo::addSubpass (vk::VkSubpassDescription subpass)
{

	m_subpasses.push_back(subpass);
	m_subpassesStructs	= std::vector<vk::VkSubpassDescription>(m_subpasses.begin(), m_subpasses.end());
	subpassCount		= static_cast<deUint32>(m_subpasses.size());
	pSubpasses			= &m_subpassesStructs[0];
}

void
RenderPassCreateInfo::addDependency (vk::VkSubpassDependency dependency)
{

	m_dependiences.push_back(dependency);
	m_dependiencesStructs	= std::vector<vk::VkSubpassDependency>(m_dependiences.begin(), m_dependiences.end());

	dependencyCount			= static_cast<deUint32>(m_dependiences.size());
	pDependencies			= &m_dependiencesStructs[0];
}

RenderPassBeginInfo::RenderPassBeginInfo (vk::VkRenderPass						_renderPass,
										  vk::VkFramebuffer						_framebuffer,
										  vk::VkRect2D							_renderArea,
										  const std::vector<vk::VkClearValue>&	_clearValues)
{

	m_clearValues	= _clearValues;

	sType			= vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
	pNext			= DE_NULL;
	renderPass		= _renderPass;
	framebuffer		= _framebuffer;
	renderArea		= _renderArea;
	clearValueCount = static_cast<deUint32>(m_clearValues.size());
	pClearValues	= m_clearValues.size() ? &m_clearValues[0] : DE_NULL;
}

CmdPoolCreateInfo::CmdPoolCreateInfo (deUint32 _queueFamilyIndex, unsigned int _flags)
{
	sType = vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
	pNext = DE_NULL;

	queueFamilyIndex = _queueFamilyIndex;
	flags				= _flags;
}

AttachmentDescription::AttachmentDescription (vk::VkFormat				_format,
											  vk::VkSampleCountFlagBits	_samples,
											  vk::VkAttachmentLoadOp	_loadOp,
											  vk::VkAttachmentStoreOp	_storeOp,
											  vk::VkAttachmentLoadOp	_stencilLoadOp,
											  vk::VkAttachmentStoreOp	_stencilStoreOp,
											  vk::VkImageLayout			_initialLayout,
											  vk::VkImageLayout			_finalLayout)
{
	flags = 0;
	format			= _format;
	samples			= _samples;
	loadOp			= _loadOp;
	storeOp			= _storeOp;
	stencilLoadOp	= _stencilLoadOp;
	stencilStoreOp	= _stencilStoreOp;
	initialLayout	= _initialLayout;
	finalLayout		= _finalLayout;
}

AttachmentDescription::AttachmentDescription (const vk::VkAttachmentDescription& rhs)
{
	flags			= rhs.flags;
	format			= rhs.format;
	samples			= rhs.samples;
	loadOp			= rhs.loadOp;
	storeOp			= rhs.storeOp;
	stencilLoadOp	= rhs.stencilLoadOp;
	stencilStoreOp	= rhs.stencilStoreOp;
	initialLayout	= rhs.initialLayout;
	finalLayout		= rhs.finalLayout;
}

AttachmentReference::AttachmentReference (deUint32 _attachment, vk::VkImageLayout _layout)
{
	attachment	= _attachment;
	layout		= _layout;
}

AttachmentReference::AttachmentReference (void)
{
	attachment = VK_ATTACHMENT_UNUSED;
	layout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
}

SubpassDescription::SubpassDescription (vk::VkPipelineBindPoint				_pipelineBindPoint,
										vk::VkSubpassDescriptionFlags		_flags,
										deUint32							_inputAttachmentCount,
										const vk::VkAttachmentReference*	_inputAttachments,
										deUint32							_colorAttachmentCount,
										const vk::VkAttachmentReference*	_colorAttachments,
										const vk::VkAttachmentReference*	_resolveAttachments,
										vk::VkAttachmentReference			depthStencilAttachment,
										deUint32							_preserveAttachmentCount,
										const deUint32*						_preserveAttachments)
{
	m_inputAttachments = std::vector<vk::VkAttachmentReference>(_inputAttachments, _inputAttachments + _inputAttachmentCount);
	m_colorAttachments = std::vector<vk::VkAttachmentReference>(_colorAttachments, _colorAttachments + _colorAttachmentCount);

	if (_resolveAttachments)
		m_resolveAttachments = std::vector<vk::VkAttachmentReference>(_resolveAttachments, _resolveAttachments + _colorAttachmentCount);

	m_preserveAttachments = std::vector<deUint32>(_preserveAttachments, _preserveAttachments + _preserveAttachmentCount);

	m_depthStencilAttachment = depthStencilAttachment;

	flags					= _flags;
	pipelineBindPoint		= _pipelineBindPoint;
	inputAttachmentCount	= _inputAttachmentCount;
	pInputAttachments		= DE_NULL;
	colorAttachmentCount	= _colorAttachmentCount;
	pColorAttachments		= DE_NULL;
	pResolveAttachments		= DE_NULL;
	pDepthStencilAttachment	= &m_depthStencilAttachment;
	pPreserveAttachments	= DE_NULL;
	preserveAttachmentCount	= _preserveAttachmentCount;

	if (!m_inputAttachments.empty())
		pInputAttachments = &m_inputAttachments[0];

	if (!m_colorAttachments.empty())
		pColorAttachments = &m_colorAttachments[0];

	if (!m_resolveAttachments.empty())
		pResolveAttachments = &m_resolveAttachments[0];

	if (!m_preserveAttachments.empty())
		pPreserveAttachments = &m_preserveAttachments[0];
}

SubpassDescription::SubpassDescription (const vk::VkSubpassDescription& rhs)
{
	*static_cast<vk::VkSubpassDescription*>(this) = rhs;

	m_inputAttachments = std::vector<vk::VkAttachmentReference>(
		rhs.pInputAttachments, rhs.pInputAttachments + rhs.inputAttachmentCount);

	m_colorAttachments = std::vector<vk::VkAttachmentReference>(
		rhs.pColorAttachments, rhs.pColorAttachments + rhs.colorAttachmentCount);

	if (rhs.pResolveAttachments)
		m_resolveAttachments = std::vector<vk::VkAttachmentReference>(
			rhs.pResolveAttachments, rhs.pResolveAttachments + rhs.colorAttachmentCount);

	m_preserveAttachments = std::vector<deUint32>(
		rhs.pPreserveAttachments, rhs.pPreserveAttachments + rhs.preserveAttachmentCount);

	if (rhs.pDepthStencilAttachment)
		m_depthStencilAttachment = *rhs.pDepthStencilAttachment;

	if (!m_inputAttachments.empty())
		pInputAttachments = &m_inputAttachments[0];

	if (!m_colorAttachments.empty())
		pColorAttachments = &m_colorAttachments[0];

	if (!m_resolveAttachments.empty())
		pResolveAttachments = &m_resolveAttachments[0];

	pDepthStencilAttachment = &m_depthStencilAttachment;

	if (!m_preserveAttachments.empty())
		pPreserveAttachments = &m_preserveAttachments[0];
}

SubpassDescription::SubpassDescription (const SubpassDescription& rhs) {
	*this = rhs;
}

SubpassDescription& SubpassDescription::operator= (const SubpassDescription& rhs)
{
	*static_cast<vk::VkSubpassDescription*>(this) = rhs;

	m_inputAttachments		= rhs.m_inputAttachments;
	m_colorAttachments		= rhs.m_colorAttachments;
	m_resolveAttachments	= rhs.m_resolveAttachments;
	m_preserveAttachments	= rhs.m_preserveAttachments;
	m_depthStencilAttachment = rhs.m_depthStencilAttachment;

	if (!m_inputAttachments.empty())
		pInputAttachments = &m_inputAttachments[0];

	if (!m_colorAttachments.empty())
		pColorAttachments = &m_colorAttachments[0];

	if (!m_resolveAttachments.empty())
		pResolveAttachments = &m_resolveAttachments[0];

	pDepthStencilAttachment = &m_depthStencilAttachment;

	if (!m_preserveAttachments.empty())
		pPreserveAttachments = &m_preserveAttachments[0];

	return *this;
}

SubpassDependency::SubpassDependency (deUint32					_srcSubpass,
									  deUint32					_dstSubpass,
									  vk::VkPipelineStageFlags	_srcStageMask,
									  vk::VkPipelineStageFlags	_dstStageMask,
									  vk::VkAccessFlags			_srcAccessMask,
									  vk::VkAccessFlags			_dstAccessMask,
									  vk::VkDependencyFlags		_dependencyFlags)
{
	srcSubpass		= _srcSubpass;
	dstSubpass		= _dstSubpass;
	srcStageMask	= _srcStageMask;
	dstStageMask	= _dstStageMask;
	srcAccessMask	= _srcAccessMask;
	dstAccessMask	= _dstAccessMask;
	dependencyFlags	= _dependencyFlags;
}

SubpassDependency::SubpassDependency (const vk::VkSubpassDependency& rhs)
{
	srcSubpass		= rhs.srcSubpass;
	dstSubpass		= rhs.dstSubpass;
	srcStageMask	= rhs.srcStageMask;
	dstStageMask	= rhs.dstStageMask;
	srcAccessMask	= rhs.srcAccessMask;
	dstAccessMask	= rhs.dstAccessMask;
	dependencyFlags	= rhs.dependencyFlags;
}

CmdBufferBeginInfo::CmdBufferBeginInfo (vk::VkCommandBufferUsageFlags _flags)
{
	sType				= vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
	pNext				= DE_NULL;
	flags				= _flags;
	pInheritanceInfo	= DE_NULL;
}

DescriptorPoolCreateInfo::DescriptorPoolCreateInfo (const std::vector<vk::VkDescriptorPoolSize>&	poolSizeCounts,
													vk::VkDescriptorPoolCreateFlags					_flags,
													deUint32										_maxSets)
	: m_poolSizeCounts(poolSizeCounts)
{
	sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
	pNext = DE_NULL;
	flags			= _flags;
	maxSets			= _maxSets;
	poolSizeCount	= static_cast<deUint32>(m_poolSizeCounts.size());
	pPoolSizes		= &m_poolSizeCounts[0];
}

DescriptorPoolCreateInfo& DescriptorPoolCreateInfo::addDescriptors (vk::VkDescriptorType type, deUint32 count)
{
	vk::VkDescriptorPoolSize descriptorTypeCount = { type, count };
	m_poolSizeCounts.push_back(descriptorTypeCount);

	poolSizeCount	= static_cast<deUint32>(m_poolSizeCounts.size());
	pPoolSizes		= &m_poolSizeCounts[0];

	return *this;
}

DescriptorSetLayoutCreateInfo::DescriptorSetLayoutCreateInfo (deUint32 _bindingCount, const vk::VkDescriptorSetLayoutBinding* _pBindings)
{
	sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
	pNext = DE_NULL;
	flags = 0;
	bindingCount = _bindingCount;
	pBindings	 = _pBindings;
}

PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (deUint32							_descriptorSetCount,
													const vk::VkDescriptorSetLayout*	_pSetLayouts,
													deUint32							_pushConstantRangeCount,
													const vk::VkPushConstantRange*		_pPushConstantRanges)
	: m_pushConstantRanges(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
{
	for (unsigned int i = 0; i < _descriptorSetCount; i++)
	{
		m_setLayouts.push_back(_pSetLayouts[i]);
	}

	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0;
	setLayoutCount			= static_cast<deUint32>(m_setLayouts.size());
	pSetLayouts				= setLayoutCount > 0 ? &m_setLayouts[0] : DE_NULL;
	pushConstantRangeCount	= static_cast<deUint32>(m_pushConstantRanges.size());

	if (m_pushConstantRanges.size()) {
		pPushConstantRanges = &m_pushConstantRanges[0];
	}
	else
	{
		pPushConstantRanges = DE_NULL;
	}
}

PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (const std::vector<vk::VkDescriptorSetLayout>&	setLayouts,
													deUint32										_pushConstantRangeCount,
													const vk::VkPushConstantRange*					_pPushConstantRanges)
	: m_setLayouts			(setLayouts)
	, m_pushConstantRanges	(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
	pNext = DE_NULL;

	flags			= 0;
	setLayoutCount	= static_cast<deUint32>(m_setLayouts.size());

	if (setLayoutCount)
	{
		pSetLayouts = &m_setLayouts[0];
	}
	else
	{
		pSetLayouts = DE_NULL;
	}

	pushConstantRangeCount = static_cast<deUint32>(m_pushConstantRanges.size());
	if (pushConstantRangeCount) {
		pPushConstantRanges = &m_pushConstantRanges[0];
	}
	else
	{
		pPushConstantRanges = DE_NULL;
	}
}

PipelineCreateInfo::PipelineShaderStage::PipelineShaderStage (vk::VkShaderModule _module, const char* _pName, vk::VkShaderStageFlagBits _stage)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
	pNext = DE_NULL;
	flags = 0u;
	stage				= _stage;
	module				= _module;
	pName				= _pName;
	pSpecializationInfo = DE_NULL;
}

PipelineCreateInfo::VertexInputState::VertexInputState (deUint32										_vertexBindingDescriptionCount,
														const vk::VkVertexInputBindingDescription*		_pVertexBindingDescriptions,
														deUint32										_vertexAttributeDescriptionCount,
														const vk::VkVertexInputAttributeDescription*	_pVertexAttributeDescriptions)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags							= 0u;
	vertexBindingDescriptionCount	= _vertexBindingDescriptionCount;
	pVertexBindingDescriptions		= _pVertexBindingDescriptions;
	vertexAttributeDescriptionCount	= _vertexAttributeDescriptionCount;
	pVertexAttributeDescriptions	= _pVertexAttributeDescriptions;
}

PipelineCreateInfo::VertexInputState& PipelineCreateInfo::VertexInputState::addDivisors (deUint32												_vertexBindingDivisorCount,
																						 const vk::VkVertexInputBindingDivisorDescriptionEXT*	_pVertexBindingDivisors)
{
	m_divisorState.sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT;
	m_divisorState.vertexBindingDivisorCount = _vertexBindingDivisorCount;
	m_divisorState.pVertexBindingDivisors = _pVertexBindingDivisors;

	// Link it into the chainadd
	m_divisorState.pNext = this->pNext;
	pNext = &m_divisorState;

	return *this;
}

PipelineCreateInfo::InputAssemblerState::InputAssemblerState (vk::VkPrimitiveTopology	_topology,
															  vk::VkBool32				_primitiveRestartEnable)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0u;
	topology				= _topology;
	primitiveRestartEnable	= _primitiveRestartEnable;
}

PipelineCreateInfo::TessellationState::TessellationState (deUint32 _patchControlPoints)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags				= 0;
	patchControlPoints	= _patchControlPoints;
}

PipelineCreateInfo::ViewportState::ViewportState (deUint32						_viewportCount,
												  std::vector<vk::VkViewport>	_viewports,
												  std::vector<vk::VkRect2D>		_scissors)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags			= 0u;
	viewportCount	= _viewportCount;
	scissorCount	= _viewportCount;

	if (!_viewports.size())
	{
		m_viewports.resize(viewportCount);
		deMemset(&m_viewports[0], 0, sizeof(m_viewports[0]) * m_viewports.size());
	}
	else
	{
		m_viewports = _viewports;
	}

	if (!_scissors.size())
	{
		m_scissors.resize(scissorCount);
		deMemset(&m_scissors[0], 0, sizeof(m_scissors[0]) * m_scissors.size());
	}
	else
	{
		m_scissors = _scissors;
	}

	pViewports	= &m_viewports[0];
	pScissors	= &m_scissors[0];
}

PipelineCreateInfo::ViewportState::ViewportState (const ViewportState& other)
{
	sType			= other.sType;
	pNext			= other.pNext;
	flags			= other.flags;
	viewportCount	= other.viewportCount;
	scissorCount	= other.scissorCount;

	m_viewports = std::vector<vk::VkViewport>(other.pViewports, other.pViewports + viewportCount);
	m_scissors	= std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);

	pViewports	= &m_viewports[0];
	pScissors	= &m_scissors[0];
}

PipelineCreateInfo::ViewportState& PipelineCreateInfo::ViewportState::operator= (const ViewportState& other)
{
	sType			= other.sType;
	pNext			= other.pNext;
	flags			= other.flags;
	viewportCount	= other.viewportCount;
	scissorCount	= other.scissorCount;

	m_viewports		= std::vector<vk::VkViewport>(other.pViewports, other.pViewports + scissorCount);
	m_scissors		= std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);

	pViewports		= &m_viewports[0];
	pScissors		= &m_scissors[0];
	return *this;
}

PipelineCreateInfo::RasterizerState::RasterizerState (vk::VkBool32			_depthClampEnable,
													  vk::VkBool32			_rasterizerDiscardEnable,
													  vk::VkPolygonMode		_polygonMode,
													  vk::VkCullModeFlags	_cullMode,
													  vk::VkFrontFace		_frontFace,
													  vk::VkBool32			_depthBiasEnable,
													  float					_depthBiasConstantFactor,
													  float					_depthBiasClamp,
													  float					_depthBiasSlopeFactor,
													  float					_lineWidth)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0u;
	depthClampEnable		= _depthClampEnable;
	rasterizerDiscardEnable = _rasterizerDiscardEnable;
	polygonMode				= _polygonMode;
	cullMode				= _cullMode;
	frontFace				= _frontFace;

	depthBiasEnable			= _depthBiasEnable;
	depthBiasConstantFactor	= _depthBiasConstantFactor;
	depthBiasClamp			= _depthBiasClamp;
	depthBiasSlopeFactor	= _depthBiasSlopeFactor;
	lineWidth				= _lineWidth;
}

PipelineCreateInfo::MultiSampleState::MultiSampleState (vk::VkSampleCountFlagBits				_rasterizationSamples,
														vk::VkBool32							_sampleShadingEnable,
														float									_minSampleShading,
														const std::vector<vk::VkSampleMask>&	_sampleMask,
														bool									_alphaToCoverageEnable,
														bool									_alphaToOneEnable)
	: m_sampleMask(_sampleMask)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0u;
	rasterizationSamples	= _rasterizationSamples;
	sampleShadingEnable		= _sampleShadingEnable;
	minSampleShading		= _minSampleShading;
	pSampleMask				= &m_sampleMask[0];
	alphaToCoverageEnable   = _alphaToCoverageEnable;
	alphaToOneEnable		= _alphaToOneEnable;
}

PipelineCreateInfo::MultiSampleState::MultiSampleState (const MultiSampleState& other)
{
	sType					= other.sType;
	pNext					= other.pNext;
	flags					= other.flags;
	rasterizationSamples	= other.rasterizationSamples;
	sampleShadingEnable		= other.sampleShadingEnable;
	minSampleShading		= other.minSampleShading;

	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8);

	m_sampleMask	= std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
	pSampleMask		= &m_sampleMask[0];
}

PipelineCreateInfo::MultiSampleState& PipelineCreateInfo::MultiSampleState::operator= (const MultiSampleState& other)
{
	sType = other.sType;
	pNext = other.pNext;
	flags					= other.flags;
	rasterizationSamples	= other.rasterizationSamples;
	sampleShadingEnable		= other.sampleShadingEnable;
	minSampleShading		= other.minSampleShading;

	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8);

	m_sampleMask	= std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
	pSampleMask		= &m_sampleMask[0];

	return *this;
}

PipelineCreateInfo::ColorBlendState::ColorBlendState (const std::vector<vk::VkPipelineColorBlendAttachmentState>&	_attachments,
													  vk::VkBool32													_logicOpEnable,
													  vk::VkLogicOp													_logicOp)
	: m_attachments(_attachments)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0u;
	logicOpEnable			= _logicOpEnable;
	logicOp					= _logicOp;
	attachmentCount			= static_cast<deUint32>(m_attachments.size());
	pAttachments			= &m_attachments[0];
}

PipelineCreateInfo::ColorBlendState::ColorBlendState (deUint32											_attachmentCount,
													  const vk::VkPipelineColorBlendAttachmentState*	_attachments,
													  vk::VkBool32										_logicOpEnable,
													  vk::VkLogicOp										_logicOp)
	: m_attachments(_attachments, _attachments + _attachmentCount)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
	pNext	= DE_NULL;
	flags					= 0;
	logicOpEnable			= _logicOpEnable;
	logicOp					= _logicOp;
	attachmentCount			= static_cast<deUint32>(m_attachments.size());
	pAttachments			= &m_attachments[0];
}

PipelineCreateInfo::ColorBlendState::ColorBlendState (const vk::VkPipelineColorBlendStateCreateInfo& createInfo)
	: m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
{
	sType = createInfo.sType;
	pNext = createInfo.pNext;
	flags					= createInfo.flags;
	logicOpEnable			= createInfo.logicOpEnable;
	logicOp					= createInfo.logicOp;
	attachmentCount			= static_cast<deUint32>(m_attachments.size());
	pAttachments			= &m_attachments[0];
}

PipelineCreateInfo::ColorBlendState::ColorBlendState (const ColorBlendState& createInfo, std::vector<float> _blendConstants)
	: m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
{
	sType = createInfo.sType;
	pNext = createInfo.pNext;
	flags					= createInfo.flags;
	logicOpEnable			= createInfo.logicOpEnable;
	logicOp					= createInfo.logicOp;
	attachmentCount			= static_cast<deUint32>(m_attachments.size());
	pAttachments			= &m_attachments[0];
	deMemcpy(blendConstants, &_blendConstants[0], 4 * sizeof(float));
}

PipelineCreateInfo::ColorBlendState::Attachment::Attachment (vk::VkBool32				_blendEnable,
															 vk::VkBlendFactor			_srcColorBlendFactor,
															 vk::VkBlendFactor			_dstColorBlendFactor,
															 vk::VkBlendOp				_colorBlendOp,
															 vk::VkBlendFactor			_srcAlphaBlendFactor,
															 vk::VkBlendFactor			_dstAlphaBlendFactor,
															 vk::VkBlendOp				_alphaBlendOp,
															 vk::VkColorComponentFlags	_colorWriteMask)
{
	blendEnable			= _blendEnable;
	srcColorBlendFactor	= _srcColorBlendFactor;
	dstColorBlendFactor	= _dstColorBlendFactor;
	colorBlendOp		= _colorBlendOp;
	srcAlphaBlendFactor	= _srcAlphaBlendFactor;
	dstAlphaBlendFactor	= _dstAlphaBlendFactor;
	alphaBlendOp		= _alphaBlendOp;
	colorWriteMask		= _colorWriteMask;
}

PipelineCreateInfo::DepthStencilState::StencilOpState::StencilOpState (vk::VkStencilOp	_failOp,
																	   vk::VkStencilOp	_passOp,
																	   vk::VkStencilOp	_depthFailOp,
																	   vk::VkCompareOp	_compareOp,
																	   deUint32			_compareMask,
																	   deUint32			_writeMask,
																	   deUint32			_reference)
{
	failOp		= _failOp;
	passOp		= _passOp;
	depthFailOp	= _depthFailOp;
	compareOp	= _compareOp;

	compareMask	= _compareMask;
	writeMask	= _writeMask;
	reference	= _reference;
}

PipelineCreateInfo::DepthStencilState::DepthStencilState (vk::VkBool32		_depthTestEnable,
														  vk::VkBool32		_depthWriteEnable,
														  vk::VkCompareOp	_depthCompareOp,
														  vk::VkBool32		_depthBoundsTestEnable,
														  vk::VkBool32		_stencilTestEnable,
														  StencilOpState	_front,
														  StencilOpState	_back,
														  float				_minDepthBounds,
														  float				_maxDepthBounds)
{
	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
	pNext = DE_NULL;
	flags					= 0u;
	depthTestEnable			= _depthTestEnable;
	depthWriteEnable		= _depthWriteEnable;
	depthCompareOp			= _depthCompareOp;
	depthBoundsTestEnable	= _depthBoundsTestEnable;
	stencilTestEnable		= _stencilTestEnable;
	front	= _front;
	back	= _back;

	minDepthBounds = _minDepthBounds;
	maxDepthBounds = _maxDepthBounds;
}

PipelineCreateInfo::DynamicState::DynamicState (const std::vector<vk::VkDynamicState>& _dynamicStates)
{
	sType	= vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
	pNext	= DE_NULL;
	flags	= 0;

	if (!_dynamicStates.size())
	{
		const vk::VkDynamicState dynamicState[] =
		{
			vk::VK_DYNAMIC_STATE_VIEWPORT,
			vk::VK_DYNAMIC_STATE_SCISSOR,
			vk::VK_DYNAMIC_STATE_LINE_WIDTH,
			vk::VK_DYNAMIC_STATE_DEPTH_BIAS,
			vk::VK_DYNAMIC_STATE_BLEND_CONSTANTS,
			vk::VK_DYNAMIC_STATE_DEPTH_BOUNDS,
			vk::VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
			vk::VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
			vk::VK_DYNAMIC_STATE_STENCIL_REFERENCE,
		};

		for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(dynamicState); ++i)
		{
			m_dynamicStates.push_back(dynamicState[i]);
		}
	}
	else
		m_dynamicStates = _dynamicStates;

	dynamicStateCount = static_cast<deUint32>(m_dynamicStates.size());
	pDynamicStates = &m_dynamicStates[0];
}

PipelineCreateInfo::DynamicState::DynamicState (const DynamicState &other)
{
	sType = other.sType;
	pNext = other.pNext;

	flags				= other.flags;
	dynamicStateCount	= other.dynamicStateCount;
	m_dynamicStates		= std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
	pDynamicStates		= &m_dynamicStates[0];
}

PipelineCreateInfo::DynamicState& PipelineCreateInfo::DynamicState::operator= (const DynamicState& other)
{
	sType = other.sType;
	pNext = other.pNext;

	flags				= other.flags;
	dynamicStateCount	= other.dynamicStateCount;
	m_dynamicStates		= std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
	pDynamicStates		= &m_dynamicStates[0];

	return *this;
}

PipelineCreateInfo::PipelineCreateInfo (vk::VkPipelineLayout		_layout,
										vk::VkRenderPass			_renderPass,
										int							_subpass,
										vk::VkPipelineCreateFlags	_flags)
{
	deMemset(static_cast<vk::VkGraphicsPipelineCreateInfo *>(this), 0,
		sizeof(vk::VkGraphicsPipelineCreateInfo));

	sType = vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
	pNext = DE_NULL;
	flags				= _flags;
	renderPass			= _renderPass;
	subpass				= _subpass;
	layout				= _layout;
	basePipelineHandle	= DE_NULL;
	basePipelineIndex	= 0;
	pDynamicState		= DE_NULL;
}

PipelineCreateInfo& PipelineCreateInfo::addShader (const vk::VkPipelineShaderStageCreateInfo& shader)
{
	m_shaders.push_back(shader);

	stageCount	= static_cast<deUint32>(m_shaders.size());
	pStages		= &m_shaders[0];

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineVertexInputStateCreateInfo& state)
{
	m_vertexInputState	= state;
	pVertexInputState	= &m_vertexInputState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineInputAssemblyStateCreateInfo& state)
{
	m_inputAssemblyState = state;
	pInputAssemblyState = &m_inputAssemblyState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineColorBlendStateCreateInfo& state)
{
	m_colorBlendStateAttachments	= std::vector<vk::VkPipelineColorBlendAttachmentState>(state.pAttachments, state.pAttachments + state.attachmentCount);
	m_colorBlendState				= state;
	m_colorBlendState.pAttachments	= &m_colorBlendStateAttachments[0];
	pColorBlendState				= &m_colorBlendState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineViewportStateCreateInfo& state)
{
	m_viewports					= std::vector<vk::VkViewport>(state.pViewports, state.pViewports + state.viewportCount);
	m_scissors					= std::vector<vk::VkRect2D>(state.pScissors, state.pScissors + state.scissorCount);
	m_viewportState				= state;
	m_viewportState.pViewports	= &m_viewports[0];
	m_viewportState.pScissors	= &m_scissors[0];
	pViewportState				= &m_viewportState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDepthStencilStateCreateInfo& state)
{
	m_dynamicDepthStencilState	= state;
	pDepthStencilState			= &m_dynamicDepthStencilState;
	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineTessellationStateCreateInfo& state)
{
	m_tessState			= state;
	pTessellationState	= &m_tessState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineRasterizationStateCreateInfo& state)
{
	m_rasterState		= state;
	pRasterizationState	= &m_rasterState;

	return *this;
}

PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineMultisampleStateCreateInfo& state)
{

	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + state.rasterizationSamples) / ( sizeof(vk::VkSampleMask) * 8 );
	m_multisampleStateSampleMask	= std::vector<vk::VkSampleMask>(state.pSampleMask, state.pSampleMask + sampleMaskArrayLen);
	m_multisampleState				= state;
	m_multisampleState.pSampleMask	= &m_multisampleStateSampleMask[0];
	pMultisampleState				= &m_multisampleState;

	return *this;
}
PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDynamicStateCreateInfo& state)
{
	m_dynamicStates					= std::vector<vk::VkDynamicState>(state.pDynamicStates, state.pDynamicStates + state.dynamicStateCount);
	m_dynamicState					= state;
	m_dynamicState.pDynamicStates	= &m_dynamicStates[0];
	pDynamicState					= &m_dynamicState;

	return *this;
}

SamplerCreateInfo::SamplerCreateInfo (vk::VkFilter				_magFilter,
									  vk::VkFilter				_minFilter,
									  vk::VkSamplerMipmapMode	_mipmapMode,
									  vk::VkSamplerAddressMode	_addressModeU,
									  vk::VkSamplerAddressMode	_addressModeV,
									  vk::VkSamplerAddressMode	_addressModeW,
									  float						_mipLodBias,
									  vk::VkBool32				_anisotropyEnable,
									  float						_maxAnisotropy,
									  vk::VkBool32				_compareEnable,
									  vk::VkCompareOp			_compareOp,
									  float						_minLod,
									  float						_maxLod,
									  vk::VkBorderColor			_borderColor,
									  vk::VkBool32				_unnormalizedCoordinates)
{
	sType					= vk::VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
	pNext					= DE_NULL;
	flags					= 0u;
	magFilter				= _magFilter;
	minFilter				= _minFilter;
	mipmapMode				= _mipmapMode;
	addressModeU			= _addressModeU;
	addressModeV			= _addressModeV;
	addressModeW			= _addressModeW;
	mipLodBias				= _mipLodBias;
	anisotropyEnable		= _anisotropyEnable;
	maxAnisotropy			= _maxAnisotropy;
	compareEnable			= _compareEnable;
	compareOp				= _compareOp;
	minLod					= _minLod;
	maxLod					= _maxLod;
	borderColor				= _borderColor;
	unnormalizedCoordinates = _unnormalizedCoordinates;
}
} // Draw
} // vkt
