1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Uniform block tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fUniformBlockTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsUniformBlockCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "glsRandomUniformBlockCase.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker using std::string;
32*35238bceSAndroid Build Coastguard Worker using std::vector;
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker namespace deqp
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace gles3
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace Functional
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker using gls::RandomUniformBlockCase;
42*35238bceSAndroid Build Coastguard Worker using gls::UniformBlockCase;
43*35238bceSAndroid Build Coastguard Worker using namespace gls::ub;
44*35238bceSAndroid Build Coastguard Worker
createRandomCaseGroup(tcu::TestCaseGroup * parentGroup,Context & context,const char * groupName,const char * description,UniformBlockCase::BufferMode bufferMode,uint32_t features,int numCases,uint32_t baseSeed)45*35238bceSAndroid Build Coastguard Worker static void createRandomCaseGroup(tcu::TestCaseGroup *parentGroup, Context &context, const char *groupName,
46*35238bceSAndroid Build Coastguard Worker const char *description, UniformBlockCase::BufferMode bufferMode, uint32_t features,
47*35238bceSAndroid Build Coastguard Worker int numCases, uint32_t baseSeed)
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description);
50*35238bceSAndroid Build Coastguard Worker parentGroup->addChild(group);
51*35238bceSAndroid Build Coastguard Worker
52*35238bceSAndroid Build Coastguard Worker baseSeed += (uint32_t)context.getTestContext().getCommandLine().getBaseSeed();
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numCases; ndx++)
55*35238bceSAndroid Build Coastguard Worker group->addChild(new RandomUniformBlockCase(context.getTestContext(), context.getRenderContext(),
56*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, de::toString(ndx).c_str(), "", bufferMode,
57*35238bceSAndroid Build Coastguard Worker features, (uint32_t)ndx + baseSeed));
58*35238bceSAndroid Build Coastguard Worker }
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker class BlockBasicTypeCase : public UniformBlockCase
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker public:
BlockBasicTypeCase(Context & context,const char * name,const char * description,const VarType & type,uint32_t layoutFlags,int numInstances)63*35238bceSAndroid Build Coastguard Worker BlockBasicTypeCase(Context &context, const char *name, const char *description, const VarType &type,
64*35238bceSAndroid Build Coastguard Worker uint32_t layoutFlags, int numInstances)
65*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
66*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, BUFFERMODE_PER_BLOCK)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
69*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("var", type, 0));
70*35238bceSAndroid Build Coastguard Worker block.setFlags(layoutFlags);
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard Worker if (numInstances > 0)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker block.setArraySize(numInstances);
75*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker }
78*35238bceSAndroid Build Coastguard Worker };
79*35238bceSAndroid Build Coastguard Worker
createBlockBasicTypeCases(tcu::TestCaseGroup * group,Context & context,const char * name,const VarType & type,uint32_t layoutFlags,int numInstances=0)80*35238bceSAndroid Build Coastguard Worker static void createBlockBasicTypeCases(tcu::TestCaseGroup *group, Context &context, const char *name,
81*35238bceSAndroid Build Coastguard Worker const VarType &type, uint32_t layoutFlags, int numInstances = 0)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker group->addChild(new BlockBasicTypeCase(context, (string(name) + "_vertex").c_str(), "", type,
84*35238bceSAndroid Build Coastguard Worker layoutFlags | DECLARE_VERTEX, numInstances));
85*35238bceSAndroid Build Coastguard Worker group->addChild(new BlockBasicTypeCase(context, (string(name) + "_fragment").c_str(), "", type,
86*35238bceSAndroid Build Coastguard Worker layoutFlags | DECLARE_FRAGMENT, numInstances));
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker if (!(layoutFlags & LAYOUT_PACKED))
89*35238bceSAndroid Build Coastguard Worker group->addChild(new BlockBasicTypeCase(context, (string(name) + "_both").c_str(), "", type,
90*35238bceSAndroid Build Coastguard Worker layoutFlags | DECLARE_VERTEX | DECLARE_FRAGMENT, numInstances));
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker class BlockSingleStructCase : public UniformBlockCase
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker public:
BlockSingleStructCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)96*35238bceSAndroid Build Coastguard Worker BlockSingleStructCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
97*35238bceSAndroid Build Coastguard Worker BufferMode bufferMode, int numInstances)
98*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
99*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
100*35238bceSAndroid Build Coastguard Worker , m_layoutFlags(layoutFlags)
101*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
102*35238bceSAndroid Build Coastguard Worker {
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
init(void)105*35238bceSAndroid Build Coastguard Worker void init(void)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
108*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH), UNUSED_BOTH); // First member is unused.
109*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM), 4));
110*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH));
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
113*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("s", VarType(&typeS), 0));
114*35238bceSAndroid Build Coastguard Worker block.setFlags(m_layoutFlags);
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
117*35238bceSAndroid Build Coastguard Worker {
118*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
119*35238bceSAndroid Build Coastguard Worker block.setArraySize(m_numInstances);
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker private:
124*35238bceSAndroid Build Coastguard Worker uint32_t m_layoutFlags;
125*35238bceSAndroid Build Coastguard Worker int m_numInstances;
126*35238bceSAndroid Build Coastguard Worker };
127*35238bceSAndroid Build Coastguard Worker
128*35238bceSAndroid Build Coastguard Worker class BlockSingleStructArrayCase : public UniformBlockCase
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker public:
BlockSingleStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)131*35238bceSAndroid Build Coastguard Worker BlockSingleStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
132*35238bceSAndroid Build Coastguard Worker BufferMode bufferMode, int numInstances)
133*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
134*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
135*35238bceSAndroid Build Coastguard Worker , m_layoutFlags(layoutFlags)
136*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker
init(void)140*35238bceSAndroid Build Coastguard Worker void init(void)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
143*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH), UNUSED_BOTH);
144*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM), 4));
145*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH));
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
148*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("u", VarType(glu::TYPE_UINT, PRECISION_LOW)));
149*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("s", VarType(VarType(&typeS), 3)));
150*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_MEDIUM)));
151*35238bceSAndroid Build Coastguard Worker block.setFlags(m_layoutFlags);
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
156*35238bceSAndroid Build Coastguard Worker block.setArraySize(m_numInstances);
157*35238bceSAndroid Build Coastguard Worker }
158*35238bceSAndroid Build Coastguard Worker }
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker private:
161*35238bceSAndroid Build Coastguard Worker uint32_t m_layoutFlags;
162*35238bceSAndroid Build Coastguard Worker int m_numInstances;
163*35238bceSAndroid Build Coastguard Worker };
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker class BlockSingleNestedStructCase : public UniformBlockCase
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker public:
BlockSingleNestedStructCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)168*35238bceSAndroid Build Coastguard Worker BlockSingleNestedStructCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
169*35238bceSAndroid Build Coastguard Worker BufferMode bufferMode, int numInstances)
170*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
171*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
172*35238bceSAndroid Build Coastguard Worker , m_layoutFlags(layoutFlags)
173*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker }
176*35238bceSAndroid Build Coastguard Worker
init(void)177*35238bceSAndroid Build Coastguard Worker void init(void)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
180*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH));
181*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM), 4));
182*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH);
183*35238bceSAndroid Build Coastguard Worker
184*35238bceSAndroid Build Coastguard Worker StructType &typeT = m_interface.allocStruct("T");
185*35238bceSAndroid Build Coastguard Worker typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM));
186*35238bceSAndroid Build Coastguard Worker typeT.addMember("b", VarType(&typeS));
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
189*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("s", VarType(&typeS), 0));
190*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_LOW), UNUSED_BOTH));
191*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("t", VarType(&typeT), 0));
192*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("u", VarType(glu::TYPE_UINT, PRECISION_HIGH), 0));
193*35238bceSAndroid Build Coastguard Worker block.setFlags(m_layoutFlags);
194*35238bceSAndroid Build Coastguard Worker
195*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
198*35238bceSAndroid Build Coastguard Worker block.setArraySize(m_numInstances);
199*35238bceSAndroid Build Coastguard Worker }
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker private:
203*35238bceSAndroid Build Coastguard Worker uint32_t m_layoutFlags;
204*35238bceSAndroid Build Coastguard Worker int m_numInstances;
205*35238bceSAndroid Build Coastguard Worker };
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker class BlockSingleNestedStructMixedMatrixPackingCase : public UniformBlockCase
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker public:
BlockSingleNestedStructMixedMatrixPackingCase(Context & context,const char * name,const char * description,uint32_t blockLayoutFlags,uint32_t matrixLayoutFlags,uint32_t matrixArrayLayoutFlags,BufferMode bufferMode,int numInstances)210*35238bceSAndroid Build Coastguard Worker BlockSingleNestedStructMixedMatrixPackingCase(Context &context, const char *name, const char *description,
211*35238bceSAndroid Build Coastguard Worker uint32_t blockLayoutFlags, uint32_t matrixLayoutFlags,
212*35238bceSAndroid Build Coastguard Worker uint32_t matrixArrayLayoutFlags, BufferMode bufferMode,
213*35238bceSAndroid Build Coastguard Worker int numInstances)
214*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
215*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
216*35238bceSAndroid Build Coastguard Worker , m_blockLayoutFlags(blockLayoutFlags)
217*35238bceSAndroid Build Coastguard Worker , m_matrixLayoutFlags(matrixLayoutFlags)
218*35238bceSAndroid Build Coastguard Worker , m_matrixArrayLayoutFlags(matrixArrayLayoutFlags)
219*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
220*35238bceSAndroid Build Coastguard Worker {
221*35238bceSAndroid Build Coastguard Worker }
222*35238bceSAndroid Build Coastguard Worker
init(void)223*35238bceSAndroid Build Coastguard Worker void init(void)
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
226*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH));
227*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM), 4));
228*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH);
229*35238bceSAndroid Build Coastguard Worker
230*35238bceSAndroid Build Coastguard Worker StructType &typeT = m_interface.allocStruct("T");
231*35238bceSAndroid Build Coastguard Worker typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM));
232*35238bceSAndroid Build Coastguard Worker typeT.addMember("b", VarType(&typeS));
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
235*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("s", VarType(&typeS, m_matrixArrayLayoutFlags), 0));
236*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_LOW), UNUSED_BOTH));
237*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("t", VarType(&typeT, m_matrixLayoutFlags), 0));
238*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("u", VarType(glu::TYPE_UINT, PRECISION_HIGH), 0));
239*35238bceSAndroid Build Coastguard Worker block.setFlags(m_blockLayoutFlags);
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
242*35238bceSAndroid Build Coastguard Worker {
243*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
244*35238bceSAndroid Build Coastguard Worker block.setArraySize(m_numInstances);
245*35238bceSAndroid Build Coastguard Worker }
246*35238bceSAndroid Build Coastguard Worker }
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Worker private:
249*35238bceSAndroid Build Coastguard Worker uint32_t m_blockLayoutFlags;
250*35238bceSAndroid Build Coastguard Worker uint32_t m_matrixLayoutFlags;
251*35238bceSAndroid Build Coastguard Worker uint32_t m_matrixArrayLayoutFlags;
252*35238bceSAndroid Build Coastguard Worker int m_numInstances;
253*35238bceSAndroid Build Coastguard Worker };
254*35238bceSAndroid Build Coastguard Worker
255*35238bceSAndroid Build Coastguard Worker class BlockSingleNestedStructArrayCase : public UniformBlockCase
256*35238bceSAndroid Build Coastguard Worker {
257*35238bceSAndroid Build Coastguard Worker public:
BlockSingleNestedStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)258*35238bceSAndroid Build Coastguard Worker BlockSingleNestedStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
259*35238bceSAndroid Build Coastguard Worker BufferMode bufferMode, int numInstances)
260*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
261*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
262*35238bceSAndroid Build Coastguard Worker , m_layoutFlags(layoutFlags)
263*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
264*35238bceSAndroid Build Coastguard Worker {
265*35238bceSAndroid Build Coastguard Worker }
266*35238bceSAndroid Build Coastguard Worker
init(void)267*35238bceSAndroid Build Coastguard Worker void init(void)
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
270*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH));
271*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_INT_VEC2, PRECISION_MEDIUM), 4));
272*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH);
273*35238bceSAndroid Build Coastguard Worker
274*35238bceSAndroid Build Coastguard Worker StructType &typeT = m_interface.allocStruct("T");
275*35238bceSAndroid Build Coastguard Worker typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM));
276*35238bceSAndroid Build Coastguard Worker typeT.addMember("b", VarType(VarType(&typeS), 3));
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker UniformBlock &block = m_interface.allocBlock("Block");
279*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("s", VarType(&typeS), 0));
280*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_LOW), UNUSED_BOTH));
281*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("t", VarType(VarType(&typeT), 2), 0));
282*35238bceSAndroid Build Coastguard Worker block.addUniform(Uniform("u", VarType(glu::TYPE_UINT, PRECISION_HIGH), 0));
283*35238bceSAndroid Build Coastguard Worker block.setFlags(m_layoutFlags);
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker block.setInstanceName("block");
288*35238bceSAndroid Build Coastguard Worker block.setArraySize(m_numInstances);
289*35238bceSAndroid Build Coastguard Worker }
290*35238bceSAndroid Build Coastguard Worker }
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker private:
293*35238bceSAndroid Build Coastguard Worker uint32_t m_layoutFlags;
294*35238bceSAndroid Build Coastguard Worker int m_numInstances;
295*35238bceSAndroid Build Coastguard Worker };
296*35238bceSAndroid Build Coastguard Worker
297*35238bceSAndroid Build Coastguard Worker class BlockMultiBasicTypesCase : public UniformBlockCase
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker public:
BlockMultiBasicTypesCase(Context & context,const char * name,const char * description,uint32_t flagsA,uint32_t flagsB,BufferMode bufferMode,int numInstances)300*35238bceSAndroid Build Coastguard Worker BlockMultiBasicTypesCase(Context &context, const char *name, const char *description, uint32_t flagsA,
301*35238bceSAndroid Build Coastguard Worker uint32_t flagsB, BufferMode bufferMode, int numInstances)
302*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
303*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
304*35238bceSAndroid Build Coastguard Worker , m_flagsA(flagsA)
305*35238bceSAndroid Build Coastguard Worker , m_flagsB(flagsB)
306*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
307*35238bceSAndroid Build Coastguard Worker {
308*35238bceSAndroid Build Coastguard Worker }
309*35238bceSAndroid Build Coastguard Worker
init(void)310*35238bceSAndroid Build Coastguard Worker void init(void)
311*35238bceSAndroid Build Coastguard Worker {
312*35238bceSAndroid Build Coastguard Worker UniformBlock &blockA = m_interface.allocBlock("BlockA");
313*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT, PRECISION_HIGH)));
314*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("b", VarType(glu::TYPE_UINT_VEC3, PRECISION_LOW), UNUSED_BOTH));
315*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("c", VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM)));
316*35238bceSAndroid Build Coastguard Worker blockA.setInstanceName("blockA");
317*35238bceSAndroid Build Coastguard Worker blockA.setFlags(m_flagsA);
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker UniformBlock &blockB = m_interface.allocBlock("BlockB");
320*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM)));
321*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("b", VarType(glu::TYPE_INT_VEC2, PRECISION_LOW)));
322*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH));
323*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("d", VarType(glu::TYPE_BOOL, 0)));
324*35238bceSAndroid Build Coastguard Worker blockB.setInstanceName("blockB");
325*35238bceSAndroid Build Coastguard Worker blockB.setFlags(m_flagsB);
326*35238bceSAndroid Build Coastguard Worker
327*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
328*35238bceSAndroid Build Coastguard Worker {
329*35238bceSAndroid Build Coastguard Worker blockA.setArraySize(m_numInstances);
330*35238bceSAndroid Build Coastguard Worker blockB.setArraySize(m_numInstances);
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker private:
335*35238bceSAndroid Build Coastguard Worker uint32_t m_flagsA;
336*35238bceSAndroid Build Coastguard Worker uint32_t m_flagsB;
337*35238bceSAndroid Build Coastguard Worker int m_numInstances;
338*35238bceSAndroid Build Coastguard Worker };
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker class BlockMultiNestedStructCase : public UniformBlockCase
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker public:
BlockMultiNestedStructCase(Context & context,const char * name,const char * description,uint32_t flagsA,uint32_t flagsB,BufferMode bufferMode,int numInstances)343*35238bceSAndroid Build Coastguard Worker BlockMultiNestedStructCase(Context &context, const char *name, const char *description, uint32_t flagsA,
344*35238bceSAndroid Build Coastguard Worker uint32_t flagsB, BufferMode bufferMode, int numInstances)
345*35238bceSAndroid Build Coastguard Worker : UniformBlockCase(context.getTestContext(), context.getRenderContext(), name, description,
346*35238bceSAndroid Build Coastguard Worker glu::GLSL_VERSION_300_ES, bufferMode)
347*35238bceSAndroid Build Coastguard Worker , m_flagsA(flagsA)
348*35238bceSAndroid Build Coastguard Worker , m_flagsB(flagsB)
349*35238bceSAndroid Build Coastguard Worker , m_numInstances(numInstances)
350*35238bceSAndroid Build Coastguard Worker {
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker
init(void)353*35238bceSAndroid Build Coastguard Worker void init(void)
354*35238bceSAndroid Build Coastguard Worker {
355*35238bceSAndroid Build Coastguard Worker StructType &typeS = m_interface.allocStruct("S");
356*35238bceSAndroid Build Coastguard Worker typeS.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_LOW));
357*35238bceSAndroid Build Coastguard Worker typeS.addMember("b", VarType(VarType(glu::TYPE_INT_VEC2, PRECISION_MEDIUM), 4));
358*35238bceSAndroid Build Coastguard Worker typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH));
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker StructType &typeT = m_interface.allocStruct("T");
361*35238bceSAndroid Build Coastguard Worker typeT.addMember("a", VarType(glu::TYPE_UINT, PRECISION_MEDIUM), UNUSED_BOTH);
362*35238bceSAndroid Build Coastguard Worker typeT.addMember("b", VarType(&typeS));
363*35238bceSAndroid Build Coastguard Worker typeT.addMember("c", VarType(glu::TYPE_BOOL_VEC4, 0));
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker UniformBlock &blockA = m_interface.allocBlock("BlockA");
366*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT, PRECISION_HIGH)));
367*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("b", VarType(&typeS)));
368*35238bceSAndroid Build Coastguard Worker blockA.addUniform(Uniform("c", VarType(glu::TYPE_UINT_VEC3, PRECISION_LOW), UNUSED_BOTH));
369*35238bceSAndroid Build Coastguard Worker blockA.setInstanceName("blockA");
370*35238bceSAndroid Build Coastguard Worker blockA.setFlags(m_flagsA);
371*35238bceSAndroid Build Coastguard Worker
372*35238bceSAndroid Build Coastguard Worker UniformBlock &blockB = m_interface.allocBlock("BlockB");
373*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("a", VarType(glu::TYPE_FLOAT_MAT2, PRECISION_MEDIUM)));
374*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("b", VarType(&typeT)));
375*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("c", VarType(glu::TYPE_BOOL_VEC4, 0), UNUSED_BOTH));
376*35238bceSAndroid Build Coastguard Worker blockB.addUniform(Uniform("d", VarType(glu::TYPE_BOOL, 0)));
377*35238bceSAndroid Build Coastguard Worker blockB.setInstanceName("blockB");
378*35238bceSAndroid Build Coastguard Worker blockB.setFlags(m_flagsB);
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker if (m_numInstances > 0)
381*35238bceSAndroid Build Coastguard Worker {
382*35238bceSAndroid Build Coastguard Worker blockA.setArraySize(m_numInstances);
383*35238bceSAndroid Build Coastguard Worker blockB.setArraySize(m_numInstances);
384*35238bceSAndroid Build Coastguard Worker }
385*35238bceSAndroid Build Coastguard Worker }
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker private:
388*35238bceSAndroid Build Coastguard Worker uint32_t m_flagsA;
389*35238bceSAndroid Build Coastguard Worker uint32_t m_flagsB;
390*35238bceSAndroid Build Coastguard Worker int m_numInstances;
391*35238bceSAndroid Build Coastguard Worker };
392*35238bceSAndroid Build Coastguard Worker
UniformBlockTests(Context & context)393*35238bceSAndroid Build Coastguard Worker UniformBlockTests::UniformBlockTests(Context &context) : TestCaseGroup(context, "ubo", "Uniform Block tests")
394*35238bceSAndroid Build Coastguard Worker {
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker
~UniformBlockTests(void)397*35238bceSAndroid Build Coastguard Worker UniformBlockTests::~UniformBlockTests(void)
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker
init(void)401*35238bceSAndroid Build Coastguard Worker void UniformBlockTests::init(void)
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker static const glu::DataType basicTypes[] = {
404*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT, glu::TYPE_FLOAT_VEC2, glu::TYPE_FLOAT_VEC3, glu::TYPE_FLOAT_VEC4,
405*35238bceSAndroid Build Coastguard Worker glu::TYPE_INT, glu::TYPE_INT_VEC2, glu::TYPE_INT_VEC3, glu::TYPE_INT_VEC4,
406*35238bceSAndroid Build Coastguard Worker glu::TYPE_UINT, glu::TYPE_UINT_VEC2, glu::TYPE_UINT_VEC3, glu::TYPE_UINT_VEC4,
407*35238bceSAndroid Build Coastguard Worker glu::TYPE_BOOL, glu::TYPE_BOOL_VEC2, glu::TYPE_BOOL_VEC3, glu::TYPE_BOOL_VEC4,
408*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT2, glu::TYPE_FLOAT_MAT3, glu::TYPE_FLOAT_MAT4, glu::TYPE_FLOAT_MAT2X3,
409*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT2X4, glu::TYPE_FLOAT_MAT3X2, glu::TYPE_FLOAT_MAT3X4, glu::TYPE_FLOAT_MAT4X2,
410*35238bceSAndroid Build Coastguard Worker glu::TYPE_FLOAT_MAT4X3};
411*35238bceSAndroid Build Coastguard Worker
412*35238bceSAndroid Build Coastguard Worker static const struct
413*35238bceSAndroid Build Coastguard Worker {
414*35238bceSAndroid Build Coastguard Worker const char *name;
415*35238bceSAndroid Build Coastguard Worker uint32_t flags;
416*35238bceSAndroid Build Coastguard Worker } precisionFlags[] = {{"lowp", PRECISION_LOW}, {"mediump", PRECISION_MEDIUM}, {"highp", PRECISION_HIGH}};
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker static const struct
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker const char *name;
421*35238bceSAndroid Build Coastguard Worker uint32_t flags;
422*35238bceSAndroid Build Coastguard Worker } layoutFlags[] = {{"shared", LAYOUT_SHARED}, {"packed", LAYOUT_PACKED}, {"std140", LAYOUT_STD140}};
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker static const struct
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker const char *name;
427*35238bceSAndroid Build Coastguard Worker uint32_t flags;
428*35238bceSAndroid Build Coastguard Worker } matrixFlags[] = {{"row_major", LAYOUT_ROW_MAJOR}, {"column_major", LAYOUT_COLUMN_MAJOR}};
429*35238bceSAndroid Build Coastguard Worker
430*35238bceSAndroid Build Coastguard Worker static const struct
431*35238bceSAndroid Build Coastguard Worker {
432*35238bceSAndroid Build Coastguard Worker const char *name;
433*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BufferMode mode;
434*35238bceSAndroid Build Coastguard Worker } bufferModes[] = {{"per_block_buffer", UniformBlockCase::BUFFERMODE_PER_BLOCK},
435*35238bceSAndroid Build Coastguard Worker {"single_buffer", UniformBlockCase::BUFFERMODE_SINGLE}};
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker // ubo.single_basic_type
438*35238bceSAndroid Build Coastguard Worker {
439*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleBasicTypeGroup =
440*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_basic_type", "Single basic variable in single buffer");
441*35238bceSAndroid Build Coastguard Worker addChild(singleBasicTypeGroup);
442*35238bceSAndroid Build Coastguard Worker
443*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
444*35238bceSAndroid Build Coastguard Worker {
445*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
446*35238bceSAndroid Build Coastguard Worker singleBasicTypeGroup->addChild(layoutGroup);
447*35238bceSAndroid Build Coastguard Worker
448*35238bceSAndroid Build Coastguard Worker for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker glu::DataType type = basicTypes[basicTypeNdx];
451*35238bceSAndroid Build Coastguard Worker const char *typeName = glu::getDataTypeName(type);
452*35238bceSAndroid Build Coastguard Worker
453*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeBoolOrBVec(type))
454*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(layoutGroup, m_context, typeName, VarType(type, 0),
455*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags);
456*35238bceSAndroid Build Coastguard Worker else
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisionFlags); precNdx++)
459*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(
460*35238bceSAndroid Build Coastguard Worker layoutGroup, m_context, (string(precisionFlags[precNdx].name) + "_" + typeName).c_str(),
461*35238bceSAndroid Build Coastguard Worker VarType(type, precisionFlags[precNdx].flags), layoutFlags[layoutFlagNdx].flags);
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeMatrix(type))
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisionFlags); precNdx++)
469*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(layoutGroup, m_context,
470*35238bceSAndroid Build Coastguard Worker (string(matrixFlags[matFlagNdx].name) + "_" +
471*35238bceSAndroid Build Coastguard Worker precisionFlags[precNdx].name + "_" + typeName)
472*35238bceSAndroid Build Coastguard Worker .c_str(),
473*35238bceSAndroid Build Coastguard Worker VarType(type, precisionFlags[precNdx].flags),
474*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags);
475*35238bceSAndroid Build Coastguard Worker }
476*35238bceSAndroid Build Coastguard Worker }
477*35238bceSAndroid Build Coastguard Worker }
478*35238bceSAndroid Build Coastguard Worker }
479*35238bceSAndroid Build Coastguard Worker }
480*35238bceSAndroid Build Coastguard Worker
481*35238bceSAndroid Build Coastguard Worker // ubo.single_basic_array
482*35238bceSAndroid Build Coastguard Worker {
483*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleBasicArrayGroup =
484*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_basic_array", "Single basic array variable in single buffer");
485*35238bceSAndroid Build Coastguard Worker addChild(singleBasicArrayGroup);
486*35238bceSAndroid Build Coastguard Worker
487*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
490*35238bceSAndroid Build Coastguard Worker singleBasicArrayGroup->addChild(layoutGroup);
491*35238bceSAndroid Build Coastguard Worker
492*35238bceSAndroid Build Coastguard Worker for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
493*35238bceSAndroid Build Coastguard Worker {
494*35238bceSAndroid Build Coastguard Worker glu::DataType type = basicTypes[basicTypeNdx];
495*35238bceSAndroid Build Coastguard Worker const char *typeName = glu::getDataTypeName(type);
496*35238bceSAndroid Build Coastguard Worker const int arraySize = 3;
497*35238bceSAndroid Build Coastguard Worker
498*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(
499*35238bceSAndroid Build Coastguard Worker layoutGroup, m_context, typeName,
500*35238bceSAndroid Build Coastguard Worker VarType(VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH), arraySize),
501*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags);
502*35238bceSAndroid Build Coastguard Worker
503*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeMatrix(type))
504*35238bceSAndroid Build Coastguard Worker {
505*35238bceSAndroid Build Coastguard Worker for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
506*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(layoutGroup, m_context,
507*35238bceSAndroid Build Coastguard Worker (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
508*35238bceSAndroid Build Coastguard Worker VarType(VarType(type, PRECISION_HIGH), arraySize),
509*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags);
510*35238bceSAndroid Build Coastguard Worker }
511*35238bceSAndroid Build Coastguard Worker }
512*35238bceSAndroid Build Coastguard Worker }
513*35238bceSAndroid Build Coastguard Worker }
514*35238bceSAndroid Build Coastguard Worker
515*35238bceSAndroid Build Coastguard Worker // ubo.single_struct
516*35238bceSAndroid Build Coastguard Worker {
517*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleStructGroup =
518*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_struct", "Single struct in uniform block");
519*35238bceSAndroid Build Coastguard Worker addChild(singleStructGroup);
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
522*35238bceSAndroid Build Coastguard Worker {
523*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
524*35238bceSAndroid Build Coastguard Worker singleStructGroup->addChild(modeGroup);
525*35238bceSAndroid Build Coastguard Worker
526*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
527*35238bceSAndroid Build Coastguard Worker {
528*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
529*35238bceSAndroid Build Coastguard Worker {
530*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
531*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Worker if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
534*35238bceSAndroid Build Coastguard Worker continue; // Doesn't make sense to add this variant.
535*35238bceSAndroid Build Coastguard Worker
536*35238bceSAndroid Build Coastguard Worker if (isArray)
537*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
538*35238bceSAndroid Build Coastguard Worker
539*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructCase(m_context, (baseName + "_vertex").c_str(), "",
540*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX, bufferModes[modeNdx].mode,
541*35238bceSAndroid Build Coastguard Worker isArray ? 3 : 0));
542*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructCase(m_context, (baseName + "_fragment").c_str(), "",
543*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT,
544*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
545*35238bceSAndroid Build Coastguard Worker
546*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
547*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructCase(m_context, (baseName + "_both").c_str(), "",
548*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
549*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
550*35238bceSAndroid Build Coastguard Worker }
551*35238bceSAndroid Build Coastguard Worker }
552*35238bceSAndroid Build Coastguard Worker }
553*35238bceSAndroid Build Coastguard Worker }
554*35238bceSAndroid Build Coastguard Worker
555*35238bceSAndroid Build Coastguard Worker // ubo.single_struct_array
556*35238bceSAndroid Build Coastguard Worker {
557*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleStructArrayGroup =
558*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_struct_array", "Struct array in one uniform block");
559*35238bceSAndroid Build Coastguard Worker addChild(singleStructArrayGroup);
560*35238bceSAndroid Build Coastguard Worker
561*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
562*35238bceSAndroid Build Coastguard Worker {
563*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
564*35238bceSAndroid Build Coastguard Worker singleStructArrayGroup->addChild(modeGroup);
565*35238bceSAndroid Build Coastguard Worker
566*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
567*35238bceSAndroid Build Coastguard Worker {
568*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
569*35238bceSAndroid Build Coastguard Worker {
570*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
571*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
572*35238bceSAndroid Build Coastguard Worker
573*35238bceSAndroid Build Coastguard Worker if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
574*35238bceSAndroid Build Coastguard Worker continue; // Doesn't make sense to add this variant.
575*35238bceSAndroid Build Coastguard Worker
576*35238bceSAndroid Build Coastguard Worker if (isArray)
577*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
578*35238bceSAndroid Build Coastguard Worker
579*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructArrayCase(m_context, (baseName + "_vertex").c_str(), "",
580*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX,
581*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
582*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructArrayCase(m_context, (baseName + "_fragment").c_str(), "",
583*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT,
584*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
585*35238bceSAndroid Build Coastguard Worker
586*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
587*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleStructArrayCase(
588*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "", baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
589*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
590*35238bceSAndroid Build Coastguard Worker }
591*35238bceSAndroid Build Coastguard Worker }
592*35238bceSAndroid Build Coastguard Worker }
593*35238bceSAndroid Build Coastguard Worker }
594*35238bceSAndroid Build Coastguard Worker
595*35238bceSAndroid Build Coastguard Worker // ubo.single_nested_struct
596*35238bceSAndroid Build Coastguard Worker {
597*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleNestedStructGroup =
598*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_nested_struct", "Nested struct in one uniform block");
599*35238bceSAndroid Build Coastguard Worker addChild(singleNestedStructGroup);
600*35238bceSAndroid Build Coastguard Worker
601*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
602*35238bceSAndroid Build Coastguard Worker {
603*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
604*35238bceSAndroid Build Coastguard Worker singleNestedStructGroup->addChild(modeGroup);
605*35238bceSAndroid Build Coastguard Worker
606*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
607*35238bceSAndroid Build Coastguard Worker {
608*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
609*35238bceSAndroid Build Coastguard Worker {
610*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
611*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
612*35238bceSAndroid Build Coastguard Worker
613*35238bceSAndroid Build Coastguard Worker if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
614*35238bceSAndroid Build Coastguard Worker continue; // Doesn't make sense to add this variant.
615*35238bceSAndroid Build Coastguard Worker
616*35238bceSAndroid Build Coastguard Worker if (isArray)
617*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
618*35238bceSAndroid Build Coastguard Worker
619*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructCase(m_context, (baseName + "_vertex").c_str(), "",
620*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX,
621*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
622*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructCase(m_context, (baseName + "_fragment").c_str(), "",
623*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT,
624*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
625*35238bceSAndroid Build Coastguard Worker
626*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
627*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructCase(
628*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "", baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
629*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
630*35238bceSAndroid Build Coastguard Worker }
631*35238bceSAndroid Build Coastguard Worker }
632*35238bceSAndroid Build Coastguard Worker }
633*35238bceSAndroid Build Coastguard Worker }
634*35238bceSAndroid Build Coastguard Worker
635*35238bceSAndroid Build Coastguard Worker // ubo.single_nested_struct_mixed_matrix_packing
636*35238bceSAndroid Build Coastguard Worker {
637*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleNestedStructMixedMatrixPackingGroup =
638*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_nested_struct_mixed_matrix_packing",
639*35238bceSAndroid Build Coastguard Worker "Nested struct in one uniform block with a mixed matrix packing");
640*35238bceSAndroid Build Coastguard Worker addChild(singleNestedStructMixedMatrixPackingGroup);
641*35238bceSAndroid Build Coastguard Worker
642*35238bceSAndroid Build Coastguard Worker for (const auto &bufferMode : bufferModes)
643*35238bceSAndroid Build Coastguard Worker {
644*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferMode.name, "");
645*35238bceSAndroid Build Coastguard Worker singleNestedStructMixedMatrixPackingGroup->addChild(modeGroup);
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker for (const auto &layoutFlag : layoutFlags)
648*35238bceSAndroid Build Coastguard Worker for (const auto &blockMatrixFlag : matrixFlags)
649*35238bceSAndroid Build Coastguard Worker for (const auto &singleMatrixFlag : matrixFlags)
650*35238bceSAndroid Build Coastguard Worker for (const auto &arrayMatrixFlag : matrixFlags)
651*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
652*35238bceSAndroid Build Coastguard Worker {
653*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlag.name;
654*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlag.flags;
655*35238bceSAndroid Build Coastguard Worker uint32_t blockFlags = baseFlags | blockMatrixFlag.flags;
656*35238bceSAndroid Build Coastguard Worker
657*35238bceSAndroid Build Coastguard Worker baseName += std::string("_block_") + blockMatrixFlag.name;
658*35238bceSAndroid Build Coastguard Worker baseName += std::string("_matrix_") + singleMatrixFlag.name;
659*35238bceSAndroid Build Coastguard Worker baseName += std::string("_matrixarray_") + arrayMatrixFlag.name;
660*35238bceSAndroid Build Coastguard Worker
661*35238bceSAndroid Build Coastguard Worker if (bufferMode.mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
662*35238bceSAndroid Build Coastguard Worker continue; // Doesn't make sense to add this variant.
663*35238bceSAndroid Build Coastguard Worker
664*35238bceSAndroid Build Coastguard Worker if (isArray)
665*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
666*35238bceSAndroid Build Coastguard Worker
667*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(
668*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_vertex").c_str(), "", blockFlags | DECLARE_VERTEX,
669*35238bceSAndroid Build Coastguard Worker singleMatrixFlag.flags, arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
670*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(
671*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_fragment").c_str(), "", blockFlags | DECLARE_FRAGMENT,
672*35238bceSAndroid Build Coastguard Worker singleMatrixFlag.flags, arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
673*35238bceSAndroid Build Coastguard Worker
674*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
675*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(
676*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "",
677*35238bceSAndroid Build Coastguard Worker blockFlags | DECLARE_VERTEX | DECLARE_FRAGMENT, singleMatrixFlag.flags,
678*35238bceSAndroid Build Coastguard Worker arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
679*35238bceSAndroid Build Coastguard Worker }
680*35238bceSAndroid Build Coastguard Worker }
681*35238bceSAndroid Build Coastguard Worker }
682*35238bceSAndroid Build Coastguard Worker
683*35238bceSAndroid Build Coastguard Worker // ubo.single_nested_struct_array
684*35238bceSAndroid Build Coastguard Worker {
685*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *singleNestedStructArrayGroup =
686*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "single_nested_struct_array", "Nested struct array in one uniform block");
687*35238bceSAndroid Build Coastguard Worker addChild(singleNestedStructArrayGroup);
688*35238bceSAndroid Build Coastguard Worker
689*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
690*35238bceSAndroid Build Coastguard Worker {
691*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
692*35238bceSAndroid Build Coastguard Worker singleNestedStructArrayGroup->addChild(modeGroup);
693*35238bceSAndroid Build Coastguard Worker
694*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
697*35238bceSAndroid Build Coastguard Worker {
698*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
699*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker if (bufferModes[modeNdx].mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
702*35238bceSAndroid Build Coastguard Worker continue; // Doesn't make sense to add this variant.
703*35238bceSAndroid Build Coastguard Worker
704*35238bceSAndroid Build Coastguard Worker if (isArray)
705*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
706*35238bceSAndroid Build Coastguard Worker
707*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructArrayCase(
708*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_vertex").c_str(), "", baseFlags | DECLARE_VERTEX,
709*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
710*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructArrayCase(
711*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_fragment").c_str(), "", baseFlags | DECLARE_FRAGMENT,
712*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
713*35238bceSAndroid Build Coastguard Worker
714*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
715*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockSingleNestedStructArrayCase(
716*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "", baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
717*35238bceSAndroid Build Coastguard Worker bufferModes[modeNdx].mode, isArray ? 3 : 0));
718*35238bceSAndroid Build Coastguard Worker }
719*35238bceSAndroid Build Coastguard Worker }
720*35238bceSAndroid Build Coastguard Worker }
721*35238bceSAndroid Build Coastguard Worker }
722*35238bceSAndroid Build Coastguard Worker
723*35238bceSAndroid Build Coastguard Worker // ubo.instance_array_basic_type
724*35238bceSAndroid Build Coastguard Worker {
725*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *instanceArrayBasicTypeGroup =
726*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "instance_array_basic_type", "Single basic variable in instance array");
727*35238bceSAndroid Build Coastguard Worker addChild(instanceArrayBasicTypeGroup);
728*35238bceSAndroid Build Coastguard Worker
729*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
730*35238bceSAndroid Build Coastguard Worker {
731*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
732*35238bceSAndroid Build Coastguard Worker instanceArrayBasicTypeGroup->addChild(layoutGroup);
733*35238bceSAndroid Build Coastguard Worker
734*35238bceSAndroid Build Coastguard Worker for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
735*35238bceSAndroid Build Coastguard Worker {
736*35238bceSAndroid Build Coastguard Worker glu::DataType type = basicTypes[basicTypeNdx];
737*35238bceSAndroid Build Coastguard Worker const char *typeName = glu::getDataTypeName(type);
738*35238bceSAndroid Build Coastguard Worker const int numInstances = 3;
739*35238bceSAndroid Build Coastguard Worker
740*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(layoutGroup, m_context, typeName,
741*35238bceSAndroid Build Coastguard Worker VarType(type, glu::isDataTypeBoolOrBVec(type) ? 0 : PRECISION_HIGH),
742*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags, numInstances);
743*35238bceSAndroid Build Coastguard Worker
744*35238bceSAndroid Build Coastguard Worker if (glu::isDataTypeMatrix(type))
745*35238bceSAndroid Build Coastguard Worker {
746*35238bceSAndroid Build Coastguard Worker for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
747*35238bceSAndroid Build Coastguard Worker createBlockBasicTypeCases(
748*35238bceSAndroid Build Coastguard Worker layoutGroup, m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(),
749*35238bceSAndroid Build Coastguard Worker VarType(type, PRECISION_HIGH),
750*35238bceSAndroid Build Coastguard Worker layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, numInstances);
751*35238bceSAndroid Build Coastguard Worker }
752*35238bceSAndroid Build Coastguard Worker }
753*35238bceSAndroid Build Coastguard Worker }
754*35238bceSAndroid Build Coastguard Worker }
755*35238bceSAndroid Build Coastguard Worker
756*35238bceSAndroid Build Coastguard Worker // ubo.multi_basic_types
757*35238bceSAndroid Build Coastguard Worker {
758*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *multiBasicTypesGroup =
759*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "multi_basic_types", "Multiple buffers with basic types");
760*35238bceSAndroid Build Coastguard Worker addChild(multiBasicTypesGroup);
761*35238bceSAndroid Build Coastguard Worker
762*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
763*35238bceSAndroid Build Coastguard Worker {
764*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
765*35238bceSAndroid Build Coastguard Worker multiBasicTypesGroup->addChild(modeGroup);
766*35238bceSAndroid Build Coastguard Worker
767*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
768*35238bceSAndroid Build Coastguard Worker {
769*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
770*35238bceSAndroid Build Coastguard Worker {
771*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
772*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
773*35238bceSAndroid Build Coastguard Worker
774*35238bceSAndroid Build Coastguard Worker if (isArray)
775*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
776*35238bceSAndroid Build Coastguard Worker
777*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiBasicTypesCase(
778*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_vertex").c_str(), "", baseFlags | DECLARE_VERTEX,
779*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX, bufferModes[modeNdx].mode, isArray ? 3 : 0));
780*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiBasicTypesCase(
781*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_fragment").c_str(), "", baseFlags | DECLARE_FRAGMENT,
782*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
783*35238bceSAndroid Build Coastguard Worker
784*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
785*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiBasicTypesCase(
786*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "", baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
787*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
788*35238bceSAndroid Build Coastguard Worker
789*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiBasicTypesCase(
790*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_mixed").c_str(), "", baseFlags | DECLARE_VERTEX,
791*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
792*35238bceSAndroid Build Coastguard Worker }
793*35238bceSAndroid Build Coastguard Worker }
794*35238bceSAndroid Build Coastguard Worker }
795*35238bceSAndroid Build Coastguard Worker }
796*35238bceSAndroid Build Coastguard Worker
797*35238bceSAndroid Build Coastguard Worker // ubo.multi_nested_struct
798*35238bceSAndroid Build Coastguard Worker {
799*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *multiNestedStructGroup =
800*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "multi_nested_struct", "Multiple buffers with nested structs");
801*35238bceSAndroid Build Coastguard Worker addChild(multiNestedStructGroup);
802*35238bceSAndroid Build Coastguard Worker
803*35238bceSAndroid Build Coastguard Worker for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
804*35238bceSAndroid Build Coastguard Worker {
805*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
806*35238bceSAndroid Build Coastguard Worker multiNestedStructGroup->addChild(modeGroup);
807*35238bceSAndroid Build Coastguard Worker
808*35238bceSAndroid Build Coastguard Worker for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
809*35238bceSAndroid Build Coastguard Worker {
810*35238bceSAndroid Build Coastguard Worker for (int isArray = 0; isArray < 2; isArray++)
811*35238bceSAndroid Build Coastguard Worker {
812*35238bceSAndroid Build Coastguard Worker std::string baseName = layoutFlags[layoutFlagNdx].name;
813*35238bceSAndroid Build Coastguard Worker uint32_t baseFlags = layoutFlags[layoutFlagNdx].flags;
814*35238bceSAndroid Build Coastguard Worker
815*35238bceSAndroid Build Coastguard Worker if (isArray)
816*35238bceSAndroid Build Coastguard Worker baseName += "_instance_array";
817*35238bceSAndroid Build Coastguard Worker
818*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiNestedStructCase(
819*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_vertex").c_str(), "", baseFlags | DECLARE_VERTEX,
820*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX, bufferModes[modeNdx].mode, isArray ? 3 : 0));
821*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiNestedStructCase(
822*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_fragment").c_str(), "", baseFlags | DECLARE_FRAGMENT,
823*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
824*35238bceSAndroid Build Coastguard Worker
825*35238bceSAndroid Build Coastguard Worker if (!(baseFlags & LAYOUT_PACKED))
826*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiNestedStructCase(
827*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_both").c_str(), "", baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT,
828*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_VERTEX | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
829*35238bceSAndroid Build Coastguard Worker
830*35238bceSAndroid Build Coastguard Worker modeGroup->addChild(new BlockMultiNestedStructCase(
831*35238bceSAndroid Build Coastguard Worker m_context, (baseName + "_mixed").c_str(), "", baseFlags | DECLARE_VERTEX,
832*35238bceSAndroid Build Coastguard Worker baseFlags | DECLARE_FRAGMENT, bufferModes[modeNdx].mode, isArray ? 3 : 0));
833*35238bceSAndroid Build Coastguard Worker }
834*35238bceSAndroid Build Coastguard Worker }
835*35238bceSAndroid Build Coastguard Worker }
836*35238bceSAndroid Build Coastguard Worker }
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker // ubo.random
839*35238bceSAndroid Build Coastguard Worker {
840*35238bceSAndroid Build Coastguard Worker const uint32_t allShaders = FEATURE_VERTEX_BLOCKS | FEATURE_FRAGMENT_BLOCKS | FEATURE_SHARED_BLOCKS;
841*35238bceSAndroid Build Coastguard Worker const uint32_t allLayouts = FEATURE_PACKED_LAYOUT | FEATURE_SHARED_LAYOUT | FEATURE_STD140_LAYOUT;
842*35238bceSAndroid Build Coastguard Worker const uint32_t allBasicTypes = FEATURE_VECTORS | FEATURE_MATRICES;
843*35238bceSAndroid Build Coastguard Worker const uint32_t unused = FEATURE_UNUSED_MEMBERS | FEATURE_UNUSED_UNIFORMS;
844*35238bceSAndroid Build Coastguard Worker const uint32_t matFlags = FEATURE_MATRIX_LAYOUT;
845*35238bceSAndroid Build Coastguard Worker const uint32_t allFeatures = ~FEATURE_ARRAYS_OF_ARRAYS;
846*35238bceSAndroid Build Coastguard Worker
847*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases");
848*35238bceSAndroid Build Coastguard Worker addChild(randomGroup);
849*35238bceSAndroid Build Coastguard Worker
850*35238bceSAndroid Build Coastguard Worker // Basic types.
851*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "scalar_types", "Scalar types only, per-block buffers",
852*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK, allShaders | allLayouts | unused, 25, 0);
853*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "vector_types", "Scalar and vector types only, per-block buffers",
854*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
855*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | FEATURE_VECTORS, 25, 25);
856*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "basic_types", "All basic types, per-block buffers",
857*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
858*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags, 25, 50);
859*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "basic_arrays", "Arrays, per-block buffers",
860*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
861*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_ARRAYS, 25, 50);
862*35238bceSAndroid Build Coastguard Worker
863*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "basic_instance_arrays",
864*35238bceSAndroid Build Coastguard Worker "Basic instance arrays, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK,
865*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_INSTANCE_ARRAYS, 25,
866*35238bceSAndroid Build Coastguard Worker 75);
867*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "nested_structs", "Nested structs, per-block buffers",
868*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
869*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_STRUCTS, 25, 100);
870*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(
871*35238bceSAndroid Build Coastguard Worker randomGroup, m_context, "nested_structs_arrays", "Nested structs, arrays, per-block buffers",
872*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
873*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_STRUCTS | FEATURE_ARRAYS, 25, 150);
874*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(
875*35238bceSAndroid Build Coastguard Worker randomGroup, m_context, "nested_structs_instance_arrays",
876*35238bceSAndroid Build Coastguard Worker "Nested structs, instance arrays, per-block buffers", UniformBlockCase::BUFFERMODE_PER_BLOCK,
877*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_STRUCTS | FEATURE_INSTANCE_ARRAYS, 25,
878*35238bceSAndroid Build Coastguard Worker 125);
879*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "nested_structs_arrays_instance_arrays",
880*35238bceSAndroid Build Coastguard Worker "Nested structs, instance arrays, per-block buffers",
881*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK,
882*35238bceSAndroid Build Coastguard Worker allShaders | allLayouts | unused | allBasicTypes | matFlags | FEATURE_STRUCTS |
883*35238bceSAndroid Build Coastguard Worker FEATURE_ARRAYS | FEATURE_INSTANCE_ARRAYS,
884*35238bceSAndroid Build Coastguard Worker 25, 175);
885*35238bceSAndroid Build Coastguard Worker
886*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers", "All random features, per-block buffers",
887*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_PER_BLOCK, allFeatures, 50, 200);
888*35238bceSAndroid Build Coastguard Worker createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer", "All random features, shared buffer",
889*35238bceSAndroid Build Coastguard Worker UniformBlockCase::BUFFERMODE_SINGLE, allFeatures, 50, 250);
890*35238bceSAndroid Build Coastguard Worker }
891*35238bceSAndroid Build Coastguard Worker }
892*35238bceSAndroid Build Coastguard Worker
893*35238bceSAndroid Build Coastguard Worker } // namespace Functional
894*35238bceSAndroid Build Coastguard Worker } // namespace gles3
895*35238bceSAndroid Build Coastguard Worker } // namespace deqp
896