/*-------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2018 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 SPIR-V Assembly Tests for the VK_KHR_8bit_storage
 *//*--------------------------------------------------------------------*/


#include "vktSpvAsm8bitStorageTests.hpp"

#include "tcuFloat.hpp"
#include "tcuRGBA.hpp"
#include "tcuStringTemplate.hpp"
#include "tcuTestLog.hpp"
#include "tcuVectorUtil.hpp"

#include "vkDefs.hpp"
#include "vkDeviceUtil.hpp"
#include "vkMemUtil.hpp"
#include "vkPlatform.hpp"
#include "vkPrograms.hpp"
#include "vkQueryUtil.hpp"
#include "vkRef.hpp"
#include "vkRefUtil.hpp"
#include "vkStrUtil.hpp"
#include "vkTypeUtil.hpp"

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

#include "vktSpvAsmComputeShaderCase.hpp"
#include "vktSpvAsmComputeShaderTestUtil.hpp"
#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"

#include <limits>
#include <map>
#include <string>
#include <sstream>
#include <utility>

namespace vkt
{
namespace SpirVAssembly
{

using namespace vk;
using std::map;
using std::string;
using std::vector;
using tcu::IVec3;
using tcu::IVec4;
using tcu::RGBA;
using tcu::TestLog;
using tcu::TestStatus;
using tcu::Vec4;
using de::UniquePtr;
using tcu::StringTemplate;
using tcu::Vec4;

namespace
{
static const deUint32	arrayStrideInBytesUniform	= 16u; // from the spec

enum ShaderTemplate
{
	SHADERTEMPLATE_STRIDE8BIT_STD140 = 0,
	SHADERTEMPLATE_STRIDE32BIT_STD140,
	SHADERTEMPLATE_STRIDEMIX_STD140,
	SHADERTEMPLATE_STRIDE8BIT_STD430,
	SHADERTEMPLATE_STRIDE32BIT_STD430,
	SHADERTEMPLATE_STRIDEMIX_STD430
};

struct StructTestData
{
	const int structArraySize; //Size of Struct Array
	const int nestedArraySize; //Max size of any nested arrays
};

struct Capability
{
	const char*				name;
	const char*				cap;
	const char*				decor;
	vk::VkDescriptorType	dtype;
};

enum
{
	STORAGE_BUFFER_TEST = 0,
	UNIFORM_AND_STORAGEBUFFER_TEST
};

static const Capability	CAPABILITIES[]	=
{
	{"storage_buffer",				"StorageBuffer8BitAccess",				"StorageBuffer",	VK_DESCRIPTOR_TYPE_STORAGE_BUFFER},
	{"uniform",						"UniformAndStorageBuffer8BitAccess",	"Block",			VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER},
};

static const StructTestData structData = {7, 11};

int getStructSize(const ShaderTemplate shaderTemplate)
{
	switch (shaderTemplate)
	{
	case SHADERTEMPLATE_STRIDE8BIT_STD140:
		return 1184 * structData.structArraySize;	//size of struct in 8b with offsets
	case SHADERTEMPLATE_STRIDE32BIT_STD140:
		return 304 * structData.structArraySize;	//size of struct in 32b with offsets
	case SHADERTEMPLATE_STRIDEMIX_STD140:
		return 4480 * structData.structArraySize;	//size of struct in 8b with offsets
	case SHADERTEMPLATE_STRIDE8BIT_STD430:
		return 224 * structData.structArraySize;	//size of struct in 8b with offset
	case SHADERTEMPLATE_STRIDE32BIT_STD430:
		return 184 * structData.structArraySize;	//size of struct in 32b with offset
	case SHADERTEMPLATE_STRIDEMIX_STD430:
		return 976 * structData.structArraySize;	//size of struct in 8b with offset
	default:
		DE_ASSERT(0);
	}
	return 0;
}

VulkanFeatures	get8BitStorageFeatures	(const char* cap)
{
	VulkanFeatures features;
	if (string(cap) == "storage_buffer")
		features.ext8BitStorage = EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
	else if (string(cap) == "uniform")
		features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
	else if  (string(cap) == "push_constant")
		features.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
	else
		DE_ASSERT(false && "not supported");

	return features;
}

bool computeCheckBuffers (const std::vector<Resource>&	originalInts,
						  const vector<AllocationSp>&	outputAllocs,
						  const std::vector<Resource>&	/*expectedOutputs*/,
						  tcu::TestLog&					/*log*/)
{
	std::vector<deUint8> result;
	originalInts.front().getBytes(result);
	return deMemCmp(&result[0], outputAllocs.front()->getHostPtr(), result.size()) == 0;
}

void addInfo(vector<bool>& info, int& ndx, const int count, const bool isData)
{
	for (int index = 0; index < count; ++index)
		info[ndx++] = isData;
}

vector<deInt8> data8bit (const ShaderTemplate std, de::Random& rnd, const bool isData = true)
{
	const int size = getStructSize(std);
	if (!isData)
		return vector<deInt8>(size, 0);
	return getInt8s(rnd, size);
}

vector<deInt32> data32bit (const ShaderTemplate std, de::Random& rnd, const bool isData = true)
{
	const int size = getStructSize(std);
	if (!isData)
		return vector<deInt32>(size, 0);
	return getInt32s(rnd, size);
}

vector<bool> info8bitStd140 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDE8BIT_STD140));

	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;						//i8
		infoData[ndx++] = false;					//offset

		infoData[ndx++] = true;						//v2i8
		infoData[ndx++] = true;						//v2i8

		addInfo(infoData, ndx, 3, true);			//v3i8
		infoData[ndx++] = false;					//offset

		addInfo(infoData, ndx, 4, true);			//v4i8
		addInfo(infoData, ndx, 4, false);			//offset

		//i8[3];
		for (int i = 0; i < 3; ++i)
		{
			infoData[ndx++] = true;					//i8[i];
			addInfo(infoData, ndx, 15, false);		//offset
		}

		//struct {i8, v2i8[3]} [11]
		for (int i = 0; i < 11; ++i)
		{
			//struct.i8
			infoData[ndx++] = true;					//i8
			addInfo(infoData, ndx, 15, false);		//offset
			//struct.v2i8[3]
			for (int j = 0; j < 3; ++j)
			{
				infoData[ndx++] = true;				//v2i8
				infoData[ndx++] = true;				//v2i8
				addInfo(infoData, ndx, 14, false);	//offset
			}
		}

		//v2i8[11];
		for (int i = 0; i < 11; ++i)
		{
			infoData[ndx++] = true;					//v2i8
			infoData[ndx++] = true;					//v2i8
			addInfo(infoData, ndx, 14, false);		//offset
		}

		//i8
		infoData[ndx++] = true;						//i8
		addInfo(infoData, ndx, 15, false);			//offset

		//v3i8[11]
		for (int i = 0; i < 11; ++i)
		{
			addInfo(infoData, ndx, 3, true);		//v3i8
			addInfo(infoData, ndx, 13, false);		//offset
		}

		//v4i8[3]
		for (int i = 0; i < 3; ++i)
		{
			addInfo(infoData, ndx, 4, true);		//v4i8
			addInfo(infoData, ndx, 12, false);		//offset
		}
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));

	return infoData;
}

vector<bool> info8bitStd430 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDE8BIT_STD430));

	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;					//i8
		infoData[ndx++] = false;				//offset

		infoData[ndx++] = true;					//v2i8
		infoData[ndx++] = true;					//v2i8

		addInfo(infoData, ndx, 3, true);		//v3i8
		infoData[ndx++] = false;				//offset

		addInfo(infoData, ndx, 4, true);		//v4i8
		addInfo(infoData, ndx, 4, false);		//offset

		//i8[3];
		for (int i = 0; i < 3; ++i)
		{
			infoData[ndx++] = true;				//i8;
		}
		addInfo(infoData, ndx, 13, false);		//offset

		//struct {i8, v2i8[3]} [11]
		for (int i = 0; i < 11; ++i)
		{
			//struct.i8
			infoData[ndx++] = true;				//i8
			infoData[ndx++] = false;			//offset
			//struct.v2i8[3]
			for (int j = 0; j < 3; ++j)
			{
				infoData[ndx++] = true;			//v2i8
				infoData[ndx++] = true;			//v2i8
			}
		}
		addInfo(infoData, ndx, 8, false);		//offset

		//vec2[11];
		for (int i = 0; i < 11; ++i)
		{
			infoData[ndx++] = true;				//v2i8
			infoData[ndx++] = true;				//v2i8
		}

		//i8
		infoData[ndx++] = true;					//i8
		addInfo(infoData, ndx, 9, false);		//offset

		//v3i8[11]
		for (int i = 0; i < 11; ++i)
		{
			addInfo(infoData, ndx, 3, true);	//v3i8
			infoData[ndx++] = false;			//offset
		}
		addInfo(infoData, ndx, 4, false);		//offset

		//v4i8[3]
		for (int i = 0; i < 3; ++i)
		{
			addInfo(infoData, ndx, 4, true);	//v4i8
		}
		addInfo(infoData, ndx, 4, false);		//offset
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));
	return infoData;
}

vector<bool> info32bitStd140 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDE32BIT_STD140));

	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;					//i32
		infoData[ndx++] = false;				//offset

		infoData[ndx++] = true;					//v2i32
		infoData[ndx++] = true;					//v2i32

		addInfo(infoData, ndx, 3, true);		//v3i32
		infoData[ndx++] = false;				//offset

		addInfo(infoData, ndx, 4, true);		//v4i32

		//i32[3];
		for (int i = 0; i < 3; ++i)
		{
			infoData[ndx++] = true;				//i32;
			addInfo(infoData, ndx, 3, false);	//offset
		}

		//struct {i32, v2i32[3]} [11]
		for (int i = 0; i < 11; ++i)
		{
			//struct.f32
			infoData[ndx++] = true;				//i32
			addInfo(infoData, ndx, 3, false);	//offset
			//struct.f32.v2f16[3]
			for (int j = 0; j < 3; ++j)
			{
				infoData[ndx++] = true;			//v2i32
				infoData[ndx++] = true;			//v2i32
				infoData[ndx++] = false;		//offset
				infoData[ndx++] = false;		//offset
			}
		}

		//v2f32[11];
		for (int i = 0; i < 11; ++i)
		{
			infoData[ndx++] = true;				//v2i32
			infoData[ndx++] = true;				//v2i32
			infoData[ndx++] = false;			//offset
			infoData[ndx++] = false;			//offset
		}

		//i32
		infoData[ndx++] = true;					//i32
		addInfo(infoData, ndx, 3, false);		//offset

		//v3i32[11]
		for (int i = 0; i < 11; ++i)
		{
			addInfo(infoData, ndx, 3, true);	//v3i32
			infoData[ndx++] = false;			//offset
		}

		//v4i32[3]
		for (int i = 0; i < 3; ++i)
		{
			addInfo(infoData, ndx, 4, true);	//v4i32
		}
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));
	return infoData;
}

vector<bool> info32bitStd430 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDE32BIT_STD430));

	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;					//i32
		infoData[ndx++] = false;				//offset

		addInfo(infoData, ndx, 2, true);		//v2i32

		addInfo(infoData, ndx, 3, true);		//v3i32
		infoData[ndx++] = false;				//offset

		addInfo(infoData, ndx, 4, true);		//v4i32

		addInfo(infoData, ndx, 3, true);		//i32[3];
		infoData[ndx++] = false;				//offset

		//struct {i32, v2i32[3]} [11]
		for (int i = 0; i < 11; ++i)
		{
			//struct.i32
			infoData[ndx++] = true;				//i32
			infoData[ndx++] = false;			//offset
			addInfo(infoData, ndx, 6, true);	//v2i32[3]
		}

		addInfo(infoData, ndx, 22, true);		//v2i32[11];

		//i32
		infoData[ndx++] = true;					//i32
		infoData[ndx++] = false;				//offset

		//v3i32[11]
		for (int i = 0; i < 11; ++i)
		{
			addInfo(infoData, ndx, 3, true);	//v3i32
			infoData[ndx++] = false;			//offset
		}

		addInfo(infoData, ndx, 12, true);	//v4i32[3]
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));
	return infoData;
}

vector<bool> infoMixStd140 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDEMIX_STD140));
	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;					//8b
		addInfo(infoData, ndx, 3, false);		//offset

		addInfo(infoData, ndx, 4, true);		//32b

		addInfo(infoData, ndx, 2, true);		//v2b8
		addInfo(infoData, ndx, 6, false);		//offset

		addInfo(infoData, ndx, 8, true);		//v2b32

		addInfo(infoData, ndx, 3, true);		//v3b8
		addInfo(infoData, ndx, 5, false);		//offset

		addInfo(infoData, ndx, 12, true);		//v3b32
		addInfo(infoData, ndx, 4,  false);		//offset

		addInfo(infoData, ndx, 4, true);		//v4b8
		addInfo(infoData, ndx, 12, false);		//offset

		addInfo(infoData, ndx, 16, true);		//v4b32

		//strut {b8, b32, v2b8[11], b32[11]}
		for (int i = 0; i < structData.nestedArraySize; ++i)
		{
			infoData[ndx++] = true;				//8b
			addInfo(infoData, ndx, 3, false);	//offset

			addInfo(infoData, ndx, 4, true);	//32b
			addInfo(infoData, ndx, 8, false);	//offset

			for (int j = 0; j < structData.nestedArraySize; ++j)
			{
				addInfo(infoData, ndx, 2, true);	//v2b8[11]
				addInfo(infoData, ndx, 14, false);	//offset
			}

			for (int j = 0; j < structData.nestedArraySize; ++j)
			{
				addInfo(infoData, ndx, 4, true);	//b32[11]
				addInfo(infoData, ndx, 12, false);	//offset
			}
		}

		for (int i = 0; i < structData.nestedArraySize; ++i)
		{
			infoData[ndx++] = true;				//8b[11]
			addInfo(infoData, ndx, 15, false);	//offset
		}

		for (int i = 0; i < structData.nestedArraySize; ++i)
		{
			addInfo(infoData, ndx, 4, true);	//b32bIn[11]
			addInfo(infoData, ndx, 12, false);	//offset
		}
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));
	return infoData;
}

vector<bool> infoMixStd430 (void)
{
	int				ndx			= 0u;
	vector<bool>	infoData	(getStructSize(SHADERTEMPLATE_STRIDEMIX_STD430));
	for(int elementNdx = 0; elementNdx < structData.structArraySize; ++elementNdx)
	{
		infoData[ndx++] = true;					//8b
		addInfo(infoData, ndx, 3, false);		//offset

		addInfo(infoData, ndx, 4, true);		//32b

		addInfo(infoData, ndx, 2, true);		//v2b8
		addInfo(infoData, ndx, 6, false);		//offset

		addInfo(infoData, ndx, 8, true);		//v2b32

		addInfo(infoData, ndx, 3, true);		//v3b8
		addInfo(infoData, ndx, 5, false);		//offset

		addInfo(infoData, ndx, 12, true);		//v3b32
		addInfo(infoData, ndx, 4,  false);		//offset

		addInfo(infoData, ndx, 4, true);		//v4b8
		addInfo(infoData, ndx, 12, false);		//offset

		addInfo(infoData, ndx, 16, true);		//v4b32

		//strut {b8, b32, v2b8[11], b32[11]}
		for (int i = 0; i < structData.nestedArraySize; ++i)
		{
			infoData[ndx++] = true;				//8b
			addInfo(infoData, ndx, 3, false);	//offset

			addInfo(infoData, ndx, 4, true);	//32b

			addInfo(infoData, ndx, 22, true);	//v2b8[11]
			addInfo(infoData, ndx, 2, false);	//offset

			addInfo(infoData, ndx, 44, true);	//b32[11]
		}

		addInfo(infoData, ndx, 11, true);		//8b[11]
		infoData[ndx++] = false;				//offset

		addInfo(infoData, ndx, 44, true);		//32b[11]
		addInfo(infoData, ndx, 4, false);		//offset
	}

	//Please check the data and offset
	DE_ASSERT(ndx == static_cast<int>(infoData.size()));
	return infoData;
}

template<typename originType, typename resultType, ShaderTemplate funcOrigin, ShaderTemplate funcResult>
bool compareStruct(const resultType* returned, const originType* original)
{
	vector<bool>		resultInfo;
	vector<bool>		originInfo;
	vector<resultType >	resultToCompare;
	vector<originType >	originToCompare;

	switch(funcOrigin)
	{
	case SHADERTEMPLATE_STRIDE8BIT_STD140:
		originInfo = info8bitStd140();
		break;
	case SHADERTEMPLATE_STRIDE8BIT_STD430:
		originInfo = info8bitStd430();
		break;
	case SHADERTEMPLATE_STRIDE32BIT_STD140:
		originInfo = info32bitStd140();
		break;
	case SHADERTEMPLATE_STRIDE32BIT_STD430:
		originInfo = info32bitStd430();
		break;
	case SHADERTEMPLATE_STRIDEMIX_STD140:
		originInfo = infoMixStd140();
		break;
	case SHADERTEMPLATE_STRIDEMIX_STD430:
		originInfo = infoMixStd430();
		break;
	default:
		DE_ASSERT(0);
	}

	switch(funcResult)
	{
	case SHADERTEMPLATE_STRIDE8BIT_STD140:
		resultInfo = info8bitStd140();
		break;
	case SHADERTEMPLATE_STRIDE8BIT_STD430:
		resultInfo = info8bitStd430();
		break;
	case SHADERTEMPLATE_STRIDE32BIT_STD140:
		resultInfo = info32bitStd140();
		break;
	case SHADERTEMPLATE_STRIDE32BIT_STD430:
		resultInfo = info32bitStd430();
		break;
	case SHADERTEMPLATE_STRIDEMIX_STD140:
		resultInfo = infoMixStd140();
		break;
	case SHADERTEMPLATE_STRIDEMIX_STD430:
		resultInfo = infoMixStd430();
		break;
	default:
		DE_ASSERT(0);
	}

	for (int ndx = 0; ndx < static_cast<int>(resultInfo.size()); ++ndx)
	{
		if (resultInfo[ndx])
			resultToCompare.push_back(returned[ndx]);
	}

	for (int ndx = 0; ndx < static_cast<int>(originInfo.size()); ++ndx)
	{
		if (originInfo[ndx])
			originToCompare.push_back(original[ndx]);
	}

	//Different offset but that same amount of data
	DE_ASSERT(originToCompare.size() == resultToCompare.size());

	for (int ndx = 0; ndx < static_cast<int>(originToCompare.size()); ++ndx)
	{
		if (static_cast<deInt8>(originToCompare[ndx]) != static_cast<deInt8>(resultToCompare[ndx]))
			return false;
	}
	return true;
}

template<typename originType, typename resultType, ShaderTemplate funcOrigin, ShaderTemplate funcResult>
bool checkStruct (const std::vector<Resource>&	originalFloats,
				  const vector<AllocationSp>&	outputAllocs,
				  const std::vector<Resource>&	/* expectedOutputs */,
				  tcu::TestLog&					/* log */)
{
	for (deUint32 outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
	{
		vector<deUint8>	originalBytes;
		originalFloats[outputNdx].getBytes(originalBytes);

		const resultType*	returned	= static_cast<const resultType*>(outputAllocs[outputNdx]->getHostPtr());
		const originType*	original	= reinterpret_cast<const originType*>(&originalBytes.front());

		if(!compareStruct<originType, resultType, funcOrigin, funcResult>(returned, original))
			return false;
	}
	return true;
}

template<typename originType, typename resultType, deUint32 compositCount>
bool checkUniformsArray (const std::vector<Resource>&	originalFloats,
						 const vector<AllocationSp>&	outputAllocs,
						 const std::vector<Resource>&	/* expectedOutputs */,
						 tcu::TestLog&					/* log */)
{
	const deUint32	originTypeSize = static_cast<deUint32>(sizeof(originType));

	DE_ASSERT((originTypeSize * compositCount) <= arrayStrideInBytesUniform); // one element of array can't be bigger then 16B

	for (deUint32 outputNdx = 0; outputNdx < static_cast<deUint32>(outputAllocs.size()); ++outputNdx)
	{
		vector<deUint8>	originalBytes;
		originalFloats[outputNdx].getBytes(originalBytes);
		const int elemntsNumber = (static_cast<int>(originalBytes.size()) / arrayStrideInBytesUniform) / compositCount;

		const resultType*	returned = static_cast<const resultType*>(outputAllocs[outputNdx]->getHostPtr());
		const originType*	original = reinterpret_cast<const originType*>(&originalBytes.front());

		for (int ndx = 0; ndx < elemntsNumber; ++ndx)
		{
			for (deUint32 ndxData = 0u; ndxData < compositCount; ++ndxData)
			{
				if (static_cast<deInt8>(*original) != static_cast<deInt8>(*returned))
					return false;
				original++;
				returned++;
			}
			original += arrayStrideInBytesUniform / originTypeSize - compositCount;
		}
	}
	return true;
}

template<typename originType, typename resultType, int compositCount, int ndxConts>
bool checkUniformsArrayConstNdx (const std::vector<Resource>&	originalFloats,
								 const vector<AllocationSp>&	outputAllocs,
								 const std::vector<Resource>&	/* expectedOutputs */,
								 tcu::TestLog&					/* log */)
{
	const deUint32	originTypeSize = static_cast<deUint32>(sizeof(originType));

	DE_ASSERT((originTypeSize * compositCount) <= arrayStrideInBytesUniform); // one element of array can't be bigger then 16B

	for (deUint32 outputNdx = 0; outputNdx < static_cast<deUint32>(outputAllocs.size()); ++outputNdx)
	{
		vector<deUint8>	originalBytes;
		originalFloats[outputNdx].getBytes(originalBytes);
		const int elemntsNumber = (static_cast<int>(originalBytes.size()) / arrayStrideInBytesUniform) / compositCount;

		const resultType*	returned = static_cast<const resultType*>(outputAllocs[outputNdx]->getHostPtr());
		const originType*	original = reinterpret_cast<const originType*>(&originalBytes.front());

		deUint32 idx = (arrayStrideInBytesUniform / originTypeSize) * ndxConts;

		for (int ndx = 0; ndx < elemntsNumber; ++ndx)
		{
			for (int ndxData = 0; ndxData < compositCount; ++ndxData)
			{
				if (static_cast<deInt8>(original[idx + ndxData]) != static_cast<deInt8>(*returned))
					return false;
				returned++;
			}
		}
	}
	return true;
}


string getStructShaderComponet (const ShaderTemplate component)
{
	switch(component)
	{
	case SHADERTEMPLATE_STRIDE8BIT_STD140:
		return string(
		//struct {i8, v2i8[3]} [11]
		"OpDecorate %v2i8arr3 ArrayStride 16\n"
		"OpMemberDecorate %struct8 0 Offset 0\n"
		"OpMemberDecorate %struct8 1 Offset 16\n"
		"OpDecorate %struct8arr11 ArrayStride 64\n"
		"\n"
		"OpDecorate %i8arr3       ArrayStride 16\n"
		"OpDecorate %v2i8arr11    ArrayStride 16\n"
		"OpDecorate %v3i8arr11    ArrayStride 16\n"
		"OpDecorate %v4i8arr3     ArrayStride 16\n"
		"OpDecorate %i8StructArr7 ArrayStride 1184\n"
		"\n"
		"OpMemberDecorate %i8Struct 0 Offset 0\n"		//i8
		"OpMemberDecorate %i8Struct 1 Offset 2\n"		//v2i8
		"OpMemberDecorate %i8Struct 2 Offset 4\n"		//v3i8
		"OpMemberDecorate %i8Struct 3 Offset 8\n"		//v4i8
		"OpMemberDecorate %i8Struct 4 Offset 16\n"		//i8[3]
		"OpMemberDecorate %i8Struct 5 Offset 64\n"		//struct {i8, v2i8[3]} [11]
		"OpMemberDecorate %i8Struct 6 Offset 768\n"		//v2i8[11]
		"OpMemberDecorate %i8Struct 7 Offset 944\n"		//i8
		"OpMemberDecorate %i8Struct 8 Offset 960\n"		//v3i8[11]
		"OpMemberDecorate %i8Struct 9 Offset 1136\n");	//v4i8[3]
	case SHADERTEMPLATE_STRIDE8BIT_STD430:
		return string(
		//struct {i8, v2i8[3]} [11]
		"OpDecorate %v2i8arr3     ArrayStride 2\n"
		"OpMemberDecorate %struct8 0 Offset 0\n"
		"OpMemberDecorate %struct8 1 Offset 2\n"
		"OpDecorate %struct8arr11 ArrayStride 8\n"
		"\n"
		"OpDecorate %i8arr3    ArrayStride 1\n"
		"OpDecorate %v2i8arr11 ArrayStride 2\n"
		"OpDecorate %v3i8arr11 ArrayStride 4\n"
		"OpDecorate %v4i8arr3  ArrayStride 4\n"
		"OpDecorate %i8StructArr7 ArrayStride 224\n"
		"\n"
		"OpMemberDecorate %i8Struct 0 Offset 0\n"		//i8
		"OpMemberDecorate %i8Struct 1 Offset 2\n"		//v2i8
		"OpMemberDecorate %i8Struct 2 Offset 4\n"		//v3i8
		"OpMemberDecorate %i8Struct 3 Offset 8\n"		//v4i8
		"OpMemberDecorate %i8Struct 4 Offset 16\n"		//i8[3]
		"OpMemberDecorate %i8Struct 5 Offset 32\n"		//struct {i8, v2i8[3]} [11]
		"OpMemberDecorate %i8Struct 6 Offset 128\n"		//v2i8[11]
		"OpMemberDecorate %i8Struct 7 Offset 150\n"		//i8
		"OpMemberDecorate %i8Struct 8 Offset 160\n"		//v3i8[11]
		"OpMemberDecorate %i8Struct 9 Offset 208\n");	//v4i8[3]
	case SHADERTEMPLATE_STRIDE32BIT_STD140:
		return string (
		//struct {i32, v2i32[3]} [11]
		"OpDecorate %v2i32arr3 ArrayStride 16\n"
		"OpMemberDecorate %struct32 0 Offset 0\n"
		"OpMemberDecorate %struct32 1 Offset 16\n"
		"OpDecorate %struct32arr11 ArrayStride 64\n"
		"\n"
		"OpDecorate %i32arr3   ArrayStride 16\n"
		"OpDecorate %v2i32arr11 ArrayStride 16\n"
		"OpDecorate %v3i32arr11 ArrayStride 16\n"
		"OpDecorate %v4i32arr3 ArrayStride 16\n"
		"OpDecorate %i32StructArr7 ArrayStride 1216\n"
		"\n"
		"OpMemberDecorate %i32Struct 0 Offset 0\n"		//i32
		"OpMemberDecorate %i32Struct 1 Offset 8\n"		//v2i32
		"OpMemberDecorate %i32Struct 2 Offset 16\n"		//v3i32
		"OpMemberDecorate %i32Struct 3 Offset 32\n"		//v4i32
		"OpMemberDecorate %i32Struct 4 Offset 48\n"		//i32[3]
		"OpMemberDecorate %i32Struct 5 Offset 96\n"		//struct {i32, v2i32[3]} [11]
		"OpMemberDecorate %i32Struct 6 Offset 800\n"	//v2i32[11]
		"OpMemberDecorate %i32Struct 7 Offset 976\n"	//i32
		"OpMemberDecorate %i32Struct 8 Offset 992\n"	//v3i32[11]
		"OpMemberDecorate %i32Struct 9 Offset 1168\n");	//v4i32[3]
	case SHADERTEMPLATE_STRIDE32BIT_STD430:
		return string(
		//struct {i32, v2i32[3]} [11]
		"OpDecorate %v2i32arr3 ArrayStride 8\n"
		"OpMemberDecorate %struct32 0 Offset 0\n"
		"OpMemberDecorate %struct32 1 Offset 8\n"
		"OpDecorate %struct32arr11 ArrayStride 32\n"
		"\n"
		"OpDecorate %i32arr3    ArrayStride 4\n"
		"OpDecorate %v2i32arr11 ArrayStride 8\n"
		"OpDecorate %v3i32arr11 ArrayStride 16\n"
		"OpDecorate %v4i32arr3  ArrayStride 16\n"
		"OpDecorate %i32StructArr7 ArrayStride 736\n"
		"\n"
		"OpMemberDecorate %i32Struct 0 Offset 0\n"		//i32
		"OpMemberDecorate %i32Struct 1 Offset 8\n"		//v2i32
		"OpMemberDecorate %i32Struct 2 Offset 16\n"		//v3i32
		"OpMemberDecorate %i32Struct 3 Offset 32\n"		//v4i32
		"OpMemberDecorate %i32Struct 4 Offset 48\n"		//i32[3]
		"OpMemberDecorate %i32Struct 5 Offset 64\n"		//struct {i32, v2i32[3]}[11]
		"OpMemberDecorate %i32Struct 6 Offset 416\n"	//v2i32[11]
		"OpMemberDecorate %i32Struct 7 Offset 504\n"	//i32
		"OpMemberDecorate %i32Struct 8 Offset 512\n"	//v3i32[11]
		"OpMemberDecorate %i32Struct 9 Offset 688\n");	//v4i32[3]
	case SHADERTEMPLATE_STRIDEMIX_STD140:
		return string(
		"\n"//strutNestedIn {b8, b32, v2b8[11], b32[11]}
		"OpDecorate %v2b8NestedArr11${InOut} ArrayStride 16\n"	//v2b8[11]
		"OpDecorate %b32NestedArr11${InOut} ArrayStride 16\n"	//b32[11]
		"OpMemberDecorate %sNested${InOut} 0 Offset 0\n"		//b8
		"OpMemberDecorate %sNested${InOut} 1 Offset 4\n"		//b32
		"OpMemberDecorate %sNested${InOut} 2 Offset 16\n"		//v2b8[11]
		"OpMemberDecorate %sNested${InOut} 3 Offset 192\n"		//b32[11]
		"OpDecorate %sNestedArr11${InOut} ArrayStride 368\n"	//strutNestedIn[11]
		"\n"//strutIn {b8, b32, v2b8, v2b32, v3b8, v3b32, v4b8, v4b32, strutNestedIn[11], b8In[11], b32bIn[11]}
		"OpDecorate %sb8Arr11${InOut} ArrayStride 16\n"			//b8In[11]
		"OpDecorate %sb32Arr11${InOut} ArrayStride 16\n"		//b32bIn[11]
		"OpMemberDecorate %struct${InOut} 0 Offset 0\n"			//b8
		"OpMemberDecorate %struct${InOut} 1 Offset 4\n"			//b32
		"OpMemberDecorate %struct${InOut} 2 Offset 8\n"			//v2b8
		"OpMemberDecorate %struct${InOut} 3 Offset 16\n"		//v2b32
		"OpMemberDecorate %struct${InOut} 4 Offset 24\n"		//v3b8
		"OpMemberDecorate %struct${InOut} 5 Offset 32\n"		//v3b32
		"OpMemberDecorate %struct${InOut} 6 Offset 48\n"		//v4b8
		"OpMemberDecorate %struct${InOut} 7 Offset 64\n"		//v4b32
		"OpMemberDecorate %struct${InOut} 8 Offset 80\n"		//strutNestedIn[11]
		"OpMemberDecorate %struct${InOut} 9 Offset 4128\n"		//b8In[11]
		"OpMemberDecorate %struct${InOut} 10 Offset 4304\n"		//b32bIn[11]
		"OpDecorate %structArr7${InOut} ArrayStride 4480\n");	//strutIn[7]
	case SHADERTEMPLATE_STRIDEMIX_STD430:
		return string(
		"\n"//strutNestedOut {b8, b32, v2b8[11], b32[11]}
		"OpDecorate %v2b8NestedArr11${InOut} ArrayStride 2\n"	//v2b8[11]
		"OpDecorate %b32NestedArr11${InOut}  ArrayStride 4\n"	//b32[11]
		"OpMemberDecorate %sNested${InOut} 0 Offset 0\n"		//b8
		"OpMemberDecorate %sNested${InOut} 1 Offset 4\n"		//b32
		"OpMemberDecorate %sNested${InOut} 2 Offset 8\n"		//v2b8[11]
		"OpMemberDecorate %sNested${InOut} 3 Offset 32\n"		//b32[11]
		"OpDecorate %sNestedArr11${InOut} ArrayStride 76\n"		//strutNestedOut[11]
		"\n"//strutOut {b8, b32, v2b8, v2b32, v3b8, v3b32, v4b8, v4b32, strutNestedOut[11], b8Out[11], b32bOut[11]}
		"OpDecorate %sb8Arr11${InOut} ArrayStride 1\n"			//b8Out[11]
		"OpDecorate %sb32Arr11${InOut} ArrayStride 4\n"			//b32bOut[11]
		"OpMemberDecorate %struct${InOut} 0 Offset 0\n"			//b8
		"OpMemberDecorate %struct${InOut} 1 Offset 4\n"			//b32
		"OpMemberDecorate %struct${InOut} 2 Offset 8\n"			//v2b8
		"OpMemberDecorate %struct${InOut} 3 Offset 16\n"		//v2b32
		"OpMemberDecorate %struct${InOut} 4 Offset 24\n"		//v3b8
		"OpMemberDecorate %struct${InOut} 5 Offset 32\n"		//v3b32
		"OpMemberDecorate %struct${InOut} 6 Offset 48\n"		//v4b8
		"OpMemberDecorate %struct${InOut} 7 Offset 64\n"		//v4b32
		"OpMemberDecorate %struct${InOut} 8 Offset 80\n"		//strutNestedOut[11]
		"OpMemberDecorate %struct${InOut} 9 Offset 916\n"		//b8Out[11]
		"OpMemberDecorate %struct${InOut} 10 Offset 928\n"		//b32bOut[11]
		"OpDecorate %structArr7${InOut} ArrayStride 976\n");	//strutOut[7]
	default:
		DE_ASSERT(0);
		return string("");
	}
}
/*Return string contains spirv loop begin.
 the spec should contains "exeCount" - with name of const i32, it is number of executions
 the spec should contains "loopName" - suffix for all local names
 %Val${loopName} - index which can be used inside loop
 "%ndxArr${loopName}   = OpVariable %fp_i32  Function\n" - has to be defined outside
 The function should be always use with endLoop function*/
std::string beginLoop(const std::map<std::string, std::string>& spec)
{
	const tcu::StringTemplate	loopBegin	(
	"OpStore %ndxArr${loopName} %zero\n"
	"OpBranch %Loop${loopName}\n"
	"%Loop${loopName} = OpLabel\n"
	"OpLoopMerge %MergeLabel1${loopName} %MergeLabel2${loopName} None\n"
	"OpBranch %Label1${loopName}\n"
	"%Label1${loopName} = OpLabel\n"
	"%Val${loopName} = OpLoad %i32 %ndxArr${loopName}\n"
	"%LessThan${loopName} = OpSLessThan %bool %Val${loopName} %${exeCount}\n"
	"OpBranchConditional %LessThan${loopName} %ifLabel${loopName} %MergeLabel1${loopName}\n"
	"%ifLabel${loopName} = OpLabel\n");
	return loopBegin.specialize(spec);
}
/*Return string contains spirv loop end.
 the spec should contains "loopName" - suffix for all local names, suffix should be the same in beginLoop
The function should be always use with beginLoop function*/
std::string endLoop(const std::map<std::string, std::string>& spec)
{
	const tcu::StringTemplate	loopEnd	(
	"OpBranch %MergeLabel2${loopName}\n"
	"%MergeLabel2${loopName} = OpLabel\n"
	"%plusOne${loopName} = OpIAdd %i32 %Val${loopName} %c_i32_1\n"
	"OpStore %ndxArr${loopName} %plusOne${loopName}\n"
	"OpBranch %Loop${loopName}\n"
	"%MergeLabel1${loopName} = OpLabel\n");
	return loopEnd.specialize(spec);
}

void addCompute8bitStorage32To8Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 128;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %SSBO32 Block\n"
		"OpDecorate %SSBO8 Block\n"
		"OpMemberDecorate %SSBO32 0 Offset 0\n"
		"OpMemberDecorate %SSBO8 0 Offset 0\n"
		"OpDecorate %ssbo32 DescriptorSet 0\n"
		"OpDecorate %ssbo8 DescriptorSet 0\n"
		"OpDecorate %ssbo32 Binding 0\n"
		"OpDecorate %ssbo8 Binding 1\n"

		"${matrix_decor:opt}\n"

		"${rounding:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%u32       = OpTypeInt 32 0\n"
		"%i32       = OpTypeInt 32 1\n"
		"%f32       = OpTypeFloat 32\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%fvec3     = OpTypeVector %f32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"
		"%i32ptr    = OpTypePointer StorageBuffer %i32\n"
		"%f32ptr    = OpTypePointer StorageBuffer %f32\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"
		"%c_i32_128 = OpConstant %i32 128\n"

		"%i32arr    = OpTypeArray %i32 %c_i32_128\n"
		"%f32arr    = OpTypeArray %f32 %c_i32_128\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%SSBO32    = OpTypeStruct %${matrix_prefix:opt}${base32}arr\n"
		"%SSBO8    = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%up_SSBO32 = OpTypePointer ${storage} %SSBO32\n"
		"%up_SSBO8 = OpTypePointer ${storage} %SSBO8\n"
		"%ssbo32    = OpVariable %up_SSBO32 ${storage}\n"
		"%ssbo8    = OpVariable %up_SSBO8 ${storage}\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base32}ptr %ssbo32 %zero %x ${index0:opt}\n"
		"%val32     = OpLoad %${base32} %inloc\n"
		"%val8     = ${convert} %${base8} %val32\n"
		"%outloc    = OpAccessChain %${base8}ptr %ssbo8 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val8\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	{  // Integers
		const char		sintTypes[]	=
			"%i8       = OpTypeInt 8 1\n"
			"%i8ptr    = OpTypePointer StorageBuffer %i8\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_128\n"
			"%v2i8     = OpTypeVector %i8 2\n"
			"%v4i8     = OpTypeVector %i8 4\n"
			"%v2i32    = OpTypeVector %i32 2\n"
			"%v4i32    = OpTypeVector %i32 4\n"
			"%v2i8ptr  = OpTypePointer StorageBuffer %v2i8\n"
			"%v2i32ptr = OpTypePointer StorageBuffer %v2i32\n"
			"%v2i8arr  = OpTypeArray %v2i8 %c_i32_64\n"
			"%v2i32arr = OpTypeArray %v2i32 %c_i32_64\n";

		const char		uintTypes[]	=
			"%u8       = OpTypeInt 8 0\n"
			"%u8ptr    = OpTypePointer StorageBuffer %u8\n"
			"%u32ptr   = OpTypePointer StorageBuffer %u32\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_128\n"
			"%u32arr   = OpTypeArray %u32 %c_i32_128\n"
			"%v2u8     = OpTypeVector %u8 2\n"
			"%v2u32    = OpTypeVector %u32 2\n"
			"%v4u32    = OpTypeVector %u32 4\n"
			"%v2u8ptr  = OpTypePointer StorageBuffer %v2u8\n"
			"%v2u32ptr = OpTypePointer StorageBuffer %v2u32\n"
			"%v2u8arr  = OpTypeArray %v2u8 %c_i32_64\n"
			"%v2u32arr = OpTypeArray %v2u32 %c_i32_64\n";

		struct CompositeType
		{
			const char*	name;
			const char* types;
			const char*	base32;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			unsigned	count;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	sintTypes,	"i32",		"i8",	"OpSConvert",	"OpDecorate %i32arr ArrayStride 4\nOpDecorate %i8arr ArrayStride 1\n",				numElements},
			{"scalar_uint",	uintTypes,	"u32",		"u8",	"OpUConvert",	"OpDecorate %u32arr ArrayStride 4\nOpDecorate %u8arr ArrayStride 1\n",				numElements},
			{"vector_sint",	sintTypes,	"v2i32",	"v2i8",	"OpSConvert",	"OpDecorate %v2i32arr ArrayStride 8\nOpDecorate %v2i8arr ArrayStride 2\n",			numElements / 2},
			{"vector_uint",	uintTypes,	"v2u32",	"v2u8",	"OpUConvert",	"OpDecorate %v2u32arr ArrayStride 8\nOpDecorate %v2u8arr ArrayStride 2\n",			numElements / 2},
		};

		vector<deInt32>	inputs			= getInt32s(rnd, numElements);
		vector<deInt8> outputs			(inputs.size());

		for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
			outputs[numNdx] = (static_cast<deInt8>(0xff & inputs[numNdx]));

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			string					testName	= string(CAPABILITIES[STORAGE_BUFFER_TEST].name) + "_" + cTypes[tyIdx].name;

			specs["capability"]		= CAPABILITIES[STORAGE_BUFFER_TEST].cap;
			specs["storage"]		= CAPABILITIES[STORAGE_BUFFER_TEST].decor;
			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base32"]			= cTypes[tyIdx].base32;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(cTypes[tyIdx].count, 1, 1);

			spec.inputs.push_back(Resource(BufferSp(new Int32Buffer(inputs)), CAPABILITIES[STORAGE_BUFFER_TEST].dtype));
			spec.outputs.push_back(Resource(BufferSp(new Int8Buffer(outputs))));
			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[STORAGE_BUFFER_TEST].name);

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
		}
	}
}

void addCompute8bitUniform8To32Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx				= group->getTestContext();
	de::Random						rnd					(deStringHash(group->getName()));
	const int						numElements			= 128;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %SSBO32 Block\n"
		"OpDecorate %SSBO8 Block\n"
		"OpMemberDecorate %SSBO32 0 Offset 0\n"
		"OpMemberDecorate %SSBO8 0 Offset 0\n"
		"OpDecorate %SSBO8 ${storage}\n"
		"OpDecorate %ssbo32 DescriptorSet 0\n"
		"OpDecorate %ssbo8 DescriptorSet 0\n"
		"OpDecorate %ssbo32 Binding 1\n"
		"OpDecorate %ssbo8 Binding 0\n"

		"${matrix_decor:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%u32       = OpTypeInt 32 0\n"
		"%i32       = OpTypeInt 32 1\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"
		"%i32ptr    = OpTypePointer StorageBuffer %i32\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_2   = OpConstant %i32 2\n"
		"%c_i32_3   = OpConstant %i32 3\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"
		"%c_i32_128 = OpConstant %i32 128\n"

		"%i32arr    = OpTypeArray %i32 %c_i32_128\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%SSBO32    = OpTypeStruct %${matrix_prefix:opt}${base32}arr\n"
		"%SSBO8    = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
		"%up_SSBO8 = OpTypePointer Uniform %SSBO8\n"
		"%ssbo32    = OpVariable %up_SSBO32 StorageBuffer\n"
		"%ssbo8    = OpVariable %up_SSBO8 Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base8}ptr %ssbo8 %zero %x ${index0:opt}\n"
		"%val8     = OpLoad %${base8} %inloc\n"
		"%val32     = ${convert} %${base32} %val8\n"
		"%outloc    = OpAccessChain %${base32}ptr %ssbo32 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val32\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");


	{  // Integers
		const char		sintTypes[]		=
			"%i8       = OpTypeInt 8 1\n"
			"%i8ptr    = OpTypePointer Uniform %i8\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_128\n"
			"%v4i8     = OpTypeVector %i8 4\n"
			"%v4i32     = OpTypeVector %i32 4\n"
			"%v4i8ptr  = OpTypePointer Uniform %v4i8\n"
			"%v4i32ptr  = OpTypePointer StorageBuffer %v4i32\n"
			"%v4i8arr  = OpTypeArray %v4i8 %c_i32_32\n"
			"%v4i32arr  = OpTypeArray %v4i32 %c_i32_32\n";

		const char		uintTypes[]		=
			"%u8       = OpTypeInt 8 0\n"
			"%u8ptr    = OpTypePointer Uniform %u8\n"
			"%u32ptr    = OpTypePointer StorageBuffer %u32\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_128\n"
			"%u32arr    = OpTypeArray %u32 %c_i32_128\n"
			"%v4u8     = OpTypeVector %u8 4\n"
			"%v4u32     = OpTypeVector %u32 4\n"
			"%v4u8ptr  = OpTypePointer Uniform %v4u8\n"
			"%v4u32ptr  = OpTypePointer StorageBuffer %v4u32\n"
			"%v4u8arr  = OpTypeArray %v4u8 %c_i32_32\n"
			"%v4u32arr  = OpTypeArray %v4u32 %c_i32_32\n";

		struct CompositeType
		{
			const char*	name;
			const char* types;
			const char*	base32;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			const int	componentsCount;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	sintTypes,	"i32",		"i8",	"OpSConvert",	"OpDecorate %i32arr ArrayStride 4\nOpDecorate %i8arr ArrayStride 16\n",			1},
			{"scalar_uint",	uintTypes,	"u32",		"u8",	"OpUConvert",	"OpDecorate %u32arr ArrayStride 4\nOpDecorate %u8arr ArrayStride 16\n",			1},
			{"vector_sint",	sintTypes,	"v4i32",	"v4i8",	"OpSConvert",	"OpDecorate %v4i32arr ArrayStride 16\nOpDecorate %v4i8arr ArrayStride 16\n",	4},
			{"vector_uint",	uintTypes,	"v4u32",	"v4u8",	"OpUConvert",	"OpDecorate %v4u32arr ArrayStride 16\nOpDecorate %v4u8arr ArrayStride 16\n",	4},
		};

		vector<deInt32> outputs(numElements);

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			string					testName	= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + cTypes[tyIdx].name;

			vector<deInt8>	inputs = getInt8s(rnd, (arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt8))) * (numElements / cTypes[tyIdx].componentsCount));

			specs["capability"]		= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
			specs["storage"]		= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].decor;
			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base32"]			= cTypes[tyIdx].base32;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(numElements / cTypes[tyIdx].componentsCount, 1, 1);

			spec.inputs.push_back(Resource(BufferSp(new Int8Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
			spec.outputs.push_back(Resource(BufferSp(new Int32Buffer(outputs))));

			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);

			if (cTypes[tyIdx].componentsCount == 4)
				spec.verifyIO = checkUniformsArray<deInt8, deInt32, 4>;
			else
				spec.verifyIO = checkUniformsArray<deInt8, deInt32, 1>;

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
		}
	}
}

void addCompute8bitStoragePushConstant8To32Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 64;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability StoragePushConstant8\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %PC8 Block\n"
		"OpDecorate %SSBO32 Block\n"
		"OpMemberDecorate %PC8 0 Offset 0\n"
		"OpMemberDecorate %SSBO32 0 Offset 0\n"
		"OpDecorate %ssbo32 DescriptorSet 0\n"
		"OpDecorate %ssbo32 Binding 0\n"

		"${matrix_decor:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%u32       = OpTypeInt 32 0\n"
		"%i32       = OpTypeInt 32 1\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"
		"%i32ptr    = OpTypePointer StorageBuffer %i32\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_8   = OpConstant %i32 8\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"

		"%i32arr    = OpTypeArray %i32 %c_i32_64\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%PC8      = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%pp_PC8   = OpTypePointer PushConstant %PC8\n"
		"%pc8      = OpVariable %pp_PC8 PushConstant\n"
		"%SSBO32    = OpTypeStruct %${matrix_prefix:opt}${base32}arr\n"
		"%up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
		"%ssbo32    = OpVariable %up_SSBO32 StorageBuffer\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base8}ptr %pc8 %zero %x ${index0:opt}\n"
		"%val8     = OpLoad %${base8} %inloc\n"
		"%val32     = ${convert} %${base32} %val8\n"
		"%outloc    = OpAccessChain %${base32}ptr %ssbo32 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val32\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	{  // integers
		const char		sintTypes[]		=
			"%i8       = OpTypeInt 8 1\n"
			"%i8ptr    = OpTypePointer PushConstant %i8\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_64\n"
			"%v2i8     = OpTypeVector %i8 2\n"
			"%v2i32     = OpTypeVector %i32 2\n"
			"%v2i8ptr  = OpTypePointer PushConstant %v2i8\n"
			"%v2i32ptr  = OpTypePointer StorageBuffer %v2i32\n"
			"%v2i8arr  = OpTypeArray %v2i8 %c_i32_32\n"
			"%v2i32arr  = OpTypeArray %v2i32 %c_i32_32\n";

		const char		uintTypes[]		=
			"%u8       = OpTypeInt 8 0\n"
			"%u8ptr    = OpTypePointer PushConstant %u8\n"
			"%u32ptr    = OpTypePointer StorageBuffer %u32\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_64\n"
			"%u32arr    = OpTypeArray %u32 %c_i32_64\n"
			"%v2u8     = OpTypeVector %u8 2\n"
			"%v2u32     = OpTypeVector %u32 2\n"
			"%v2u8ptr  = OpTypePointer PushConstant %v2u8\n"
			"%v2u32ptr  = OpTypePointer StorageBuffer %v2u32\n"
			"%v2u8arr  = OpTypeArray %v2u8 %c_i32_32\n"
			"%v2u32arr  = OpTypeArray %v2u32 %c_i32_32\n";

		struct CompositeType
		{
			const char*	name;
			bool		isSigned;
			const char* types;
			const char*	base32;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			unsigned	count;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	true,	sintTypes,	"i32",		"i8",	"OpSConvert",	"OpDecorate %i32arr ArrayStride 4\nOpDecorate %i8arr ArrayStride 1\n",		numElements},
			{"scalar_uint",	false,	uintTypes,	"u32",		"u8",	"OpUConvert",	"OpDecorate %u32arr ArrayStride 4\nOpDecorate %u8arr ArrayStride 1\n",		numElements},
			{"vector_sint",	true,	sintTypes,	"v2i32",	"v2i8",	"OpSConvert",	"OpDecorate %v2i32arr ArrayStride 8\nOpDecorate %v2i8arr ArrayStride 2\n",	numElements / 2},
			{"vector_uint",	false,	uintTypes,	"v2u32",	"v2u8",	"OpUConvert",	"OpDecorate %v2u32arr ArrayStride 8\nOpDecorate %v2u8arr ArrayStride 2\n",	numElements / 2},
		};

		vector<deInt8>	inputs			= getInt8s(rnd, numElements);
		vector<deInt32> sOutputs;
		vector<deInt32> uOutputs;
		const deUint8	signBitMask		= 0x80;
		const deUint32	signExtendMask	= 0xffff0000;

		sOutputs.reserve(inputs.size());
		uOutputs.reserve(inputs.size());

		for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
		{
			uOutputs.push_back(static_cast<deUint8>(inputs[numNdx]));
			if (inputs[numNdx] & signBitMask)
				sOutputs.push_back(static_cast<deInt32>(inputs[numNdx] | signExtendMask));
			else
				sOutputs.push_back(static_cast<deInt32>(inputs[numNdx]));
		}

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			const char*				testName	= cTypes[tyIdx].name;

			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base32"]			= cTypes[tyIdx].base32;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(cTypes[tyIdx].count, 1, 1);
			spec.pushConstants		= BufferSp(new Int8Buffer(inputs));

			if (cTypes[tyIdx].isSigned)
				spec.outputs.push_back(BufferSp(new Int32Buffer(sOutputs)));
			else
				spec.outputs.push_back(BufferSp(new Int32Buffer(uOutputs)));
			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName, testName, spec));
		}
	}
}

void addCompute8bitStorage16To8Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 128;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpCapability StorageUniform16\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %SSBO16 Block\n"
		"OpDecorate %SSBO8 Block\n"
		"OpMemberDecorate %SSBO16 0 Offset 0\n"
		"OpMemberDecorate %SSBO8 0 Offset 0\n"
		"OpDecorate %ssbo16 DescriptorSet 0\n"
		"OpDecorate %ssbo8 DescriptorSet 0\n"
		"OpDecorate %ssbo16 Binding 0\n"
		"OpDecorate %ssbo8 Binding 1\n"

		"${matrix_decor:opt}\n"

		"${rounding:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%i32       = OpTypeInt 32 1\n"
		"%u32       = OpTypeInt 32 0\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"
		"%c_i32_128 = OpConstant %i32 128\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%SSBO16    = OpTypeStruct %${matrix_prefix:opt}${base16}arr\n"
		"%SSBO8     = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%up_SSBO16 = OpTypePointer ${storage} %SSBO16\n"
		"%up_SSBO8  = OpTypePointer ${storage} %SSBO8\n"
		"%ssbo16    = OpVariable %up_SSBO16 ${storage}\n"
		"%ssbo8     = OpVariable %up_SSBO8 ${storage}\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base16}ptr %ssbo16 %zero %x ${index0:opt}\n"
		"%val16     = OpLoad %${base16} %inloc\n"
		"%val8      = ${convert} %${base8} %val16\n"
		"%outloc    = OpAccessChain %${base8}ptr %ssbo8 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val8\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	{  // Integers
		const char		sintTypes[]	=
			"%i8       = OpTypeInt 8 1\n"
			"%i16      = OpTypeInt 16 1\n"
			"%i8ptr    = OpTypePointer StorageBuffer %i8\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_128\n"
			"%i16arr   = OpTypeArray %i16 %c_i32_128\n"
			"%v2i8     = OpTypeVector %i8 2\n"
			"%v2i16    = OpTypeVector %i16 2\n"
			"%v2i8ptr  = OpTypePointer StorageBuffer %v2i8\n"
			"%v2i16ptr = OpTypePointer StorageBuffer %v2i16\n"
			"%v2i8arr  = OpTypeArray %v2i8 %c_i32_64\n"
			"%v2i16arr = OpTypeArray %v2i16 %c_i32_64\n"
			"%i16ptr   = OpTypePointer StorageBuffer %i16\n";

		const char		uintTypes[]	=
			"%u8       = OpTypeInt 8 0\n"
			"%u16      = OpTypeInt 16 0\n"
			"%u8ptr    = OpTypePointer StorageBuffer %u8\n"
			"%u16ptr   = OpTypePointer StorageBuffer %u16\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_128\n"
			"%u16arr   = OpTypeArray %u16 %c_i32_128\n"
			"%v2u8     = OpTypeVector %u8 2\n"
			"%v2u16    = OpTypeVector %u16 2\n"
			"%v2u8ptr  = OpTypePointer StorageBuffer %v2u8\n"
			"%v2u16ptr = OpTypePointer StorageBuffer %v2u16\n"
			"%v2u8arr  = OpTypeArray %v2u8 %c_i32_64\n"
			"%v2u16arr = OpTypeArray %v2u16 %c_i32_64\n";

		struct CompositeType
		{
			const char*	name;
			const char* types;
			const char*	base16;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			unsigned	count;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	sintTypes,	"i16",		"i8",		"OpSConvert",	"OpDecorate %i16arr ArrayStride 2\nOpDecorate %i8arr ArrayStride 1\n",		numElements},
			{"scalar_uint",	uintTypes,	"u16",		"u8",		"OpUConvert",	"OpDecorate %u16arr ArrayStride 2\nOpDecorate %u8arr ArrayStride 1\n",		numElements},
			{"vector_sint",	sintTypes,	"v2i16",	"v2i8",		"OpSConvert",	"OpDecorate %v2i16arr ArrayStride 4\nOpDecorate %v2i8arr ArrayStride 2\n",	numElements / 2},
			{"vector_uint",	uintTypes,	"v2u16",	"v2u8",		"OpUConvert",	"OpDecorate %v2u16arr ArrayStride 4\nOpDecorate %v2u8arr ArrayStride 2\n",	numElements / 2},
		};

		vector<deInt16>	inputs			= getInt16s(rnd, numElements);
		vector<deInt8> outputs;

		outputs.reserve(inputs.size());
		for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
			outputs.push_back(static_cast<deInt8>(0xff & inputs[numNdx]));

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			string					testName	= string(CAPABILITIES[STORAGE_BUFFER_TEST].name) + "_" + cTypes[tyIdx].name;

			specs["capability"]		= CAPABILITIES[STORAGE_BUFFER_TEST].cap;
			specs["storage"]		= CAPABILITIES[STORAGE_BUFFER_TEST].decor;
			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base16"]			= cTypes[tyIdx].base16;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(cTypes[tyIdx].count, 1, 1);

			spec.inputs.push_back(Resource(BufferSp(new Int16Buffer(inputs)), CAPABILITIES[STORAGE_BUFFER_TEST].dtype));
			spec.outputs.push_back(Resource(BufferSp(new Int8Buffer(outputs))));
			spec.extensions.push_back("VK_KHR_16bit_storage");
			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[STORAGE_BUFFER_TEST].name);
			spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
		}
	}
}

void addCompute8bitUniform8To16Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 128;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpCapability StorageUniform16\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %SSBO16 Block\n"
		"OpDecorate %SSBO8 Block\n"
		"OpMemberDecorate %SSBO16 0 Offset 0\n"
		"OpMemberDecorate %SSBO8 0 Offset 0\n"
		"OpDecorate %SSBO8 ${storage}\n"
		"OpDecorate %ssbo16 DescriptorSet 0\n"
		"OpDecorate %ssbo8 DescriptorSet 0\n"
		"OpDecorate %ssbo16 Binding 1\n"
		"OpDecorate %ssbo8 Binding 0\n"

		"${matrix_decor:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"

		"%i32       = OpTypeInt 32 1\n"
		"%u32       = OpTypeInt 32 0\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_2   = OpConstant %i32 2\n"
		"%c_i32_3   = OpConstant %i32 3\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"
		"%c_i32_128 = OpConstant %i32 128\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%SSBO16    = OpTypeStruct %${matrix_prefix:opt}${base16}arr\n"
		"%SSBO8    = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%up_SSBO16 = OpTypePointer StorageBuffer %SSBO16\n"
		"%up_SSBO8 = OpTypePointer Uniform %SSBO8\n"
		"%ssbo16    = OpVariable %up_SSBO16 StorageBuffer\n"
		"%ssbo8    = OpVariable %up_SSBO8 Uniform\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base8}ptr %ssbo8 %zero %x ${index0:opt}\n"
		"%val8     = OpLoad %${base8} %inloc\n"
		"%val16     = ${convert} %${base16} %val8\n"
		"%outloc    = OpAccessChain %${base16}ptr %ssbo16 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val16\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");


	{  // Integers
		const char		sintTypes[]		=
			"%i8       = OpTypeInt 8 1\n"
			"%i16      = OpTypeInt 16 1\n"
			"%i8ptr    = OpTypePointer Uniform %i8\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_128\n"
			"%i16arr    = OpTypeArray %i16 %c_i32_128\n"
			"%i16ptr   = OpTypePointer StorageBuffer %i16\n"
			"%v4i8     = OpTypeVector %i8 4\n"
			"%v4i16    = OpTypeVector %i16 4\n"
			"%v4i8ptr  = OpTypePointer Uniform %v4i8\n"
			"%v4i16ptr = OpTypePointer StorageBuffer %v4i16\n"
			"%v4i8arr  = OpTypeArray %v4i8 %c_i32_32\n"
			"%v4i16arr = OpTypeArray %v4i16 %c_i32_32\n";

		const char		uintTypes[]		=
			"%u8       = OpTypeInt 8 0\n"
			"%u16      = OpTypeInt 16 0\n"
			"%u8ptr    = OpTypePointer Uniform %u8\n"
			"%u16ptr   = OpTypePointer StorageBuffer %u16\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_128\n"
			"%u16arr   = OpTypeArray %u16 %c_i32_128\n"
			"%v4u8     = OpTypeVector %u8 4\n"
			"%v4u16    = OpTypeVector %u16 4\n"
			"%v4u8ptr  = OpTypePointer Uniform %v4u8\n"
			"%v4u16ptr = OpTypePointer StorageBuffer %v4u16\n"
			"%v4u8arr  = OpTypeArray %v4u8 %c_i32_32\n"
			"%v4u16arr = OpTypeArray %v4u16 %c_i32_32\n";

		struct CompositeType
		{
			const char*	name;
			const char* types;
			const char*	base16;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			const int	componentsCount;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	sintTypes,	"i16",		"i8",	"OpSConvert",	"OpDecorate %i16arr ArrayStride 2\nOpDecorate %i8arr ArrayStride 16\n",			1},
			{"scalar_uint",	uintTypes,	"u16",		"u8",	"OpUConvert",	"OpDecorate %u16arr ArrayStride 2\nOpDecorate %u8arr ArrayStride 16\n",			1},
			{"vector_sint",	sintTypes,	"v4i16",	"v4i8",	"OpSConvert",	"OpDecorate %v4i16arr ArrayStride 8\nOpDecorate %v4i8arr ArrayStride 16\n",	4},
			{"vector_uint",	uintTypes,	"v4u16",	"v4u8",	"OpUConvert",	"OpDecorate %v4u16arr ArrayStride 8\nOpDecorate %v4u8arr ArrayStride 16\n",	4},
		};

		vector<deInt16> outputs(numElements);

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			string					testName	= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + cTypes[tyIdx].name;

			vector<deInt8>			inputs		= getInt8s(rnd, (arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt8))) * (numElements / cTypes[tyIdx].componentsCount));

			specs["capability"]		= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
			specs["storage"]		= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].decor;
			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base16"]			= cTypes[tyIdx].base16;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(numElements / cTypes[tyIdx].componentsCount, 1, 1);

			spec.inputs.push_back(Resource(BufferSp(new Int8Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
			spec.outputs.push_back(Resource(BufferSp(new Int16Buffer(outputs))));
			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_16bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
			spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;

			if (cTypes[tyIdx].componentsCount == 4)
				spec.verifyIO = checkUniformsArray<deInt8, deInt16, 4>;
			else
				spec.verifyIO = checkUniformsArray<deInt8, deInt16, 1>;

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
		}
	}
}

void addCompute8bitStoragePushConstant8To16Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const int						numElements		= 64;

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability StorageUniform16\n"
		"OpCapability StoragePushConstant8\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"

		"${stride}"

		"OpDecorate %PC8 Block\n"
		"OpDecorate %SSBO16 Block\n"
		"OpMemberDecorate %PC8 0 Offset 0\n"
		"OpMemberDecorate %SSBO16 0 Offset 0\n"
		"OpDecorate %ssbo16 DescriptorSet 0\n"
		"OpDecorate %ssbo16 Binding 0\n"

		"${matrix_decor:opt}\n"

		"%bool      = OpTypeBool\n"
		"%void      = OpTypeVoid\n"
		"%voidf     = OpTypeFunction %void\n"
		"%i32       = OpTypeInt 32 1\n"
		"%u32       = OpTypeInt 32 0\n"
		"%uvec3     = OpTypeVector %u32 3\n"
		"%uvec3ptr  = OpTypePointer Input %uvec3\n"

		"%zero      = OpConstant %i32 0\n"
		"%c_i32_1   = OpConstant %i32 1\n"
		"%c_i32_8   = OpConstant %i32 8\n"
		"%c_i32_16  = OpConstant %i32 16\n"
		"%c_i32_32  = OpConstant %i32 32\n"
		"%c_i32_64  = OpConstant %i32 64\n"

		"${types}\n"
		"${matrix_types:opt}\n"

		"%PC8       = OpTypeStruct %${matrix_prefix:opt}${base8}arr\n"
		"%pp_PC8    = OpTypePointer PushConstant %PC8\n"
		"%pc8       = OpVariable %pp_PC8 PushConstant\n"
		"%SSBO16    = OpTypeStruct %${matrix_prefix:opt}${base16}arr\n"
		"%up_SSBO16 = OpTypePointer StorageBuffer %SSBO16\n"
		"%ssbo16    = OpVariable %up_SSBO16 StorageBuffer\n"

		"%id        = OpVariable %uvec3ptr Input\n"

		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%inloc     = OpAccessChain %${base8}ptr %pc8 %zero %x ${index0:opt}\n"
		"%val8      = OpLoad %${base8} %inloc\n"
		"%val16     = ${convert} %${base16} %val8\n"
		"%outloc    = OpAccessChain %${base16}ptr %ssbo16 %zero %x ${index0:opt}\n"
		"             OpStore %outloc %val16\n"
		"${matrix_store:opt}\n"
		"             OpReturn\n"
		"             OpFunctionEnd\n");

	{  // integers
		const char		sintTypes[]		=
			"%i8       = OpTypeInt 8 1\n"
			"%i16      = OpTypeInt 16 1\n"
			"%i8ptr    = OpTypePointer PushConstant %i8\n"
			"%i16ptr   = OpTypePointer StorageBuffer %i16\n"
			"%i8arr    = OpTypeArray %i8 %c_i32_64\n"
			"%i16arr   = OpTypeArray %i16 %c_i32_64\n"
			"%v2i8     = OpTypeVector %i8 2\n"
			"%v2i16    = OpTypeVector %i16 2\n"
			"%v2i8ptr  = OpTypePointer PushConstant %v2i8\n"
			"%v2i16ptr = OpTypePointer StorageBuffer %v2i16\n"
			"%v2i8arr  = OpTypeArray %v2i8 %c_i32_32\n"
			"%v2i16arr = OpTypeArray %v2i16 %c_i32_32\n";

		const char		uintTypes[]		=
			"%u8       = OpTypeInt 8 0\n"
			"%u16      = OpTypeInt 16 0\n"
			"%u8ptr    = OpTypePointer PushConstant %u8\n"
			"%u16ptr   = OpTypePointer StorageBuffer %u16\n"
			"%u8arr    = OpTypeArray %u8 %c_i32_64\n"
			"%u16arr   = OpTypeArray %u16 %c_i32_64\n"
			"%v2u8     = OpTypeVector %u8 2\n"
			"%v2u16    = OpTypeVector %u16 2\n"
			"%v2u8ptr  = OpTypePointer PushConstant %v2u8\n"
			"%v2u16ptr = OpTypePointer StorageBuffer %v2u16\n"
			"%v2u8arr  = OpTypeArray %v2u8 %c_i32_32\n"
			"%v2u16arr = OpTypeArray %v2u16 %c_i32_32\n";

		struct CompositeType
		{
			const char*	name;
			bool		isSigned;
			const char* types;
			const char*	base16;
			const char*	base8;
			const char* opcode;
			const char*	stride;
			unsigned	count;
		};

		const CompositeType	cTypes[]	=
		{
			{"scalar_sint",	true,	sintTypes,	"i16",		"i8",		"OpSConvert",	"OpDecorate %i16arr ArrayStride 2\nOpDecorate %i8arr ArrayStride 1\n",		numElements},
			{"scalar_uint",	false,	uintTypes,	"u16",		"u8",		"OpUConvert",	"OpDecorate %u16arr ArrayStride 2\nOpDecorate %u8arr ArrayStride 1\n",		numElements},
			{"vector_sint",	true,	sintTypes,	"v2i16",	"v2i8",		"OpSConvert",	"OpDecorate %v2i16arr ArrayStride 4\nOpDecorate %v2i8arr ArrayStride 2\n",	numElements / 2},
			{"vector_uint",	false,	uintTypes,	"v2u16",	"v2u8",		"OpUConvert",	"OpDecorate %v2u16arr ArrayStride 4\nOpDecorate %v2u8arr ArrayStride 2\n",	numElements / 2},
		};

		vector<deInt8>	inputs			= getInt8s(rnd, numElements);
		vector<deInt16> sOutputs;
		vector<deInt16> uOutputs;
		const deUint8	signBitMask		= 0x80;
		const deUint16	signExtendMask	= 0xff00;

		sOutputs.reserve(inputs.size());
		uOutputs.reserve(inputs.size());

		for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
		{
			uOutputs.push_back(static_cast<deUint8>(inputs[numNdx]));
			if (inputs[numNdx] & signBitMask)
				sOutputs.push_back(static_cast<deInt16>(inputs[numNdx] | signExtendMask));
			else
				sOutputs.push_back(static_cast<deInt16>(inputs[numNdx]));
		}

		for (deUint32 tyIdx = 0; tyIdx < DE_LENGTH_OF_ARRAY(cTypes); ++tyIdx)
		{
			ComputeShaderSpec		spec;
			map<string, string>		specs;
			const char*				testName	= cTypes[tyIdx].name;

			specs["stride"]			= cTypes[tyIdx].stride;
			specs["base16"]			= cTypes[tyIdx].base16;
			specs["base8"]			= cTypes[tyIdx].base8;
			specs["types"]			= cTypes[tyIdx].types;
			specs["convert"]		= cTypes[tyIdx].opcode;

			spec.assembly			= shaderTemplate.specialize(specs);
			spec.numWorkGroups		= IVec3(cTypes[tyIdx].count, 1, 1);
			spec.pushConstants		= BufferSp(new Int8Buffer(inputs));

			if (cTypes[tyIdx].isSigned)
				spec.outputs.push_back(BufferSp(new Int16Buffer(sOutputs)));
			else
				spec.outputs.push_back(BufferSp(new Int16Buffer(uOutputs)));
			spec.extensions.push_back("VK_KHR_8bit_storage");
			spec.extensions.push_back("VK_KHR_16bit_storage");
			spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
			spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
			spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;

			group->addChild(new SpvAsmComputeShaderCase(testCtx, testName, testName, spec));
		}
	}
}

void addCompute8bitStorageBuffer8To8Group (tcu::TestCaseGroup* group)
{
	tcu::TestContext&		testCtx				= group->getTestContext();
	de::Random				rnd					(deStringHash(group->getName()));
	const int				numElements			= 128;
	const vector<deInt8>	int8Data			= getInt8s(rnd, numElements);
	const vector<deInt8>	int8DummyData		(numElements, 0);
	ComputeShaderSpec		spec;
	std::ostringstream		shaderTemplate;
		shaderTemplate<<"OpCapability Shader\n"
			<< "OpCapability StorageBuffer8BitAccess \n"
			<< "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
			<< "OpExtension \"SPV_KHR_8bit_storage\"\n"
			<< "OpMemoryModel Logical GLSL450\n"
			<< "OpEntryPoint GLCompute %main \"main\" %id\n"
			<< "OpExecutionMode %main LocalSize 1 1 1\n"
			<< "OpDecorate %id BuiltIn GlobalInvocationId\n"
			<< "OpDecorate %i8arr ArrayStride 1\n"
			<< "OpDecorate %SSBO_IN Block\n"
			<< "OpDecorate %SSBO_OUT Block\n"
			<< "OpMemberDecorate %SSBO_IN 0 Coherent\n"
			<< "OpMemberDecorate %SSBO_OUT 0 Coherent\n"
			<< "OpMemberDecorate %SSBO_IN 0 Offset 0\n"
			<< "OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
			<< "OpDecorate %ssboIN DescriptorSet 0\n"
			<< "OpDecorate %ssboOUT DescriptorSet 0\n"
			<< "OpDecorate %ssboIN Binding 0\n"
			<< "OpDecorate %ssboOUT Binding 1\n"
			<< "\n"
			<< "%bool      = OpTypeBool\n"
			<< "%void      = OpTypeVoid\n"
			<< "%voidf     = OpTypeFunction %void\n"
			<< "%u32       = OpTypeInt 32 0\n"
			<< "%i32       = OpTypeInt 32 1\n"
			<< "%uvec3     = OpTypeVector %u32 3\n"
			<< "%uvec3ptr  = OpTypePointer Input %uvec3\n"
			<< "%i8        = OpTypeInt 8 1\n"
			<< "%i8ptr     = OpTypePointer StorageBuffer %i8\n"
			<< "\n"
			<< "%zero      = OpConstant %i32 0\n"
			<< "%c_size    = OpConstant %i32 " << numElements << "\n"
			<< "\n"
			<< "%i8arr     = OpTypeArray %i8 %c_size\n"
			<< "%SSBO_IN   = OpTypeStruct %i8arr\n"
			<< "%SSBO_OUT  = OpTypeStruct %i8arr\n"
			<< "%up_SSBOIN = OpTypePointer StorageBuffer %SSBO_IN\n"
			<< "%up_SSBOOUT = OpTypePointer StorageBuffer %SSBO_OUT\n"
			<< "%ssboIN    = OpVariable %up_SSBOIN StorageBuffer\n"
			<< "%ssboOUT   = OpVariable %up_SSBOOUT StorageBuffer\n"
			<< "\n"
			<< "%id        = OpVariable %uvec3ptr Input\n"
			<< "%main      = OpFunction %void None %voidf\n"
			<< "%label     = OpLabel\n"
			<< "%idval     = OpLoad %uvec3 %id\n"
			<< "%x         = OpCompositeExtract %u32 %idval 0\n"
			<< "%y         = OpCompositeExtract %u32 %idval 1\n"
			<< "\n"
			<< "%inlocx     = OpAccessChain %i8ptr %ssboIN %zero %x \n"
			<< "%valx       = OpLoad %i8 %inlocx\n"
			<< "%outlocx    = OpAccessChain %i8ptr %ssboOUT %zero %x \n"
			<< "             OpStore %outlocx %valx\n"

			<< "%inlocy    = OpAccessChain %i8ptr %ssboIN %zero %y \n"
			<< "%valy      = OpLoad %i8 %inlocy\n"
			<< "%outlocy   = OpAccessChain %i8ptr %ssboOUT %zero %y \n"
			<< "             OpStore %outlocy %valy\n"
			<< "\n"
			<< "             OpReturn\n"
			<< "             OpFunctionEnd\n";

	spec.assembly			= shaderTemplate.str();
	spec.numWorkGroups		= IVec3(numElements, numElements, 1);
	spec.verifyIO			= computeCheckBuffers;
	spec.coherentMemory		= true;
	spec.inputs.push_back(BufferSp(new Int8Buffer(int8Data)));
	spec.outputs.push_back(BufferSp(new Int8Buffer(int8DummyData)));
	spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
	spec.extensions.push_back("VK_KHR_8bit_storage");
	spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;

	group->addChild(new SpvAsmComputeShaderCase(testCtx, "stress_test", "Granularity stress test", spec));
}

void addCompute8bitStorageUniform8StructTo32StructGroup (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));
	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"\n"
		"${stridei8}"
		"\n"
		"${stridei32}"
		"\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %SSBO_IN Block\n"
		"OpDecorate %SSBO_OUT Block\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"OpDecorate %ssboOUT Binding 1\n"
		"\n"
		"%bool     = OpTypeBool\n"
		"%void     = OpTypeVoid\n"
		"%voidf    = OpTypeFunction %void\n"
		"%u32      = OpTypeInt 32 0\n"
		"%uvec3    = OpTypeVector %u32 3\n"
		"%uvec3ptr = OpTypePointer Input %uvec3\n"
		"\n"
		"%i32      = OpTypeInt 32 1\n"
		"%v2i32    = OpTypeVector %i32 2\n"
		"%v3i32    = OpTypeVector %i32 3\n"
		"%v4i32    = OpTypeVector %i32 4\n"
		"\n"
		"%i8       = OpTypeInt 8 1\n"
		"%v2i8     = OpTypeVector %i8 2\n"
		"%v3i8     = OpTypeVector %i8 3\n"
		"%v4i8     = OpTypeVector %i8 4\n"
		"%i8ptr    = OpTypePointer ${8Storage} %i8\n"
		"%v2i8ptr  = OpTypePointer ${8Storage} %v2i8\n"
		"%v3i8ptr  = OpTypePointer ${8Storage} %v3i8\n"
		"%v4i8ptr  = OpTypePointer ${8Storage} %v4i8\n"
		"\n"
		"%i32ptr   = OpTypePointer ${32Storage} %i32\n"
		"%v2i32ptr = OpTypePointer ${32Storage} %v2i32\n"
		"%v3i32ptr = OpTypePointer ${32Storage} %v3i32\n"
		"%v4i32ptr = OpTypePointer ${32Storage} %v4i32\n"
		"\n"
		"%zero = OpConstant %i32 0\n"
		"%c_i32_1 = OpConstant %i32 1\n"
		"%c_i32_2 = OpConstant %i32 2\n"
		"%c_i32_3 = OpConstant %i32 3\n"
		"%c_i32_4 = OpConstant %i32 4\n"
		"%c_i32_5 = OpConstant %i32 5\n"
		"%c_i32_6 = OpConstant %i32 6\n"
		"%c_i32_7 = OpConstant %i32 7\n"
		"%c_i32_8 = OpConstant %i32 8\n"
		"%c_i32_9 = OpConstant %i32 9\n"
		"\n"
		"%c_u32_1 = OpConstant %u32 1\n"
		"%c_u32_3 = OpConstant %u32 3\n"
		"%c_u32_7 = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"
		"%i8arr3       = OpTypeArray %i8 %c_u32_3\n"
		"%v2i8arr3     = OpTypeArray %v2i8 %c_u32_3\n"
		"%v2i8arr11    = OpTypeArray %v2i8 %c_u32_11\n"
		"%v3i8arr11    = OpTypeArray %v3i8 %c_u32_11\n"
		"%v4i8arr3     = OpTypeArray %v4i8 %c_u32_3\n"
		"%struct8      = OpTypeStruct %i8 %v2i8arr3\n"
		"%struct8arr11 = OpTypeArray %struct8 %c_u32_11\n"
		"%i8Struct = OpTypeStruct %i8 %v2i8 %v3i8 %v4i8 %i8arr3 %struct8arr11 %v2i8arr11 %i8 %v3i8arr11 %v4i8arr3\n"
		"\n"
		"%i32arr3       = OpTypeArray %i32 %c_u32_3\n"
		"%v2i32arr3     = OpTypeArray %v2i32 %c_u32_3\n"
		"%v2i32arr11    = OpTypeArray %v2i32 %c_u32_11\n"
		"%v3i32arr11    = OpTypeArray %v3i32 %c_u32_11\n"
		"%v4i32arr3     = OpTypeArray %v4i32 %c_u32_3\n"
		"%struct32      = OpTypeStruct %i32 %v2i32arr3\n"
		"%struct32arr11 = OpTypeArray %struct32 %c_u32_11\n"
		"%i32Struct = OpTypeStruct %i32 %v2i32 %v3i32 %v4i32 %i32arr3 %struct32arr11 %v2i32arr11 %i32 %v3i32arr11 %v4i32arr3\n"
		"\n"
		"%i8StructArr7  = OpTypeArray %i8Struct %c_u32_7\n"
		"%i32StructArr7 = OpTypeArray %i32Struct %c_u32_7\n"
		"%SSBO_IN       = OpTypeStruct %i8StructArr7\n"
		"%SSBO_OUT      = OpTypeStruct %i32StructArr7\n"
		"%up_SSBOIN     = OpTypePointer Uniform %SSBO_IN\n"
		"%up_SSBOOUT    = OpTypePointer StorageBuffer %SSBO_OUT\n"
		"%ssboIN        = OpVariable %up_SSBOIN Uniform\n"
		"%ssboOUT       = OpVariable %up_SSBOOUT StorageBuffer\n"
		"\n"
		"%id        = OpVariable %uvec3ptr Input\n"
		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%y         = OpCompositeExtract %u32 %idval 1\n"
		"\n"
		"%i8src  = OpAccessChain %i8ptr %ssboIN %zero %x %zero\n"
		"%val_i8 = OpLoad %i8 %i8src\n"
		"%val_i32 = OpSConvert %i32 %val_i8\n"
		"%i32dst  = OpAccessChain %i32ptr %ssboOUT %zero %x %zero\n"
		"OpStore %i32dst %val_i32\n"
		"\n"
		"%v2i8src  = OpAccessChain %v2i8ptr %ssboIN %zero %x %c_i32_1\n"
		"%val_v2i8 = OpLoad %v2i8 %v2i8src\n"
		"%val_v2i32 = OpSConvert %v2i32 %val_v2i8\n"
		"%v2i32dst  = OpAccessChain %v2i32ptr %ssboOUT %zero %x %c_i32_1\n"
		"OpStore %v2i32dst %val_v2i32\n"
		"\n"
		"%v3i8src  = OpAccessChain %v3i8ptr %ssboIN %zero %x %c_i32_2\n"
		"%val_v3i8 = OpLoad %v3i8 %v3i8src\n"
		"%val_v3i32 = OpSConvert %v3i32 %val_v3i8\n"
		"%v3i32dst  = OpAccessChain %v3i32ptr %ssboOUT %zero %x %c_i32_2\n"
		"OpStore %v3i32dst %val_v3i32\n"
		"\n"
		"%v4i8src  = OpAccessChain %v4i8ptr %ssboIN %zero %x %c_i32_3\n"
		"%val_v4i8 = OpLoad %v4i8 %v4i8src\n"
		"%val_v4i32 = OpSConvert %v4i32 %val_v4i8\n"
		"%v4i32dst  = OpAccessChain %v4i32ptr %ssboOUT %zero %x %c_i32_3\n"
		"OpStore %v4i32dst %val_v4i32\n"
		"\n"
		//struct {i8, v2i8[3]}
		"%Si8src  = OpAccessChain %i8ptr %ssboIN %zero %x %c_i32_5 %y %zero\n"
		"%Sval_i8 = OpLoad %i8 %Si8src\n"
		"%Sval_i32 = OpSConvert %i32 %Sval_i8\n"
		"%Si32dst2  = OpAccessChain %i32ptr %ssboOUT %zero %x %c_i32_5 %y %zero\n"
		"OpStore %Si32dst2 %Sval_i32\n"
		"\n"
		"%Sv2i8src0   = OpAccessChain %v2i8ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %zero\n"
		"%Sv2i8_0     = OpLoad %v2i8 %Sv2i8src0\n"
		"%Sv2i32_0     = OpSConvert %v2i32 %Sv2i8_0\n"
		"%Sv2i32dst_0  = OpAccessChain %v2i32ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %zero\n"
		"OpStore %Sv2i32dst_0 %Sv2i32_0\n"
		"\n"
		"%Sv2i8src1  = OpAccessChain %v2i8ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %c_i32_1\n"
		"%Sv2i8_1 = OpLoad %v2i8 %Sv2i8src1\n"
		"%Sv2i32_1 = OpSConvert %v2i32 %Sv2i8_1\n"
		"%Sv2i32dst_1  = OpAccessChain %v2i32ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %c_i32_1\n"
		"OpStore %Sv2i32dst_1 %Sv2i32_1\n"
		"\n"
		"%Sv2i8src2  = OpAccessChain %v2i8ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %c_i32_2\n"
		"%Sv2i8_2 = OpLoad %v2i8 %Sv2i8src2\n"
		"%Sv2i32_2 = OpSConvert %v2i32 %Sv2i8_2\n"
		"%Sv2i32dst_2  = OpAccessChain %v2i32ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %c_i32_2\n"
		"OpStore %Sv2i32dst_2 %Sv2i32_2\n"
		"\n"
		"%v2i8src2  = OpAccessChain %v2i8ptr %ssboIN %zero %x %c_i32_6 %y\n"
		"%val2_v2i8 = OpLoad %v2i8 %v2i8src2\n"
		"%val2_v2i32 = OpSConvert %v2i32 %val2_v2i8\n"
		"%v2i32dst2  = OpAccessChain %v2i32ptr %ssboOUT %zero %x %c_i32_6 %y\n"
		"OpStore %v2i32dst2 %val2_v2i32\n"
		"\n"
		"%i8src2  = OpAccessChain %i8ptr %ssboIN %zero %x %c_i32_7\n"
		"%val2_i8 = OpLoad %i8 %i8src2\n"
		"%val2_i32 = OpSConvert %i32 %val2_i8\n"
		"%i32dst2  = OpAccessChain %i32ptr %ssboOUT %zero %x %c_i32_7\n"
		"OpStore %i32dst2 %val2_i32\n"
		"\n"
		"%v3i8src2  = OpAccessChain %v3i8ptr %ssboIN %zero %x %c_i32_8 %y\n"
		"%val2_v3i8 = OpLoad %v3i8 %v3i8src2\n"
		"%val2_v3i32 = OpSConvert %v3i32 %val2_v3i8\n"
		"%v3i32dst2  = OpAccessChain %v3i32ptr %ssboOUT %zero %x %c_i32_8 %y\n"
		"OpStore %v3i32dst2 %val2_v3i32\n"
		"\n"
		//Array with 3 elements
		"%LessThan3 = OpSLessThan %bool %y %c_i32_3\n"
		"OpSelectionMerge %BlockIf None\n"
		"OpBranchConditional %LessThan3 %LabelIf %BlockIf\n"
		"%LabelIf = OpLabel\n"
		"  %i8src3  = OpAccessChain %i8ptr %ssboIN %zero %x %c_i32_4 %y\n"
		"  %val3_i8 = OpLoad %i8 %i8src3\n"
		"  %val3_i32 = OpSConvert %i32 %val3_i8\n"
		"  %i32dst3  = OpAccessChain %i32ptr %ssboOUT %zero %x %c_i32_4 %y\n"
		"  OpStore %i32dst3 %val3_i32\n"
		"\n"
		"  %v4i8src2  = OpAccessChain %v4i8ptr %ssboIN %zero %x %c_i32_9 %y\n"
		"  %val2_v4i8 = OpLoad %v4i8 %v4i8src2\n"
		"  %val2_v4i32 = OpSConvert %v4i32 %val2_v4i8\n"
		"  %v4i32dst2  = OpAccessChain %v4i32ptr %ssboOUT %zero %x %c_i32_9 %y\n"
		"  OpStore %v4i32dst2 %val2_v4i32\n"
		"OpBranch %BlockIf\n"
		"%BlockIf = OpLabel\n"

		"   OpReturn\n"
		"   OpFunctionEnd\n");

	{  // int
		vector<deInt32>			int32Data	= data32bit(SHADERTEMPLATE_STRIDE32BIT_STD430, rnd, false);

		vector<deInt8>			in8DData	= data8bit(SHADERTEMPLATE_STRIDE8BIT_STD140, rnd);
		ComputeShaderSpec		spec;
		map<string, string>		specs;
		string					testName	= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);

		specs["capability"]		= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
		specs["stridei8"]		= getStructShaderComponet(SHADERTEMPLATE_STRIDE8BIT_STD140);
		specs["stridei32"]		= getStructShaderComponet(SHADERTEMPLATE_STRIDE32BIT_STD430);
		specs["32Storage"]		= "StorageBuffer";
		specs["8Storage"]		= "Uniform";

		spec.assembly			= shaderTemplate.specialize(specs);
		spec.numWorkGroups		= IVec3(structData.structArraySize, structData.nestedArraySize, 1);
		spec.verifyIO			= checkStruct<deInt8, deInt32, SHADERTEMPLATE_STRIDE8BIT_STD140, SHADERTEMPLATE_STRIDE32BIT_STD430>;
		spec.inputs.push_back(Resource(BufferSp(new Int8Buffer(in8DData)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		spec.outputs.push_back(Resource(BufferSp(new Int32Buffer(int32Data))));
		spec.extensions.push_back("VK_KHR_8bit_storage");
		spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
	}
}

void addCompute8bitStorageUniform32StructTo8StructGroup (tcu::TestCaseGroup* group)
{
	tcu::TestContext&				testCtx			= group->getTestContext();
	de::Random						rnd				(deStringHash(group->getName()));

	const StringTemplate			shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability ${capability}\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"\n"
		"${stridei8}"
		"\n"
		"${stridei32}"
		"\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %SSBO_IN Block\n"
		"OpDecorate %SSBO_OUT Block\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"OpDecorate %ssboOUT Binding 1\n"
		"\n"
		"%bool     = OpTypeBool\n"
		"%void     = OpTypeVoid\n"
		"%voidf    = OpTypeFunction %void\n"
		"%u32      = OpTypeInt 32 0\n"
		"%uvec3    = OpTypeVector %u32 3\n"
		"%uvec3ptr = OpTypePointer Input %uvec3\n"
		"\n"
		"%i32      = OpTypeInt 32 1\n"
		"%v2i32    = OpTypeVector %i32 2\n"
		"%v3i32    = OpTypeVector %i32 3\n"
		"%v4i32    = OpTypeVector %i32 4\n"
		"\n"
		"%i8       = OpTypeInt 8 1\n"
		"%v2i8     = OpTypeVector %i8 2\n"
		"%v3i8     = OpTypeVector %i8 3\n"
		"%v4i8     = OpTypeVector %i8 4\n"
		"%i8ptr    = OpTypePointer ${8Storage} %i8\n"
		"%v2i8ptr  = OpTypePointer ${8Storage} %v2i8\n"
		"%v3i8ptr  = OpTypePointer ${8Storage} %v3i8\n"
		"%v4i8ptr  = OpTypePointer ${8Storage} %v4i8\n"
		"\n"
		"%i32ptr   = OpTypePointer ${32Storage} %i32\n"
		"%v2i32ptr = OpTypePointer ${32Storage} %v2i32\n"
		"%v3i32ptr = OpTypePointer ${32Storage} %v3i32\n"
		"%v4i32ptr = OpTypePointer ${32Storage} %v4i32\n"
		"\n"
		"%zero = OpConstant %i32 0\n"
		"%c_i32_1 = OpConstant %i32 1\n"
		"%c_i32_2 = OpConstant %i32 2\n"
		"%c_i32_3 = OpConstant %i32 3\n"
		"%c_i32_4 = OpConstant %i32 4\n"
		"%c_i32_5 = OpConstant %i32 5\n"
		"%c_i32_6 = OpConstant %i32 6\n"
		"%c_i32_7 = OpConstant %i32 7\n"
		"%c_i32_8 = OpConstant %i32 8\n"
		"%c_i32_9 = OpConstant %i32 9\n"
		"\n"
		"%c_u32_1 = OpConstant %u32 1\n"
		"%c_u32_3 = OpConstant %u32 3\n"
		"%c_u32_7 = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"
		"%i8arr3      = OpTypeArray %i8 %c_u32_3\n"
		"%v2i8arr3     = OpTypeArray %v2i8 %c_u32_3\n"
		"%v2i8arr11    = OpTypeArray %v2i8 %c_u32_11\n"
		"%v3i8arr11    = OpTypeArray %v3i8 %c_u32_11\n"
		"%v4i8arr3     = OpTypeArray %v4i8 %c_u32_3\n"
		"%struct8       = OpTypeStruct %i8 %v2i8arr3\n"
		"%struct8arr11 = OpTypeArray %struct8 %c_u32_11\n"
		"%i8Struct = OpTypeStruct %i8 %v2i8 %v3i8 %v4i8 %i8arr3 %struct8arr11 %v2i8arr11 %i8 %v3i8arr11 %v4i8arr3\n"
		"\n"
		"%i32arr3       = OpTypeArray %i32 %c_u32_3\n"
		"%v2i32arr3     = OpTypeArray %v2i32 %c_u32_3\n"
		"%v2i32arr11    = OpTypeArray %v2i32 %c_u32_11\n"
		"%v3i32arr11    = OpTypeArray %v3i32 %c_u32_11\n"
		"%v4i32arr3     = OpTypeArray %v4i32 %c_u32_3\n"
		"%struct32      = OpTypeStruct %i32 %v2i32arr3\n"
		"%struct32arr11 = OpTypeArray %struct32 %c_u32_11\n"
		"%i32Struct = OpTypeStruct %i32 %v2i32 %v3i32 %v4i32 %i32arr3 %struct32arr11 %v2i32arr11 %i32 %v3i32arr11 %v4i32arr3\n"
		"\n"
		"%i8StructArr7  = OpTypeArray %i8Struct %c_u32_7\n"
		"%i32StructArr7 = OpTypeArray %i32Struct %c_u32_7\n"
		"%SSBO_IN       = OpTypeStruct %i32StructArr7\n"
		"%SSBO_OUT      = OpTypeStruct %i8StructArr7\n"
		"%up_SSBOIN     = OpTypePointer Uniform %SSBO_IN\n"
		"%up_SSBOOUT    = OpTypePointer ${storage} %SSBO_OUT\n"
		"%ssboIN        = OpVariable %up_SSBOIN Uniform\n"
		"%ssboOUT       = OpVariable %up_SSBOOUT ${storage}\n"
		"\n"
		"%id        = OpVariable %uvec3ptr Input\n"
		"%main      = OpFunction %void None %voidf\n"
		"%label     = OpLabel\n"
		"\n"
		"%idval     = OpLoad %uvec3 %id\n"
		"%x         = OpCompositeExtract %u32 %idval 0\n"
		"%y         = OpCompositeExtract %u32 %idval 1\n"
		"\n"
		"%i32src  = OpAccessChain %i32ptr %ssboIN %zero %x %zero\n"
		"%val_i32 = OpLoad %i32 %i32src\n"
		"%val_i8 = OpSConvert %i8 %val_i32\n"
		"%i8dst  = OpAccessChain %i8ptr %ssboOUT %zero %x %zero\n"
		"OpStore %i8dst %val_i8\n"
		"\n"
		"%v2i32src  = OpAccessChain %v2i32ptr %ssboIN %zero %x %c_i32_1\n"
		"%val_v2i32 = OpLoad %v2i32 %v2i32src\n"
		"%val_v2i8 = OpSConvert %v2i8 %val_v2i32\n"
		"%v2i8dst  = OpAccessChain %v2i8ptr %ssboOUT %zero %x %c_i32_1\n"
		"OpStore %v2i8dst %val_v2i8\n"
		"\n"
		"%v3i32src  = OpAccessChain %v3i32ptr %ssboIN %zero %x %c_i32_2\n"
		"%val_v3i32 = OpLoad %v3i32 %v3i32src\n"
		"%val_v3i8 = OpSConvert %v3i8 %val_v3i32\n"
		"%v3i8dst  = OpAccessChain %v3i8ptr %ssboOUT %zero %x %c_i32_2\n"
		"OpStore %v3i8dst %val_v3i8\n"
		"\n"
		"%v4i32src  = OpAccessChain %v4i32ptr %ssboIN %zero %x %c_i32_3\n"
		"%val_v4i32 = OpLoad %v4i32 %v4i32src\n"
		"%val_v4i8 = OpSConvert %v4i8 %val_v4i32\n"
		"%v4i8dst  = OpAccessChain %v4i8ptr %ssboOUT %zero %x %c_i32_3\n"
		"OpStore %v4i8dst %val_v4i8\n"
		"\n"

		//struct {i8, v2i8[3]}
		"%Si32src  = OpAccessChain %i32ptr %ssboIN %zero %x %c_i32_5 %y %zero\n"
		"%Sval_i32 = OpLoad %i32 %Si32src\n"
		"%Sval_i8 = OpSConvert %i8 %Sval_i32\n"
		"%Si8dst2  = OpAccessChain %i8ptr %ssboOUT %zero %x %c_i32_5 %y %zero\n"
		"OpStore %Si8dst2 %Sval_i8\n"
		"\n"
		"%Sv2i32src0   = OpAccessChain %v2i32ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %zero\n"
		"%Sv2i32_0     = OpLoad %v2i32 %Sv2i32src0\n"
		"%Sv2i8_0     = OpSConvert %v2i8 %Sv2i32_0\n"
		"%Sv2i8dst_0  = OpAccessChain %v2i8ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %zero\n"
		"OpStore %Sv2i8dst_0 %Sv2i8_0\n"
		"\n"
		"%Sv2i32src1  = OpAccessChain %v2i32ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %c_i32_1\n"
		"%Sv2i32_1 = OpLoad %v2i32 %Sv2i32src1\n"
		"%Sv2i8_1 = OpSConvert %v2i8 %Sv2i32_1\n"
		"%Sv2i8dst_1  = OpAccessChain %v2i8ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %c_i32_1\n"
		"OpStore %Sv2i8dst_1 %Sv2i8_1\n"
		"\n"
		"%Sv2i32src2  = OpAccessChain %v2i32ptr %ssboIN %zero %x %c_i32_5 %y %c_i32_1 %c_i32_2\n"
		"%Sv2i32_2 = OpLoad %v2i32 %Sv2i32src2\n"
		"%Sv2i8_2 = OpSConvert %v2i8 %Sv2i32_2\n"
		"%Sv2i8dst_2  = OpAccessChain %v2i8ptr %ssboOUT %zero %x %c_i32_5 %y %c_i32_1 %c_i32_2\n"
		"OpStore %Sv2i8dst_2 %Sv2i8_2\n"
		"\n"

		"%v2i32src2  = OpAccessChain %v2i32ptr %ssboIN %zero %x %c_i32_6 %y\n"
		"%val2_v2i32 = OpLoad %v2i32 %v2i32src2\n"
		"%val2_v2i8 = OpSConvert %v2i8 %val2_v2i32\n"
		"%v2i8dst2  = OpAccessChain %v2i8ptr %ssboOUT %zero %x %c_i32_6 %y\n"
		"OpStore %v2i8dst2 %val2_v2i8\n"
		"\n"
		"%i32src2  = OpAccessChain %i32ptr %ssboIN %zero %x %c_i32_7\n"
		"%val2_i32 = OpLoad %i32 %i32src2\n"
		"%val2_i8 = OpSConvert %i8 %val2_i32\n"
		"%i8dst2  = OpAccessChain %i8ptr %ssboOUT %zero %x %c_i32_7\n"
		"OpStore %i8dst2 %val2_i8\n"
		"\n"
		"%v3i32src2  = OpAccessChain %v3i32ptr %ssboIN %zero %x %c_i32_8 %y\n"
		"%val2_v3i32 = OpLoad %v3i32 %v3i32src2\n"
		"%val2_v3i8 = OpSConvert %v3i8 %val2_v3i32\n"
		"%v3i8dst2  = OpAccessChain %v3i8ptr %ssboOUT %zero %x %c_i32_8 %y\n"
		"OpStore %v3i8dst2 %val2_v3i8\n"
		"\n"

		//Array with 3 elements
		"%LessThan3 = OpSLessThan %bool %y %c_i32_3\n"
		"OpSelectionMerge %BlockIf None\n"
		"OpBranchConditional %LessThan3 %LabelIf %BlockIf\n"
		"  %LabelIf = OpLabel\n"
		"  %i32src3  = OpAccessChain %i32ptr %ssboIN %zero %x %c_i32_4 %y\n"
		"  %val3_i32 = OpLoad %i32 %i32src3\n"
		"  %val3_i8 = OpSConvert %i8 %val3_i32\n"
		"  %i8dst3  = OpAccessChain %i8ptr %ssboOUT %zero %x %c_i32_4 %y\n"
		"  OpStore %i8dst3 %val3_i8\n"
		"\n"
		"  %v4i32src2  = OpAccessChain %v4i32ptr %ssboIN %zero %x %c_i32_9 %y\n"
		"  %val2_v4i32 = OpLoad %v4i32 %v4i32src2\n"
		"  %val2_v4i8 = OpSConvert %v4i8 %val2_v4i32\n"
		"  %v4i8dst2  = OpAccessChain %v4i8ptr %ssboOUT %zero %x %c_i32_9 %y\n"
		"  OpStore %v4i8dst2 %val2_v4i8\n"
		"OpBranch %BlockIf\n"
		"%BlockIf = OpLabel\n"

		"   OpReturn\n"
		"   OpFunctionEnd\n");

	{  // Int
		vector<deInt8>		int8Data		= data8bit(SHADERTEMPLATE_STRIDE8BIT_STD430, rnd, false);

		ComputeShaderSpec		spec;
		map<string, string>		specs;
		string					testName	= string(CAPABILITIES[STORAGE_BUFFER_TEST].name);
		vector<deInt32>			int32DData	= data32bit(SHADERTEMPLATE_STRIDE32BIT_STD140, rnd);

		specs["capability"]		= CAPABILITIES[STORAGE_BUFFER_TEST].cap;
		specs["storage"]		= CAPABILITIES[STORAGE_BUFFER_TEST].decor;
		specs["stridei8"]		= getStructShaderComponet(SHADERTEMPLATE_STRIDE8BIT_STD430);
		specs["stridei32"]		= getStructShaderComponet(SHADERTEMPLATE_STRIDE32BIT_STD140);
		specs["8Storage"]		= "StorageBuffer";
		specs["32Storage"]		= "Uniform";

		spec.assembly			= shaderTemplate.specialize(specs);
		spec.numWorkGroups		= IVec3(structData.structArraySize, structData.nestedArraySize, 1);
		spec.verifyIO			= checkStruct<deInt32, deInt8, SHADERTEMPLATE_STRIDE32BIT_STD140, SHADERTEMPLATE_STRIDE8BIT_STD430>;

		spec.inputs.push_back(Resource(BufferSp(new Int32Buffer(int32DData)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		spec.outputs.push_back(Resource(BufferSp(new Int8Buffer(int8Data))));
		spec.extensions.push_back("VK_KHR_8bit_storage");
		spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
		spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[STORAGE_BUFFER_TEST].name);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
	}
}

void addCompute8bitStorage8bitStructMixedTypesGroup (tcu::TestCaseGroup* group)
{
	tcu::TestContext&		testCtx			= group->getTestContext();
	de::Random				rnd				(deStringHash(group->getName()));
	vector<deInt8>			outData			= data8bit(SHADERTEMPLATE_STRIDEMIX_STD430, rnd, false);

	const StringTemplate	shaderTemplate	(
		"OpCapability Shader\n"
		"OpCapability StorageBuffer8BitAccess\n"
		"${capability}\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpMemoryModel Logical GLSL450\n"
		"OpEntryPoint GLCompute %main \"main\" %id\n"
		"OpExecutionMode %main LocalSize 1 1 1\n"
		"OpDecorate %id BuiltIn GlobalInvocationId\n"
		"${OutOffsets}"
		"${InOffsets}"
		"\n"//SSBO IN
		"OpDecorate %SSBO_IN Block\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"\n"//SSBO OUT
		"OpDecorate %SSBO_OUT Block\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboOUT Binding 1\n"
		"\n"//Types
		"%void  = OpTypeVoid\n"
		"%bool  = OpTypeBool\n"
		"%i8    = OpTypeInt 8 1\n"
		"%v2i8  = OpTypeVector %i8 2\n"
		"%v3i8  = OpTypeVector %i8 3\n"
		"%v4i8  = OpTypeVector %i8 4\n"
		"%i32   = OpTypeInt 32 1\n"
		"%v2i32 = OpTypeVector %i32 2\n"
		"%v3i32 = OpTypeVector %i32 3\n"
		"%v4i32 = OpTypeVector %i32 4\n"
		"%u32   = OpTypeInt 32 0\n"
		"%uvec3 = OpTypeVector %u32 3\n"
		"%f32   = OpTypeFloat 32\n"
		"%v4f32 = OpTypeVector %f32  4\n"
		"%voidf = OpTypeFunction %void\n"
		"\n"//Consta value
		"%zero     = OpConstant %i32 0\n"
		"%c_i32_1  = OpConstant %i32 1\n"
		"%c_i32_2  = OpConstant %i32 2\n"
		"%c_i32_3  = OpConstant %i32 3\n"
		"%c_i32_4  = OpConstant %i32 4\n"
		"%c_i32_5  = OpConstant %i32 5\n"
		"%c_i32_6  = OpConstant %i32 6\n"
		"%c_i32_7  = OpConstant %i32 7\n"
		"%c_i32_8  = OpConstant %i32 8\n"
		"%c_i32_9  = OpConstant %i32 9\n"
		"%c_i32_10 = OpConstant %i32 10\n"
		"%c_i32_11 = OpConstant %i32 11\n"
		"%c_u32_1  = OpConstant %u32 1\n"
		"%c_u32_7  = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"//Arrays & Structs
		"%v2b8NestedArr11In  = OpTypeArray %v2i8 %c_u32_11\n"
		"%b32NestedArr11In   = OpTypeArray %i32 %c_u32_11\n"
		"%sb8Arr11In         = OpTypeArray %i8 %c_u32_11\n"
		"%sb32Arr11In        = OpTypeArray %i32 %c_u32_11\n"
		"%sNestedIn          = OpTypeStruct %i8 %i32 %v2b8NestedArr11In %b32NestedArr11In\n"
		"%sNestedArr11In     = OpTypeArray %sNestedIn %c_u32_11\n"
		"%structIn           = OpTypeStruct %i8 %i32 %v2i8 %v2i32 %v3i8 %v3i32 %v4i8 %v4i32 %sNestedArr11In %sb8Arr11In %sb32Arr11In\n"
		"%structArr7In       = OpTypeArray %structIn %c_u32_7\n"
		"%v2b8NestedArr11Out = OpTypeArray %v2i8 %c_u32_11\n"
		"%b32NestedArr11Out  = OpTypeArray %i32 %c_u32_11\n"
		"%sb8Arr11Out        = OpTypeArray %i8 %c_u32_11\n"
		"%sb32Arr11Out       = OpTypeArray %i32 %c_u32_11\n"
		"%sNestedOut         = OpTypeStruct %i8 %i32 %v2b8NestedArr11Out %b32NestedArr11Out\n"
		"%sNestedArr11Out    = OpTypeArray %sNestedOut %c_u32_11\n"
		"%structOut          = OpTypeStruct %i8 %i32 %v2i8 %v2i32 %v3i8 %v3i32 %v4i8 %v4i32 %sNestedArr11Out %sb8Arr11Out %sb32Arr11Out\n"
		"%structArr7Out      = OpTypeArray %structOut %c_u32_7\n"
		"\n"//Pointers
		"${uniformPtr}"
		"%i8outPtr    = OpTypePointer StorageBuffer %i8\n"
		"%v2i8outPtr  = OpTypePointer StorageBuffer %v2i8\n"
		"%v3i8outPtr  = OpTypePointer StorageBuffer %v3i8\n"
		"%v4i8outPtr  = OpTypePointer StorageBuffer %v4i8\n"
		"%i32outPtr   = OpTypePointer StorageBuffer %i32\n"
		"%v2i32outPtr = OpTypePointer StorageBuffer %v2i32\n"
		"%v3i32outPtr = OpTypePointer StorageBuffer %v3i32\n"
		"%v4i32outPtr = OpTypePointer StorageBuffer %v4i32\n"
		"%fp_i32      = OpTypePointer Function %i32\n"
		"%uvec3ptr = OpTypePointer Input %uvec3\n"
		"\n"//SSBO IN
		"%SSBO_IN    = OpTypeStruct %structArr7In\n"
		"%up_SSBOIN  = OpTypePointer ${inStorage} %SSBO_IN\n"
		"%ssboIN     = OpVariable %up_SSBOIN ${inStorage}\n"
		"\n"//SSBO OUT
		"%SSBO_OUT   = OpTypeStruct %structArr7Out\n"
		"%up_SSBOOUT = OpTypePointer StorageBuffer %SSBO_OUT\n"
		"%ssboOUT    = OpVariable %up_SSBOOUT StorageBuffer\n"
		"\n"//MAIN
		"%id                = OpVariable %uvec3ptr Input\n"
		"%main              = OpFunction %void None %voidf\n"
		"%label             = OpLabel\n"
		"%ndxArrz           = OpVariable %fp_i32  Function\n"
		"%idval             = OpLoad %uvec3 %id\n"
		"%x                 = OpCompositeExtract %u32 %idval 0\n"
		"%y                 = OpCompositeExtract %u32 %idval 1\n"
		"\n"//strutOut.b8 = strutIn.b8
		"%inP1  = OpAccessChain %i8${inPtr} %ssboIN %zero %x %zero\n"
		"%inV1  = OpLoad %i8 %inP1\n"
		"%outP1 = OpAccessChain %i8outPtr %ssboOUT %zero %x %zero\n"
		"OpStore %outP1 %inV1\n"
		"\n"//strutOut.b32 = strutIn.b32
		"%inP2  = OpAccessChain %i32${inPtr} %ssboIN %zero %x %c_i32_1\n"
		"%inV2  = OpLoad %i32 %inP2\n"
		"%outP2 = OpAccessChain %i32outPtr %ssboOUT %zero %x %c_i32_1\n"
		"OpStore %outP2 %inV2\n"
		"\n"//strutOut.v2b8 = strutIn.v2b8
		"%inP3  = OpAccessChain %v2i8${inPtr} %ssboIN %zero %x %c_i32_2\n"
		"%inV3  = OpLoad %v2i8 %inP3\n"
		"%outP3 = OpAccessChain %v2i8outPtr %ssboOUT %zero %x %c_i32_2\n"
		"OpStore %outP3 %inV3\n"
		"\n"//strutOut.v2b32 = strutIn.v2b32
		"%inP4  = OpAccessChain %v2i32${inPtr} %ssboIN %zero %x %c_i32_3\n"
		"%inV4  = OpLoad %v2i32 %inP4\n"
		"%outP4 = OpAccessChain %v2i32outPtr %ssboOUT %zero %x %c_i32_3\n"
		"OpStore %outP4 %inV4\n"
		"\n"//strutOut.v3b8 = strutIn.v3b8
		"%inP5  = OpAccessChain %v3i8${inPtr} %ssboIN %zero %x %c_i32_4\n"
		"%inV5  = OpLoad %v3i8 %inP5\n"
		"%outP5 = OpAccessChain %v3i8outPtr %ssboOUT %zero %x %c_i32_4\n"
		"OpStore %outP5 %inV5\n"
		"\n"//strutOut.v3b32 = strutIn.v3b32
		"%inP6  = OpAccessChain %v3i32${inPtr} %ssboIN %zero %x %c_i32_5\n"
		"%inV6  = OpLoad %v3i32 %inP6\n"
		"%outP6 = OpAccessChain %v3i32outPtr %ssboOUT %zero %x %c_i32_5\n"
		"OpStore %outP6 %inV6\n"
		"\n"//strutOut.v4b8 = strutIn.v4b8
		"%inP7  = OpAccessChain %v4i8${inPtr} %ssboIN %zero %x %c_i32_6\n"
		"%inV7  = OpLoad %v4i8 %inP7\n"
		"%outP7 = OpAccessChain %v4i8outPtr %ssboOUT %zero %x %c_i32_6\n"
		"OpStore %outP7 %inV7\n"
		"\n"//strutOut.v4b32 = strutIn.v4b32
		"%inP8  = OpAccessChain %v4i32${inPtr} %ssboIN %zero %x %c_i32_7\n"
		"%inV8  = OpLoad %v4i32 %inP8\n"
		"%outP8 = OpAccessChain %v4i32outPtr %ssboOUT %zero %x %c_i32_7\n"
		"OpStore %outP8 %inV8\n"
		"\n"//strutOut.b8[y] = strutIn.b8[y]
		"%inP9  = OpAccessChain %i8${inPtr} %ssboIN %zero %x %c_i32_9 %y\n"
		"%inV9  = OpLoad %i8 %inP9\n"
		"%outP9 = OpAccessChain %i8outPtr %ssboOUT %zero %x %c_i32_9 %y\n"
		"OpStore %outP9 %inV9\n"
		"\n"//strutOut.b32[y] = strutIn.b32[y]
		"%inP10  = OpAccessChain %i32${inPtr} %ssboIN %zero %x %c_i32_10 %y\n"
		"%inV10  = OpLoad %i32 %inP10\n"
		"%outP10 = OpAccessChain %i32outPtr %ssboOUT %zero %x %c_i32_10 %y\n"
		"OpStore %outP10 %inV10\n"
		"\n"//strutOut.strutNestedOut[y].b8 = strutIn.strutNestedIn[y].b8
		"%inP11 = OpAccessChain %i8${inPtr} %ssboIN %zero %x %c_i32_8 %y %zero\n"
		"%inV11 = OpLoad %i8 %inP11\n"
		"%outP11 = OpAccessChain %i8outPtr %ssboOUT %zero %x %c_i32_8 %y %zero\n"
		"OpStore %outP11 %inV11\n"
		"\n"//strutOut.strutNestedOut[y].b32 = strutIn.strutNestedIn[y].b32
		"%inP12 = OpAccessChain %i32${inPtr} %ssboIN %zero %x %c_i32_8 %y %c_i32_1\n"
		"%inV12 = OpLoad %i32 %inP12\n"
		"%outP12 = OpAccessChain %i32outPtr %ssboOUT %zero %x %c_i32_8 %y %c_i32_1\n"
		"OpStore %outP12 %inV12\n"
		"\n"
		"${zBeginLoop}"
		"\n"//strutOut.strutNestedOut[y].v2b8[valNdx] = strutIn.strutNestedIn[y].v2b8[valNdx]
		"%inP13  = OpAccessChain %v2i8${inPtr} %ssboIN %zero %x %c_i32_8 %y %c_i32_2 %Valz\n"
		"%inV13  = OpLoad %v2i8 %inP13\n"
		"%outP13 = OpAccessChain %v2i8outPtr %ssboOUT %zero %x %c_i32_8 %y %c_i32_2 %Valz\n"
		"OpStore %outP13 %inV13\n"
		"\n"//strutOut.strutNestedOut[y].b32[valNdx] = strutIn.strutNestedIn[y].b32[valNdx]
		"%inP14  = OpAccessChain %i32${inPtr} %ssboIN %zero %x %c_i32_8 %y %c_i32_3 %Valz\n"
		"%inV14  = OpLoad %i32 %inP14\n"
		"%outP14 = OpAccessChain %i32outPtr %ssboOUT %zero %x %c_i32_8 %y %c_i32_3 %Valz\n"
		"OpStore %outP14 %inV14\n"
		"\n${zEndLoop}\n"
		"OpBranch %exitLabel\n"
		"%exitLabel = OpLabel\n"
		"OpReturn\n"
		"OpFunctionEnd\n");

	for (deUint32 capIdx = 0; capIdx < DE_LENGTH_OF_ARRAY(CAPABILITIES); ++capIdx)
	{  // int
		const bool				isUniform	= VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == CAPABILITIES[capIdx].dtype;
		vector<deInt8>			inData		= isUniform ? data8bit(SHADERTEMPLATE_STRIDEMIX_STD140, rnd) : data8bit(SHADERTEMPLATE_STRIDEMIX_STD430, rnd);
		ComputeShaderSpec		spec;
		map<string, string>		specsOffset;
		map<string, string>		specsLoop;
		map<string, string>		specs;
		string					testName	= string(CAPABILITIES[capIdx].name);

		specsLoop["exeCount"]	= "c_i32_11";
		specsLoop["loopName"]	= "z";
		specs["zBeginLoop"]		= beginLoop(specsLoop);
		specs["zEndLoop"]		= endLoop(specsLoop);
		specs["inStorage"]		= isUniform ? "Uniform" : "StorageBuffer";
		specs["capability"]		= "";
		specs["uniformPtr"]		= isUniform ?
								"%i8inPtr     = OpTypePointer Uniform %i8\n"
								"%v2i8inPtr   = OpTypePointer Uniform %v2i8\n"
								"%v3i8inPtr   = OpTypePointer Uniform %v3i8\n"
								"%v4i8inPtr   = OpTypePointer Uniform %v4i8\n"
								"%i32inPtr    = OpTypePointer Uniform %i32\n"
								"%v2i32inPtr  = OpTypePointer Uniform %v2i32\n"
								"%v3i32inPtr  = OpTypePointer Uniform %v3i32\n"
								"%v4i32inPtr  = OpTypePointer Uniform %v4i32\n" :
								"";
		specs["inPtr"]			= isUniform ? "inPtr" : "outPtr";
		specsOffset["InOut"]	= "In";
		specs["InOffsets"]		= StringTemplate(isUniform ? getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD140) : getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD430)).specialize(specsOffset);
		specsOffset["InOut"]	= "Out";
		specs["OutOffsets"]		= StringTemplate(getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD430)).specialize(specsOffset);
		if(isUniform)
		{
			specs["capability"]				= "OpCapability " + string(CAPABILITIES[capIdx].cap);
		}

		spec.assembly					= shaderTemplate.specialize(specs);
		spec.numWorkGroups				= IVec3(structData.structArraySize, structData.nestedArraySize, 1);
		spec.verifyIO					= isUniform ? checkStruct<deInt8, deInt8, SHADERTEMPLATE_STRIDEMIX_STD140, SHADERTEMPLATE_STRIDEMIX_STD430> : checkStruct<deInt8, deInt8, SHADERTEMPLATE_STRIDEMIX_STD430, SHADERTEMPLATE_STRIDEMIX_STD430>;
		spec.inputs.push_back			(Resource(BufferSp(new Int8Buffer(inData)), CAPABILITIES[capIdx].dtype));
		spec.outputs.push_back			(Resource(BufferSp(new Int8Buffer(outData))));
		spec.extensions.push_back		("VK_KHR_8bit_storage");
		spec.extensions.push_back		("VK_KHR_storage_buffer_storage_class");
		spec.requestedVulkanFeatures	= get8BitStorageFeatures(CAPABILITIES[capIdx].name);

		group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
	}
}

void addGraphics8BitStorageUniformInt32To8Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	const deUint32						numDataPoints		= 256u;
	RGBA								defaultColors[4];
	GraphicsResources					resources;
	vector<string>						extensions;
	const StringTemplate				capabilities		("OpCapability ${cap}\n");
	vector<deInt8>						outputs				(numDataPoints);

	extensions.push_back("VK_KHR_8bit_storage");
	fragments["extension"]	=
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"";

	getDefaultColors(defaultColors);

	struct IntegerFacts
	{
		const char*	name;
		const char*	type32;
		const char*	type8;
		const char* opcode;
		const char*	isSigned;
	};

	const IntegerFacts	intFacts[]		=
	{
		{"sint",	"%i32",		"%i8",		"OpSConvert",	"1"},
		{"uint",	"%u32",		"%u8",		"OpUConvert",	"0"},
	};

	const StringTemplate	scalarPreMain(
			"${itype8} = OpTypeInt 8 ${signed}\n"
			"%c_i32_256 = OpConstant %i32 256\n"
			"   %up_i32 = OpTypePointer Uniform ${itype32}\n"
			"   %up_i8 = OpTypePointer StorageBuffer ${itype8}\n"
			"   %ra_i32 = OpTypeArray ${itype32} %c_i32_256\n"
			"   %ra_i8 = OpTypeArray ${itype8} %c_i32_256\n"
			"   %SSBO32 = OpTypeStruct %ra_i32\n"
			"   %SSBO8 = OpTypeStruct %ra_i8\n"
			"%up_SSBO32 = OpTypePointer Uniform %SSBO32\n"
			"%up_SSBO8 = OpTypePointer StorageBuffer %SSBO8\n"
			"   %ssbo32 = OpVariable %up_SSBO32 Uniform\n"
			"   %ssbo8 = OpVariable %up_SSBO8 StorageBuffer\n");

	const StringTemplate	scalarDecoration(
			"OpDecorate %ra_i32 ArrayStride 16\n"
			"OpDecorate %ra_i8 ArrayStride 1\n"
			"OpDecorate %SSBO32 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 0\n"
			"OpDecorate %ssbo8 Binding 1\n");

	const StringTemplate	scalarTestFunc(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_256\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_i32 %ssbo32 %c_i32_0 %30\n"
			"%val32 = OpLoad ${itype32} %src\n"
			"%val8 = ${convert} ${itype8} %val32\n"
			"  %dst = OpAccessChain %up_i8 %ssbo8 %c_i32_0 %30\n"
			"         OpStore %dst %val8\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"

			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	const StringTemplate	vecPreMain(
			"${itype8} = OpTypeInt 8 ${signed}\n"
			" %c_i32_64 = OpConstant %i32 64\n"
			"%v4itype8 = OpTypeVector ${itype8} 4\n"
			" %up_v4i32 = OpTypePointer Uniform ${v4itype32}\n"
			" %up_v4i8 = OpTypePointer StorageBuffer %v4itype8\n"
			" %ra_v4i32 = OpTypeArray ${v4itype32} %c_i32_64\n"
			" %ra_v4i8 = OpTypeArray %v4itype8 %c_i32_64\n"
			"   %SSBO32 = OpTypeStruct %ra_v4i32\n"
			"   %SSBO8 = OpTypeStruct %ra_v4i8\n"
			"%up_SSBO32 = OpTypePointer Uniform %SSBO32\n"
			"%up_SSBO8 = OpTypePointer StorageBuffer %SSBO8\n"
			"   %ssbo32 = OpVariable %up_SSBO32 Uniform\n"
			"   %ssbo8 = OpVariable %up_SSBO8 StorageBuffer\n");

	const StringTemplate	vecDecoration(
			"OpDecorate %ra_v4i32 ArrayStride 16\n"
			"OpDecorate %ra_v4i8 ArrayStride 4\n"
			"OpDecorate %SSBO32 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 0\n"
			"OpDecorate %ssbo8 Binding 1\n");

	const StringTemplate	vecTestFunc(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_64\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_v4i32 %ssbo32 %c_i32_0 %30\n"
			"%val32 = OpLoad ${v4itype32} %src\n"
			"%val8 = ${convert} %v4itype8 %val32\n"
			"  %dst = OpAccessChain %up_v4i8 %ssbo8 %c_i32_0 %30\n"
			"         OpStore %dst %val8\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"

			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	struct Category
	{
		const char*				name;
		const StringTemplate&	preMain;
		const StringTemplate&	decoration;
		const StringTemplate&	testFunction;
		const deUint32			numElements;
	};

	const Category		categories[]	=
	{
		{"scalar",	scalarPreMain,	scalarDecoration,	scalarTestFunc,	1},
		{"vector",	vecPreMain,		vecDecoration,		vecTestFunc,	4},
	};


	for (deUint32 catIdx = 0; catIdx < DE_LENGTH_OF_ARRAY(categories); ++catIdx)
	{
		resources.inputs.clear();
		resources.outputs.clear();
		vector<deInt32>	inputs = getInt32s(rnd, ((arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt32))) * numDataPoints) / categories[catIdx].numElements);

		if ( 0 != (arrayStrideInBytesUniform - static_cast<deUint32>(sizeof(deInt32)) * categories[catIdx].numElements))
			resources.verifyIO = checkUniformsArray<deInt32, deInt8, 1>;
		else
		{
			resources.verifyIO = DE_NULL;
			for (deUint32 numNdx = 0; numNdx < numDataPoints; ++numNdx)
				outputs[numNdx] = static_cast<deInt8>(0xffff & inputs[numNdx]);
		}

		resources.inputs.push_back(Resource(BufferSp(new Int32Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		resources.outputs.push_back(Resource(BufferSp(new Int8Buffer(outputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

		for (deUint32 factIdx = 0; factIdx < DE_LENGTH_OF_ARRAY(intFacts); ++factIdx)
		{
			map<string, string>	specs;
			VulkanFeatures		features;
			string				name		= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + categories[catIdx].name + "_" + intFacts[factIdx].name;

			specs["cap"]					= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
			specs["itype32"]				= intFacts[factIdx].type32;
			specs["v4itype32"]				= "%v4" + string(intFacts[factIdx].type32).substr(1);
			specs["itype8"]					= intFacts[factIdx].type8;
			specs["signed"]					= intFacts[factIdx].isSigned;
			specs["convert"]				= intFacts[factIdx].opcode;

			fragments["pre_main"]			= categories[catIdx].preMain.specialize(specs);
			fragments["testfun"]			= categories[catIdx].testFunction.specialize(specs);
			fragments["capability"]			= capabilities.specialize(specs);
			fragments["decoration"]			= categories[catIdx].decoration.specialize(specs);

			features												= get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
			features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
			features.coreFeatures.fragmentStoresAndAtomics			= true;

			createTestsForAllStages(name, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
	}
}

void addGraphics8BitStorageUniformInt8To32Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	const deUint32						numDataPoints		= 256;
	RGBA								defaultColors[4];
	vector<deInt32>						outputs				(numDataPoints);
	GraphicsResources					resources;
	vector<string>						extensions;
	const StringTemplate				capabilities		("OpCapability ${cap}\n");

	extensions.push_back("VK_KHR_8bit_storage");
	fragments["extension"]	=
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"";

	getDefaultColors(defaultColors);

	struct IntegerFacts
	{
		const char*	name;
		const char*	type32;
		const char*	type8;
		const char* opcode;
		bool		isSigned;
	};

	const IntegerFacts	intFacts[]	=
	{
		{"sint",	"%i32",		"%i8",		"OpSConvert",	true},
		{"uint",	"%u32",		"%u8",		"OpUConvert",	false},
	};

	struct ConstantIndex
	{
		bool		useConstantIndex;
		deUint32	constantIndex;
	};

	ConstantIndex	constantIndices[] =
	{
		{ false,	0 },
		{ true,		4 },
		{ true,		5 },
		{ true,		6 }
	};

	const StringTemplate scalarPreMain		(
			"${itype8} = OpTypeInt 8 ${signed}\n"
			" %c_i32_256 = OpConstant %i32 256\n"
			"%c_i32_ci  = OpConstant %i32 ${constarrayidx}\n"
			"   %up_i32 = OpTypePointer StorageBuffer ${itype32}\n"
			"   %up_i8 = OpTypePointer Uniform ${itype8}\n"
			"   %ra_i32 = OpTypeArray ${itype32} %c_i32_256\n"
			"   %ra_i8 = OpTypeArray ${itype8} %c_i32_256\n"
			"   %SSBO32 = OpTypeStruct %ra_i32\n"
			"   %SSBO8 = OpTypeStruct %ra_i8\n"
			"%up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
			"%up_SSBO8 = OpTypePointer Uniform %SSBO8\n"
			"   %ssbo32 = OpVariable %up_SSBO32 StorageBuffer\n"
			"   %ssbo8 = OpVariable %up_SSBO8 Uniform\n");

	const StringTemplate scalarDecoration		(
			"OpDecorate %ra_i32 ArrayStride 4\n"
			"OpDecorate %ra_i8 ArrayStride 16\n"
			"OpDecorate %SSBO32 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 1\n"
			"OpDecorate %ssbo8 Binding 0\n");

	const StringTemplate scalarTestFunc	(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_256\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_i8 %ssbo8 %c_i32_0 %${arrayindex}\n"
			"%val8 = OpLoad ${itype8} %src\n"
			"%val32 = ${convert} ${itype32} %val8\n"
			"  %dst = OpAccessChain %up_i32 %ssbo32 %c_i32_0 %30\n"
			"         OpStore %dst %val32\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"
			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	const StringTemplate vecPreMain		(
			"${itype8} = OpTypeInt 8 ${signed}\n"
			"%c_i32_128 = OpConstant %i32 128\n"
			"%c_i32_ci  = OpConstant %i32 ${constarrayidx}\n"
			"%v2itype8 = OpTypeVector ${itype8} 2\n"
			" %up_v2i32 = OpTypePointer StorageBuffer ${v2itype32}\n"
			" %up_v2i8 = OpTypePointer Uniform %v2itype8\n"
			" %ra_v2i32 = OpTypeArray ${v2itype32} %c_i32_128\n"
			" %ra_v2i8 = OpTypeArray %v2itype8 %c_i32_128\n"
			"   %SSBO32 = OpTypeStruct %ra_v2i32\n"
			"   %SSBO8 = OpTypeStruct %ra_v2i8\n"
			"%up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
			"%up_SSBO8 = OpTypePointer Uniform %SSBO8\n"
			"   %ssbo32 = OpVariable %up_SSBO32 StorageBuffer\n"
			"   %ssbo8 = OpVariable %up_SSBO8 Uniform\n");

	const StringTemplate vecDecoration		(
			"OpDecorate %ra_v2i32 ArrayStride 8\n"
			"OpDecorate %ra_v2i8 ArrayStride 16\n"
			"OpDecorate %SSBO32 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 1\n"
			"OpDecorate %ssbo8 Binding 0\n");

	const StringTemplate vecTestFunc	(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_128\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_v2i8 %ssbo8 %c_i32_0 %${arrayindex}\n"
			"%val8 = OpLoad %v2itype8 %src\n"
			"%val32 = ${convert} ${v2itype32} %val8\n"
			"  %dst = OpAccessChain %up_v2i32 %ssbo32 %c_i32_0 %30\n"
			"         OpStore %dst %val32\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"
			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	struct Category
	{
		const char*				name;
		const StringTemplate&	preMain;
		const StringTemplate&	decoration;
		const StringTemplate&	testFunction;
		const deUint32			numElements;
	};

	const Category		categories[]	=
	{
		{"scalar", scalarPreMain,	scalarDecoration,	scalarTestFunc,	1},
		{"vector", vecPreMain,		vecDecoration,		vecTestFunc,	2},
	};

	for (deUint32 catIdx = 0; catIdx < DE_LENGTH_OF_ARRAY(categories); ++catIdx)
	{
		resources.inputs.clear();
		vector<deInt8>	inputs = getInt8s(rnd, (arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt8))) * (numDataPoints / categories[catIdx].numElements));
		resources.inputs.push_back(Resource(BufferSp(new Int8Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		for (deUint32 factIdx = 0; factIdx < DE_LENGTH_OF_ARRAY(intFacts); ++factIdx)
			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool				useConstIdx	= constantIndices[constIndexIdx].useConstantIndex;
				deUint32			constIdx	= constantIndices[constIndexIdx].constantIndex;
				map<string, string>	specs;
				VulkanFeatures		features;
				string				name		= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + categories[catIdx].name + "_" + intFacts[factIdx].name;

				specs["cap"]					= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
				specs["itype32"]				= intFacts[factIdx].type32;
				specs["v2itype32"]				= "%v2" + string(intFacts[factIdx].type32).substr(1);
				specs["itype8"]					= intFacts[factIdx].type8;
				if (intFacts[factIdx].isSigned)
					specs["signed"]				= "1";
				else
					specs["signed"]				= "0";
				specs["convert"]				= intFacts[factIdx].opcode;
				specs["constarrayidx"]			= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				fragments["pre_main"]			= categories[catIdx].preMain.specialize(specs);
				fragments["testfun"]			= categories[catIdx].testFunction.specialize(specs);
				fragments["capability"]			= capabilities.specialize(specs);
				fragments["decoration"]			= categories[catIdx].decoration.specialize(specs);

				if (useConstIdx)
					name += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(outputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
				if (useConstIdx)
				{
					switch(constantIndices[constIndexIdx].constantIndex)
					{
					case 0:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 2, 0>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 1, 0>;
						break;
					case 4:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 2, 4>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 1, 4>;
						break;
					case 5:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 2, 5>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 1, 5>;
						break;
					case 6:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 2, 6>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt32, 1, 6>;
						break;
					default:
						DE_FATAL("Impossible");
						break;
					};
				}
				else
				{
					if (categories[catIdx].numElements == 2)
						resources.verifyIO = checkUniformsArray<deInt8, deInt32, 2>;
					else
						resources.verifyIO = checkUniformsArray<deInt8, deInt32, 1>;
				}

				features												= get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
				features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
				features.coreFeatures.fragmentStoresAndAtomics			= true;

				createTestsForAllStages(name, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
	}
}

void addGraphics8BitStoragePushConstantInt8To32Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	RGBA								defaultColors[4];
	const deUint32						numDataPoints		= 64;
	vector<deInt8>						inputs				= getInt8s(rnd, numDataPoints);
	vector<deInt32>						sOutputs;
	vector<deInt32>						uOutputs;
	PushConstants						pcs;
	GraphicsResources					resources;
	vector<string>						extensions;
	const deUint8						signBitMask			= 0x80;
	const deUint32						signExtendMask		= 0xffff0000;
	VulkanFeatures						requiredFeatures;

	struct ConstantIndex
	{
		bool		useConstantIndex;
		deUint32	constantIndex;
	};

	ConstantIndex	constantIndices[] =
	{
		{ false,	0 },
		{ true,		4 },
		{ true,		5 },
		{ true,		6 }
	};

	sOutputs.reserve(inputs.size());
	uOutputs.reserve(inputs.size());

	for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
	{
		uOutputs.push_back(static_cast<deUint8>(inputs[numNdx]));
		if (inputs[numNdx] & signBitMask)
			sOutputs.push_back(static_cast<deInt32>(inputs[numNdx] | signExtendMask));
		else
			sOutputs.push_back(static_cast<deInt32>(inputs[numNdx]));
	}

	extensions.push_back("VK_KHR_8bit_storage");

	requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics	= true;
	requiredFeatures.coreFeatures.fragmentStoresAndAtomics			= true;
	requiredFeatures.ext8BitStorage									= EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;

	fragments["capability"]				= "OpCapability StoragePushConstant8\n";
	fragments["extension"]				= "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
										  "OpExtension \"SPV_KHR_8bit_storage\"";

	pcs.setPushConstant(BufferSp(new Int8Buffer(inputs)));

	getDefaultColors(defaultColors);

	const StringTemplate	testFun		(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"    %i = OpVariable %fp_i32 Function\n"
		"         OpStore %i %c_i32_0\n"
		"         OpBranch %loop\n"

		" %loop = OpLabel\n"
		"   %15 = OpLoad %i32 %i\n"
		"   %lt = OpSLessThan %bool %15 %c_i32_${count}\n"
		"         OpLoopMerge %merge %inc None\n"
		"         OpBranchConditional %lt %write %merge\n"

		"%write = OpLabel\n"
		"   %30 = OpLoad %i32 %i\n"
		"  %src = OpAccessChain %pp_${type8} %pc8 %c_i32_0 %${arrayindex}\n"
		"%val8 = OpLoad %${type8} %src\n"
		"%val32 = ${convert} %${type32} %val8\n"
		"  %dst = OpAccessChain %up_${type32} %ssbo32 %c_i32_0 %30\n"
		"         OpStore %dst %val32\n"
		"         OpBranch %inc\n"

		"  %inc = OpLabel\n"
		"   %37 = OpLoad %i32 %i\n"
		"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
		"         OpStore %i %39\n"
		"         OpBranch %loop\n"

		"%merge = OpLabel\n"
		"         OpReturnValue %param\n"

		"OpFunctionEnd\n");

	{  // Scalar cases
		const StringTemplate	preMain		(
			"         %${type8} = OpTypeInt 8 ${signed}\n"
			"    %c_i32_${count} = OpConstant %i32 ${count}\n"					// Should be the same as numDataPoints
			"         %c_i32_ci = OpConstant %i32 ${constarrayidx}\n"
			"%a${count}${type8} = OpTypeArray %${type8} %c_i32_${count}\n"
			"%a${count}${type32} = OpTypeArray %${type32} %c_i32_${count}\n"
			"      %pp_${type8} = OpTypePointer PushConstant %${type8}\n"
			"      %up_${type32} = OpTypePointer StorageBuffer      %${type32}\n"
			"            %SSBO32 = OpTypeStruct %a${count}${type32}\n"
			"         %up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
			"            %ssbo32 = OpVariable %up_SSBO32 StorageBuffer\n"
			"              %PC8 = OpTypeStruct %a${count}${type8}\n"
			"           %pp_PC8 = OpTypePointer PushConstant %PC8\n"
			"              %pc8 = OpVariable %pp_PC8 PushConstant\n");

		const StringTemplate	decoration	(
			"OpDecorate %a${count}${type8} ArrayStride 1\n"
			"OpDecorate %a${count}${type32} ArrayStride 4\n"
			"OpDecorate %SSBO32 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpDecorate %PC8 Block\n"
			"OpMemberDecorate %PC8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 0\n");

		{  // signed int
			map<string, string>		specs;

			specs["type8"]			= "i8";
			specs["type32"]			= "i32";
			specs["signed"]			= "1";
			specs["count"]			= "64";
			specs["convert"]		= "OpSConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "sint_scalar";
				vector<deInt32>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(sOutputs[constIdx]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(useConstIdx ? constIdxData : sOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
		{  // signed int
			map<string, string>		specs;

			specs["type8"]			= "u8";
			specs["type32"]			= "u32";
			specs["signed"]			= "0";
			specs["count"]			= "64";
			specs["convert"]		= "OpUConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "uint_scalar";
				vector<deInt32>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(uOutputs[constIdx]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(useConstIdx ? constIdxData : uOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
	}

	{  // Vector cases
		const StringTemplate	preMain		(
			"    %${base_type8} = OpTypeInt 8 ${signed}\n"
			"         %${type8} = OpTypeVector %${base_type8} 2\n"
			"    %c_i32_${count} = OpConstant %i32 ${count}\n"
			"          %c_i32_ci = OpConstant %i32 ${constarrayidx}\n"
			"%a${count}${type8} = OpTypeArray %${type8} %c_i32_${count}\n"
			"%a${count}${type32} = OpTypeArray %${type32} %c_i32_${count}\n"
			"      %pp_${type8} = OpTypePointer PushConstant %${type8}\n"
			"      %up_${type32} = OpTypePointer StorageBuffer      %${type32}\n"
			"            %SSBO32 = OpTypeStruct %a${count}${type32}\n"
			"         %up_SSBO32 = OpTypePointer StorageBuffer %SSBO32\n"
			"            %ssbo32 = OpVariable %up_SSBO32 StorageBuffer\n"
			"              %PC8 = OpTypeStruct %a${count}${type8}\n"
			"           %pp_PC8 = OpTypePointer PushConstant %PC8\n"
			"              %pc8 = OpVariable %pp_PC8 PushConstant\n");

		const StringTemplate	decoration	(
			"OpDecorate %a${count}${type8} ArrayStride 2\n"
			"OpDecorate %a${count}${type32} ArrayStride 8\n"
			"OpDecorate %SSBO32 Block\n"
			"OpMemberDecorate %SSBO32 0 Offset 0\n"
			"OpDecorate %PC8 Block\n"
			"OpMemberDecorate %PC8 0 Offset 0\n"
			"OpDecorate %ssbo32 DescriptorSet 0\n"
			"OpDecorate %ssbo32 Binding 0\n");

		{  // signed int
			map<string, string>		specs;

			specs["base_type8"]		= "i8";
			specs["type8"]			= "v2i8";
			specs["type32"]			= "v2i32";
			specs["signed"]			= "1";
			specs["count"]			= "32";				// 64 / 2
			specs["convert"]		= "OpSConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "sint_vector";
				vector<deInt32>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(sOutputs[constIdx * 2 + numIdx % 2]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(useConstIdx ? constIdxData : sOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
		{  // signed int
			map<string, string>		specs;

			specs["base_type8"]		= "u8";
			specs["type8"]			= "v2u8";
			specs["type32"]			= "v2u32";
			specs["signed"]			= "0";
			specs["count"]			= "32";
			specs["convert"]		= "OpUConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "uint_vector";
				vector<deInt32>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(uOutputs[constIdx * 2 + numIdx % 2]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(useConstIdx ? constIdxData : uOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
	}
}

void addGraphics8BitStorageUniformInt16To8Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	const deUint32						numDataPoints		= 256;
	RGBA								defaultColors[4];
	GraphicsResources					resources;
	vector<string>						extensions;
	const StringTemplate				capabilities		("OpCapability ${cap}\n");

	extensions.push_back("VK_KHR_8bit_storage");
	extensions.push_back("VK_KHR_16bit_storage");
	fragments["extension"]	=
		"OpCapability StorageUniform16\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n";

	getDefaultColors(defaultColors);

	struct IntegerFacts
	{
		const char*	name;
		const char*	type16;
		const char*	type8;
		const char* opcode;
		const char*	isSigned;
	};

	const IntegerFacts	intFacts[]		=
	{
		{"sint",	"%i16",		"%i8",		"OpSConvert",	"1"},
		{"uint",	"%u16",		"%u8",		"OpUConvert",	"0"},
	};

	const StringTemplate	scalarPreMain(
			"${itype8}  = OpTypeInt 8 ${signed}\n"
			"${itype16} = OpTypeInt 16 ${signed}\n"
			"%c_i32_256 = OpConstant %i32 256\n"
			"   %up_i16 = OpTypePointer Uniform ${itype16}\n"
			"   %up_i8  = OpTypePointer StorageBuffer ${itype8}\n"
			"   %ra_i16 = OpTypeArray ${itype16} %c_i32_256\n"
			"   %ra_i8  = OpTypeArray ${itype8} %c_i32_256\n"
			"   %SSBO16 = OpTypeStruct %ra_i16\n"
			"   %SSBO8  = OpTypeStruct %ra_i8\n"
			"%up_SSBO16 = OpTypePointer Uniform %SSBO16\n"
			"%up_SSBO8  = OpTypePointer StorageBuffer %SSBO8\n"
			"   %ssbo16 = OpVariable %up_SSBO16 Uniform\n"
			"   %ssbo8  = OpVariable %up_SSBO8 StorageBuffer\n");

	const StringTemplate	scalarDecoration(
			"OpDecorate %ra_i16 ArrayStride 16\n"
			"OpDecorate %ra_i8 ArrayStride 1\n"
			"OpDecorate %SSBO16 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 0\n"
			"OpDecorate %ssbo8 Binding 1\n");

	const StringTemplate	scalarTestFunc(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_256\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_i16 %ssbo16 %c_i32_0 %30\n"
			"%val16 = OpLoad ${itype16} %src\n"
			"%val8 = ${convert} ${itype8} %val16\n"
			"  %dst = OpAccessChain %up_i8 %ssbo8 %c_i32_0 %30\n"
			"         OpStore %dst %val8\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"

			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	const StringTemplate	vecPreMain(
			"${itype8} = OpTypeInt 8 ${signed}\n"
			"${itype16} = OpTypeInt 16 ${signed}\n"
			"${v4itype16} = OpTypeVector ${itype16} 4\n"
			"%c_i32_64 = OpConstant %i32 64\n"
			"%v4itype8 = OpTypeVector ${itype8} 4\n"
			" %up_v4i16 = OpTypePointer Uniform ${v4itype16}\n"
			" %up_v4i8 = OpTypePointer StorageBuffer %v4itype8\n"
			" %ra_v4i16 = OpTypeArray ${v4itype16} %c_i32_64\n"
			" %ra_v4i8 = OpTypeArray %v4itype8 %c_i32_64\n"
			"   %SSBO16 = OpTypeStruct %ra_v4i16\n"
			"   %SSBO8 = OpTypeStruct %ra_v4i8\n"
			"%up_SSBO16 = OpTypePointer Uniform %SSBO16\n"
			"%up_SSBO8 = OpTypePointer StorageBuffer %SSBO8\n"
			"   %ssbo16 = OpVariable %up_SSBO16 Uniform\n"
			"   %ssbo8 = OpVariable %up_SSBO8 StorageBuffer\n");

	const StringTemplate	vecDecoration(
			"OpDecorate %ra_v4i16 ArrayStride 16\n"
			"OpDecorate %ra_v4i8 ArrayStride 4\n"
			"OpDecorate %SSBO16 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 0\n"
			"OpDecorate %ssbo8 Binding 1\n");

	const StringTemplate	vecTestFunc(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_64\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_v4i16 %ssbo16 %c_i32_0 %30\n"
			"%val16 = OpLoad ${v4itype16} %src\n"
			"%val8 = ${convert} %v4itype8 %val16\n"
			"  %dst = OpAccessChain %up_v4i8 %ssbo8 %c_i32_0 %30\n"
			"         OpStore %dst %val8\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"

			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	struct Category
	{
		const char*				name;
		const StringTemplate&	preMain;
		const StringTemplate&	decoration;
		const StringTemplate&	testFunction;
		const deUint32			numElements;
	};

	const Category		categories[]	=
	{
		{"scalar",	scalarPreMain,	scalarDecoration,	scalarTestFunc,	1},
		{"vector",	vecPreMain,		vecDecoration,		vecTestFunc,	4},
	};

	for (deUint32 catIdx = 0; catIdx < DE_LENGTH_OF_ARRAY(categories); ++catIdx)
	{
		resources.inputs.clear();
		resources.outputs.clear();
		vector<deInt16>						inputs	= getInt16s(rnd, ((arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt16))) * numDataPoints) / categories[catIdx].numElements);
		vector<deInt8>						outputs	(numDataPoints/ categories[catIdx].numElements);

		switch (categories[catIdx].numElements)
		{
		case 1:
			resources.verifyIO = checkUniformsArray<deInt16, deInt8, 1>;
			break;
		case 4:
			resources.verifyIO = checkUniformsArray<deInt16, deInt8, 4>;
			break;
		default:
			DE_FATAL("Impossible");
			break;
		}

		resources.inputs.push_back(Resource(BufferSp(new Int16Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		resources.outputs.push_back(Resource(BufferSp(new Int8Buffer(outputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

		for (deUint32 factIdx = 0; factIdx < DE_LENGTH_OF_ARRAY(intFacts); ++factIdx)
		{
			map<string, string>	specs;
			VulkanFeatures		features;
			string				name		= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + categories[catIdx].name + "_" + intFacts[factIdx].name;

			specs["cap"]					= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
			specs["itype16"]				= intFacts[factIdx].type16;
			specs["v4itype16"]				= "%v4" + string(intFacts[factIdx].type16).substr(1);
			specs["itype8"]					= intFacts[factIdx].type8;
			specs["signed"]					= intFacts[factIdx].isSigned;
			specs["convert"]				= intFacts[factIdx].opcode;

			fragments["pre_main"]			= categories[catIdx].preMain.specialize(specs);
			fragments["testfun"]			= categories[catIdx].testFunction.specialize(specs);
			fragments["capability"]			= capabilities.specialize(specs);
			fragments["decoration"]			= categories[catIdx].decoration.specialize(specs);

			features												= get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
			features.ext16BitStorage								= EXT16BITSTORAGEFEATURES_UNIFORM;
			features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
			features.coreFeatures.fragmentStoresAndAtomics			= true;

			createTestsForAllStages(name, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
	}
}

void addGraphics8BitStorageUniformInt8To16Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	const deUint32						numDataPoints		= 256;
	vector<deInt16>						outputs				(numDataPoints);
	RGBA								defaultColors[4];
	GraphicsResources					resources;
	vector<string>						extensions;
	const StringTemplate				capabilities		("OpCapability ${cap}\n");

	extensions.push_back("VK_KHR_8bit_storage");
	extensions.push_back("VK_KHR_16bit_storage");
	fragments["extension"]	=
		"OpCapability StorageUniform16\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
		"OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_16bit_storage\"\n";

	getDefaultColors(defaultColors);

	struct IntegerFacts
	{
		const char*	name;
		const char*	type16;
		const char*	type8;
		const char* opcode;
		bool		isSigned;
	};

	const IntegerFacts	intFacts[]	=
	{
		{"sint",	"%i16",		"%i8",		"OpSConvert",	true},
		{"uint",	"%u16",		"%u8",		"OpUConvert",	false},
	};

	struct ConstantIndex
	{
		bool		useConstantIndex;
		deUint32	constantIndex;
	};

	ConstantIndex	constantIndices[] =
	{
		{ false,	0 },
		{ true,		4 },
		{ true,		5 },
		{ true,		6 }
	};

	const StringTemplate scalarPreMain		(
			"${itype8}   = OpTypeInt 8 ${signed}\n"
			"${itype16}   = OpTypeInt 16 ${signed}\n"
			" %c_i32_256 = OpConstant %i32 256\n"
			"%c_i32_ci   = OpConstant %i32 ${constarrayidx}\n"
			"   %up_i16  = OpTypePointer StorageBuffer ${itype16}\n"
			"   %up_i8   = OpTypePointer Uniform ${itype8}\n"
			"   %ra_i16  = OpTypeArray ${itype16} %c_i32_256\n"
			"   %ra_i8   = OpTypeArray ${itype8} %c_i32_256\n"
			"   %SSBO16  = OpTypeStruct %ra_i16\n"
			"   %SSBO8   = OpTypeStruct %ra_i8\n"
			"%up_SSBO16  = OpTypePointer StorageBuffer %SSBO16\n"
			"%up_SSBO8   = OpTypePointer Uniform %SSBO8\n"
			"   %ssbo16  = OpVariable %up_SSBO16 StorageBuffer\n"
			"   %ssbo8   = OpVariable %up_SSBO8 Uniform\n");

	const StringTemplate scalarDecoration		(
			"OpDecorate %ra_i16 ArrayStride 2\n"
			"OpDecorate %ra_i8 ArrayStride 16\n"
			"OpDecorate %SSBO16 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 1\n"
			"OpDecorate %ssbo8 Binding 0\n");

	const StringTemplate scalarTestFunc	(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_256\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_i8 %ssbo8 %c_i32_0 %${arrayindex}\n"
			"%val8 = OpLoad ${itype8} %src\n"
			"%val16 = ${convert} ${itype16} %val8\n"
			"  %dst = OpAccessChain %up_i16 %ssbo16 %c_i32_0 %30\n"
			"         OpStore %dst %val16\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"
			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	const StringTemplate vecPreMain		(
			"${itype8}  = OpTypeInt 8 ${signed}\n"
			"${itype16} = OpTypeInt 16 ${signed}\n"
			"${v2itype16} = OpTypeVector ${itype16} 2\n"
			"%c_i32_128 = OpConstant %i32 128\n"
			"%c_i32_ci  = OpConstant %i32 ${constarrayidx}\n"
			"%v2itype8  = OpTypeVector ${itype8} 2\n"
			" %up_v2i16 = OpTypePointer StorageBuffer ${v2itype16}\n"
			" %up_v2i8  = OpTypePointer Uniform %v2itype8\n"
			" %ra_v2i16 = OpTypeArray ${v2itype16} %c_i32_128\n"
			" %ra_v2i8  = OpTypeArray %v2itype8 %c_i32_128\n"
			"   %SSBO16 = OpTypeStruct %ra_v2i16\n"
			"   %SSBO8  = OpTypeStruct %ra_v2i8\n"
			"%up_SSBO16 = OpTypePointer StorageBuffer %SSBO16\n"
			"%up_SSBO8  = OpTypePointer Uniform %SSBO8\n"
			"   %ssbo16 = OpVariable %up_SSBO16 StorageBuffer\n"
			"   %ssbo8  = OpVariable %up_SSBO8 Uniform\n");

	const StringTemplate vecDecoration		(
			"OpDecorate %ra_v2i16 ArrayStride 4\n"
			"OpDecorate %ra_v2i8 ArrayStride 16\n"
			"OpDecorate %SSBO16 Block\n"
			"OpDecorate %SSBO8 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpMemberDecorate %SSBO8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo8 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 1\n"
			"OpDecorate %ssbo8 Binding 0\n");

	const StringTemplate vecTestFunc	(
			"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
			"    %param = OpFunctionParameter %v4f32\n"

			"%entry = OpLabel\n"
			"    %i = OpVariable %fp_i32 Function\n"
			"         OpStore %i %c_i32_0\n"
			"         OpBranch %loop\n"

			" %loop = OpLabel\n"
			"   %15 = OpLoad %i32 %i\n"
			"   %lt = OpSLessThan %bool %15 %c_i32_128\n"
			"         OpLoopMerge %merge %inc None\n"
			"         OpBranchConditional %lt %write %merge\n"

			"%write = OpLabel\n"
			"   %30 = OpLoad %i32 %i\n"
			"  %src = OpAccessChain %up_v2i8 %ssbo8 %c_i32_0 %${arrayindex}\n"
			"%val8 = OpLoad %v2itype8 %src\n"
			"%val16 = ${convert} ${v2itype16} %val8\n"
			"  %dst = OpAccessChain %up_v2i16 %ssbo16 %c_i32_0 %30\n"
			"         OpStore %dst %val16\n"
			"         OpBranch %inc\n"

			"  %inc = OpLabel\n"
			"   %37 = OpLoad %i32 %i\n"
			"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
			"         OpStore %i %39\n"
			"         OpBranch %loop\n"
			"%merge = OpLabel\n"
			"         OpReturnValue %param\n"

			"OpFunctionEnd\n");

	struct Category
	{
		const char*				name;
		const StringTemplate&	preMain;
		const StringTemplate&	decoration;
		const StringTemplate&	testFunction;
		const deUint32			numElements;
	};

	const Category		categories[]	=
	{
		{"scalar", scalarPreMain,	scalarDecoration,	scalarTestFunc,	1},
		{"vector", vecPreMain,		vecDecoration,		vecTestFunc,	2},
	};

	for (deUint32 catIdx = 0; catIdx < DE_LENGTH_OF_ARRAY(categories); ++catIdx)
	{
		resources.inputs.clear();
		vector<deInt8>	inputs = getInt8s(rnd, (arrayStrideInBytesUniform / static_cast<deUint32>(sizeof(deInt8))) * (numDataPoints / categories[catIdx].numElements));
		resources.inputs.push_back(Resource(BufferSp(new Int8Buffer(inputs)), CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].dtype));
		for (deUint32 factIdx = 0; factIdx < DE_LENGTH_OF_ARRAY(intFacts); ++factIdx)
			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool				useConstIdx	= constantIndices[constIndexIdx].useConstantIndex;
				deUint32			constIdx	= constantIndices[constIndexIdx].constantIndex;
				map<string, string>	specs;
				VulkanFeatures		features;
				string				name		= string(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name) + "_" + categories[catIdx].name + "_" + intFacts[factIdx].name;

				specs["cap"]					= CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].cap;
				specs["itype16"]				= intFacts[factIdx].type16;
				specs["v2itype16"]				= "%v2" + string(intFacts[factIdx].type16).substr(1);
				specs["itype8"]					= intFacts[factIdx].type8;
				if (intFacts[factIdx].isSigned)
					specs["signed"]				= "1";
				else
					specs["signed"]				= "0";
				specs["convert"]				= intFacts[factIdx].opcode;
				specs["constarrayidx"]			= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				fragments["pre_main"]			= categories[catIdx].preMain.specialize(specs);
				fragments["testfun"]			= categories[catIdx].testFunction.specialize(specs);
				fragments["capability"]			= capabilities.specialize(specs);
				fragments["decoration"]			= categories[catIdx].decoration.specialize(specs);

				if (useConstIdx)
					name += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int16Buffer(outputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
				if (useConstIdx)
				{
					switch (constantIndices[constIndexIdx].constantIndex)
					{
					case 0:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 2, 0>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 1, 0>;
						break;
					case 4:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 2, 4>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 1, 4>;
						break;
					case 5:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 2, 5>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 1, 5>;
						break;
					case 6:
						if (categories[catIdx].numElements == 2)
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 2, 6>;
						else
							resources.verifyIO = checkUniformsArrayConstNdx<deInt8, deInt16, 1, 6>;
						break;
					default:
						DE_FATAL("Impossible");
						break;
					};
				}
				else
				{
					if (categories[catIdx].numElements == 2)
						resources.verifyIO = checkUniformsArray<deInt8, deInt16, 2>;
					else
						resources.verifyIO = checkUniformsArray<deInt8, deInt16, 1>;
				}

				features												= get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
				features.ext16BitStorage								= EXT16BITSTORAGEFEATURES_UNIFORM;
				features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
				features.coreFeatures.fragmentStoresAndAtomics			= true;

				createTestsForAllStages(name, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
	}
}

void addGraphics8BitStoragePushConstantInt8To16Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	RGBA								defaultColors[4];
	const deUint32						numDataPoints		= 64;
	vector<deInt8>						inputs				= getInt8s(rnd, numDataPoints);
	vector<deInt16>						sOutputs;
	vector<deInt16>						uOutputs;
	PushConstants						pcs;
	GraphicsResources					resources;
	vector<string>						extensions;
	const deUint8						signBitMask			= 0x80;
	const deUint16						signExtendMask		= 0xff00;
	VulkanFeatures						requiredFeatures;

	struct ConstantIndex
	{
		bool		useConstantIndex;
		deUint32	constantIndex;
	};

	ConstantIndex	constantIndices[] =
	{
		{ false,	0 },
		{ true,		4 },
		{ true,		5 },
		{ true,		6 }
	};

	sOutputs.reserve(inputs.size());
	uOutputs.reserve(inputs.size());

	for (deUint32 numNdx = 0; numNdx < inputs.size(); ++numNdx)
	{
		uOutputs.push_back(static_cast<deUint8>(inputs[numNdx]));
		if (inputs[numNdx] & signBitMask)
			sOutputs.push_back(static_cast<deInt16>(inputs[numNdx] | signExtendMask));
		else
			sOutputs.push_back(static_cast<deInt16>(inputs[numNdx]));
	}

	extensions.push_back("VK_KHR_8bit_storage");
	extensions.push_back("VK_KHR_16bit_storage");

	requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics	= true;
	requiredFeatures.coreFeatures.fragmentStoresAndAtomics			= true;
	requiredFeatures.ext8BitStorage									= EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
	requiredFeatures.ext16BitStorage								= EXT16BITSTORAGEFEATURES_UNIFORM;

	fragments["capability"]				= "OpCapability StoragePushConstant8\n"
										  "OpCapability StorageUniform16\n";
	fragments["extension"]				= "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
										  "OpExtension \"SPV_KHR_8bit_storage\"\n"
										  "OpExtension \"SPV_KHR_16bit_storage\"\n";

	pcs.setPushConstant(BufferSp(new Int8Buffer(inputs)));

	getDefaultColors(defaultColors);

	const StringTemplate	testFun		(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"

		"%entry = OpLabel\n"
		"    %i = OpVariable %fp_i32 Function\n"
		"         OpStore %i %c_i32_0\n"
		"         OpBranch %loop\n"

		" %loop = OpLabel\n"
		"   %15 = OpLoad %i32 %i\n"
		"   %lt = OpSLessThan %bool %15 %c_i32_${count}\n"
		"         OpLoopMerge %merge %inc None\n"
		"         OpBranchConditional %lt %write %merge\n"

		"%write = OpLabel\n"
		"   %30 = OpLoad %i32 %i\n"
		"  %src = OpAccessChain %pp_${type8} %pc8 %c_i32_0 %${arrayindex}\n"
		"%val8 = OpLoad %${type8} %src\n"
		"%val16 = ${convert} %${type16} %val8\n"
		"  %dst = OpAccessChain %up_${type16} %ssbo16 %c_i32_0 %30\n"
		"         OpStore %dst %val16\n"
		"         OpBranch %inc\n"

		"  %inc = OpLabel\n"
		"   %37 = OpLoad %i32 %i\n"
		"   %39 = OpIAdd %i32 %37 %c_i32_1\n"
		"         OpStore %i %39\n"
		"         OpBranch %loop\n"

		"%merge = OpLabel\n"
		"         OpReturnValue %param\n"

		"OpFunctionEnd\n");

	{  // Scalar cases
		const StringTemplate	preMain		(
			"         %${type8} = OpTypeInt 8 ${signed}\n"
			"         %${type16} = OpTypeInt 16 ${signed}\n"
			"    %c_i32_${count} = OpConstant %i32 ${count}\n"					// Should be the same as numDataPoints
			"         %c_i32_ci = OpConstant %i32 ${constarrayidx}\n"
			"%a${count}${type8} = OpTypeArray %${type8} %c_i32_${count}\n"
			"%a${count}${type16} = OpTypeArray %${type16} %c_i32_${count}\n"
			"      %pp_${type8} = OpTypePointer PushConstant %${type8}\n"
			"      %up_${type16} = OpTypePointer StorageBuffer      %${type16}\n"
			"            %SSBO16 = OpTypeStruct %a${count}${type16}\n"
			"         %up_SSBO16 = OpTypePointer StorageBuffer %SSBO16\n"
			"            %ssbo16 = OpVariable %up_SSBO16 StorageBuffer\n"
			"              %PC8 = OpTypeStruct %a${count}${type8}\n"
			"           %pp_PC8 = OpTypePointer PushConstant %PC8\n"
			"              %pc8 = OpVariable %pp_PC8 PushConstant\n");

		const StringTemplate	decoration	(
			"OpDecorate %a${count}${type8} ArrayStride 1\n"
			"OpDecorate %a${count}${type16} ArrayStride 2\n"
			"OpDecorate %SSBO16 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpDecorate %PC8 Block\n"
			"OpMemberDecorate %PC8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 0\n");

		{  // signed int
			map<string, string>		specs;

			specs["type8"]			= "i8";
			specs["type16"]			= "i16";
			specs["signed"]			= "1";
			specs["count"]			= "64";
			specs["convert"]		= "OpSConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "sint_scalar";
				vector<deInt16>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(sOutputs[constIdx]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int16Buffer(useConstIdx ? constIdxData : sOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
		{  // signed int
			map<string, string>		specs;

			specs["type8"]			= "u8";
			specs["type16"]			= "u16";
			specs["signed"]			= "0";
			specs["count"]			= "64";
			specs["convert"]		= "OpUConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "uint_scalar";
				vector<deInt16>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(uOutputs[constIdx]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int16Buffer(useConstIdx ? constIdxData : uOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
	}

	{  // Vector cases
		const StringTemplate	preMain		(
			"    %${base_type8} = OpTypeInt 8 ${signed}\n"
			"         %${type8} = OpTypeVector %${base_type8} 2\n"
			"    %${base_type16} = OpTypeInt 16 ${signed}\n"
			"         %${type16} = OpTypeVector %${base_type16} 2\n"
			"    %c_i32_${count} = OpConstant %i32 ${count}\n"
			"          %c_i32_ci = OpConstant %i32 ${constarrayidx}\n"
			"%a${count}${type8} = OpTypeArray %${type8} %c_i32_${count}\n"
			"%a${count}${type16} = OpTypeArray %${type16} %c_i32_${count}\n"
			"      %pp_${type8} = OpTypePointer PushConstant %${type8}\n"
			"      %up_${type16} = OpTypePointer StorageBuffer      %${type16}\n"
			"            %SSBO16 = OpTypeStruct %a${count}${type16}\n"
			"         %up_SSBO16 = OpTypePointer StorageBuffer %SSBO16\n"
			"            %ssbo16 = OpVariable %up_SSBO16 StorageBuffer\n"
			"              %PC8 = OpTypeStruct %a${count}${type8}\n"
			"           %pp_PC8 = OpTypePointer PushConstant %PC8\n"
			"              %pc8 = OpVariable %pp_PC8 PushConstant\n");

		const StringTemplate	decoration	(
			"OpDecorate %a${count}${type8} ArrayStride 2\n"
			"OpDecorate %a${count}${type16} ArrayStride 4\n"
			"OpDecorate %SSBO16 Block\n"
			"OpMemberDecorate %SSBO16 0 Offset 0\n"
			"OpDecorate %PC8 Block\n"
			"OpMemberDecorate %PC8 0 Offset 0\n"
			"OpDecorate %ssbo16 DescriptorSet 0\n"
			"OpDecorate %ssbo16 Binding 0\n");

		{  // signed int
			map<string, string>		specs;

			specs["base_type8"]		= "i8";
			specs["base_type16"]	= "i16";
			specs["type8"]			= "v2i8";
			specs["type16"]			= "v2i16";
			specs["signed"]			= "1";
			specs["count"]			= "32";				// 64 / 2
			specs["convert"]		= "OpSConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "sint_vector";
				vector<deInt16>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(sOutputs[constIdx * 2 + numIdx % 2]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int16Buffer(useConstIdx ? constIdxData : sOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
		{  // signed int
			map<string, string>		specs;

			specs["base_type8"]		= "u8";
			specs["base_type16"]	= "u16";
			specs["type8"]			= "v2u8";
			specs["type16"]			= "v2u16";
			specs["signed"]			= "0";
			specs["count"]			= "32";
			specs["convert"]		= "OpUConvert";

			for (deUint32 constIndexIdx = 0; constIndexIdx < DE_LENGTH_OF_ARRAY(constantIndices); ++constIndexIdx)
			{
				bool			useConstIdx		= constantIndices[constIndexIdx].useConstantIndex;
				deUint32		constIdx		= constantIndices[constIndexIdx].constantIndex;
				string			testName		= "uint_vector";
				vector<deInt16>	constIdxData;

				if (useConstIdx)
				{
					constIdxData.reserve(numDataPoints);

					for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
						constIdxData.push_back(uOutputs[constIdx * 2 + numIdx % 2]);
				}

				specs["constarrayidx"]	= de::toString(constIdx);
				if (useConstIdx)
					specs["arrayindex"] = "c_i32_ci";
				else
					specs["arrayindex"] = "30";

				if (useConstIdx)
					testName += string("_const_idx_") + de::toString(constIdx);

				resources.outputs.clear();
				resources.outputs.push_back(Resource(BufferSp(new Int16Buffer(useConstIdx ? constIdxData : uOutputs)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));

				fragments["testfun"]	= testFun.specialize(specs);
				fragments["pre_main"]	= preMain.specialize(specs);
				fragments["decoration"]	= decoration.specialize(specs);

				createTestsForAllStages(testName.c_str(), defaultColors, defaultColors, fragments, pcs, resources, extensions, testGroup, requiredFeatures);
			}
		}
	}
}

void addGraphics8BitStorageUniformStruct8To32Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	vector<string>						extensions;
	RGBA								defaultColors[4];
	const StringTemplate				capabilities		("OpCapability ${cap}\n");
	vector<deInt32>						i32Data				= data32bit(SHADERTEMPLATE_STRIDE32BIT_STD430, rnd, false);

	extensions.push_back("VK_KHR_8bit_storage");
	fragments["extension"]	= "OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";

	getDefaultColors(defaultColors);

	const StringTemplate preMain		(
		"\n"
		"%i8      = OpTypeInt 8 ${signed}\n"
		"%v2i8    = OpTypeVector %i8 2\n"
		"%v3i8    = OpTypeVector %i8 3\n"
		"%v4i8    = OpTypeVector %i8 4\n"
		"%i8ptr   = OpTypePointer ${8Storage} %i8\n"
		"%v2i8ptr = OpTypePointer ${8Storage} %v2i8\n"
		"%v3i8ptr = OpTypePointer ${8Storage} %v3i8\n"
		"%v4i8ptr = OpTypePointer ${8Storage} %v4i8\n"
		"\n"
		"%i32ptr   = OpTypePointer ${32Storage} %${32type}\n"
		"%v2i32ptr = OpTypePointer ${32Storage} %v2${32type}\n"
		"%v3i32ptr = OpTypePointer ${32Storage} %v3${32type}\n"
		"%v4i32ptr = OpTypePointer ${32Storage} %v4${32type}\n"
		"\n"
		"%zero = OpConstant %i32 0\n"
		"%c_i32_5  = OpConstant %i32 5\n"
		"%c_i32_6  = OpConstant %i32 6\n"
		"%c_i32_7  = OpConstant %i32 7\n"
		"%c_i32_8  = OpConstant %i32 8\n"
		"%c_i32_9  = OpConstant %i32 9\n"
		"%c_i32_11 = OpConstant %i32 11\n"
		"\n"
		"%c_u32_7 = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"
		"%i8arr3       = OpTypeArray %i8 %c_u32_3\n"
		"%v2i8arr3     = OpTypeArray %v2i8 %c_u32_3\n"
		"%v2i8arr11    = OpTypeArray %v2i8 %c_u32_11\n"
		"%v3i8arr11    = OpTypeArray %v3i8 %c_u32_11\n"
		"%v4i8arr3     = OpTypeArray %v4i8 %c_u32_3\n"
		"%struct8      = OpTypeStruct %i8 %v2i8arr3\n"
		"%struct8arr11 = OpTypeArray %struct8 %c_u32_11\n"
		"%i8Struct = OpTypeStruct %i8 %v2i8 %v3i8 %v4i8 %i8arr3 %struct8arr11 %v2i8arr11 %i8 %v3i8arr11 %v4i8arr3\n"
		"\n"
		"%i32arr3       = OpTypeArray %${32type} %c_u32_3\n"
		"%v2i32arr3     = OpTypeArray %v2${32type} %c_u32_3\n"
		"%v2i32arr11    = OpTypeArray %v2${32type} %c_u32_11\n"
		"%v3i32arr11    = OpTypeArray %v3${32type} %c_u32_11\n"
		"%v4i32arr3     = OpTypeArray %v4${32type} %c_u32_3\n"
		"%struct32      = OpTypeStruct %${32type} %v2i32arr3\n"
		"%struct32arr11 = OpTypeArray %struct32 %c_u32_11\n"
		"%i32Struct = OpTypeStruct %${32type} %v2${32type} %v3${32type} %v4${32type} %i32arr3 %struct32arr11 %v2i32arr11 %${32type} %v3i32arr11 %v4i32arr3\n"
		"\n"
		"%i8StructArr7  = OpTypeArray %i8Struct %c_u32_7\n"
		"%i32StructArr7 = OpTypeArray %i32Struct %c_u32_7\n"
		"%SSBO_IN       = OpTypeStruct %i8StructArr7\n"
		"%SSBO_OUT      = OpTypeStruct %i32StructArr7\n"
		"%up_SSBOIN     = OpTypePointer ${8Storage} %SSBO_IN\n"
		"%up_SSBOOUT    = OpTypePointer ${32Storage} %SSBO_OUT\n"
		"%ssboIN        = OpVariable %up_SSBOIN ${8Storage}\n"
		"%ssboOUT       = OpVariable %up_SSBOOUT ${32Storage}\n"
		"\n");

	const StringTemplate decoration		(
		"${stridei8}"
		"\n"
		"${stridei32}"
		"\n"
		"OpDecorate %SSBO_IN Block\n"
		"OpDecorate %SSBO_OUT Block\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"OpDecorate %ssboOUT Binding 1\n"
		"\n");

	const StringTemplate testFun		(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"    %param = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%loopNdx   = OpVariable %fp_i32 Function\n"
		"%insideLoopNdx = OpVariable %fp_i32 Function\n"

		"OpStore %loopNdx %zero\n"
		"OpBranch %loop\n"
		"%loop = OpLabel\n"
		"OpLoopMerge %merge %13 None\n"
		"OpBranch %14\n"
		"%14 = OpLabel\n"
		"%valLoopNdx = OpLoad %i32 %loopNdx\n"
		"%18 = OpSLessThan %bool %valLoopNdx %c_i32_7\n"
		"OpBranchConditional %18 %11 %merge\n"
		"%11 = OpLabel\n"
		"\n"
		"%i8src  = OpAccessChain %i8ptr %ssboIN %zero %valLoopNdx %zero\n"
		"%val_i8 = OpLoad %i8 %i8src\n"
		"%val_i32 = ${convert} %${32type} %val_i8\n"
		"%i32dst  = OpAccessChain %i32ptr %ssboOUT %zero %valLoopNdx %zero\n"
		"OpStore %i32dst %val_i32\n"
		"\n"
		"%v2i8src  = OpAccessChain %v2i8ptr %ssboIN %zero %valLoopNdx %c_i32_1\n"
		"%val_v2i8 = OpLoad %v2i8 %v2i8src\n"
		"%val_v2i32 = ${convert} %v2${32type} %val_v2i8\n"
		"%v2i32dst  = OpAccessChain %v2i32ptr %ssboOUT %zero %valLoopNdx %c_i32_1\n"
		"OpStore %v2i32dst %val_v2i32\n"
		"\n"
		"%v3i8src  = OpAccessChain %v3i8ptr %ssboIN %zero %valLoopNdx %c_i32_2\n"
		"%val_v3i8 = OpLoad %v3i8 %v3i8src\n"
		"%val_v3i32 = ${convert} %v3${32type} %val_v3i8\n"
		"%v3i32dst  = OpAccessChain %v3i32ptr %ssboOUT %zero %valLoopNdx %c_i32_2\n"
		"OpStore %v3i32dst %val_v3i32\n"
		"\n"
		"%v4i8src  = OpAccessChain %v4i8ptr %ssboIN %zero %valLoopNdx %c_i32_3\n"
		"%val_v4i8 = OpLoad %v4i8 %v4i8src\n"
		"%val_v4i32 = ${convert} %v4${32type} %val_v4i8\n"
		"%v4i32dst  = OpAccessChain %v4i32ptr %ssboOUT %zero %valLoopNdx %c_i32_3\n"
		"OpStore %v4i32dst %val_v4i32\n"
		"\n"
		"%i8src2  = OpAccessChain %i8ptr %ssboIN %zero %valLoopNdx %c_i32_7\n"
		"%val2_i8 = OpLoad %i8 %i8src2\n"
		"%val2_i32 = ${convert} %${32type} %val2_i8\n"
		"%i32dst2  = OpAccessChain %i32ptr %ssboOUT %zero %valLoopNdx %c_i32_7\n"
		"OpStore %i32dst2 %val2_i32\n"
		"\n"
		"OpStore %insideLoopNdx %zero\n"
		"OpBranch %loopInside\n"
		"%loopInside = OpLabel\n"
		"OpLoopMerge %92 %93 None\n"
		"OpBranch %94\n"
		"%94 = OpLabel\n"
		"%valInsideLoopNdx = OpLoad %i32 %insideLoopNdx\n"
		"%96 = OpSLessThan %bool %valInsideLoopNdx %c_i32_11\n"
		"OpBranchConditional %96 %91 %92\n"
		"\n"
		"%91 = OpLabel\n"
		"\n"
		"%v2i8src2  = OpAccessChain %v2i8ptr %ssboIN %zero %valLoopNdx %c_i32_6 %valInsideLoopNdx\n"
		"%val2_v2i8 = OpLoad %v2i8 %v2i8src2\n"
		"%val2_v2i32 = ${convert} %v2${32type} %val2_v2i8\n"
		"%v2i32dst2  = OpAccessChain %v2i32ptr %ssboOUT %zero %valLoopNdx %c_i32_6 %valInsideLoopNdx\n"
		"OpStore %v2i32dst2 %val2_v2i32\n"
		"\n"
		"%v3i8src2  = OpAccessChain %v3i8ptr %ssboIN %zero %valLoopNdx %c_i32_8 %valInsideLoopNdx\n"
		"%val2_v3i8 = OpLoad %v3i8 %v3i8src2\n"
		"%val2_v3i32 = ${convert} %v3${32type} %val2_v3i8\n"
		"%v3i32dst2  = OpAccessChain %v3i32ptr %ssboOUT %zero %valLoopNdx %c_i32_8 %valInsideLoopNdx\n"
		"OpStore %v3i32dst2 %val2_v3i32\n"
		"\n"
		//struct {i8, v2i8[3]}
		"%Si8src  = OpAccessChain %i8ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %zero\n"
		"%Sval_i8 = OpLoad %i8 %Si8src\n"
		"%Sval_i32 = ${convert} %${32type} %Sval_i8\n"
		"%Si32dst2  = OpAccessChain %i32ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %zero\n"
		"OpStore %Si32dst2 %Sval_i32\n"
		"\n"
		"%Sv2i8src0   = OpAccessChain %v2i8ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %zero\n"
		"%Sv2i8_0     = OpLoad %v2i8 %Sv2i8src0\n"
		"%Sv2i32_0     = ${convert} %v2${32type} %Sv2i8_0\n"
		"%Sv2i32dst_0  = OpAccessChain %v2i32ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %zero\n"
		"OpStore %Sv2i32dst_0 %Sv2i32_0\n"
		"\n"
		"%Sv2i8src1  = OpAccessChain %v2i8ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_1\n"
		"%Sv2i8_1 = OpLoad %v2i8 %Sv2i8src1\n"
		"%Sv2i32_1 = ${convert} %v2${32type} %Sv2i8_1\n"
		"%Sv2i32dst_1  = OpAccessChain %v2i32ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_1\n"
		"OpStore %Sv2i32dst_1 %Sv2i32_1\n"
		"\n"
		"%Sv2i8src2  = OpAccessChain %v2i8ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_2\n"
		"%Sv2i8_2 = OpLoad %v2i8 %Sv2i8src2\n"
		"%Sv2i32_2 = ${convert} %v2${32type} %Sv2i8_2\n"
		"%Sv2i32dst_2  = OpAccessChain %v2i32ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_2\n"
		"OpStore %Sv2i32dst_2 %Sv2i32_2\n"
		"\n"
		//Array with 3 elements
		"%LessThan3 = OpSLessThan %bool %valInsideLoopNdx %c_i32_3\n"
		"OpSelectionMerge %BlockIf None\n"
		"OpBranchConditional %LessThan3 %LabelIf %BlockIf\n"
		"%LabelIf = OpLabel\n"
		"  %i8src3  = OpAccessChain %i8ptr %ssboIN %zero %valLoopNdx %c_i32_4 %valInsideLoopNdx\n"
		"  %val3_i8 = OpLoad %i8 %i8src3\n"
		"  %val3_i32 = ${convert} %${32type} %val3_i8\n"
		"  %i32dst3  = OpAccessChain %i32ptr %ssboOUT %zero %valLoopNdx %c_i32_4 %valInsideLoopNdx\n"
		"  OpStore %i32dst3 %val3_i32\n"
		"\n"
		"  %v4i8src2  = OpAccessChain %v4i8ptr %ssboIN %zero %valLoopNdx %c_i32_9 %valInsideLoopNdx\n"
		"  %val2_v4i8 = OpLoad %v4i8 %v4i8src2\n"
		"  %val2_v4i32 = ${convert} %v4${32type} %val2_v4i8\n"
		"  %v4i32dst2  = OpAccessChain %v4i32ptr %ssboOUT %zero %valLoopNdx %c_i32_9 %valInsideLoopNdx\n"
		"  OpStore %v4i32dst2 %val2_v4i32\n"
		"OpBranch %BlockIf\n"
		"%BlockIf = OpLabel\n"
		"\n"
		"OpBranch %93\n"
		"%93 = OpLabel\n"
		"%132 = OpLoad %i32 %insideLoopNdx\n"
		"%133 = OpIAdd %i32 %132 %c_i32_1\n"
		"OpStore %insideLoopNdx %133\n"
		"OpBranch %loopInside\n"
		"\n"
		"%92 = OpLabel\n"
		"OpBranch %13\n"
		"%13 = OpLabel\n"
		"%134 = OpLoad %i32 %loopNdx\n"
		"%135 = OpIAdd %i32 %134 %c_i32_1\n"
		"OpStore %loopNdx %135\n"
		"OpBranch %loop\n"

		"%merge = OpLabel\n"
		"         OpReturnValue %param\n"
		"         OpFunctionEnd\n");

	struct IntegerFacts
	{
		const char*	name;
		const char* opcode;
		const char*	signedInt;
		const char*	type32;
	};

	const IntegerFacts	intFacts[]	=
	{
		{"sint",	"OpSConvert",	"1", "i32"},
		{"uint",	"OpUConvert",	"0", "u32"},
	};

	for (deUint32 capIdx = 0; capIdx < DE_LENGTH_OF_ARRAY(CAPABILITIES); ++capIdx)
		for (deUint32 intFactsNdx = 0; intFactsNdx < DE_LENGTH_OF_ARRAY(intFacts); ++intFactsNdx)
		{
			const bool				isUniform	= (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == CAPABILITIES[capIdx].dtype);
			vector<deInt8>			i8Data		= isUniform ? data8bit(SHADERTEMPLATE_STRIDE8BIT_STD140, rnd) : data8bit(SHADERTEMPLATE_STRIDE8BIT_STD430, rnd);
			GraphicsResources		resources;
			map<string, string>		specs;
			VulkanFeatures			features;
			const string			testName	= string(CAPABILITIES[capIdx].name) + "_" + intFacts[intFactsNdx].name;

			specs["cap"]						= CAPABILITIES[capIdx].cap;
			specs["stridei8"]					= getStructShaderComponet(isUniform ? SHADERTEMPLATE_STRIDE8BIT_STD140 : SHADERTEMPLATE_STRIDE8BIT_STD430);
			specs["stridei32"]					= getStructShaderComponet(SHADERTEMPLATE_STRIDE32BIT_STD430);
			specs["32Storage"]					= "StorageBuffer";
			specs["8Storage"]					= isUniform ? "Uniform" : "StorageBuffer";
			specs["signed"]						= intFacts[intFactsNdx].signedInt;
			specs["convert"]					= intFacts[intFactsNdx].opcode;
			specs["32type"]						= intFacts[intFactsNdx].type32;

			fragments["capability"]				= capabilities.specialize(specs);
			fragments["decoration"]				= decoration.specialize(specs);
			fragments["pre_main"]				= preMain.specialize(specs);
			fragments["testfun"]				= testFun.specialize(specs);

			resources.inputs.push_back(Resource(BufferSp(new Int8Buffer(i8Data)), CAPABILITIES[capIdx].dtype));
			resources.outputs.push_back(Resource(BufferSp(new Int32Buffer(i32Data)), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
			if (isUniform)
				resources.verifyIO = checkStruct<deInt8, deInt32, SHADERTEMPLATE_STRIDE8BIT_STD140, SHADERTEMPLATE_STRIDE32BIT_STD430>;
			else
				resources.verifyIO = checkStruct<deInt8, deInt32, SHADERTEMPLATE_STRIDE8BIT_STD430, SHADERTEMPLATE_STRIDE32BIT_STD430>;

			features												= get8BitStorageFeatures(CAPABILITIES[capIdx].name);
			features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
			features.coreFeatures.fragmentStoresAndAtomics			= true;

			createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
}

void addGraphics8BitStorageUniformStruct32To8Group (tcu::TestCaseGroup* testGroup)
{
	de::Random							rnd					(deStringHash(testGroup->getName()));
	map<string, string>					fragments;
	vector<string>						extensions;
	RGBA								defaultColors[4];
	const StringTemplate				capabilities		("OpCapability ${cap}\n");
	vector<deInt8>						i8Data				= data8bit(SHADERTEMPLATE_STRIDE8BIT_STD430, rnd, false);

	extensions.push_back("VK_KHR_8bit_storage");
	fragments["extension"]	= "OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";

	getDefaultColors(defaultColors);

	const StringTemplate preMain		(
		"\n"
		"%i8      = OpTypeInt 8 ${signed}\n"
		"%v2i8    = OpTypeVector %i8 2\n"
		"%v3i8    = OpTypeVector %i8 3\n"
		"%v4i8    = OpTypeVector %i8 4\n"
		"%i8ptr   = OpTypePointer ${8Storage} %i8\n"
		"%v2i8ptr = OpTypePointer ${8Storage} %v2i8\n"
		"%v3i8ptr = OpTypePointer ${8Storage} %v3i8\n"
		"%v4i8ptr = OpTypePointer ${8Storage} %v4i8\n"
		"\n"
		"%i32ptr   = OpTypePointer ${32Storage} %${32type}\n"
		"%v2i32ptr = OpTypePointer ${32Storage} %v2${32type}\n"
		"%v3i32ptr = OpTypePointer ${32Storage} %v3${32type}\n"
		"%v4i32ptr = OpTypePointer ${32Storage} %v4${32type}\n"
		"\n"
		"%zero = OpConstant %i32 0\n"
		"%c_i32_5  = OpConstant %i32 5\n"
		"%c_i32_6  = OpConstant %i32 6\n"
		"%c_i32_7  = OpConstant %i32 7\n"
		"%c_i32_8  = OpConstant %i32 8\n"
		"%c_i32_9  = OpConstant %i32 9\n"
		"%c_i32_11 = OpConstant %i32 11\n"
		"\n"
		"%c_u32_7 = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"
		"%i8arr3       = OpTypeArray %i8 %c_u32_3\n"
		"%v2i8arr3    = OpTypeArray %v2i8 %c_u32_3\n"
		"%v2i8arr11    = OpTypeArray %v2i8 %c_u32_11\n"
		"%v3i8arr11    = OpTypeArray %v3i8 %c_u32_11\n"
		"%v4i8arr3     = OpTypeArray %v4i8 %c_u32_3\n"
		"%struct8      = OpTypeStruct %i8 %v2i8arr3\n"
		"%struct8arr11 = OpTypeArray %struct8 %c_u32_11\n"
		"%i8Struct = OpTypeStruct %i8 %v2i8 %v3i8 %v4i8 %i8arr3 %struct8arr11 %v2i8arr11 %i8 %v3i8arr11 %v4i8arr3\n"
		"\n"
		"%i32arr3       = OpTypeArray %${32type} %c_u32_3\n"
		"%v2i32arr3     = OpTypeArray %v2${32type} %c_u32_3\n"
		"%v2i32arr11    = OpTypeArray %v2${32type} %c_u32_11\n"
		"%v3i32arr11    = OpTypeArray %v3${32type} %c_u32_11\n"
		"%v4i32arr3     = OpTypeArray %v4${32type} %c_u32_3\n"
		"%struct32      = OpTypeStruct %${32type} %v2i32arr3\n"
		"%struct32arr11 = OpTypeArray %struct32 %c_u32_11\n"
		"%i32Struct = OpTypeStruct %${32type} %v2${32type} %v3${32type} %v4${32type} %i32arr3 %struct32arr11 %v2i32arr11 %${32type} %v3i32arr11 %v4i32arr3\n"
		"\n"
		"%i8StructArr7  = OpTypeArray %i8Struct %c_u32_7\n"
		"%i32StructArr7 = OpTypeArray %i32Struct %c_u32_7\n"
		"%SSBO_IN       = OpTypeStruct %i32StructArr7\n"
		"%SSBO_OUT      = OpTypeStruct %i8StructArr7\n"
		"%up_SSBOIN     = OpTypePointer ${32Storage} %SSBO_IN\n"
		"%up_SSBOOUT    = OpTypePointer ${8Storage} %SSBO_OUT\n"
		"%ssboIN        = OpVariable %up_SSBOIN ${32Storage}\n"
		"%ssboOUT       = OpVariable %up_SSBOOUT ${8Storage}\n"
		"\n");

	const StringTemplate decoration		(
		"${stridei8}"
		"\n"
		"${stridei32}"
		"\n"
		"OpDecorate %SSBO_IN Block\n"
		"OpDecorate %SSBO_OUT Block\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"OpDecorate %ssboOUT Binding 1\n"
		"\n");

	const StringTemplate testFun		(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%loopNdx    = OpVariable %fp_i32 Function\n"
		"%insideLoopNdx = OpVariable %fp_i32 Function\n"

		"OpStore %loopNdx %zero\n"
		"OpBranch %loop\n"
		"%loop = OpLabel\n"
		"OpLoopMerge %merge %13 None\n"
		"OpBranch %14\n"
		"%14 = OpLabel\n"
		"%valLoopNdx = OpLoad %i32 %loopNdx\n"
		"%18 = OpSLessThan %bool %valLoopNdx %c_i32_7\n"
		"OpBranchConditional %18 %11 %merge\n"
		"%11 = OpLabel\n"
		"\n"
		"%i32src  = OpAccessChain %i32ptr %ssboIN %zero %valLoopNdx %zero\n"
		"%val_i32 = OpLoad %${32type} %i32src\n"
		"%val_i8 = ${convert} %i8 %val_i32\n"
		"%i8dst  = OpAccessChain %i8ptr %ssboOUT %zero %valLoopNdx %zero\n"
		"OpStore %i8dst %val_i8\n"
		"\n"
		"%v2i32src  = OpAccessChain %v2i32ptr %ssboIN %zero %valLoopNdx %c_i32_1\n"
		"%val_v2i32 = OpLoad %v2${32type} %v2i32src\n"
		"%val_v2i8 = ${convert} %v2i8 %val_v2i32\n"
		"%v2i8dst  = OpAccessChain %v2i8ptr %ssboOUT %zero %valLoopNdx %c_i32_1\n"
		"OpStore %v2i8dst %val_v2i8\n"
		"\n"
		"%v3i32src  = OpAccessChain %v3i32ptr %ssboIN %zero %valLoopNdx %c_i32_2\n"
		"%val_v3i32 = OpLoad %v3${32type} %v3i32src\n"
		"%val_v3i8 = ${convert} %v3i8 %val_v3i32\n"
		"%v3i8dst  = OpAccessChain %v3i8ptr %ssboOUT %zero %valLoopNdx %c_i32_2\n"
		"OpStore %v3i8dst %val_v3i8\n"
		"\n"
		"%v4i32src  = OpAccessChain %v4i32ptr %ssboIN %zero %valLoopNdx %c_i32_3\n"
		"%val_v4i32 = OpLoad %v4${32type} %v4i32src\n"
		"%val_v4i8 = ${convert} %v4i8 %val_v4i32\n"
		"%v4i8dst  = OpAccessChain %v4i8ptr %ssboOUT %zero %valLoopNdx %c_i32_3\n"
		"OpStore %v4i8dst %val_v4i8\n"
		"\n"
		"%i32src2  = OpAccessChain %i32ptr %ssboIN %zero %valLoopNdx %c_i32_7\n"
		"%val2_i32 = OpLoad %${32type} %i32src2\n"
		"%val2_i8 = ${convert} %i8 %val2_i32\n"
		"%i8dst2  = OpAccessChain %i8ptr %ssboOUT %zero %valLoopNdx %c_i32_7\n"
		"OpStore %i8dst2 %val2_i8\n"
		"\n"
		"OpStore %insideLoopNdx %zero\n"
		"OpBranch %loopInside\n"
		"%loopInside = OpLabel\n"
		"OpLoopMerge %92 %93 None\n"
		"OpBranch %94\n"
		"%94 = OpLabel\n"
		"%valInsideLoopNdx = OpLoad %i32 %insideLoopNdx\n"
		"%96 = OpSLessThan %bool %valInsideLoopNdx %c_i32_11\n"
		"OpBranchConditional %96 %91 %92\n"
		"\n"
		"%91 = OpLabel\n"
		"\n"
		//struct {i8, v2i8[3]}
		"%Si32src  = OpAccessChain %i32ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %zero\n"
		"%Sval_i32 = OpLoad %${32type} %Si32src\n"
		"%Sval_i8  = ${convert} %i8 %Sval_i32\n"
		"%Si8dst2  = OpAccessChain %i8ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %zero\n"
		"OpStore %Si8dst2 %Sval_i8\n"
		"\n"
		"%Sv2i32src0 = OpAccessChain %v2i32ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %zero\n"
		"%Sv2i32_0   = OpLoad %v2${32type} %Sv2i32src0\n"
		"%Sv2i8_0    = ${convert} %v2i8 %Sv2i32_0\n"
		"%Sv2i8dst_0 = OpAccessChain %v2i8ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %zero\n"
		"OpStore %Sv2i8dst_0 %Sv2i8_0\n"
		"\n"
		"%Sv2i32src1 = OpAccessChain %v2i32ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_1\n"
		"%Sv2i32_1   = OpLoad %v2${32type} %Sv2i32src1\n"
		"%Sv2i8_1    = ${convert} %v2i8 %Sv2i32_1\n"
		"%Sv2i8dst_1 = OpAccessChain %v2i8ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_1\n"
		"OpStore %Sv2i8dst_1 %Sv2i8_1\n"
		"\n"
		"%Sv2i32src2 = OpAccessChain %v2i32ptr %ssboIN %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_2\n"
		"%Sv2i32_2   = OpLoad %v2${32type} %Sv2i32src2\n"
		"%Sv2i8_2    = ${convert} %v2i8 %Sv2i32_2\n"
		"%Sv2i8dst_2 = OpAccessChain %v2i8ptr %ssboOUT %zero %valLoopNdx %c_i32_5 %valInsideLoopNdx %c_i32_1 %c_i32_2\n"
		"OpStore %Sv2i8dst_2 %Sv2i8_2\n"
		"\n"

		"%v2i32src2  = OpAccessChain %v2i32ptr %ssboIN %zero %valLoopNdx %c_i32_6 %valInsideLoopNdx\n"
		"%val2_v2i32 = OpLoad %v2${32type} %v2i32src2\n"
		"%val2_v2i8  = ${convert} %v2i8 %val2_v2i32\n"
		"%v2i8dst2   = OpAccessChain %v2i8ptr %ssboOUT %zero %valLoopNdx %c_i32_6 %valInsideLoopNdx\n"
		"OpStore %v2i8dst2 %val2_v2i8\n"
		"\n"
		"%v3i32src2  = OpAccessChain %v3i32ptr %ssboIN %zero %valLoopNdx %c_i32_8 %valInsideLoopNdx\n"
		"%val2_v3i32 = OpLoad %v3${32type} %v3i32src2\n"
		"%val2_v3i8  = ${convert} %v3i8 %val2_v3i32\n"
		"%v3i8dst2   = OpAccessChain %v3i8ptr %ssboOUT %zero %valLoopNdx %c_i32_8 %valInsideLoopNdx\n"
		"OpStore %v3i8dst2 %val2_v3i8\n"
		"\n"

		//Array with 3 elements
		"%LessThan3 = OpSLessThan %bool %valInsideLoopNdx %c_i32_3\n"
		"OpSelectionMerge %BlockIf None\n"
		"OpBranchConditional %LessThan3 %LabelIf %BlockIf\n"
		"  %LabelIf = OpLabel\n"
		"  %i32src3  = OpAccessChain %i32ptr %ssboIN %zero %valLoopNdx %c_i32_4 %valInsideLoopNdx\n"
		"  %val3_i32 = OpLoad %${32type} %i32src3\n"
		"  %val3_i8  = ${convert} %i8 %val3_i32\n"
		"  %i8dst3   = OpAccessChain %i8ptr %ssboOUT %zero %valLoopNdx %c_i32_4 %valInsideLoopNdx\n"
		"  OpStore %i8dst3 %val3_i8\n"
		"\n"
		"  %v4i32src2  = OpAccessChain %v4i32ptr %ssboIN %zero %valLoopNdx %c_i32_9 %valInsideLoopNdx\n"
		"  %val2_v4i32 = OpLoad %v4${32type} %v4i32src2\n"
		"  %val2_v4i8  = ${convert} %v4i8 %val2_v4i32\n"
		"  %v4i8dst2   = OpAccessChain %v4i8ptr %ssboOUT %zero %valLoopNdx %c_i32_9 %valInsideLoopNdx\n"
		"  OpStore %v4i8dst2 %val2_v4i8\n"
		"OpBranch %BlockIf\n"
		"%BlockIf = OpLabel\n"

		"OpBranch %93\n"
		"%93 = OpLabel\n"
		"%132 = OpLoad %i32 %insideLoopNdx\n"
		"%133 = OpIAdd %i32 %132 %c_i32_1\n"
		"OpStore %insideLoopNdx %133\n"
		"OpBranch %loopInside\n"
		"\n"
		"%92 = OpLabel\n"
		"OpBranch %13\n"
		"%13 = OpLabel\n"
		"%134 = OpLoad %i32 %loopNdx\n"
		"%135 = OpIAdd %i32 %134 %c_i32_1\n"
		"OpStore %loopNdx %135\n"
		"OpBranch %loop\n"

		"%merge = OpLabel\n"
		"         OpReturnValue %param\n"
		"         OpFunctionEnd\n");

	struct IntegerFacts
	{
		const char*	name;
		const char* opcode;
		const char*	signedInt;
		const char*	type32;
	};

	const IntegerFacts	intFacts[]	=
	{
		{"sint",	"OpSConvert",	"1", "i32"},
		{"uint",	"OpUConvert",	"0", "u32"},
	};

	for (deUint32 capIdx = 0; capIdx < DE_LENGTH_OF_ARRAY(CAPABILITIES); ++capIdx)
		for (deUint32 intFactsNdx = 0; intFactsNdx < DE_LENGTH_OF_ARRAY(intFacts); ++intFactsNdx)
		{
			const bool			isUniform	= (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == CAPABILITIES[capIdx].dtype);
			map<string, string>	specs;
			string				testName	= string(CAPABILITIES[capIdx].name) + "_" + intFacts[intFactsNdx].name;
			vector<deInt32>		i32Data		= isUniform ? data32bit(SHADERTEMPLATE_STRIDE32BIT_STD140, rnd) : data32bit(SHADERTEMPLATE_STRIDE32BIT_STD430, rnd);
			GraphicsResources	resources;
			VulkanFeatures		features;

			specs["cap"]					= CAPABILITIES[STORAGE_BUFFER_TEST].cap;
			specs["stridei8"]				= getStructShaderComponet(SHADERTEMPLATE_STRIDE8BIT_STD430);
			specs["stridei32"]				= getStructShaderComponet(isUniform ? SHADERTEMPLATE_STRIDE32BIT_STD140 : SHADERTEMPLATE_STRIDE32BIT_STD430);
			specs["8Storage"]				= "StorageBuffer";
			specs["32Storage"]				= isUniform ? "Uniform" : "StorageBuffer";
			specs["signed"]					= intFacts[intFactsNdx].signedInt;
			specs["convert"]				= intFacts[intFactsNdx].opcode;
			specs["32type"]					= intFacts[intFactsNdx].type32;

			fragments["capability"]			= capabilities.specialize(specs);
			fragments["decoration"]			= decoration.specialize(specs);
			fragments["pre_main"]			= preMain.specialize(specs);
			fragments["testfun"]			= testFun.specialize(specs);

			resources.inputs.push_back(Resource(BufferSp(new Int32Buffer(i32Data)), CAPABILITIES[capIdx].dtype));
			resources.outputs.push_back(Resource(BufferSp(new Int8Buffer(i8Data)), CAPABILITIES[STORAGE_BUFFER_TEST].dtype));
			if (isUniform)
				resources.verifyIO = checkStruct<deInt32, deInt8, SHADERTEMPLATE_STRIDE32BIT_STD140, SHADERTEMPLATE_STRIDE8BIT_STD430>;
			else
				resources.verifyIO = checkStruct<deInt32, deInt8, SHADERTEMPLATE_STRIDE32BIT_STD430, SHADERTEMPLATE_STRIDE8BIT_STD430>;

			features												= get8BitStorageFeatures(CAPABILITIES[STORAGE_BUFFER_TEST].name);
			features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
			features.coreFeatures.fragmentStoresAndAtomics			= true;

			createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
		}
}

void addGraphics8bitStorage8bitStructMixedTypesGroup (tcu::TestCaseGroup* group)
{
	de::Random							rnd					(deStringHash(group->getName()));
	map<string, string>					fragments;
	vector<string>						extensions;
	RGBA								defaultColors[4];
	const StringTemplate				capabilities		("OpCapability StorageBuffer8BitAccess\n"
															"${cap}\n");
	vector<deInt8>						outData				= data8bit(SHADERTEMPLATE_STRIDEMIX_STD430, rnd, false);

	extensions.push_back("VK_KHR_8bit_storage");
	fragments["extension"]	= "OpExtension \"SPV_KHR_8bit_storage\"\n"
		"OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n";

	getDefaultColors(defaultColors);

	const StringTemplate				preMain				(
		"\n"//Types
		"%i8    = OpTypeInt 8 1\n"
		"%v2i8  = OpTypeVector %i8 2\n"
		"%v3i8  = OpTypeVector %i8 3\n"
		"%v4i8  = OpTypeVector %i8 4\n"
		"\n"//Consta value
		"%zero     = OpConstant %i32 0\n"
		"%c_i32_5  = OpConstant %i32 5\n"
		"%c_i32_6  = OpConstant %i32 6\n"
		"%c_i32_7  = OpConstant %i32 7\n"
		"%c_i32_8  = OpConstant %i32 8\n"
		"%c_i32_9  = OpConstant %i32 9\n"
		"%c_i32_10 = OpConstant %i32 10\n"
		"%c_i32_11 = OpConstant %i32 11\n"
		"%c_u32_7  = OpConstant %u32 7\n"
		"%c_u32_11 = OpConstant %u32 11\n"
		"\n"//Arrays & Structs
		"%v2b8NestedArr11In  = OpTypeArray %v2i8 %c_u32_11\n"
		"%b32NestedArr11In   = OpTypeArray %i32 %c_u32_11\n"
		"%sb8Arr11In         = OpTypeArray %i8 %c_u32_11\n"
		"%sb32Arr11In        = OpTypeArray %i32 %c_u32_11\n"
		"%sNestedIn          = OpTypeStruct %i8 %i32 %v2b8NestedArr11In %b32NestedArr11In\n"
		"%sNestedArr11In     = OpTypeArray %sNestedIn %c_u32_11\n"
		"%structIn           = OpTypeStruct %i8 %i32 %v2i8 %v2i32 %v3i8 %v3i32 %v4i8 %v4i32 %sNestedArr11In %sb8Arr11In %sb32Arr11In\n"
		"%structArr7In       = OpTypeArray %structIn %c_u32_7\n"
		"%v2b8NestedArr11Out = OpTypeArray %v2i8 %c_u32_11\n"
		"%b32NestedArr11Out  = OpTypeArray %i32 %c_u32_11\n"
		"%sb8Arr11Out        = OpTypeArray %i8 %c_u32_11\n"
		"%sb32Arr11Out       = OpTypeArray %i32 %c_u32_11\n"
		"%sNestedOut         = OpTypeStruct %i8 %i32 %v2b8NestedArr11Out %b32NestedArr11Out\n"
		"%sNestedArr11Out    = OpTypeArray %sNestedOut %c_u32_11\n"
		"%structOut          = OpTypeStruct %i8 %i32 %v2i8 %v2i32 %v3i8 %v3i32 %v4i8 %v4i32 %sNestedArr11Out %sb8Arr11Out %sb32Arr11Out\n"
		"%structArr7Out      = OpTypeArray %structOut %c_u32_7\n"
		"\n"//Pointers
		"${uniformPtr}"
		"%i8outPtr    = OpTypePointer StorageBuffer %i8\n"
		"%v2i8outPtr  = OpTypePointer StorageBuffer %v2i8\n"
		"%v3i8outPtr  = OpTypePointer StorageBuffer %v3i8\n"
		"%v4i8outPtr  = OpTypePointer StorageBuffer %v4i8\n"
		"%i32outPtr   = OpTypePointer StorageBuffer %i32\n"
		"%v2i32outPtr = OpTypePointer StorageBuffer %v2i32\n"
		"%v3i32outPtr = OpTypePointer StorageBuffer %v3i32\n"
		"%v4i32outPtr = OpTypePointer StorageBuffer %v4i32\n"
		"%uvec3ptr = OpTypePointer Input %v3u32\n"
		"\n"//SSBO IN
		"%SSBO_IN    = OpTypeStruct %structArr7In\n"
		"%up_SSBOIN  = OpTypePointer ${inStorage} %SSBO_IN\n"
		"%ssboIN     = OpVariable %up_SSBOIN ${inStorage}\n"
		"\n"//SSBO OUT
		"%SSBO_OUT   = OpTypeStruct %structArr7Out\n"
		"%up_SSBOOUT = OpTypePointer StorageBuffer %SSBO_OUT\n"
		"%ssboOUT    = OpVariable %up_SSBOOUT StorageBuffer\n");

		const StringTemplate			decoration			(
		"${OutOffsets}"
		"${InOffsets}"
		"\n"//SSBO IN
		"OpDecorate %SSBO_IN Block\n"
		"OpMemberDecorate %SSBO_IN 0 Offset 0\n"
		"OpDecorate %ssboIN DescriptorSet 0\n"
		"OpDecorate %ssboIN Binding 0\n"
		"\n"//SSBO OUT
		"OpDecorate %SSBO_OUT Block\n"
		"OpMemberDecorate %SSBO_OUT 0 Offset 0\n"
		"OpDecorate %ssboOUT DescriptorSet 0\n"
		"OpDecorate %ssboOUT Binding 1\n");

		const StringTemplate			testFun				(
		"%test_code = OpFunction %v4f32 None %v4f32_v4f32_function\n"
		"%param     = OpFunctionParameter %v4f32\n"
		"%label     = OpLabel\n"
		"%ndxArrx   = OpVariable %fp_i32  Function\n"
		"%ndxArry   = OpVariable %fp_i32  Function\n"
		"%ndxArrz   = OpVariable %fp_i32  Function\n"
		"${xBeginLoop}"
		"\n"//strutOut.b8 = strutIn.b8
		"%inP1  = OpAccessChain %i8${inPtr} %ssboIN %zero %Valx %zero\n"
		"%inV1  = OpLoad %i8 %inP1\n"
		"%outP1 = OpAccessChain %i8outPtr %ssboOUT %zero %Valx %zero\n"
		"OpStore %outP1 %inV1\n"
		"\n"//strutOut.b32 = strutIn.b32
		"%inP2  = OpAccessChain %i32${inPtr} %ssboIN %zero %Valx %c_i32_1\n"
		"%inV2  = OpLoad %i32 %inP2\n"
		"%outP2 = OpAccessChain %i32outPtr %ssboOUT %zero %Valx %c_i32_1\n"
		"OpStore %outP2 %inV2\n"
		"\n"//strutOut.v2b8 = strutIn.v2b8
		"%inP3  = OpAccessChain %v2i8${inPtr} %ssboIN %zero %Valx %c_i32_2\n"
		"%inV3  = OpLoad %v2i8 %inP3\n"
		"%outP3 = OpAccessChain %v2i8outPtr %ssboOUT %zero %Valx %c_i32_2\n"
		"OpStore %outP3 %inV3\n"
		"\n"//strutOut.v2b32 = strutIn.v2b32
		"%inP4  = OpAccessChain %v2i32${inPtr} %ssboIN %zero %Valx %c_i32_3\n"
		"%inV4  = OpLoad %v2i32 %inP4\n"
		"%outP4 = OpAccessChain %v2i32outPtr %ssboOUT %zero %Valx %c_i32_3\n"
		"OpStore %outP4 %inV4\n"
		"\n"//strutOut.v3b8 = strutIn.v3b8
		"%inP5  = OpAccessChain %v3i8${inPtr} %ssboIN %zero %Valx %c_i32_4\n"
		"%inV5  = OpLoad %v3i8 %inP5\n"
		"%outP5 = OpAccessChain %v3i8outPtr %ssboOUT %zero %Valx %c_i32_4\n"
		"OpStore %outP5 %inV5\n"
		"\n"//strutOut.v3b32 = strutIn.v3b32
		"%inP6  = OpAccessChain %v3i32${inPtr} %ssboIN %zero %Valx %c_i32_5\n"
		"%inV6  = OpLoad %v3i32 %inP6\n"
		"%outP6 = OpAccessChain %v3i32outPtr %ssboOUT %zero %Valx %c_i32_5\n"
		"OpStore %outP6 %inV6\n"
		"\n"//strutOut.v4b8 = strutIn.v4b8
		"%inP7  = OpAccessChain %v4i8${inPtr} %ssboIN %zero %Valx %c_i32_6\n"
		"%inV7  = OpLoad %v4i8 %inP7\n"
		"%outP7 = OpAccessChain %v4i8outPtr %ssboOUT %zero %Valx %c_i32_6\n"
		"OpStore %outP7 %inV7\n"
		"\n"//strutOut.v4b32 = strutIn.v4b32
		"%inP8  = OpAccessChain %v4i32${inPtr} %ssboIN %zero %Valx %c_i32_7\n"
		"%inV8  = OpLoad %v4i32 %inP8\n"
		"%outP8 = OpAccessChain %v4i32outPtr %ssboOUT %zero %Valx %c_i32_7\n"
		"OpStore %outP8 %inV8\n"
		"${yBeginLoop}"
		"\n"//strutOut.b8[y] = strutIn.b8[y]
		"%inP9  = OpAccessChain %i8${inPtr} %ssboIN %zero %Valx %c_i32_9 %Valy\n"
		"%inV9  = OpLoad %i8 %inP9\n"
		"%outP9 = OpAccessChain %i8outPtr %ssboOUT %zero %Valx %c_i32_9 %Valy\n"
		"OpStore %outP9 %inV9\n"
		"\n"//strutOut.b32[y] = strutIn.b32[y]
		"%inP10  = OpAccessChain %i32${inPtr} %ssboIN %zero %Valx %c_i32_10 %Valy\n"
		"%inV10  = OpLoad %i32 %inP10\n"
		"%outP10 = OpAccessChain %i32outPtr %ssboOUT %zero %Valx %c_i32_10 %Valy\n"
		"OpStore %outP10 %inV10\n"
		"\n"//strutOut.strutNestedOut[y].b8 = strutIn.strutNestedIn[y].b8
		"%inP11 = OpAccessChain %i8${inPtr} %ssboIN %zero %Valx %c_i32_8 %Valy %zero\n"
		"%inV11 = OpLoad %i8 %inP11\n"
		"%outP11 = OpAccessChain %i8outPtr %ssboOUT %zero %Valx %c_i32_8 %Valy %zero\n"
		"OpStore %outP11 %inV11\n"
		"\n"//strutOut.strutNestedOut[y].b32 = strutIn.strutNestedIn[y].b32
		"%inP12 = OpAccessChain %i32${inPtr} %ssboIN %zero %Valx %c_i32_8 %Valy %c_i32_1\n"
		"%inV12 = OpLoad %i32 %inP12\n"
		"%outP12 = OpAccessChain %i32outPtr %ssboOUT %zero %Valx %c_i32_8 %Valy %c_i32_1\n"
		"OpStore %outP12 %inV12\n"
		"${zBeginLoop}"
		"\n"//strutOut.strutNestedOut[y].v2b8[valNdx] = strutIn.strutNestedIn[y].v2b8[valNdx]
		"%inP13  = OpAccessChain %v2i8${inPtr} %ssboIN %zero %Valx %c_i32_8 %Valy %c_i32_2 %Valz\n"
		"%inV13  = OpLoad %v2i8 %inP13\n"
		"%outP13 = OpAccessChain %v2i8outPtr %ssboOUT %zero %Valx %c_i32_8 %Valy %c_i32_2 %Valz\n"
		"OpStore %outP13 %inV13\n"
		"\n"//strutOut.strutNestedOut[y].b32[valNdx] = strutIn.strutNestedIn[y].b32[valNdx]
		"%inP14  = OpAccessChain %i32${inPtr} %ssboIN %zero %Valx %c_i32_8 %Valy %c_i32_3 %Valz\n"
		"%inV14  = OpLoad %i32 %inP14\n"
		"%outP14 = OpAccessChain %i32outPtr %ssboOUT %zero %Valx %c_i32_8 %Valy %c_i32_3 %Valz\n"
		"OpStore %outP14 %inV14\n"
		"${zEndLoop}"
		"${yEndLoop}"
		"${xEndLoop}"
		"\n"
		"OpBranch %ExitLabel\n"
		"%ExitLabel = OpLabel\n"
		"OpReturnValue %param\n"
		"OpFunctionEnd\n");

	for (deUint32 capIdx = 0; capIdx < DE_LENGTH_OF_ARRAY(CAPABILITIES); ++capIdx)
	{  // int
		const bool				isUniform	= VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == CAPABILITIES[capIdx].dtype;
		vector<deInt8>			inData		= isUniform ? data8bit(SHADERTEMPLATE_STRIDEMIX_STD140, rnd) : data8bit(SHADERTEMPLATE_STRIDEMIX_STD430, rnd);
		GraphicsResources		resources;
		map<string, string>		specsLoop;
		map<string, string>		specsOffset;
		map<string, string>		specs;
		VulkanFeatures			features;
		string					testName	= string(CAPABILITIES[capIdx].name);

		specsLoop["exeCount"]	= "c_i32_7";
		specsLoop["loopName"]	= "x";
		specs["xBeginLoop"]		= beginLoop(specsLoop);
		specs["xEndLoop"]		= endLoop(specsLoop);

		specsLoop["exeCount"]	= "c_i32_11";
		specsLoop["loopName"]	= "y";
		specs["yBeginLoop"]		= beginLoop(specsLoop);
		specs["yEndLoop"]		= endLoop(specsLoop);

		specsLoop["exeCount"]	= "c_i32_11";
		specsLoop["loopName"]	= "z";
		specs["zBeginLoop"]		= beginLoop(specsLoop);
		specs["zEndLoop"]		= endLoop(specsLoop);

		specs["inStorage"]		= isUniform ? "Uniform" : "StorageBuffer";
		specs["cap"]			= isUniform ?"OpCapability " + string( CAPABILITIES[capIdx].cap) : "";
		specs["uniformPtr"]		= isUniform ?
								"%i8inPtr     = OpTypePointer Uniform %i8\n"
								"%v2i8inPtr   = OpTypePointer Uniform %v2i8\n"
								"%v3i8inPtr   = OpTypePointer Uniform %v3i8\n"
								"%v4i8inPtr   = OpTypePointer Uniform %v4i8\n"
								"%i32inPtr    = OpTypePointer Uniform %i32\n"
								"%v2i32inPtr  = OpTypePointer Uniform %v2i32\n"
								"%v3i32inPtr  = OpTypePointer Uniform %v3i32\n"
								"%v4i32inPtr  = OpTypePointer Uniform %v4i32\n" :
								"";
		specs["inPtr"]			= isUniform ? "inPtr" : "outPtr";
		specsOffset["InOut"]	= "In";
		specs["InOffsets"]		= StringTemplate(isUniform ? getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD140) : getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD430)).specialize(specsOffset);
		specsOffset["InOut"]	= "Out";
		specs["OutOffsets"]		= StringTemplate(getStructShaderComponet(SHADERTEMPLATE_STRIDEMIX_STD430)).specialize(specsOffset);

		fragments["capability"]	= capabilities.specialize(specs);
		fragments["decoration"]	= decoration.specialize(specs);
		fragments["pre_main"]	= preMain.specialize(specs);
		fragments["testfun"]	= testFun.specialize(specs);

		resources.verifyIO		= isUniform ? checkStruct<deInt8, deInt8, SHADERTEMPLATE_STRIDEMIX_STD140, SHADERTEMPLATE_STRIDEMIX_STD430> : checkStruct<deInt8, deInt8, SHADERTEMPLATE_STRIDEMIX_STD430, SHADERTEMPLATE_STRIDEMIX_STD430>;
		resources.inputs.push_back(Resource(BufferSp(new Int8Buffer(inData)), CAPABILITIES[capIdx].dtype));
		resources.outputs.push_back(Resource(BufferSp(new Int8Buffer(outData)), CAPABILITIES[STORAGE_BUFFER_TEST].dtype));

		features												= get8BitStorageFeatures(CAPABILITIES[capIdx].name);
		features.coreFeatures.vertexPipelineStoresAndAtomics	= true;
		features.coreFeatures.fragmentStoresAndAtomics			= true;

		createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, group, features);
	}
}

} // anonymous

tcu::TestCaseGroup* create8BitStorageComputeGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "8bit_storage", "Compute tests for VK_KHR_8bit_storage extension"));

	addTestGroup(group.get(), "storagebuffer_32_to_8",	"32bit ints to 8bit tests under capability StorageBuffer8BitAccess",			addCompute8bitStorage32To8Group);
	addTestGroup(group.get(), "uniform_8_to_32",		"8bit ints to 32bit tests under capability UniformAndStorageBuffer8BitAccess",	addCompute8bitUniform8To32Group);
	addTestGroup(group.get(), "push_constant_8_to_32",	"8bit ints to 32bit tests under capability StoragePushConstant8",				addCompute8bitStoragePushConstant8To32Group);

	addTestGroup(group.get(), "storagebuffer_16_to_8",	"16bit ints to 8bit tests under capability StorageBuffer8BitAccess",			addCompute8bitStorage16To8Group);
	addTestGroup(group.get(), "uniform_8_to_16",		"8bit ints to 16bit tests under capability UniformAndStorageBuffer8BitAccess",	addCompute8bitUniform8To16Group);
	addTestGroup(group.get(), "push_constant_8_to_16",	"8bit ints to 16bit tests under capability StoragePushConstant8",				addCompute8bitStoragePushConstant8To16Group);

	addTestGroup(group.get(), "uniform_8_to_8",			"8bit ints to 8bit tests under capability UniformAndStorageBuffer8BitAccess",	addCompute8bitStorageBuffer8To8Group);

	addTestGroup(group.get(), "uniform_8struct_to_32struct",		"8bit floats struct to 32bit tests under capability UniformAndStorageBuffer8BitAccess",	addCompute8bitStorageUniform8StructTo32StructGroup);
	addTestGroup(group.get(), "storagebuffer_32struct_to_8struct",	"32bit floats struct to 8bit tests under capability StorageBuffer8BitAccess",			addCompute8bitStorageUniform32StructTo8StructGroup);
	addTestGroup(group.get(), "struct_mixed_types",					"mixed type of 8bit and 32bit struct",													addCompute8bitStorage8bitStructMixedTypesGroup);

	return group.release();
}

tcu::TestCaseGroup* create8BitStorageGraphicsGroup (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "8bit_storage", "Graphics tests for VK_KHR_8bit_storage extension"));

	addTestGroup(group.get(), "storagebuffer_int_32_to_8",	"32-bit int into 8-bit tests under capability StorageBuffer8BitAccess",				addGraphics8BitStorageUniformInt32To8Group);
	addTestGroup(group.get(), "uniform_int_8_to_32",		"8-bit int into 32-bit tests under capability UniformAndStorageBuffer8BitAccess",	addGraphics8BitStorageUniformInt8To32Group);
	addTestGroup(group.get(), "push_constant_int_8_to_32",	"8-bit int into 32-bit tests under capability StoragePushConstant8",				addGraphics8BitStoragePushConstantInt8To32Group);

	addTestGroup(group.get(), "storagebuffer_int_16_to_8",	"16-bit int into 8-bit tests under capability StorageBuffer8BitAccess",				addGraphics8BitStorageUniformInt16To8Group);
	addTestGroup(group.get(), "uniform_int_8_to_16",		"8-bit int into 16-bit tests under capability UniformAndStorageBuffer8BitAccess",	addGraphics8BitStorageUniformInt8To16Group);
	addTestGroup(group.get(), "push_constant_int_8_to_16",	"8-bit int into 16-bit tests under capability StoragePushConstant8",				addGraphics8BitStoragePushConstantInt8To16Group);

	addTestGroup(group.get(), "8struct_to_32struct",		"8bit floats struct to 32bit tests ",												addGraphics8BitStorageUniformStruct8To32Group);
	addTestGroup(group.get(), "32struct_to_8struct",		"32bit floats struct to 8bit tests ",												addGraphics8BitStorageUniformStruct32To8Group);
	addTestGroup(group.get(), "struct_mixed_types",			"mixed type of 8bit and 32bit struc",												addGraphics8bitStorage8bitStructMixedTypesGroup);

	return group.release();
}

} // SpirVAssembly
} // vkt
