1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.1 Module
3e5c31af7Sopenharmony_ci * -------------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Uniform block tests.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "es31fUniformBlockTests.hpp"
25e5c31af7Sopenharmony_ci#include "glsUniformBlockCase.hpp"
26e5c31af7Sopenharmony_ci#include "glsRandomUniformBlockCase.hpp"
27e5c31af7Sopenharmony_ci#include "tcuCommandLine.hpp"
28e5c31af7Sopenharmony_ci#include "deRandom.hpp"
29e5c31af7Sopenharmony_ci#include "deStringUtil.hpp"
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ciusing std::string;
32e5c31af7Sopenharmony_ciusing std::vector;
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_cinamespace deqp
35e5c31af7Sopenharmony_ci{
36e5c31af7Sopenharmony_cinamespace gles31
37e5c31af7Sopenharmony_ci{
38e5c31af7Sopenharmony_cinamespace Functional
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_cinamespace
41e5c31af7Sopenharmony_ci{
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ciusing gls::UniformBlockCase;
44e5c31af7Sopenharmony_ciusing gls::RandomUniformBlockCase;
45e5c31af7Sopenharmony_ciusing namespace gls::ub;
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_civoid createRandomCaseGroup (tcu::TestCaseGroup* parentGroup, Context& context, const char* groupName, const char* description, UniformBlockCase::BufferMode bufferMode, deUint32 features, int numCases, deUint32 baseSeed)
48e5c31af7Sopenharmony_ci{
49e5c31af7Sopenharmony_ci	tcu::TestCaseGroup* group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description);
50e5c31af7Sopenharmony_ci	parentGroup->addChild(group);
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_ci	baseSeed += (deUint32)context.getTestContext().getCommandLine().getBaseSeed();
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < numCases; ndx++)
55e5c31af7Sopenharmony_ci		group->addChild(new RandomUniformBlockCase(context.getTestContext(), context.getRenderContext(), glu::GLSL_VERSION_310_ES,
56e5c31af7Sopenharmony_ci												   de::toString(ndx).c_str(), "", bufferMode, features, (deUint32)ndx+baseSeed));
57e5c31af7Sopenharmony_ci}
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ciclass BlockBasicTypeCase : public UniformBlockCase
60e5c31af7Sopenharmony_ci{
61e5c31af7Sopenharmony_cipublic:
62e5c31af7Sopenharmony_ci	BlockBasicTypeCase (Context& context, const char* name, const char* description, const VarType& type, deUint32 layoutFlags, int numInstances)
63e5c31af7Sopenharmony_ci		: UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK)
64e5c31af7Sopenharmony_ci	{
65e5c31af7Sopenharmony_ci		UniformBlock& block = m_interface.allocBlock("Block");
66e5c31af7Sopenharmony_ci		block.addUniform(Uniform("var", type, 0));
67e5c31af7Sopenharmony_ci		block.setFlags(layoutFlags);
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ci		if (numInstances > 0)
70e5c31af7Sopenharmony_ci		{
71e5c31af7Sopenharmony_ci			block.setArraySize(numInstances);
72e5c31af7Sopenharmony_ci			block.setInstanceName("block");
73e5c31af7Sopenharmony_ci		}
74e5c31af7Sopenharmony_ci	}
75e5c31af7Sopenharmony_ci};
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_cistatic void createBlockBasicTypeCases (tcu::TestCaseGroup* group, Context& context, const char* name, const VarType& type, deUint32 layoutFlags, int numInstances = 0)
78e5c31af7Sopenharmony_ci{
79e5c31af7Sopenharmony_ci	group->addChild(new BlockBasicTypeCase(context, (string(name) + "_vertex").c_str(),		"", type, layoutFlags|DECLARE_VERTEX,					numInstances));
80e5c31af7Sopenharmony_ci	group->addChild(new BlockBasicTypeCase(context, (string(name) + "_fragment").c_str(),	"", type, layoutFlags|DECLARE_FRAGMENT,					numInstances));
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci	if (!(layoutFlags & LAYOUT_PACKED))
83e5c31af7Sopenharmony_ci		group->addChild(new BlockBasicTypeCase(context, (string(name) + "_both").c_str(),	"", type, layoutFlags|DECLARE_VERTEX|DECLARE_FRAGMENT,	numInstances));
84e5c31af7Sopenharmony_ci}
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ciclass Block2LevelStructArrayCase : public UniformBlockCase
87e5c31af7Sopenharmony_ci{
88e5c31af7Sopenharmony_cipublic:
89e5c31af7Sopenharmony_ci	Block2LevelStructArrayCase (Context& context, const char* name, const char* description, deUint32 layoutFlags, BufferMode bufferMode, int numInstances)
90e5c31af7Sopenharmony_ci		: UniformBlockCase	(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES, bufferMode)
91e5c31af7Sopenharmony_ci		, m_layoutFlags		(layoutFlags)
92e5c31af7Sopenharmony_ci		, m_numInstances	(numInstances)
93e5c31af7Sopenharmony_ci	{
94e5c31af7Sopenharmony_ci	}
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_ci	void init (void)
97e5c31af7Sopenharmony_ci	{
98e5c31af7Sopenharmony_ci		StructType& typeS = m_interface.allocStruct("S");
99e5c31af7Sopenharmony_ci		typeS.addMember("a", VarType(glu::TYPE_UINT_VEC3, PRECISION_HIGH), UNUSED_BOTH);
100e5c31af7Sopenharmony_ci		typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM), 4));
101e5c31af7Sopenharmony_ci		typeS.addMember("c", VarType(glu::TYPE_UINT, PRECISION_LOW));
102e5c31af7Sopenharmony_ci
103e5c31af7Sopenharmony_ci		UniformBlock& block = m_interface.allocBlock("Block");
104e5c31af7Sopenharmony_ci		block.addUniform(Uniform("u", VarType(glu::TYPE_INT, PRECISION_MEDIUM)));
105e5c31af7Sopenharmony_ci		block.addUniform(Uniform("s", VarType(VarType(VarType(&typeS), 3), 2)));
106e5c31af7Sopenharmony_ci		block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_MEDIUM)));
107e5c31af7Sopenharmony_ci		block.setFlags(m_layoutFlags);
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_ci		if (m_numInstances > 0)
110e5c31af7Sopenharmony_ci		{
111e5c31af7Sopenharmony_ci			block.setInstanceName("block");
112e5c31af7Sopenharmony_ci			block.setArraySize(m_numInstances);
113e5c31af7Sopenharmony_ci		}
114e5c31af7Sopenharmony_ci	}
115e5c31af7Sopenharmony_ci
116e5c31af7Sopenharmony_ciprivate:
117e5c31af7Sopenharmony_ci	deUint32	m_layoutFlags;
118e5c31af7Sopenharmony_ci	int			m_numInstances;
119e5c31af7Sopenharmony_ci};
120e5c31af7Sopenharmony_ci
121e5c31af7Sopenharmony_ci} // anonymous
122e5c31af7Sopenharmony_ci
123e5c31af7Sopenharmony_ciUniformBlockTests::UniformBlockTests (Context& context)
124e5c31af7Sopenharmony_ci	: TestCaseGroup(context, "ubo", "Uniform Block tests")
125e5c31af7Sopenharmony_ci{
126e5c31af7Sopenharmony_ci}
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_ciUniformBlockTests::~UniformBlockTests (void)
129e5c31af7Sopenharmony_ci{
130e5c31af7Sopenharmony_ci}
131e5c31af7Sopenharmony_ci
132e5c31af7Sopenharmony_civoid UniformBlockTests::init (void)
133e5c31af7Sopenharmony_ci{
134e5c31af7Sopenharmony_ci	static const glu::DataType basicTypes[] =
135e5c31af7Sopenharmony_ci	{
136e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT,
137e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_VEC2,
138e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_VEC3,
139e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_VEC4,
140e5c31af7Sopenharmony_ci		glu::TYPE_INT,
141e5c31af7Sopenharmony_ci		glu::TYPE_INT_VEC2,
142e5c31af7Sopenharmony_ci		glu::TYPE_INT_VEC3,
143e5c31af7Sopenharmony_ci		glu::TYPE_INT_VEC4,
144e5c31af7Sopenharmony_ci		glu::TYPE_UINT,
145e5c31af7Sopenharmony_ci		glu::TYPE_UINT_VEC2,
146e5c31af7Sopenharmony_ci		glu::TYPE_UINT_VEC3,
147e5c31af7Sopenharmony_ci		glu::TYPE_UINT_VEC4,
148e5c31af7Sopenharmony_ci		glu::TYPE_BOOL,
149e5c31af7Sopenharmony_ci		glu::TYPE_BOOL_VEC2,
150e5c31af7Sopenharmony_ci		glu::TYPE_BOOL_VEC3,
151e5c31af7Sopenharmony_ci		glu::TYPE_BOOL_VEC4,
152e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT2,
153e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT3,
154e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT4,
155e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT2X3,
156e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT2X4,
157e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT3X2,
158e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT3X4,
159e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT4X2,
160e5c31af7Sopenharmony_ci		glu::TYPE_FLOAT_MAT4X3
161e5c31af7Sopenharmony_ci	};
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_ci	static const struct
164e5c31af7Sopenharmony_ci	{
165e5c31af7Sopenharmony_ci		const char*		name;
166e5c31af7Sopenharmony_ci		deUint32		flags;
167e5c31af7Sopenharmony_ci	} layoutFlags[] =
168e5c31af7Sopenharmony_ci	{
169e5c31af7Sopenharmony_ci		{ "shared",		LAYOUT_SHARED	},
170e5c31af7Sopenharmony_ci		{ "packed",		LAYOUT_PACKED	},
171e5c31af7Sopenharmony_ci		{ "std140",		LAYOUT_STD140	}
172e5c31af7Sopenharmony_ci	};
173e5c31af7Sopenharmony_ci
174e5c31af7Sopenharmony_ci	static const struct
175e5c31af7Sopenharmony_ci	{
176e5c31af7Sopenharmony_ci		const char*		name;
177e5c31af7Sopenharmony_ci		deUint32		flags;
178e5c31af7Sopenharmony_ci	} matrixFlags[] =
179e5c31af7Sopenharmony_ci	{
180e5c31af7Sopenharmony_ci		{ "row_major",		LAYOUT_ROW_MAJOR	},
181e5c31af7Sopenharmony_ci		{ "column_major",	LAYOUT_COLUMN_MAJOR }
182e5c31af7Sopenharmony_ci	};
183e5c31af7Sopenharmony_ci
184e5c31af7Sopenharmony_ci	static const struct
185e5c31af7Sopenharmony_ci	{
186e5c31af7Sopenharmony_ci		const char*							name;
187e5c31af7Sopenharmony_ci		UniformBlockCase::BufferMode		mode;
188e5c31af7Sopenharmony_ci	} bufferModes[] =
189e5c31af7Sopenharmony_ci	{
190e5c31af7Sopenharmony_ci		{ "per_block_buffer",	UniformBlockCase::BUFFERMODE_PER_BLOCK },
191e5c31af7Sopenharmony_ci		{ "single_buffer",		UniformBlockCase::BUFFERMODE_SINGLE	}
192e5c31af7Sopenharmony_ci	};
193e5c31af7Sopenharmony_ci
194e5c31af7Sopenharmony_ci	// ubo.2_level_array
195e5c31af7Sopenharmony_ci	{
196e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_array", "2-level basic array variable in single buffer");
197e5c31af7Sopenharmony_ci		addChild(nestedArrayGroup);
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ci		for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
200e5c31af7Sopenharmony_ci		{
201e5c31af7Sopenharmony_ci			tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
202e5c31af7Sopenharmony_ci			nestedArrayGroup->addChild(layoutGroup);
203e5c31af7Sopenharmony_ci
204e5c31af7Sopenharmony_ci			for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
205e5c31af7Sopenharmony_ci			{
206e5c31af7Sopenharmony_ci				const glu::DataType	type		= basicTypes[basicTypeNdx];
207e5c31af7Sopenharmony_ci				const char*			typeName	= glu::getDataTypeName(type);
208e5c31af7Sopenharmony_ci				const int			childSize	= 4;
209e5c31af7Sopenharmony_ci				const int			parentSize	= 3;
210e5c31af7Sopenharmony_ci				const VarType		childType	(VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize);
211e5c31af7Sopenharmony_ci				const VarType		parentType	(childType, parentSize);
212e5c31af7Sopenharmony_ci
213e5c31af7Sopenharmony_ci				createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags);
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ci				if (glu::isDataTypeMatrix(type))
216e5c31af7Sopenharmony_ci				{
217e5c31af7Sopenharmony_ci					for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
218e5c31af7Sopenharmony_ci						createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
219e5c31af7Sopenharmony_ci												  parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags);
220e5c31af7Sopenharmony_ci				}
221e5c31af7Sopenharmony_ci			}
222e5c31af7Sopenharmony_ci		}
223e5c31af7Sopenharmony_ci	}
224e5c31af7Sopenharmony_ci
225e5c31af7Sopenharmony_ci	// ubo.3_level_array
226e5c31af7Sopenharmony_ci	{
227e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* nestedArrayGroup = new tcu::TestCaseGroup(m_testCtx, "3_level_array", "3-level basic array variable in single buffer");
228e5c31af7Sopenharmony_ci		addChild(nestedArrayGroup);
229e5c31af7Sopenharmony_ci
230e5c31af7Sopenharmony_ci		for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
231e5c31af7Sopenharmony_ci		{
232e5c31af7Sopenharmony_ci			tcu::TestCaseGroup* layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
233e5c31af7Sopenharmony_ci			nestedArrayGroup->addChild(layoutGroup);
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_ci			for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
236e5c31af7Sopenharmony_ci			{
237e5c31af7Sopenharmony_ci				const glu::DataType	type		= basicTypes[basicTypeNdx];
238e5c31af7Sopenharmony_ci				const char*			typeName	= glu::getDataTypeName(type);
239e5c31af7Sopenharmony_ci				const int			childSize0	= 2;
240e5c31af7Sopenharmony_ci				const int			childSize1	= 4;
241e5c31af7Sopenharmony_ci				const int			parentSize	= 3;
242e5c31af7Sopenharmony_ci				const VarType		childType0	(VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), childSize0);
243e5c31af7Sopenharmony_ci				const VarType		childType1	(childType0, childSize1);
244e5c31af7Sopenharmony_ci				const VarType		parentType	(childType1, parentSize);
245e5c31af7Sopenharmony_ci
246e5c31af7Sopenharmony_ci				createBlockBasicTypeCases(layoutGroup, m_context, typeName, parentType, layoutFlags[layoutFlagNdx].flags);
247e5c31af7Sopenharmony_ci
248e5c31af7Sopenharmony_ci				if (glu::isDataTypeMatrix(type))
249e5c31af7Sopenharmony_ci				{
250e5c31af7Sopenharmony_ci					for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
251e5c31af7Sopenharmony_ci						createBlockBasicTypeCases(layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
252e5c31af7Sopenharmony_ci												  parentType, layoutFlags[layoutFlagNdx].flags|matrixFlags[matFlagNdx].flags);
253e5c31af7Sopenharmony_ci				}
254e5c31af7Sopenharmony_ci			}
255e5c31af7Sopenharmony_ci		}
256e5c31af7Sopenharmony_ci	}
257e5c31af7Sopenharmony_ci
258e5c31af7Sopenharmony_ci	// ubo.2_level_struct_array
259e5c31af7Sopenharmony_ci	{
260e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* structArrayArrayGroup = new tcu::TestCaseGroup(m_testCtx, "2_level_struct_array", "Struct array in one uniform block");
261e5c31af7Sopenharmony_ci		addChild(structArrayArrayGroup);
262e5c31af7Sopenharmony_ci
263e5c31af7Sopenharmony_ci		for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
264e5c31af7Sopenharmony_ci		{
265e5c31af7Sopenharmony_ci			tcu::TestCaseGroup* modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
266e5c31af7Sopenharmony_ci			structArrayArrayGroup->addChild(modeGroup);
267e5c31af7Sopenharmony_ci
268e5c31af7Sopenharmony_ci			for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
269e5c31af7Sopenharmony_ci			{
270e5c31af7Sopenharmony_ci				for (int isArray = 0; isArray < 2; isArray++)
271e5c31af7Sopenharmony_ci				{
272e5c31af7Sopenharmony_ci					std::string	baseName	= layoutFlags[layoutFlagNdx].name;
273e5c31af7Sopenharmony_ci					deUint32	baseFlags	= layoutFlags[layoutFlagNdx].flags;
274e5c31af7Sopenharmony_ci
275e5c31af7Sopenharmony_ci					if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
276e5c31af7Sopenharmony_ci						continue; // Doesn't make sense to add this variant.
277e5c31af7Sopenharmony_ci
278e5c31af7Sopenharmony_ci					if (isArray)
279e5c31af7Sopenharmony_ci						baseName += "_instance_array";
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_ci					modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_vertex").c_str(),	"", baseFlags|DECLARE_VERTEX,					bufferModes[modeNdx].mode, isArray ? 3 : 0));
282e5c31af7Sopenharmony_ci					modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_fragment").c_str(),	"", baseFlags|DECLARE_FRAGMENT,					bufferModes[modeNdx].mode, isArray ? 3 : 0));
283e5c31af7Sopenharmony_ci
284e5c31af7Sopenharmony_ci					if (!(baseFlags & LAYOUT_PACKED))
285e5c31af7Sopenharmony_ci						modeGroup->addChild(new Block2LevelStructArrayCase(m_context, (baseName + "_both").c_str(),	"", baseFlags|DECLARE_VERTEX|DECLARE_FRAGMENT,	bufferModes[modeNdx].mode, isArray ? 3 : 0));
286e5c31af7Sopenharmony_ci				}
287e5c31af7Sopenharmony_ci			}
288e5c31af7Sopenharmony_ci		}
289e5c31af7Sopenharmony_ci	}
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci	// ubo.random
292e5c31af7Sopenharmony_ci	{
293e5c31af7Sopenharmony_ci		const deUint32	allShaders		= FEATURE_VERTEX_BLOCKS|FEATURE_FRAGMENT_BLOCKS|FEATURE_SHARED_BLOCKS;
294e5c31af7Sopenharmony_ci		const deUint32	allLayouts		= FEATURE_PACKED_LAYOUT|FEATURE_SHARED_LAYOUT|FEATURE_STD140_LAYOUT;
295e5c31af7Sopenharmony_ci		const deUint32	allBasicTypes	= FEATURE_VECTORS|FEATURE_MATRICES;
296e5c31af7Sopenharmony_ci		const deUint32	unused			= FEATURE_UNUSED_MEMBERS|FEATURE_UNUSED_UNIFORMS;
297e5c31af7Sopenharmony_ci		const deUint32	matFlags		= FEATURE_MATRIX_LAYOUT;
298e5c31af7Sopenharmony_ci		const deUint32	basicTypeArrays	= allShaders|allLayouts|unused|allBasicTypes|matFlags|FEATURE_ARRAYS|FEATURE_ARRAYS_OF_ARRAYS;
299e5c31af7Sopenharmony_ci		const deUint32	allFeatures		= ~0u;
300e5c31af7Sopenharmony_ci
301e5c31af7Sopenharmony_ci		tcu::TestCaseGroup* randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases");
302e5c31af7Sopenharmony_ci		addChild(randomGroup);
303e5c31af7Sopenharmony_ci
304e5c31af7Sopenharmony_ci		createRandomCaseGroup(randomGroup, m_context, "basic_type_arrays",		"Arrays, per-block buffers",				UniformBlockCase::BUFFERMODE_PER_BLOCK,	basicTypeArrays,	25, 1150);
305e5c31af7Sopenharmony_ci		createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers",	"All random features, per-block buffers",	UniformBlockCase::BUFFERMODE_PER_BLOCK,	allFeatures,		50, 11200);
306e5c31af7Sopenharmony_ci		createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer",		"All random features, shared buffer",		UniformBlockCase::BUFFERMODE_SINGLE,	allFeatures,		50, 11250);
307e5c31af7Sopenharmony_ci	}
308e5c31af7Sopenharmony_ci}
309e5c31af7Sopenharmony_ci
310e5c31af7Sopenharmony_ci} // Functional
311e5c31af7Sopenharmony_ci} // gles31
312e5c31af7Sopenharmony_ci} // deqp
313