13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Uniform block tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fUniformBlockTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsUniformBlockCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsRandomUniformBlockCase.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuCommandLine.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::UniformBlockCase;
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::RandomUniformBlockCase;
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace gls::ub;
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid createRandomCaseGroup (tcu::TestCaseGroup* parentGroup, Context& context, const char* groupName, const char* description, UniformBlockCase::BufferMode bufferMode, deUint32 features, int numCases, deUint32 baseSeed)
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestCaseGroup* group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description);
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	parentGroup->addChild(group);
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	baseSeed += (deUint32)context.getTestContext().getCommandLine().getBaseSeed();
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < numCases; ndx++)
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(new RandomUniformBlockCase(context.getTestContext(), context.getRenderContext(), glu::GLSL_VERSION_310_ES,
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												   de::toString(ndx).c_str(), "", bufferMode, features, (deUint32)ndx+baseSeed));
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlockBasicTypeCase : public UniformBlockCase
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BlockBasicTypeCase (Context& context, const char* name, const char* description, const VarType& type, deUint32 layoutFlags, int numInstances)
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK)
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UniformBlock& block = m_interface.allocBlock("Block");
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.addUniform(Uniform("var", type, 0));
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.setFlags(layoutFlags);
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (numInstances > 0)
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			block.setArraySize(numInstances);
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			block.setInstanceName("block");
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void createBlockBasicTypeCases (tcu::TestCaseGroup* group, Context& context, const char* name, const VarType& type, deUint32 layoutFlags, int numInstances = 0)
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	group->addChild(new BlockBasicTypeCase(context, (string(name) + "_vertex").c_str(),		"", type, layoutFlags|DECLARE_VERTEX,					numInstances));
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	group->addChild(new BlockBasicTypeCase(context, (string(name) + "_fragment").c_str(),	"", type, layoutFlags|DECLARE_FRAGMENT,					numInstances));
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!(layoutFlags & LAYOUT_PACKED))
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group->addChild(new BlockBasicTypeCase(context, (string(name) + "_both").c_str(),	"", type, layoutFlags|DECLARE_VERTEX|DECLARE_FRAGMENT,	numInstances));
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Block2LevelStructArrayCase : public UniformBlockCase
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Block2LevelStructArrayCase (Context& context, const char* name, const char* description, deUint32 layoutFlags, BufferMode bufferMode, int numInstances)
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: UniformBlockCase	(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, bufferMode)
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_layoutFlags		(layoutFlags)
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_numInstances	(numInstances)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void init (void)
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StructType& typeS = m_interface.allocStruct("S");
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		typeS.addMember("a", VarType(glu::TYPE_UINT_VEC3, PRECISION_HIGH), UNUSED_BOTH);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM), 4));
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		typeS.addMember("c", VarType(glu::TYPE_UINT, PRECISION_LOW));
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UniformBlock& block = m_interface.allocBlock("Block");
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.addUniform(Uniform("u", VarType(glu::TYPE_INT, PRECISION_MEDIUM)));
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.addUniform(Uniform("s", VarType(VarType(VarType(&typeS), 3), 2)));
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_MEDIUM)));
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		block.setFlags(m_layoutFlags);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_numInstances > 0)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			block.setInstanceName("block");
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			block.setArraySize(m_numInstances);
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	m_layoutFlags;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			m_numInstances;
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryUniformBlockTests::UniformBlockTests (Context& context)
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "ubo", "Uniform Block tests")
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryUniformBlockTests::~UniformBlockTests (void)
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid UniformBlockTests::init (void)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const glu::DataType basicTypes[] =
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT,
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_VEC2,
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_VEC3,
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_VEC4,
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_INT,
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_INT_VEC2,
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_INT_VEC3,
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_INT_VEC4,
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_UINT,
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_UINT_VEC2,
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_UINT_VEC3,
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_UINT_VEC4,
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_BOOL,
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_BOOL_VEC2,
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_BOOL_VEC3,
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_BOOL_VEC4,
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT2,
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT3,
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT4,
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT2X3,
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT2X4,
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT3X2,
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT3X4,
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT4X2,
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::TYPE_FLOAT_MAT4X3
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		name;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint32		flags;
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} layoutFlags[] =
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "shared",		LAYOUT_SHARED	},
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "packed",		LAYOUT_PACKED	},
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "std140",		LAYOUT_STD140	}
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		name;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint32		flags;
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} matrixFlags[] =
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "row_major",		LAYOUT_ROW_MAJOR	},
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "column_major",	LAYOUT_COLUMN_MAJOR }
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*							name;
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UniformBlockCase::BufferMode		mode;
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} bufferModes[] =
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "per_block_buffer",	UniformBlockCase::BUFFERMODE_PER_BLOCK },
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "single_buffer",		UniformBlockCase::BUFFERMODE_SINGLE	}
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// ubo.2_level_array
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_array", "2-level basic array variable in single buffer");
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(nestedArrayGroup);
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			nestedArrayGroup->addChild(layoutGroup);
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const glu::DataType	type		= basicTypes[basicTypeNdx];
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const char*			typeName	= glu::getDataTypeName(type);
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int			childSize	= 4;
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int			parentSize	= 3;
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const VarType		childType	(VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize);
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const VarType		parentType	(childType, parentSize);
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags);
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (glu::isDataTypeMatrix(type))
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												  parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags);
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// ubo.3_level_array
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "3_level_array", "3-level basic array variable in single buffer");
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(nestedArrayGroup);
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			nestedArrayGroup->addChild(layoutGroup);
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const glu::DataType	type		= basicTypes[basicTypeNdx];
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const char*			typeName	= glu::getDataTypeName(type);
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int			childSize0	= 2;
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int			childSize1	= 4;
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int			parentSize	= 3;
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const VarType		childType0	(VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize0);
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const VarType		childType1	(childType0, childSize1);
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const VarType		parentType	(childType1, parentSize);
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags);
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (glu::isDataTypeMatrix(type))
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												  parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags);
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// ubo.2_level_struct_array
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::TestCaseGroup* structArrayArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_struct_array", "Struct array in one uniform block");
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(structArrayArrayGroup);
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::TestCaseGroup* modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			structArrayArrayGroup->addChild(modeGroup);
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int isArray = 0; isArray < 2; isArray++)
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					std::string	baseName	= layoutFlags[layoutFlagNdx].name;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deUint32	baseFlags	= layoutFlags[layoutFlagNdx].flags;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						continue; // Doesn't make sense to add this variant.
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (isArray)
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						baseName += "_instance_array";
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_vertex").c_str(),	"", baseFlags|DECLARE_VERTEX,					bufferModes[modeNdx].mode, isArray ? 3 : 0));
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_fragment").c_str(),	"", baseFlags|DECLARE_FRAGMENT,					bufferModes[modeNdx].mode, isArray ? 3 : 0));
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (!(baseFlags & LAYOUT_PACKED))
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_both").c_str(),	"", baseFlags|DECLARE_VERTEX|DECLARE_FRAGMENT,	bufferModes[modeNdx].mode, isArray ? 3 : 0));
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// ubo.random
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	allShaders		= FEATURE_VERTEX_BLOCKS|FEATURE_FRAGMENT_BLOCKS|FEATURE_SHARED_BLOCKS;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	allLayouts		= FEATURE_PACKED_LAYOUT|FEATURE_SHARED_LAYOUT|FEATURE_STD140_LAYOUT;
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	allBasicTypes	= FEATURE_VECTORS|FEATURE_MATRICES;
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	unused			= FEATURE_UNUSED_MEMBERS|FEATURE_UNUSED_UNIFORMS;
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	matFlags		= FEATURE_MATRIX_LAYOUT;
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	basicTypeArrays	= allShaders|allLayouts|unused|allBasicTypes|matFlags|FEATURE_ARRAYS|FEATURE_ARRAYS_OF_ARRAYS;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint32	allFeatures		= ~0u;
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::TestCaseGroup* randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases");
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(randomGroup);
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		createRandomCaseGroup(randomGroup, m_context, "basic_type_arrays",		"Arrays, per-block buffers",				UniformBlockCase::BUFFERMODE_PER_BLOCK,	basicTypeArrays,	25, 1150);
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers",	"All random features, per-block buffers",	UniformBlockCase::BUFFERMODE_PER_BLOCK,	allFeatures,		50, 11200);
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer",		"All random features, shared buffer",		UniformBlockCase::BUFFERMODE_SINGLE,	allFeatures,		50, 11250);
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
313