xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fUniformBlockTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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