/*------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2017 The Khronos Group Inc.
 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
 *
 * 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 Protected memory storage buffer tests
 *//*--------------------------------------------------------------------*/

#include "vktProtectedMemStorageBufferTests.hpp"

#include "deRandom.hpp"
#include "deStringUtil.hpp"
#include "tcuTestLog.hpp"
#include "tcuVector.hpp"
#include "tcuStringTemplate.hpp"

#include "vkPrograms.hpp"
#include "vktTestCase.hpp"
#include "vktTestGroupUtil.hpp"
#include "vkTypeUtil.hpp"
#include "vkBuilderUtil.hpp"
#include "vkCmdUtil.hpp"

#include "vktProtectedMemBufferValidator.hpp"
#include "vktProtectedMemUtils.hpp"
#include "vktProtectedMemContext.hpp"

namespace vkt
{
namespace ProtectedMem
{

namespace
{

enum {
	RENDER_HEIGHT	= 128,
	RENDER_WIDTH	= 128,
};

enum {
	RANDOM_TEST_COUNT	= 10,
};

enum SSBOTestType {
	SSBO_READ,
	SSBO_WRITE,
	SSBO_ATOMIC
};

enum SSBOAtomicType {
	ATOMIC_ADD,
	ATOMIC_MIN,
	ATOMIC_MAX,
	ATOMIC_AND,
	ATOMIC_OR,
	ATOMIC_XOR,
	ATOMIC_EXCHANGE,
	ATOMIC_COMPSWAP
};


const char* getSSBOTestDescription (SSBOTestType type)
{
	switch (type) {
		case SSBO_READ:		return "Test for read storage buffer on protected memory.";
		case SSBO_WRITE:	return "Test for write storage buffer on protected memory.";
		case SSBO_ATOMIC:	return "Test for atomic storage buffer on protected memory.";
		default: DE_FATAL("Invalid SSBO test type"); return "";
	}
}

const char* getSSBOTypeString (SSBOTestType type)
{
	switch (type) {
		case SSBO_READ:		return "read";
		case SSBO_WRITE:	return "write";
		case SSBO_ATOMIC:	return "atomic";
		default: DE_FATAL("Invalid SSBO test type"); return "";
	}
}

const char* getSSBOAtomicTypeString (SSBOAtomicType type)
{
	switch (type)
	{
		case ATOMIC_ADD:		return "add";
		case ATOMIC_MIN:		return "min";
		case ATOMIC_MAX:		return "max";
		case ATOMIC_AND:		return "and";
		case ATOMIC_OR:			return "or";
		case ATOMIC_XOR:		return "xor";
		case ATOMIC_EXCHANGE:	return "exchange";
		case ATOMIC_COMPSWAP:	return "compswap";
		default: DE_FATAL("Invalid SSBO atomic operation type"); return "";
	}
}

void static addBufferCopyCmd (const vk::DeviceInterface&	vk,
							  vk::VkCommandBuffer			cmdBuffer,
							  deUint32						queueFamilyIndex,
							  vk::VkBuffer					srcBuffer,
							  vk::VkBuffer					dstBuffer,
							  deUint32						copySize)
{
	const vk::VkBufferMemoryBarrier		dstWriteStartBarrier	=
	{
		vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,		// VkStructureType		sType
		DE_NULL,											// const void*			pNext
		0,													// VkAccessFlags		srcAccessMask
		vk::VK_ACCESS_SHADER_WRITE_BIT,						// VkAccessFlags		dstAccessMask
		queueFamilyIndex,									// uint32_t				srcQueueFamilyIndex
		queueFamilyIndex,									// uint32_t				dstQueueFamilyIndex
		dstBuffer,											// VkBuffer				buffer
		0u,													// VkDeviceSize			offset
		VK_WHOLE_SIZE,										// VkDeviceSize			size
	};

	vk.cmdPipelineBarrier(cmdBuffer,
						  vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,	// srcStageMask
						  vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,	// dstStageMask
						  (vk::VkDependencyFlags)0,
						  0, (const vk::VkMemoryBarrier*)DE_NULL,
						  1, &dstWriteStartBarrier,
						  0, (const vk::VkImageMemoryBarrier*)DE_NULL);

	const vk::VkBufferCopy				copyRegion				=
	{
		0,					// VkDeviceSize	srcOffset
		0,					// VkDeviceSize	dstOffset
		copySize			// VkDeviceSize	size
	};
	vk.cmdCopyBuffer(cmdBuffer, srcBuffer, dstBuffer, 1, &copyRegion);

	const vk::VkBufferMemoryBarrier		dstWriteEndBarrier		=
	{
		vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,		// VkStructureType		sType
		DE_NULL,											// const void*			pNext
		vk::VK_ACCESS_SHADER_WRITE_BIT,						// VkAccessFlags		srcAccessMask
		vk::VK_ACCESS_SHADER_READ_BIT,						// VkAccessFlags		dstAccessMask
		queueFamilyIndex,									// uint32_t				srcQueueFamilyIndex
		queueFamilyIndex,									// uint32_t				dstQueueFamilyIndex
		dstBuffer,											// VkBuffer				buffer
		0u,													// VkDeviceSize			offset
		VK_WHOLE_SIZE,										// VkDeviceSize			size
	};
	vk.cmdPipelineBarrier(cmdBuffer,
						  vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,		// srcStageMask
						  vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,	// dstStageMask
						  (vk::VkDependencyFlags)0,
						  0, (const vk::VkMemoryBarrier*)DE_NULL,
						  1, &dstWriteEndBarrier,
						  0, (const vk::VkImageMemoryBarrier*)DE_NULL);

}

template<typename T>
class StorageBufferTestInstance : public ProtectedTestInstance
{
public:
								StorageBufferTestInstance	(Context&					ctx,
															 const SSBOTestType			testType,
															 const glu::ShaderType		shaderType,
															 const tcu::UVec4			testInput,
															 const BufferValidator<T>&	validator);
	virtual tcu::TestStatus		iterate						(void);

private:
	tcu::TestStatus				executeFragmentTest			(void);
	tcu::TestStatus				executeComputeTest			(void);

	const SSBOTestType			m_testType;
	const glu::ShaderType		m_shaderType;
	const tcu::UVec4			m_testInput;
	const BufferValidator<T>&	m_validator;
	const vk::VkFormat			m_imageFormat;
};

template<typename T>
class StorageBufferTestCase : public TestCase
{
public:
								StorageBufferTestCase	(tcu::TestContext&			testctx,
														 const SSBOTestType			testType,
														 const glu::ShaderType		shaderType,
														 const char*				name,
														 const tcu::UVec4			testInput,
														 ValidationDataStorage<T>	validationData,
														 vk::VkFormat				format,
														 const std::string&			extraShader = "")
									: TestCase		(testctx, name, getSSBOTestDescription(testType))
									, m_testType	(testType)
									, m_shaderType	(shaderType)
									, m_testInput	(testInput)
									, m_validator	(validationData, format)
									, m_extraShader	(extraShader)
								{
								}
	virtual TestInstance*		createInstance			(Context& ctx) const
								{
									return new StorageBufferTestInstance<T>(ctx, m_testType, m_shaderType, m_testInput, m_validator);
								}
	virtual void				initPrograms			(vk::SourceCollections& programCollection) const;
	virtual void				checkSupport			(Context& context) const
								{
									checkProtectedQueueSupport(context);
								}

	virtual						~StorageBufferTestCase	(void) {}

private:
	const SSBOTestType			m_testType;
	const glu::ShaderType		m_shaderType;
	const tcu::UVec4			m_testInput;
	const BufferValidator<T>	m_validator;
	const std::string			m_extraShader;
};

template<typename T>
StorageBufferTestInstance<T>::StorageBufferTestInstance	 (Context&					ctx,
														  const SSBOTestType		testType,
														  const glu::ShaderType		shaderType,
														  const tcu::UVec4			testInput,
														  const BufferValidator<T>&	validator)
	: ProtectedTestInstance	(ctx)
	, m_testType			(testType)
	, m_shaderType			(shaderType)
	, m_testInput			(testInput)
	, m_validator			(validator)
	, m_imageFormat			(vk::VK_FORMAT_R8G8B8A8_UNORM)
{
}

template<typename T>
void StorageBufferTestCase<T>::initPrograms (vk::SourceCollections& programCollection) const
{
	const char* vertexShader =
		"#version 450\n"
		"layout(location=0) out vec4 vIndex;\n"
		"void main() {\n"
		"    vec2 pos[4] = vec2[4]( vec2(-0.7, 0.7), vec2(0.7, 0.7), vec2(0.0, -0.7), vec2(-0.7, -0.7) );\n"
		"    vIndex = vec4(gl_VertexIndex);\n"
		"    gl_PointSize = 1.0;\n"
		"    gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n"
		"}";

	//  set = 0, location = 0 -> buffer ProtectedTestBuffer (uvec4)
	//  set = 0, location = 2 -> buffer ProtectedTestBufferSource (uvec4)
	const char* readShaderTemplateStr =
		"#version 450\n"
		"${INPUT_DECLARATION}\n"
		"\n"
		"layout(set=0, binding=0, std140) buffer ProtectedTestBuffer\n"
		"{\n"
		"    highp uvec4 protectedTestResultBuffer;\n"
		"};\n"
		"\n"
		"layout(set=0, binding=2, std140) buffer ProtectedTestBufferSource\n"
		"{\n"
		"    highp uvec4 protectedTestBufferSource;\n"
		"};\n"
		"\n"
		"void main (void)\n"
		"{\n"
		"    protectedTestResultBuffer = protectedTestBufferSource;\n"
		"    ${FRAGMENT_OUTPUT}\n"
		"}\n";

	//  set = 0, location = 0 -> buffer ProtectedTestBuffer (uvec4)
	//  set = 0, location = 1 -> uniform Data (uvec4)
	const char* writeShaderTemplateStr =
		"#version 450\n"
		"${INPUT_DECLARATION}\n"
		"\n"
		"layout(set=0, binding=0, std140) buffer ProtectedTestBuffer\n"
		"{\n"
		"    highp uvec4 protectedTestResultBuffer;\n"
		"};\n"
		"\n"
		"layout(set=0, binding=1, std140) uniform Data\n"
		"{\n"
		"    highp uvec4 testInput;\n"
		"};\n"
		"\n"
		"void main (void)\n"
		"{\n"
		"    protectedTestResultBuffer = testInput;\n"
		"    ${FRAGMENT_OUTPUT}\n"
		"}\n";

	//  set = 0, location = 0 -> buffer ProtectedTestBuffer (uint [4])
	const char* atomicTestShaderTemplateStr =
		"#version 450\n"
		"${INPUT_DECLARATION}\n"
		"\n"
		"layout(set=0, binding=0, std430) buffer ProtectedTestBuffer\n"
		"{\n"
		"    highp uint protectedTestResultBuffer[4];\n"
		"};\n"
		"\n"
		"void main (void)\n"
		"{\n"
		"    uint i = uint(${INVOCATION_ID});\n"
		"    ${ATOMIC_FUNCTION_CALL}\n"
		"    ${FRAGMENT_OUTPUT}\n"
		"}\n";

	const char*							shaderTemplateStr;
	std::map<std::string, std::string>	shaderParam;
	switch (m_testType) {
		case SSBO_READ:		shaderTemplateStr = readShaderTemplateStr; break;
		case SSBO_WRITE:	shaderTemplateStr = writeShaderTemplateStr; break;
		case SSBO_ATOMIC:	{
			shaderTemplateStr = atomicTestShaderTemplateStr;
			shaderParam["ATOMIC_FUNCTION_CALL"] = m_extraShader;
			break;
		}
		default: DE_FATAL("Incorrect SSBO test type"); return;
	}

	if (m_shaderType == glu::SHADERTYPE_FRAGMENT)
	{
		shaderParam["INPUT_DECLARATION"]		= "layout(location=0) out mediump vec4 o_color;\n"
												  "layout(location=0) in vec4 vIndex;\n";
		shaderParam["FRAGMENT_OUTPUT"]			= "o_color = vec4( 0.0, 0.4, 1.0, 1.0 );\n";
		shaderParam["INVOCATION_ID"]			= "vIndex.x";

		programCollection.glslSources.add("vert") << glu::VertexSource(vertexShader);
		programCollection.glslSources.add("TestShader") << glu::FragmentSource(tcu::StringTemplate(shaderTemplateStr).specialize(shaderParam));
	}
	else if (m_shaderType == glu::SHADERTYPE_COMPUTE)
	{
		shaderParam["INPUT_DECLARATION"]		= "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n";
		shaderParam["FRAGMENT_OUTPUT"]			= "";
		shaderParam["INVOCATION_ID"]			= "gl_GlobalInvocationID.x";
		programCollection.glslSources.add("TestShader") << glu::ComputeSource(tcu::StringTemplate(shaderTemplateStr).specialize(shaderParam));
	}
	else
		DE_FATAL("Incorrect shader type");

	m_validator.initPrograms(programCollection);
}

template<typename T>
tcu::TestStatus StorageBufferTestInstance<T>::executeFragmentTest(void)
{
	ProtectedContext&						ctx					(m_protectedContext);
	const vk::DeviceInterface&				vk					= ctx.getDeviceInterface();
	const vk::VkDevice						device				= ctx.getDevice();
	const vk::VkQueue						queue				= ctx.getQueue();
	const deUint32							queueFamilyIndex	= ctx.getQueueFamilyIndex();

	const deUint32							testUniformSize		= sizeof(m_testInput);
	de::UniquePtr<vk::BufferWithMemory>		testUniform			(makeBuffer(ctx,
																		PROTECTION_DISABLED,
																		queueFamilyIndex,
																		testUniformSize,
																		vk::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
																		 | vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
																		vk::MemoryRequirement::HostVisible));

	// Set the test input uniform data
	{
		deMemcpy(testUniform->getAllocation().getHostPtr(), &m_testInput, testUniformSize);
		vk::flushAlloc(vk, device, testUniform->getAllocation());
	}
	const deUint32							testBufferSize		= sizeof(ValidationDataStorage<T>);
	de::MovePtr<vk::BufferWithMemory>		testBuffer			(makeBuffer(ctx,
																			PROTECTION_ENABLED,
																			queueFamilyIndex,
																			testBufferSize,
																			vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
																			 | vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT,
																			vk::MemoryRequirement::Protected));
    de::MovePtr<vk::BufferWithMemory>		testBufferSource			(makeBuffer(ctx,
																			PROTECTION_ENABLED,
																			queueFamilyIndex,
																			testBufferSize,
																			vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
																			 | vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT,
																			vk::MemoryRequirement::Protected));

	vk::Move<vk::VkShaderModule>			vertexShader		(vk::createShaderModule(vk, device, ctx.getBinaryCollection().get("vert"), 0));
	vk::Unique<vk::VkShaderModule>			testShader			(vk::createShaderModule(vk, device, ctx.getBinaryCollection().get("TestShader"), 0));

	// Create descriptors
	vk::Unique<vk::VkDescriptorSetLayout>	descriptorSetLayout(vk::DescriptorSetLayoutBuilder()
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_ALL)
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, vk::VK_SHADER_STAGE_ALL)
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_ALL)
		.build(vk, device));
	vk::Unique<vk::VkDescriptorPool>		descriptorPool(vk::DescriptorPoolBuilder()
		.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u)
		.addType(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u)
		.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u)
		.build(vk, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
	vk::Unique<vk::VkDescriptorSet>			descriptorSet		(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));

	// Update descriptor set information
	{
		vk::VkDescriptorBufferInfo	descTestBuffer			= makeDescriptorBufferInfo(**testBuffer, 0, testBufferSize);
		vk::VkDescriptorBufferInfo	descTestUniform			= makeDescriptorBufferInfo(**testUniform, 0, testUniformSize);
		vk::VkDescriptorBufferInfo	descTestBufferSource	= makeDescriptorBufferInfo(**testBufferSource, 0, testBufferSize);

		vk::DescriptorSetUpdateBuilder()
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descTestBuffer)
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descTestUniform)
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descTestBufferSource)
			.update(vk, device);
	}

	// Create output image
	de::MovePtr<vk::ImageWithMemory>		colorImage			(createImage2D(ctx, PROTECTION_ENABLED, queueFamilyIndex,
																			   RENDER_WIDTH, RENDER_HEIGHT,
																			   m_imageFormat,
																			   vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|vk::VK_IMAGE_USAGE_SAMPLED_BIT));
	vk::Unique<vk::VkImageView>				colorImageView		(createImageView(ctx, **colorImage, m_imageFormat));
	vk::Unique<vk::VkRenderPass>			renderPass			(createRenderPass(ctx, m_imageFormat));
	vk::Unique<vk::VkFramebuffer>			framebuffer			(createFramebuffer(ctx, RENDER_WIDTH, RENDER_HEIGHT, *renderPass, *colorImageView));

	// Build pipeline
	vk::Unique<vk::VkPipelineLayout>		pipelineLayout		(makePipelineLayout(vk, device, *descriptorSetLayout));
	vk::Unique<vk::VkCommandPool>			cmdPool				(makeCommandPool(vk, device, PROTECTION_ENABLED, queueFamilyIndex));
	vk::Unique<vk::VkCommandBuffer>			cmdBuffer			(vk::allocateCommandBuffer(vk, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));

	// Create pipeline
	vk::Unique<vk::VkPipeline>				graphicsPipeline	(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass,
																					  *vertexShader, *testShader,
																					  std::vector<vk::VkVertexInputBindingDescription>(),
																					  std::vector<vk::VkVertexInputAttributeDescription>(),
																					  tcu::UVec2(RENDER_WIDTH, RENDER_HEIGHT),
																					  vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST));

	beginCommandBuffer(vk, *cmdBuffer);

	if (m_testType == SSBO_READ || m_testType == SSBO_ATOMIC)
	{
		vk::VkBuffer targetBuffer = (m_testType == SSBO_ATOMIC) ? **testBuffer : **testBufferSource;
		addBufferCopyCmd(vk, *cmdBuffer, queueFamilyIndex, **testUniform, targetBuffer, testUniformSize);
	}

	// Start image barrier
	{
		const vk::VkImageMemoryBarrier	startImgBarrier		=
		{
			vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType
			DE_NULL,											// pNext
			0,													// srcAccessMask
			vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			// dstAccessMask
			vk::VK_IMAGE_LAYOUT_UNDEFINED,						// oldLayout
			vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// newLayout
			queueFamilyIndex,									// srcQueueFamilyIndex
			queueFamilyIndex,									// dstQueueFamilyIndex
			**colorImage,										// image
			{
				vk::VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
				0u,												// baseMipLevel
				1u,												// mipLevels
				0u,												// baseArraySlice
				1u,												// subresourceRange
			}
		};

		vk.cmdPipelineBarrier(*cmdBuffer,
							  vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,				// srcStageMask
							  vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,	// dstStageMask
							  (vk::VkDependencyFlags)0,
							  0, (const vk::VkMemoryBarrier*)DE_NULL,
							  0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
							  1, &startImgBarrier);
	}

	beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, vk::makeRect2D(0, 0, RENDER_WIDTH, RENDER_HEIGHT), tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f));
	vk.cmdBindPipeline(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
	vk.cmdBindDescriptorSets(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &*descriptorSet, 0u, DE_NULL);

	vk.cmdDraw(*cmdBuffer, 4u, 1u, 0u, 0u);
	endRenderPass(vk, *cmdBuffer);

	{
		const vk::VkImageMemoryBarrier	endImgBarrier		=
		{
			vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType
			DE_NULL,											// pNext
			vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			// srcAccessMask
			vk::VK_ACCESS_SHADER_READ_BIT,						// dstAccessMask
			vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// oldLayout
			vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,		// newLayout
			queueFamilyIndex,									// srcQueueFamilyIndex
			queueFamilyIndex,									// dstQueueFamilyIndex
			**colorImage,										// image
			{
				vk::VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
				0u,												// baseMipLevel
				1u,												// mipLevels
				0u,												// baseArraySlice
				1u,												// subresourceRange
			}
		};
		vk.cmdPipelineBarrier(*cmdBuffer,
							  vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,	// srcStageMask
							  vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,				// dstStageMask
							  (vk::VkDependencyFlags)0,
							  0, (const vk::VkMemoryBarrier*)DE_NULL,
							  0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
							  1, &endImgBarrier);
	}

	endCommandBuffer(vk, *cmdBuffer);

	// Execute Draw
	{
		const vk::Unique<vk::VkFence> fence (vk::createFence(vk, device));
		VK_CHECK(vk.resetFences(device, 1, &fence.get()));
		VK_CHECK(queueSubmit(ctx, PROTECTION_ENABLED, queue, *cmdBuffer, *fence, ~0ull));
	}

	// Log inputs
	ctx.getTestContext().getLog()
			<< tcu::TestLog::Message << "Input values: \n"
			<< "1: " << m_testInput << "\n"
			<< tcu::TestLog::EndMessage;

	// Validate buffer
	if (m_validator.validateBuffer(ctx, **testBuffer))
		return tcu::TestStatus::pass("Everything went OK");
	else
		return tcu::TestStatus::fail("Something went really wrong");
}

template<typename T>
tcu::TestStatus StorageBufferTestInstance<T>::executeComputeTest(void)
{
	ProtectedContext&						ctx					(m_protectedContext);
	const vk::DeviceInterface&				vk					= ctx.getDeviceInterface();
	const vk::VkDevice						device				= ctx.getDevice();
	const vk::VkQueue						queue				= ctx.getQueue();
	const deUint32							queueFamilyIndex	= ctx.getQueueFamilyIndex();

	const deUint32							testUniformSize		= sizeof(m_testInput);
	de::UniquePtr<vk::BufferWithMemory>		testUniform			(makeBuffer(ctx,
																		PROTECTION_DISABLED,
																		queueFamilyIndex,
																		testUniformSize,
																		vk::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
																		 | vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
																		vk::MemoryRequirement::HostVisible));

	// Set the test input uniform data
	{
		deMemcpy(testUniform->getAllocation().getHostPtr(), &m_testInput, testUniformSize);
		vk::flushAlloc(vk, device, testUniform->getAllocation());
	}

	const deUint32							testBufferSize		= sizeof(ValidationDataStorage<T>);
	de::MovePtr<vk::BufferWithMemory>		testBuffer			(makeBuffer(ctx,
																			PROTECTION_ENABLED,
																			queueFamilyIndex,
																			testBufferSize,
																			vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
																			 | vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT,
																			vk::MemoryRequirement::Protected));
	de::MovePtr<vk::BufferWithMemory>		testBufferSource	(makeBuffer(ctx,
																			PROTECTION_ENABLED,
																			queueFamilyIndex,
																			testBufferSize,
																			vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
																			 | vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT,
																			vk::MemoryRequirement::Protected));

	vk::Unique<vk::VkShaderModule>			testShader			(vk::createShaderModule(vk, device, ctx.getBinaryCollection().get("TestShader"), 0));

	// Create descriptors
	vk::Unique<vk::VkDescriptorSetLayout>	descriptorSetLayout(vk::DescriptorSetLayoutBuilder()
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT)
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT)
		.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT)
		.build(vk, device));
	vk::Unique<vk::VkDescriptorPool>		descriptorPool(vk::DescriptorPoolBuilder()
		.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u)
		.addType(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u)
		.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u)
		.build(vk, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
	vk::Unique<vk::VkDescriptorSet>			descriptorSet		(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));

	// Update descriptor set information
	{
		vk::VkDescriptorBufferInfo	descTestBuffer			= makeDescriptorBufferInfo(**testBuffer, 0, testBufferSize);
		vk::VkDescriptorBufferInfo	descTestUniform			= makeDescriptorBufferInfo(**testUniform, 0, testUniformSize);
		vk::VkDescriptorBufferInfo	descTestBufferSource	= makeDescriptorBufferInfo(**testBufferSource, 0, testBufferSize);

		vk::DescriptorSetUpdateBuilder()
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descTestBuffer)
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descTestUniform)
			.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descTestBufferSource)
			.update(vk, device);
	}


	// Build and execute test
	{
		const vk::Unique<vk::VkFence>		fence				(vk::createFence(vk, device));
		vk::Unique<vk::VkPipelineLayout>	pipelineLayout		(makePipelineLayout(vk, device, *descriptorSetLayout));
		vk::Unique<vk::VkPipeline>			SSBOPipeline		(makeComputePipeline(vk, device, *pipelineLayout, *testShader, DE_NULL));
		vk::Unique<vk::VkCommandPool>		cmdPool				(makeCommandPool(vk, device, PROTECTION_ENABLED, queueFamilyIndex));
		vk::Unique<vk::VkCommandBuffer>		cmdBuffer			(vk::allocateCommandBuffer(vk, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
		deUint32							dispatchCount		= (m_testType == SSBO_ATOMIC) ? 4u : 1u;

		beginCommandBuffer(vk, *cmdBuffer);

		if (m_testType == SSBO_READ || m_testType == SSBO_ATOMIC)
		{
			vk::VkBuffer targetBuffer = (m_testType == SSBO_ATOMIC) ? **testBuffer : **testBufferSource;
			addBufferCopyCmd(vk, *cmdBuffer, queueFamilyIndex, **testUniform, targetBuffer, testUniformSize);
		}

		vk.cmdBindPipeline(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_COMPUTE, *SSBOPipeline);
		vk.cmdBindDescriptorSets(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &*descriptorSet, 0u, DE_NULL);

		vk.cmdDispatch(*cmdBuffer, dispatchCount, 1u, 1u);

		endCommandBuffer(vk, *cmdBuffer);
		VK_CHECK(queueSubmit(ctx, PROTECTION_ENABLED, queue, *cmdBuffer, *fence, ~0ull));
	}

	ctx.getTestContext().getLog()
			<< tcu::TestLog::Message << "Input values: \n"
			<< "1: " << m_testInput << "\n"
			<< tcu::TestLog::EndMessage;

	// Validate buffer
	if (m_validator.validateBuffer(ctx, **testBuffer))
		return tcu::TestStatus::pass("Everything went OK");
	else
		return tcu::TestStatus::fail("Something went really wrong");
}

template<typename T>
tcu::TestStatus StorageBufferTestInstance<T>::iterate(void)
{
	switch (m_shaderType)
	{
		case glu::SHADERTYPE_FRAGMENT:	return executeFragmentTest();
		case glu::SHADERTYPE_COMPUTE:	return executeComputeTest();
		default:
			DE_FATAL("Incorrect shader type"); return tcu::TestStatus::fail("");
	}
}

tcu::TestCaseGroup* createSpecifiedStorageBufferTests (tcu::TestContext&						testCtx,
													   const std::string						groupName,
													   SSBOTestType								testType,
													   const glu::ShaderType					shaderType,
													   const ValidationDataStorage<tcu::UVec4>	testData[],
													   size_t									testCount)
{
	const std::string				testTypeStr		= getSSBOTypeString(testType);
	const std::string				description		= "Storage buffer " + testTypeStr + " tests";
	de::MovePtr<tcu::TestCaseGroup> testGroup		(new tcu::TestCaseGroup(testCtx, groupName.c_str(), description.c_str()));

	for (size_t ndx = 0; ndx < testCount; ++ndx)
	{
		const std::string name = testTypeStr + "_" + de::toString(ndx + 1);
		testGroup->addChild(new StorageBufferTestCase<tcu::UVec4>(testCtx, testType, shaderType, name.c_str(), testData[ndx].values, testData[ndx], vk::VK_FORMAT_R32G32B32A32_UINT));
	}

	return testGroup.release();
}

tcu::TestCaseGroup* createRandomizedBufferTests (tcu::TestContext& testCtx, SSBOTestType testType, const glu::ShaderType shaderType, size_t testCount)
{
	de::Random											rnd				(testCtx.getCommandLine().getBaseSeed());
	std::vector<ValidationDataStorage<tcu::UVec4> >		testData;
	testData.resize(testCount);

	for (size_t ndx = 0; ndx < testCount; ++ndx)
		for (deUint32 compIdx = 0; compIdx < 4; ++compIdx)
			testData[ndx].values[compIdx] = rnd.getUint32();

	return createSpecifiedStorageBufferTests(testCtx, "random", testType, shaderType, testData.data(), testData.size());
}

tcu::TestCaseGroup* createRWStorageBufferTests (tcu::TestContext&							testCtx,
												const std::string							groupName,
												const std::string							groupDescription,
												SSBOTestType								testType,
												const ValidationDataStorage<tcu::UVec4>		testData[],
												size_t										testCount)
{
	de::MovePtr<tcu::TestCaseGroup> ssboRWTestGroup (new tcu::TestCaseGroup(testCtx, groupName.c_str(), groupDescription.c_str()));

	glu::ShaderType					shaderTypes[] = {
		glu::SHADERTYPE_FRAGMENT,
		glu::SHADERTYPE_COMPUTE
	};

	for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(shaderTypes); ++shaderNdx)
	{
		const glu::ShaderType				shaderType			= shaderTypes[shaderNdx];
		const std::string					shaderName			= glu::getShaderTypeName(shaderType);
		const std::string					shaderGroupDesc		= "Storage buffer tests for shader type: " + shaderName;
		de::MovePtr<tcu::TestCaseGroup>		testShaderGroup		(new tcu::TestCaseGroup(testCtx, shaderName.c_str(), shaderGroupDesc.c_str()));

		testShaderGroup->addChild(createSpecifiedStorageBufferTests(testCtx, "static", testType, shaderType, testData, testCount));
		testShaderGroup->addChild(createRandomizedBufferTests(testCtx, testType, shaderType, RANDOM_TEST_COUNT));
		ssboRWTestGroup->addChild(testShaderGroup.release());
	}

	return ssboRWTestGroup.release();
}

void calculateAtomicOpData (SSBOAtomicType		type,
							const tcu::UVec4&	inputValue,
							const deUint32		atomicArg,
							std::string&		atomicCall,
							tcu::UVec4&			refValue,
							const deUint32		swapNdx = 0)
{
	switch (type)
	{
		case ATOMIC_ADD:
		{
			refValue	= inputValue + tcu::UVec4(atomicArg);
			atomicCall	= "atomicAdd(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_MIN:
		{
			refValue	= tcu::UVec4(std::min(inputValue.x(), atomicArg), std::min(inputValue.y(), atomicArg), std::min(inputValue.z(), atomicArg), std::min(inputValue.w(), atomicArg));
			atomicCall	= "atomicMin(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_MAX:
		{
			refValue	= tcu::UVec4(std::max(inputValue.x(), atomicArg), std::max(inputValue.y(), atomicArg), std::max(inputValue.z(), atomicArg), std::max(inputValue.w(), atomicArg));
			atomicCall	= "atomicMax(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_AND:
		{
			refValue	= tcu::UVec4(inputValue.x() & atomicArg, inputValue.y() & atomicArg, inputValue.z() & atomicArg, inputValue.w() & atomicArg);
			atomicCall	= "atomicAnd(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_OR:
		{
			refValue	= tcu::UVec4(inputValue.x() | atomicArg, inputValue.y() | atomicArg, inputValue.z() | atomicArg, inputValue.w() | atomicArg);
			atomicCall	= "atomicOr(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_XOR:
		{
			refValue	= tcu::UVec4(inputValue.x() ^ atomicArg, inputValue.y() ^ atomicArg, inputValue.z() ^ atomicArg, inputValue.w() ^ atomicArg);
			atomicCall	= "atomicXor(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_EXCHANGE:
		{
			refValue	= tcu::UVec4(atomicArg);
			atomicCall	= "atomicExchange(protectedTestResultBuffer[i], " + de::toString(atomicArg) + "u);";
			break;
		}
		case ATOMIC_COMPSWAP:
		{
			int			selectedNdx		= swapNdx % 4;
			deUint32	selectedChange	= inputValue[selectedNdx];

			refValue				= inputValue;
			refValue[selectedNdx]	= atomicArg;
			atomicCall				= "atomicCompSwap(protectedTestResultBuffer[i], " + de::toString(selectedChange) + "u, " + de::toString(atomicArg) + "u);";
			break;
		}
		default: DE_FATAL("Incorrect atomic function type"); break;
	}

}

} // anonymous

tcu::TestCaseGroup* createReadStorageBufferTests (tcu::TestContext& testCtx)
{
	const ValidationDataStorage<tcu::UVec4> testData[] = {
		{ tcu::UVec4(0u, 0u, 0u, 0u) },	{ tcu::UVec4(1u, 0u, 0u, 0u) },
		{ tcu::UVec4(0u, 1u, 0u, 0u) },	{ tcu::UVec4(0u, 0u, 1u, 0u) },
		{ tcu::UVec4(0u, 0u, 0u, 1u) },	{ tcu::UVec4(1u, 1u, 1u, 1u) }
	};

	return createRWStorageBufferTests(testCtx, "ssbo_read", "Storage Buffer Read Tests", SSBO_READ, testData, DE_LENGTH_OF_ARRAY(testData));
}

tcu::TestCaseGroup* createWriteStorageBufferTests (tcu::TestContext& testCtx)
{
	const ValidationDataStorage<tcu::UVec4> testData[] = {
		{ tcu::UVec4(0u, 0u, 0u, 0u) }, { tcu::UVec4(1u, 0u, 0u, 0u) },
		{ tcu::UVec4(0u, 1u, 0u, 0u) }, { tcu::UVec4(0u, 0u, 1u, 0u) },
		{ tcu::UVec4(0u, 0u, 0u, 1u) }, { tcu::UVec4(1u, 1u, 1u, 1u) }
	};

	return createRWStorageBufferTests(testCtx, "ssbo_write", "Storage Buffer Write Tests", SSBO_WRITE, testData, DE_LENGTH_OF_ARRAY(testData));
}

tcu::TestCaseGroup* createAtomicStorageBufferTests (tcu::TestContext& testctx)
{
	struct {
		const tcu::UVec4	input;
		const deUint32		atomicArg;
		const deUint32		swapNdx;
	}								testData[]	= {
		{ tcu::UVec4(0u,		1u,			2u,			3u),		10u,	0u	},
		{ tcu::UVec4(10u,		20u,		30u,		40u),		3u,		2u	},
		{ tcu::UVec4(800u,		400u,		230u,		999u),		50u,	3u	},
		{ tcu::UVec4(100800u,	233400u,	22230u,		77999u),	800u,	1u	},
	};

	SSBOAtomicType					testTypes[]	= {
		ATOMIC_ADD,
		ATOMIC_MIN,
		ATOMIC_MAX,
		ATOMIC_AND,
		ATOMIC_OR,
		ATOMIC_XOR,
		ATOMIC_EXCHANGE,
		ATOMIC_COMPSWAP
	};

	glu::ShaderType					shaderTypes[] = {
		glu::SHADERTYPE_FRAGMENT,
		glu::SHADERTYPE_COMPUTE
	};

	de::Random						rnd				(testctx.getCommandLine().getBaseSeed());
	de::MovePtr<tcu::TestCaseGroup>	ssboAtomicTests (new tcu::TestCaseGroup(testctx, "ssbo_atomic", "Storage Buffer Atomic Tests"));

	for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(shaderTypes); ++shaderNdx)
	{
		const glu::ShaderType				shaderType			= shaderTypes[shaderNdx];
		const std::string					shaderName			= glu::getShaderTypeName(shaderType);
		const std::string					shaderDesc			= "Storage Buffer Atomic Tests for shader type: " + shaderName;
		de::MovePtr<tcu::TestCaseGroup>		atomicShaderGroup	(new tcu::TestCaseGroup(testctx, shaderName.c_str(), shaderDesc.c_str()));

		for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(testTypes); ++typeNdx)
		{
			SSBOAtomicType					atomicType		= testTypes[typeNdx];
			const std::string				atomicTypeStr	= getSSBOAtomicTypeString(atomicType);
			const std::string				atomicDesc		= "Storage Buffer Atomic Tests: " + atomicTypeStr;

			de::MovePtr<tcu::TestCaseGroup>	staticTests		(new tcu::TestCaseGroup(testctx, "static", (atomicDesc + " with static input").c_str()));
			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(testData); ++ndx)
			{
				const std::string	name		= "atomic_" + atomicTypeStr + "_" + de::toString(ndx + 1);
				const tcu::UVec4&	inputValue	= testData[ndx].input;
				const deUint32&		atomicArg	= testData[ndx].atomicArg;
				std::string			atomicCall;
				tcu::UVec4			refValue;

				calculateAtomicOpData(atomicType, inputValue, atomicArg, atomicCall, refValue, testData[ndx].swapNdx);

				ValidationDataStorage<tcu::UVec4>	validationData	= { refValue };
				staticTests->addChild(new StorageBufferTestCase<tcu::UVec4>(testctx, SSBO_ATOMIC, shaderType, name.c_str(), inputValue, validationData, vk::VK_FORMAT_R32G32B32A32_UINT, atomicCall));
			}

			de::MovePtr<tcu::TestCaseGroup>	randomTests		(new tcu::TestCaseGroup(testctx, "random", (atomicDesc + " with random input").c_str()));
			for (int ndx = 0; ndx < RANDOM_TEST_COUNT; ndx++)
			{
				const std::string					name			= "atomic_" + atomicTypeStr + "_" + de::toString(ndx + 1);
				deUint32							atomicArg		= rnd.getUint16();
				tcu::UVec4							inputValue;
				tcu::UVec4							refValue;
				std::string							atomicCall;

				for (int i = 0; i < 4; i++)
					inputValue[i] = rnd.getUint16();

				calculateAtomicOpData(atomicType, inputValue, atomicArg, atomicCall, refValue, ndx);

				ValidationDataStorage<tcu::UVec4>	validationData	= { refValue };
				randomTests->addChild(new StorageBufferTestCase<tcu::UVec4>(testctx, SSBO_ATOMIC, shaderType, name.c_str(), inputValue, validationData, vk::VK_FORMAT_R32G32B32A32_UINT, atomicCall));

			}

			de::MovePtr<tcu::TestCaseGroup>	atomicTests		(new tcu::TestCaseGroup(testctx, atomicTypeStr.c_str(), atomicDesc.c_str()));
			atomicTests->addChild(staticTests.release());
			atomicTests->addChild(randomTests.release());
			atomicShaderGroup->addChild(atomicTests.release());
		}
		ssboAtomicTests->addChild(atomicShaderGroup.release());
	}

	return ssboAtomicTests.release();
}

} // ProtectedMem
} // vkt
