xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fSSBOLayoutTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.1 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 SSBO layout tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fSSBOLayoutTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es31fSSBOLayoutCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deString.h"
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 gles31
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 namespace bb;
42*35238bceSAndroid Build Coastguard Worker using glu::StructType;
43*35238bceSAndroid Build Coastguard Worker using glu::VarType;
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker namespace
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker enum FeatureBits
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker     FEATURE_VECTORS          = (1 << 0),
51*35238bceSAndroid Build Coastguard Worker     FEATURE_MATRICES         = (1 << 1),
52*35238bceSAndroid Build Coastguard Worker     FEATURE_ARRAYS           = (1 << 2),
53*35238bceSAndroid Build Coastguard Worker     FEATURE_STRUCTS          = (1 << 3),
54*35238bceSAndroid Build Coastguard Worker     FEATURE_NESTED_STRUCTS   = (1 << 4),
55*35238bceSAndroid Build Coastguard Worker     FEATURE_INSTANCE_ARRAYS  = (1 << 5),
56*35238bceSAndroid Build Coastguard Worker     FEATURE_UNUSED_VARS      = (1 << 6),
57*35238bceSAndroid Build Coastguard Worker     FEATURE_UNUSED_MEMBERS   = (1 << 7),
58*35238bceSAndroid Build Coastguard Worker     FEATURE_PACKED_LAYOUT    = (1 << 8),
59*35238bceSAndroid Build Coastguard Worker     FEATURE_SHARED_LAYOUT    = (1 << 9),
60*35238bceSAndroid Build Coastguard Worker     FEATURE_STD140_LAYOUT    = (1 << 10),
61*35238bceSAndroid Build Coastguard Worker     FEATURE_STD430_LAYOUT    = (1 << 11),
62*35238bceSAndroid Build Coastguard Worker     FEATURE_MATRIX_LAYOUT    = (1 << 12), //!< Matrix layout flags.
63*35238bceSAndroid Build Coastguard Worker     FEATURE_UNSIZED_ARRAYS   = (1 << 13),
64*35238bceSAndroid Build Coastguard Worker     FEATURE_ARRAYS_OF_ARRAYS = (1 << 14)
65*35238bceSAndroid Build Coastguard Worker };
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker class RandomSSBOLayoutCase : public SSBOLayoutCase
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker public:
70*35238bceSAndroid Build Coastguard Worker     RandomSSBOLayoutCase(Context &context, const char *name, const char *description, BufferMode bufferMode,
71*35238bceSAndroid Build Coastguard Worker                          uint32_t features, uint32_t seed);
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker     void init(void);
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker private:
76*35238bceSAndroid Build Coastguard Worker     void generateBlock(de::Random &rnd, uint32_t layoutFlags);
77*35238bceSAndroid Build Coastguard Worker     void generateBufferVar(de::Random &rnd, BufferBlock &block, bool isLastMember);
78*35238bceSAndroid Build Coastguard Worker     glu::VarType generateType(de::Random &rnd, int structDepth, int arrayDepth, bool arrayOk, bool unusedArrayOk);
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker     uint32_t m_features;
81*35238bceSAndroid Build Coastguard Worker     int m_maxBlocks;
82*35238bceSAndroid Build Coastguard Worker     int m_maxInstances;
83*35238bceSAndroid Build Coastguard Worker     int m_maxArrayLength;
84*35238bceSAndroid Build Coastguard Worker     int m_maxArrayDepth;
85*35238bceSAndroid Build Coastguard Worker     int m_maxStructDepth;
86*35238bceSAndroid Build Coastguard Worker     int m_maxBlockMembers;
87*35238bceSAndroid Build Coastguard Worker     int m_maxStructMembers;
88*35238bceSAndroid Build Coastguard Worker     uint32_t m_seed;
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker     int m_blockNdx;
91*35238bceSAndroid Build Coastguard Worker     int m_bufferVarNdx;
92*35238bceSAndroid Build Coastguard Worker     int m_structNdx;
93*35238bceSAndroid Build Coastguard Worker };
94*35238bceSAndroid Build Coastguard Worker 
RandomSSBOLayoutCase(Context & context,const char * name,const char * description,BufferMode bufferMode,uint32_t features,uint32_t seed)95*35238bceSAndroid Build Coastguard Worker RandomSSBOLayoutCase::RandomSSBOLayoutCase(Context &context, const char *name, const char *description,
96*35238bceSAndroid Build Coastguard Worker                                            BufferMode bufferMode, uint32_t features, uint32_t seed)
97*35238bceSAndroid Build Coastguard Worker     : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_310_ES,
98*35238bceSAndroid Build Coastguard Worker                      bufferMode)
99*35238bceSAndroid Build Coastguard Worker     , m_features(features)
100*35238bceSAndroid Build Coastguard Worker     , m_maxBlocks(3)
101*35238bceSAndroid Build Coastguard Worker     , m_maxInstances((features & FEATURE_INSTANCE_ARRAYS) ? 3 : 0)
102*35238bceSAndroid Build Coastguard Worker     , m_maxArrayLength((features & FEATURE_ARRAYS) ? 8 : 0)
103*35238bceSAndroid Build Coastguard Worker     , m_maxArrayDepth((features & FEATURE_ARRAYS_OF_ARRAYS) ? 2 : 0)
104*35238bceSAndroid Build Coastguard Worker     , m_maxStructDepth((features & FEATURE_STRUCTS) ? 2 : 0)
105*35238bceSAndroid Build Coastguard Worker     , m_maxBlockMembers(4)
106*35238bceSAndroid Build Coastguard Worker     , m_maxStructMembers(4)
107*35238bceSAndroid Build Coastguard Worker     , m_seed(seed)
108*35238bceSAndroid Build Coastguard Worker     , m_blockNdx(1)
109*35238bceSAndroid Build Coastguard Worker     , m_bufferVarNdx(1)
110*35238bceSAndroid Build Coastguard Worker     , m_structNdx(1)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker }
113*35238bceSAndroid Build Coastguard Worker 
init(void)114*35238bceSAndroid Build Coastguard Worker void RandomSSBOLayoutCase::init(void)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker     de::Random rnd(m_seed);
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker     const int numBlocks = rnd.getInt(1, m_maxBlocks);
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < numBlocks; ndx++)
121*35238bceSAndroid Build Coastguard Worker         generateBlock(rnd, 0);
122*35238bceSAndroid Build Coastguard Worker }
123*35238bceSAndroid Build Coastguard Worker 
generateBlock(de::Random & rnd,uint32_t layoutFlags)124*35238bceSAndroid Build Coastguard Worker void RandomSSBOLayoutCase::generateBlock(de::Random &rnd, uint32_t layoutFlags)
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_blockNdx <= 'z' - 'a');
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     const float instanceArrayWeight = 0.3f;
129*35238bceSAndroid Build Coastguard Worker     BufferBlock &block              = m_interface.allocBlock((string("Block") + (char)('A' + m_blockNdx)).c_str());
130*35238bceSAndroid Build Coastguard Worker     int numInstances = (m_maxInstances > 0 && rnd.getFloat() < instanceArrayWeight) ? rnd.getInt(0, m_maxInstances) : 0;
131*35238bceSAndroid Build Coastguard Worker     int numVars      = rnd.getInt(1, m_maxBlockMembers);
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     if (numInstances > 0)
134*35238bceSAndroid Build Coastguard Worker         block.setArraySize(numInstances);
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     if (numInstances > 0 || rnd.getBool())
137*35238bceSAndroid Build Coastguard Worker         block.setInstanceName((string("block") + (char)('A' + m_blockNdx)).c_str());
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker     // Layout flag candidates.
140*35238bceSAndroid Build Coastguard Worker     vector<uint32_t> layoutFlagCandidates;
141*35238bceSAndroid Build Coastguard Worker     layoutFlagCandidates.push_back(0);
142*35238bceSAndroid Build Coastguard Worker     if (m_features & FEATURE_PACKED_LAYOUT)
143*35238bceSAndroid Build Coastguard Worker         layoutFlagCandidates.push_back(LAYOUT_PACKED);
144*35238bceSAndroid Build Coastguard Worker     if ((m_features & FEATURE_SHARED_LAYOUT))
145*35238bceSAndroid Build Coastguard Worker         layoutFlagCandidates.push_back(LAYOUT_SHARED);
146*35238bceSAndroid Build Coastguard Worker     if (m_features & FEATURE_STD140_LAYOUT)
147*35238bceSAndroid Build Coastguard Worker         layoutFlagCandidates.push_back(LAYOUT_STD140);
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker     layoutFlags |= rnd.choose<uint32_t>(layoutFlagCandidates.begin(), layoutFlagCandidates.end());
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     if (m_features & FEATURE_MATRIX_LAYOUT)
152*35238bceSAndroid Build Coastguard Worker     {
153*35238bceSAndroid Build Coastguard Worker         static const uint32_t matrixCandidates[] = {0, LAYOUT_ROW_MAJOR, LAYOUT_COLUMN_MAJOR};
154*35238bceSAndroid Build Coastguard Worker         layoutFlags |=
155*35238bceSAndroid Build Coastguard Worker             rnd.choose<uint32_t>(&matrixCandidates[0], &matrixCandidates[DE_LENGTH_OF_ARRAY(matrixCandidates)]);
156*35238bceSAndroid Build Coastguard Worker     }
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker     block.setFlags(layoutFlags);
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < numVars; ndx++)
161*35238bceSAndroid Build Coastguard Worker         generateBufferVar(rnd, block, (ndx + 1 == numVars));
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     if (numVars > 0)
164*35238bceSAndroid Build Coastguard Worker     {
165*35238bceSAndroid Build Coastguard Worker         const BufferVar &lastVar     = *(block.end() - 1);
166*35238bceSAndroid Build Coastguard Worker         const glu::VarType &lastType = lastVar.getType();
167*35238bceSAndroid Build Coastguard Worker         const bool isUnsizedArr = lastType.isArrayType() && (lastType.getArraySize() == glu::VarType::UNSIZED_ARRAY);
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker         if (isUnsizedArr)
170*35238bceSAndroid Build Coastguard Worker         {
171*35238bceSAndroid Build Coastguard Worker             for (int instanceNdx = 0; instanceNdx < (numInstances ? numInstances : 1); instanceNdx++)
172*35238bceSAndroid Build Coastguard Worker             {
173*35238bceSAndroid Build Coastguard Worker                 const int arrSize = rnd.getInt(0, m_maxArrayLength);
174*35238bceSAndroid Build Coastguard Worker                 block.setLastUnsizedArraySize(instanceNdx, arrSize);
175*35238bceSAndroid Build Coastguard Worker             }
176*35238bceSAndroid Build Coastguard Worker         }
177*35238bceSAndroid Build Coastguard Worker     }
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker     m_blockNdx += 1;
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker 
genName(char first,char last,int ndx)182*35238bceSAndroid Build Coastguard Worker static std::string genName(char first, char last, int ndx)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker     std::string str = "";
185*35238bceSAndroid Build Coastguard Worker     int alphabetLen = last - first + 1;
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     while (ndx > alphabetLen)
188*35238bceSAndroid Build Coastguard Worker     {
189*35238bceSAndroid Build Coastguard Worker         str.insert(str.begin(), (char)(first + ((ndx - 1) % alphabetLen)));
190*35238bceSAndroid Build Coastguard Worker         ndx = ((ndx - 1) / alphabetLen);
191*35238bceSAndroid Build Coastguard Worker     }
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker     str.insert(str.begin(), (char)(first + (ndx % (alphabetLen + 1)) - 1));
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker     return str;
196*35238bceSAndroid Build Coastguard Worker }
197*35238bceSAndroid Build Coastguard Worker 
generateBufferVar(de::Random & rnd,BufferBlock & block,bool isLastMember)198*35238bceSAndroid Build Coastguard Worker void RandomSSBOLayoutCase::generateBufferVar(de::Random &rnd, BufferBlock &block, bool isLastMember)
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker     const float readWeight   = 0.7f;
201*35238bceSAndroid Build Coastguard Worker     const float writeWeight  = 0.7f;
202*35238bceSAndroid Build Coastguard Worker     const float accessWeight = 0.85f;
203*35238bceSAndroid Build Coastguard Worker     const bool unusedOk      = (m_features & FEATURE_UNUSED_VARS) != 0;
204*35238bceSAndroid Build Coastguard Worker     const std::string name   = genName('a', 'z', m_bufferVarNdx);
205*35238bceSAndroid Build Coastguard Worker     const glu::VarType type  = generateType(rnd, 0, 0, true, isLastMember && (m_features & FEATURE_UNSIZED_ARRAYS));
206*35238bceSAndroid Build Coastguard Worker     const bool access        = !unusedOk || (rnd.getFloat() < accessWeight);
207*35238bceSAndroid Build Coastguard Worker     const bool read          = access ? (rnd.getFloat() < readWeight) : false;
208*35238bceSAndroid Build Coastguard Worker     const bool write         = access ? (!read || (rnd.getFloat() < writeWeight)) : false;
209*35238bceSAndroid Build Coastguard Worker     const uint32_t flags     = (read ? ACCESS_READ : 0) | (write ? ACCESS_WRITE : 0);
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     block.addMember(BufferVar(name.c_str(), type, flags));
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker     m_bufferVarNdx += 1;
214*35238bceSAndroid Build Coastguard Worker }
215*35238bceSAndroid Build Coastguard Worker 
generateType(de::Random & rnd,int structDepth,int arrayDepth,bool arrayOk,bool unsizedArrayOk)216*35238bceSAndroid Build Coastguard Worker glu::VarType RandomSSBOLayoutCase::generateType(de::Random &rnd, int structDepth, int arrayDepth, bool arrayOk,
217*35238bceSAndroid Build Coastguard Worker                                                 bool unsizedArrayOk)
218*35238bceSAndroid Build Coastguard Worker {
219*35238bceSAndroid Build Coastguard Worker     const float structWeight       = 0.1f;
220*35238bceSAndroid Build Coastguard Worker     const float arrayWeight        = 0.1f;
221*35238bceSAndroid Build Coastguard Worker     const float unsizedArrayWeight = 0.8f;
222*35238bceSAndroid Build Coastguard Worker 
223*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(arrayOk || !unsizedArrayOk);
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker     if (unsizedArrayOk && (rnd.getFloat() < unsizedArrayWeight))
226*35238bceSAndroid Build Coastguard Worker     {
227*35238bceSAndroid Build Coastguard Worker         const bool childArrayOk = ((m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0) && (arrayDepth < m_maxArrayDepth);
228*35238bceSAndroid Build Coastguard Worker         const glu::VarType elementType = generateType(rnd, structDepth, arrayDepth + 1, childArrayOk, false);
229*35238bceSAndroid Build Coastguard Worker         return glu::VarType(elementType, glu::VarType::UNSIZED_ARRAY);
230*35238bceSAndroid Build Coastguard Worker     }
231*35238bceSAndroid Build Coastguard Worker     else if (structDepth < m_maxStructDepth && rnd.getFloat() < structWeight)
232*35238bceSAndroid Build Coastguard Worker     {
233*35238bceSAndroid Build Coastguard Worker         // \todo [2013-10-14 pyry] Implement unused flags for members!
234*35238bceSAndroid Build Coastguard Worker         // bool unusedOk = (m_features & FEATURE_UNUSED_MEMBERS) != 0;
235*35238bceSAndroid Build Coastguard Worker         vector<glu::VarType> memberTypes;
236*35238bceSAndroid Build Coastguard Worker         int numMembers = rnd.getInt(1, m_maxStructMembers);
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker         // Generate members first so nested struct declarations are in correct order.
239*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < numMembers; ndx++)
240*35238bceSAndroid Build Coastguard Worker             memberTypes.push_back(
241*35238bceSAndroid Build Coastguard Worker                 generateType(rnd, structDepth + 1, arrayDepth, (arrayDepth < m_maxArrayDepth), false));
242*35238bceSAndroid Build Coastguard Worker 
243*35238bceSAndroid Build Coastguard Worker         glu::StructType &structType = m_interface.allocStruct((string("s") + genName('A', 'Z', m_structNdx)).c_str());
244*35238bceSAndroid Build Coastguard Worker         m_structNdx += 1;
245*35238bceSAndroid Build Coastguard Worker 
246*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(numMembers <= 'Z' - 'A');
247*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < numMembers; ndx++)
248*35238bceSAndroid Build Coastguard Worker         {
249*35238bceSAndroid Build Coastguard Worker             structType.addMember((string("m") + (char)('A' + ndx)).c_str(), memberTypes[ndx]);
250*35238bceSAndroid Build Coastguard Worker         }
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker         return glu::VarType(&structType);
253*35238bceSAndroid Build Coastguard Worker     }
254*35238bceSAndroid Build Coastguard Worker     else if (m_maxArrayLength > 0 && arrayOk && rnd.getFloat() < arrayWeight)
255*35238bceSAndroid Build Coastguard Worker     {
256*35238bceSAndroid Build Coastguard Worker         const int arrayLength   = rnd.getInt(1, m_maxArrayLength);
257*35238bceSAndroid Build Coastguard Worker         const bool childArrayOk = ((m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0) && (arrayDepth < m_maxArrayDepth);
258*35238bceSAndroid Build Coastguard Worker         const glu::VarType elementType = generateType(rnd, structDepth, arrayDepth + 1, childArrayOk, false);
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker         return glu::VarType(elementType, arrayLength);
261*35238bceSAndroid Build Coastguard Worker     }
262*35238bceSAndroid Build Coastguard Worker     else
263*35238bceSAndroid Build Coastguard Worker     {
264*35238bceSAndroid Build Coastguard Worker         vector<glu::DataType> typeCandidates;
265*35238bceSAndroid Build Coastguard Worker 
266*35238bceSAndroid Build Coastguard Worker         typeCandidates.push_back(glu::TYPE_FLOAT);
267*35238bceSAndroid Build Coastguard Worker         typeCandidates.push_back(glu::TYPE_INT);
268*35238bceSAndroid Build Coastguard Worker         typeCandidates.push_back(glu::TYPE_UINT);
269*35238bceSAndroid Build Coastguard Worker         typeCandidates.push_back(glu::TYPE_BOOL);
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker         if (m_features & FEATURE_VECTORS)
272*35238bceSAndroid Build Coastguard Worker         {
273*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_VEC2);
274*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_VEC3);
275*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_VEC4);
276*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_INT_VEC2);
277*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_INT_VEC3);
278*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_INT_VEC4);
279*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_UINT_VEC2);
280*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_UINT_VEC3);
281*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_UINT_VEC4);
282*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_BOOL_VEC2);
283*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_BOOL_VEC3);
284*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_BOOL_VEC4);
285*35238bceSAndroid Build Coastguard Worker         }
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker         if (m_features & FEATURE_MATRICES)
288*35238bceSAndroid Build Coastguard Worker         {
289*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT2);
290*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT2X3);
291*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT3X2);
292*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT3);
293*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT3X4);
294*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT4X2);
295*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT4X3);
296*35238bceSAndroid Build Coastguard Worker             typeCandidates.push_back(glu::TYPE_FLOAT_MAT4);
297*35238bceSAndroid Build Coastguard Worker         }
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker         glu::DataType type = rnd.choose<glu::DataType>(typeCandidates.begin(), typeCandidates.end());
300*35238bceSAndroid Build Coastguard Worker         glu::Precision precision;
301*35238bceSAndroid Build Coastguard Worker 
302*35238bceSAndroid Build Coastguard Worker         if (!glu::isDataTypeBoolOrBVec(type))
303*35238bceSAndroid Build Coastguard Worker         {
304*35238bceSAndroid Build Coastguard Worker             // Precision.
305*35238bceSAndroid Build Coastguard Worker             static const glu::Precision precisionCandidates[] = {glu::PRECISION_LOWP, glu::PRECISION_MEDIUMP,
306*35238bceSAndroid Build Coastguard Worker                                                                  glu::PRECISION_HIGHP};
307*35238bceSAndroid Build Coastguard Worker             precision                                         = rnd.choose<glu::Precision>(&precisionCandidates[0],
308*35238bceSAndroid Build Coastguard Worker                                                    &precisionCandidates[DE_LENGTH_OF_ARRAY(precisionCandidates)]);
309*35238bceSAndroid Build Coastguard Worker         }
310*35238bceSAndroid Build Coastguard Worker         else
311*35238bceSAndroid Build Coastguard Worker             precision = glu::PRECISION_LAST;
312*35238bceSAndroid Build Coastguard Worker 
313*35238bceSAndroid Build Coastguard Worker         return glu::VarType(type, precision);
314*35238bceSAndroid Build Coastguard Worker     }
315*35238bceSAndroid Build Coastguard Worker }
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker class BlockBasicTypeCase : public SSBOLayoutCase
318*35238bceSAndroid Build Coastguard Worker {
319*35238bceSAndroid Build Coastguard Worker public:
BlockBasicTypeCase(Context & context,const char * name,const char * description,const VarType & type,uint32_t layoutFlags,int numInstances)320*35238bceSAndroid Build Coastguard Worker     BlockBasicTypeCase(Context &context, const char *name, const char *description, const VarType &type,
321*35238bceSAndroid Build Coastguard Worker                        uint32_t layoutFlags, int numInstances)
322*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
323*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK)
324*35238bceSAndroid Build Coastguard Worker     {
325*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
326*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("var", type, ACCESS_READ | ACCESS_WRITE));
327*35238bceSAndroid Build Coastguard Worker         block.setFlags(layoutFlags);
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker         if (numInstances > 0)
330*35238bceSAndroid Build Coastguard Worker         {
331*35238bceSAndroid Build Coastguard Worker             block.setArraySize(numInstances);
332*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
333*35238bceSAndroid Build Coastguard Worker         }
334*35238bceSAndroid Build Coastguard Worker     }
335*35238bceSAndroid Build Coastguard Worker };
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker class BlockBasicUnsizedArrayCase : public SSBOLayoutCase
338*35238bceSAndroid Build Coastguard Worker {
339*35238bceSAndroid Build Coastguard Worker public:
BlockBasicUnsizedArrayCase(Context & context,const char * name,const char * description,const VarType & elementType,int arraySize,uint32_t layoutFlags)340*35238bceSAndroid Build Coastguard Worker     BlockBasicUnsizedArrayCase(Context &context, const char *name, const char *description, const VarType &elementType,
341*35238bceSAndroid Build Coastguard Worker                                int arraySize, uint32_t layoutFlags)
342*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
343*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, BUFFERMODE_PER_BLOCK)
344*35238bceSAndroid Build Coastguard Worker     {
345*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
346*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("var", VarType(elementType, VarType::UNSIZED_ARRAY), ACCESS_READ | ACCESS_WRITE));
347*35238bceSAndroid Build Coastguard Worker         block.setFlags(layoutFlags);
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker         block.setLastUnsizedArraySize(0, arraySize);
350*35238bceSAndroid Build Coastguard Worker     }
351*35238bceSAndroid Build Coastguard Worker };
352*35238bceSAndroid Build Coastguard Worker 
createRandomCaseGroup(tcu::TestCaseGroup * parentGroup,Context & context,const char * groupName,const char * description,SSBOLayoutCase::BufferMode bufferMode,uint32_t features,int numCases,uint32_t baseSeed)353*35238bceSAndroid Build Coastguard Worker static void createRandomCaseGroup(tcu::TestCaseGroup *parentGroup, Context &context, const char *groupName,
354*35238bceSAndroid Build Coastguard Worker                                   const char *description, SSBOLayoutCase::BufferMode bufferMode, uint32_t features,
355*35238bceSAndroid Build Coastguard Worker                                   int numCases, uint32_t baseSeed)
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *group = new tcu::TestCaseGroup(context.getTestContext(), groupName, description);
358*35238bceSAndroid Build Coastguard Worker     parentGroup->addChild(group);
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker     baseSeed += (uint32_t)context.getTestContext().getCommandLine().getBaseSeed();
361*35238bceSAndroid Build Coastguard Worker 
362*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < numCases; ndx++)
363*35238bceSAndroid Build Coastguard Worker         group->addChild(new RandomSSBOLayoutCase(context, de::toString(ndx).c_str(), "", bufferMode, features,
364*35238bceSAndroid Build Coastguard Worker                                                  (uint32_t)ndx + baseSeed));
365*35238bceSAndroid Build Coastguard Worker }
366*35238bceSAndroid Build Coastguard Worker 
367*35238bceSAndroid Build Coastguard Worker class BlockSingleStructCase : public SSBOLayoutCase
368*35238bceSAndroid Build Coastguard Worker {
369*35238bceSAndroid Build Coastguard Worker public:
BlockSingleStructCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)370*35238bceSAndroid Build Coastguard Worker     BlockSingleStructCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
371*35238bceSAndroid Build Coastguard Worker                           BufferMode bufferMode, int numInstances)
372*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
373*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
374*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
375*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
376*35238bceSAndroid Build Coastguard Worker     {
377*35238bceSAndroid Build Coastguard Worker     }
378*35238bceSAndroid Build Coastguard Worker 
init(void)379*35238bceSAndroid Build Coastguard Worker     void init(void)
380*35238bceSAndroid Build Coastguard Worker     {
381*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
382*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, glu::PRECISION_HIGHP)); // \todo [pyry] First member is unused.
383*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP), 4));
384*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP));
385*35238bceSAndroid Build Coastguard Worker 
386*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
387*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(&typeS), ACCESS_READ | ACCESS_WRITE));
388*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
391*35238bceSAndroid Build Coastguard Worker         {
392*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
393*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
394*35238bceSAndroid Build Coastguard Worker         }
395*35238bceSAndroid Build Coastguard Worker     }
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker private:
398*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
399*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
400*35238bceSAndroid Build Coastguard Worker };
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker class BlockSingleStructArrayCase : public SSBOLayoutCase
403*35238bceSAndroid Build Coastguard Worker {
404*35238bceSAndroid Build Coastguard Worker public:
BlockSingleStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)405*35238bceSAndroid Build Coastguard Worker     BlockSingleStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
406*35238bceSAndroid Build Coastguard Worker                                BufferMode bufferMode, int numInstances)
407*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
408*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
409*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
410*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
411*35238bceSAndroid Build Coastguard Worker     {
412*35238bceSAndroid Build Coastguard Worker     }
413*35238bceSAndroid Build Coastguard Worker 
init(void)414*35238bceSAndroid Build Coastguard Worker     void init(void)
415*35238bceSAndroid Build Coastguard Worker     {
416*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
417*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, glu::PRECISION_HIGHP)); // \todo [pyry] UNUSED
418*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP), 4));
419*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP));
420*35238bceSAndroid Build Coastguard Worker 
421*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
422*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_UINT, glu::PRECISION_LOWP), 0 /* no access */));
423*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(VarType(&typeS), 3), ACCESS_READ | ACCESS_WRITE));
424*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_MEDIUMP), ACCESS_WRITE));
425*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
428*35238bceSAndroid Build Coastguard Worker         {
429*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
430*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
431*35238bceSAndroid Build Coastguard Worker         }
432*35238bceSAndroid Build Coastguard Worker     }
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker private:
435*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
436*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
437*35238bceSAndroid Build Coastguard Worker };
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker class BlockSingleNestedStructCase : public SSBOLayoutCase
440*35238bceSAndroid Build Coastguard Worker {
441*35238bceSAndroid Build Coastguard Worker public:
BlockSingleNestedStructCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)442*35238bceSAndroid Build Coastguard Worker     BlockSingleNestedStructCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
443*35238bceSAndroid Build Coastguard Worker                                 BufferMode bufferMode, int numInstances)
444*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
445*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
446*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
447*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
448*35238bceSAndroid Build Coastguard Worker     {
449*35238bceSAndroid Build Coastguard Worker     }
450*35238bceSAndroid Build Coastguard Worker 
init(void)451*35238bceSAndroid Build Coastguard Worker     void init(void)
452*35238bceSAndroid Build Coastguard Worker     {
453*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
454*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, glu::PRECISION_HIGHP));
455*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP), 4));
456*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP)); // \todo [pyry] UNUSED
457*35238bceSAndroid Build Coastguard Worker 
458*35238bceSAndroid Build Coastguard Worker         StructType &typeT = m_interface.allocStruct("T");
459*35238bceSAndroid Build Coastguard Worker         typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP));
460*35238bceSAndroid Build Coastguard Worker         typeT.addMember("b", VarType(&typeS));
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
463*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(&typeS), ACCESS_READ));
464*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_FLOAT_VEC2, glu::PRECISION_LOWP), 0 /* no access */));
465*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("t", VarType(&typeT), ACCESS_READ | ACCESS_WRITE));
466*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_UINT, glu::PRECISION_HIGHP), ACCESS_WRITE));
467*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
470*35238bceSAndroid Build Coastguard Worker         {
471*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
472*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
473*35238bceSAndroid Build Coastguard Worker         }
474*35238bceSAndroid Build Coastguard Worker     }
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker private:
477*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
478*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
479*35238bceSAndroid Build Coastguard Worker };
480*35238bceSAndroid Build Coastguard Worker 
481*35238bceSAndroid Build Coastguard Worker class BlockSingleNestedStructArrayCase : public SSBOLayoutCase
482*35238bceSAndroid Build Coastguard Worker {
483*35238bceSAndroid Build Coastguard Worker public:
BlockSingleNestedStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)484*35238bceSAndroid Build Coastguard Worker     BlockSingleNestedStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
485*35238bceSAndroid Build Coastguard Worker                                      BufferMode bufferMode, int numInstances)
486*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
487*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
488*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
489*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
490*35238bceSAndroid Build Coastguard Worker     {
491*35238bceSAndroid Build Coastguard Worker     }
492*35238bceSAndroid Build Coastguard Worker 
init(void)493*35238bceSAndroid Build Coastguard Worker     void init(void)
494*35238bceSAndroid Build Coastguard Worker     {
495*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
496*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, glu::PRECISION_HIGHP));
497*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_INT_VEC2, glu::PRECISION_MEDIUMP), 4));
498*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP)); // \todo [pyry] UNUSED
499*35238bceSAndroid Build Coastguard Worker 
500*35238bceSAndroid Build Coastguard Worker         StructType &typeT = m_interface.allocStruct("T");
501*35238bceSAndroid Build Coastguard Worker         typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP));
502*35238bceSAndroid Build Coastguard Worker         typeT.addMember("b", VarType(VarType(&typeS), 3));
503*35238bceSAndroid Build Coastguard Worker 
504*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
505*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(&typeS), ACCESS_WRITE));
506*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_FLOAT_VEC2, glu::PRECISION_LOWP), 0 /* no access */));
507*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("t", VarType(VarType(&typeT), 2), ACCESS_READ));
508*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_UINT, glu::PRECISION_HIGHP), ACCESS_READ | ACCESS_WRITE));
509*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
510*35238bceSAndroid Build Coastguard Worker 
511*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
512*35238bceSAndroid Build Coastguard Worker         {
513*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
514*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
515*35238bceSAndroid Build Coastguard Worker         }
516*35238bceSAndroid Build Coastguard Worker     }
517*35238bceSAndroid Build Coastguard Worker 
518*35238bceSAndroid Build Coastguard Worker private:
519*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
520*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
521*35238bceSAndroid Build Coastguard Worker };
522*35238bceSAndroid Build Coastguard Worker 
523*35238bceSAndroid Build Coastguard Worker class BlockUnsizedStructArrayCase : public SSBOLayoutCase
524*35238bceSAndroid Build Coastguard Worker {
525*35238bceSAndroid Build Coastguard Worker public:
BlockUnsizedStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)526*35238bceSAndroid Build Coastguard Worker     BlockUnsizedStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
527*35238bceSAndroid Build Coastguard Worker                                 BufferMode bufferMode, int numInstances)
528*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
529*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
530*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
531*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
532*35238bceSAndroid Build Coastguard Worker     {
533*35238bceSAndroid Build Coastguard Worker     }
534*35238bceSAndroid Build Coastguard Worker 
init(void)535*35238bceSAndroid Build Coastguard Worker     void init(void)
536*35238bceSAndroid Build Coastguard Worker     {
537*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
538*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_UINT_VEC2, glu::PRECISION_HIGHP)); // \todo [pyry] UNUSED
539*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT2X4, glu::PRECISION_MEDIUMP), 4));
540*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC3, glu::PRECISION_HIGHP));
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
543*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_FLOAT_VEC2, glu::PRECISION_LOWP), 0 /* no access */));
544*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_UINT, glu::PRECISION_MEDIUMP), ACCESS_WRITE));
545*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(VarType(&typeS), VarType::UNSIZED_ARRAY), ACCESS_READ | ACCESS_WRITE));
546*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
547*35238bceSAndroid Build Coastguard Worker 
548*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
549*35238bceSAndroid Build Coastguard Worker         {
550*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
551*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
552*35238bceSAndroid Build Coastguard Worker         }
553*35238bceSAndroid Build Coastguard Worker 
554*35238bceSAndroid Build Coastguard Worker         {
555*35238bceSAndroid Build Coastguard Worker             de::Random rnd(246);
556*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < (m_numInstances ? m_numInstances : 1); ndx++)
557*35238bceSAndroid Build Coastguard Worker             {
558*35238bceSAndroid Build Coastguard Worker                 const int lastArrayLen = rnd.getInt(1, 5);
559*35238bceSAndroid Build Coastguard Worker                 block.setLastUnsizedArraySize(ndx, lastArrayLen);
560*35238bceSAndroid Build Coastguard Worker             }
561*35238bceSAndroid Build Coastguard Worker         }
562*35238bceSAndroid Build Coastguard Worker     }
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker private:
565*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
566*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
567*35238bceSAndroid Build Coastguard Worker };
568*35238bceSAndroid Build Coastguard Worker 
569*35238bceSAndroid Build Coastguard Worker class Block2LevelUnsizedStructArrayCase : public SSBOLayoutCase
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker public:
Block2LevelUnsizedStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)572*35238bceSAndroid Build Coastguard Worker     Block2LevelUnsizedStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
573*35238bceSAndroid Build Coastguard Worker                                       BufferMode bufferMode, int numInstances)
574*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
575*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
576*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
577*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
578*35238bceSAndroid Build Coastguard Worker     {
579*35238bceSAndroid Build Coastguard Worker     }
580*35238bceSAndroid Build Coastguard Worker 
init(void)581*35238bceSAndroid Build Coastguard Worker     void init(void)
582*35238bceSAndroid Build Coastguard Worker     {
583*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
584*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, glu::PRECISION_HIGHP));
585*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP));
586*35238bceSAndroid Build Coastguard Worker 
587*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
588*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_UINT, glu::PRECISION_LOWP), 0 /* no access */));
589*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_MEDIUMP), ACCESS_WRITE));
590*35238bceSAndroid Build Coastguard Worker         block.addMember(
591*35238bceSAndroid Build Coastguard Worker             BufferVar("s", VarType(VarType(VarType(&typeS), 2), VarType::UNSIZED_ARRAY), ACCESS_READ | ACCESS_WRITE));
592*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
593*35238bceSAndroid Build Coastguard Worker 
594*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
595*35238bceSAndroid Build Coastguard Worker         {
596*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
597*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
598*35238bceSAndroid Build Coastguard Worker         }
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker         {
601*35238bceSAndroid Build Coastguard Worker             de::Random rnd(2344);
602*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < (m_numInstances ? m_numInstances : 1); ndx++)
603*35238bceSAndroid Build Coastguard Worker             {
604*35238bceSAndroid Build Coastguard Worker                 const int lastArrayLen = rnd.getInt(1, 5);
605*35238bceSAndroid Build Coastguard Worker                 block.setLastUnsizedArraySize(ndx, lastArrayLen);
606*35238bceSAndroid Build Coastguard Worker             }
607*35238bceSAndroid Build Coastguard Worker         }
608*35238bceSAndroid Build Coastguard Worker     }
609*35238bceSAndroid Build Coastguard Worker 
610*35238bceSAndroid Build Coastguard Worker private:
611*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
612*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
613*35238bceSAndroid Build Coastguard Worker };
614*35238bceSAndroid Build Coastguard Worker 
615*35238bceSAndroid Build Coastguard Worker class BlockUnsizedNestedStructArrayCase : public SSBOLayoutCase
616*35238bceSAndroid Build Coastguard Worker {
617*35238bceSAndroid Build Coastguard Worker public:
BlockUnsizedNestedStructArrayCase(Context & context,const char * name,const char * description,uint32_t layoutFlags,BufferMode bufferMode,int numInstances)618*35238bceSAndroid Build Coastguard Worker     BlockUnsizedNestedStructArrayCase(Context &context, const char *name, const char *description, uint32_t layoutFlags,
619*35238bceSAndroid Build Coastguard Worker                                       BufferMode bufferMode, int numInstances)
620*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
621*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
622*35238bceSAndroid Build Coastguard Worker         , m_layoutFlags(layoutFlags)
623*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
624*35238bceSAndroid Build Coastguard Worker     {
625*35238bceSAndroid Build Coastguard Worker     }
626*35238bceSAndroid Build Coastguard Worker 
init(void)627*35238bceSAndroid Build Coastguard Worker     void init(void)
628*35238bceSAndroid Build Coastguard Worker     {
629*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
630*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_UINT_VEC3, glu::PRECISION_HIGHP));
631*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_VEC2, glu::PRECISION_MEDIUMP), 4));
632*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP)); // \todo [pyry] UNUSED
633*35238bceSAndroid Build Coastguard Worker 
634*35238bceSAndroid Build Coastguard Worker         StructType &typeT = m_interface.allocStruct("T");
635*35238bceSAndroid Build Coastguard Worker         typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT4X3, glu::PRECISION_MEDIUMP));
636*35238bceSAndroid Build Coastguard Worker         typeT.addMember("b", VarType(VarType(&typeS), 3));
637*35238bceSAndroid Build Coastguard Worker         typeT.addMember("c", VarType(glu::TYPE_INT, glu::PRECISION_HIGHP));
638*35238bceSAndroid Build Coastguard Worker 
639*35238bceSAndroid Build Coastguard Worker         BufferBlock &block = m_interface.allocBlock("Block");
640*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("s", VarType(&typeS), ACCESS_WRITE));
641*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("v", VarType(glu::TYPE_FLOAT_VEC2, glu::PRECISION_LOWP), 0 /* no access */));
642*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("u", VarType(glu::TYPE_UINT, glu::PRECISION_HIGHP), ACCESS_READ | ACCESS_WRITE));
643*35238bceSAndroid Build Coastguard Worker         block.addMember(BufferVar("t", VarType(VarType(&typeT), VarType::UNSIZED_ARRAY), ACCESS_READ));
644*35238bceSAndroid Build Coastguard Worker         block.setFlags(m_layoutFlags);
645*35238bceSAndroid Build Coastguard Worker 
646*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
647*35238bceSAndroid Build Coastguard Worker         {
648*35238bceSAndroid Build Coastguard Worker             block.setInstanceName("block");
649*35238bceSAndroid Build Coastguard Worker             block.setArraySize(m_numInstances);
650*35238bceSAndroid Build Coastguard Worker         }
651*35238bceSAndroid Build Coastguard Worker 
652*35238bceSAndroid Build Coastguard Worker         {
653*35238bceSAndroid Build Coastguard Worker             de::Random rnd(7921);
654*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < (m_numInstances ? m_numInstances : 1); ndx++)
655*35238bceSAndroid Build Coastguard Worker             {
656*35238bceSAndroid Build Coastguard Worker                 const int lastArrayLen = rnd.getInt(1, 5);
657*35238bceSAndroid Build Coastguard Worker                 block.setLastUnsizedArraySize(ndx, lastArrayLen);
658*35238bceSAndroid Build Coastguard Worker             }
659*35238bceSAndroid Build Coastguard Worker         }
660*35238bceSAndroid Build Coastguard Worker     }
661*35238bceSAndroid Build Coastguard Worker 
662*35238bceSAndroid Build Coastguard Worker private:
663*35238bceSAndroid Build Coastguard Worker     uint32_t m_layoutFlags;
664*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
665*35238bceSAndroid Build Coastguard Worker };
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker class BlockMultiBasicTypesCase : public SSBOLayoutCase
668*35238bceSAndroid Build Coastguard Worker {
669*35238bceSAndroid Build Coastguard Worker public:
BlockMultiBasicTypesCase(Context & context,const char * name,const char * description,uint32_t flagsA,uint32_t flagsB,BufferMode bufferMode,int numInstances)670*35238bceSAndroid Build Coastguard Worker     BlockMultiBasicTypesCase(Context &context, const char *name, const char *description, uint32_t flagsA,
671*35238bceSAndroid Build Coastguard Worker                              uint32_t flagsB, BufferMode bufferMode, int numInstances)
672*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
673*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
674*35238bceSAndroid Build Coastguard Worker         , m_flagsA(flagsA)
675*35238bceSAndroid Build Coastguard Worker         , m_flagsB(flagsB)
676*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
677*35238bceSAndroid Build Coastguard Worker     {
678*35238bceSAndroid Build Coastguard Worker     }
679*35238bceSAndroid Build Coastguard Worker 
init(void)680*35238bceSAndroid Build Coastguard Worker     void init(void)
681*35238bceSAndroid Build Coastguard Worker     {
682*35238bceSAndroid Build Coastguard Worker         BufferBlock &blockA = m_interface.allocBlock("BlockA");
683*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("a", VarType(glu::TYPE_FLOAT, glu::PRECISION_HIGHP), ACCESS_READ | ACCESS_WRITE));
684*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("b", VarType(glu::TYPE_UINT_VEC3, glu::PRECISION_LOWP), 0 /* no access */));
685*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("c", VarType(glu::TYPE_FLOAT_MAT2, glu::PRECISION_MEDIUMP), ACCESS_READ));
686*35238bceSAndroid Build Coastguard Worker         blockA.setInstanceName("blockA");
687*35238bceSAndroid Build Coastguard Worker         blockA.setFlags(m_flagsA);
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker         BufferBlock &blockB = m_interface.allocBlock("BlockB");
690*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("a", VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_MEDIUMP), ACCESS_WRITE));
691*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("b", VarType(glu::TYPE_INT_VEC2, glu::PRECISION_LOWP), ACCESS_READ));
692*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP), 0 /* no access */));
693*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("d", VarType(glu::TYPE_BOOL, glu::PRECISION_LAST), ACCESS_READ | ACCESS_WRITE));
694*35238bceSAndroid Build Coastguard Worker         blockB.setInstanceName("blockB");
695*35238bceSAndroid Build Coastguard Worker         blockB.setFlags(m_flagsB);
696*35238bceSAndroid Build Coastguard Worker 
697*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
698*35238bceSAndroid Build Coastguard Worker         {
699*35238bceSAndroid Build Coastguard Worker             blockA.setArraySize(m_numInstances);
700*35238bceSAndroid Build Coastguard Worker             blockB.setArraySize(m_numInstances);
701*35238bceSAndroid Build Coastguard Worker         }
702*35238bceSAndroid Build Coastguard Worker     }
703*35238bceSAndroid Build Coastguard Worker 
704*35238bceSAndroid Build Coastguard Worker private:
705*35238bceSAndroid Build Coastguard Worker     uint32_t m_flagsA;
706*35238bceSAndroid Build Coastguard Worker     uint32_t m_flagsB;
707*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
708*35238bceSAndroid Build Coastguard Worker };
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker class BlockMultiNestedStructCase : public SSBOLayoutCase
711*35238bceSAndroid Build Coastguard Worker {
712*35238bceSAndroid Build Coastguard Worker public:
BlockMultiNestedStructCase(Context & context,const char * name,const char * description,uint32_t flagsA,uint32_t flagsB,BufferMode bufferMode,int numInstances)713*35238bceSAndroid Build Coastguard Worker     BlockMultiNestedStructCase(Context &context, const char *name, const char *description, uint32_t flagsA,
714*35238bceSAndroid Build Coastguard Worker                                uint32_t flagsB, BufferMode bufferMode, int numInstances)
715*35238bceSAndroid Build Coastguard Worker         : SSBOLayoutCase(context.getTestContext(), context.getRenderContext(), name, description,
716*35238bceSAndroid Build Coastguard Worker                          glu::GLSL_VERSION_310_ES, bufferMode)
717*35238bceSAndroid Build Coastguard Worker         , m_flagsA(flagsA)
718*35238bceSAndroid Build Coastguard Worker         , m_flagsB(flagsB)
719*35238bceSAndroid Build Coastguard Worker         , m_numInstances(numInstances)
720*35238bceSAndroid Build Coastguard Worker     {
721*35238bceSAndroid Build Coastguard Worker     }
722*35238bceSAndroid Build Coastguard Worker 
init(void)723*35238bceSAndroid Build Coastguard Worker     void init(void)
724*35238bceSAndroid Build Coastguard Worker     {
725*35238bceSAndroid Build Coastguard Worker         StructType &typeS = m_interface.allocStruct("S");
726*35238bceSAndroid Build Coastguard Worker         typeS.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, glu::PRECISION_LOWP));
727*35238bceSAndroid Build Coastguard Worker         typeS.addMember("b", VarType(VarType(glu::TYPE_INT_VEC2, glu::PRECISION_MEDIUMP), 4));
728*35238bceSAndroid Build Coastguard Worker         typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, glu::PRECISION_HIGHP));
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker         StructType &typeT = m_interface.allocStruct("T");
731*35238bceSAndroid Build Coastguard Worker         typeT.addMember("a", VarType(glu::TYPE_UINT, glu::PRECISION_MEDIUMP)); // \todo [pyry] UNUSED
732*35238bceSAndroid Build Coastguard Worker         typeT.addMember("b", VarType(&typeS));
733*35238bceSAndroid Build Coastguard Worker         typeT.addMember("c", VarType(glu::TYPE_BOOL_VEC4, glu::PRECISION_LAST));
734*35238bceSAndroid Build Coastguard Worker 
735*35238bceSAndroid Build Coastguard Worker         BufferBlock &blockA = m_interface.allocBlock("BlockA");
736*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("a", VarType(glu::TYPE_FLOAT, glu::PRECISION_HIGHP), ACCESS_READ | ACCESS_WRITE));
737*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("b", VarType(&typeS), ACCESS_WRITE));
738*35238bceSAndroid Build Coastguard Worker         blockA.addMember(BufferVar("c", VarType(glu::TYPE_UINT_VEC3, glu::PRECISION_LOWP), 0 /* no access */));
739*35238bceSAndroid Build Coastguard Worker         blockA.setInstanceName("blockA");
740*35238bceSAndroid Build Coastguard Worker         blockA.setFlags(m_flagsA);
741*35238bceSAndroid Build Coastguard Worker 
742*35238bceSAndroid Build Coastguard Worker         BufferBlock &blockB = m_interface.allocBlock("BlockB");
743*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("a", VarType(glu::TYPE_FLOAT_MAT2, glu::PRECISION_MEDIUMP), ACCESS_WRITE));
744*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("b", VarType(&typeT), ACCESS_READ | ACCESS_WRITE));
745*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("c", VarType(glu::TYPE_BOOL_VEC4, glu::PRECISION_LAST), 0 /* no access */));
746*35238bceSAndroid Build Coastguard Worker         blockB.addMember(BufferVar("d", VarType(glu::TYPE_BOOL, glu::PRECISION_LAST), ACCESS_READ | ACCESS_WRITE));
747*35238bceSAndroid Build Coastguard Worker         blockB.setInstanceName("blockB");
748*35238bceSAndroid Build Coastguard Worker         blockB.setFlags(m_flagsB);
749*35238bceSAndroid Build Coastguard Worker 
750*35238bceSAndroid Build Coastguard Worker         if (m_numInstances > 0)
751*35238bceSAndroid Build Coastguard Worker         {
752*35238bceSAndroid Build Coastguard Worker             blockA.setArraySize(m_numInstances);
753*35238bceSAndroid Build Coastguard Worker             blockB.setArraySize(m_numInstances);
754*35238bceSAndroid Build Coastguard Worker         }
755*35238bceSAndroid Build Coastguard Worker     }
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker private:
758*35238bceSAndroid Build Coastguard Worker     uint32_t m_flagsA;
759*35238bceSAndroid Build Coastguard Worker     uint32_t m_flagsB;
760*35238bceSAndroid Build Coastguard Worker     int m_numInstances;
761*35238bceSAndroid Build Coastguard Worker };
762*35238bceSAndroid Build Coastguard Worker 
763*35238bceSAndroid Build Coastguard Worker } // namespace
764*35238bceSAndroid Build Coastguard Worker 
SSBOLayoutTests(Context & context)765*35238bceSAndroid Build Coastguard Worker SSBOLayoutTests::SSBOLayoutTests(Context &context) : TestCaseGroup(context, "layout", "SSBO Layout Tests")
766*35238bceSAndroid Build Coastguard Worker {
767*35238bceSAndroid Build Coastguard Worker }
768*35238bceSAndroid Build Coastguard Worker 
~SSBOLayoutTests(void)769*35238bceSAndroid Build Coastguard Worker SSBOLayoutTests::~SSBOLayoutTests(void)
770*35238bceSAndroid Build Coastguard Worker {
771*35238bceSAndroid Build Coastguard Worker }
772*35238bceSAndroid Build Coastguard Worker 
init(void)773*35238bceSAndroid Build Coastguard Worker void SSBOLayoutTests::init(void)
774*35238bceSAndroid Build Coastguard Worker {
775*35238bceSAndroid Build Coastguard Worker     static const glu::DataType basicTypes[] = {
776*35238bceSAndroid Build Coastguard Worker         glu::TYPE_FLOAT,        glu::TYPE_FLOAT_VEC2,   glu::TYPE_FLOAT_VEC3,   glu::TYPE_FLOAT_VEC4,
777*35238bceSAndroid Build Coastguard Worker         glu::TYPE_INT,          glu::TYPE_INT_VEC2,     glu::TYPE_INT_VEC3,     glu::TYPE_INT_VEC4,
778*35238bceSAndroid Build Coastguard Worker         glu::TYPE_UINT,         glu::TYPE_UINT_VEC2,    glu::TYPE_UINT_VEC3,    glu::TYPE_UINT_VEC4,
779*35238bceSAndroid Build Coastguard Worker         glu::TYPE_BOOL,         glu::TYPE_BOOL_VEC2,    glu::TYPE_BOOL_VEC3,    glu::TYPE_BOOL_VEC4,
780*35238bceSAndroid Build Coastguard Worker         glu::TYPE_FLOAT_MAT2,   glu::TYPE_FLOAT_MAT3,   glu::TYPE_FLOAT_MAT4,   glu::TYPE_FLOAT_MAT2X3,
781*35238bceSAndroid Build Coastguard Worker         glu::TYPE_FLOAT_MAT2X4, glu::TYPE_FLOAT_MAT3X2, glu::TYPE_FLOAT_MAT3X4, glu::TYPE_FLOAT_MAT4X2,
782*35238bceSAndroid Build Coastguard Worker         glu::TYPE_FLOAT_MAT4X3};
783*35238bceSAndroid Build Coastguard Worker 
784*35238bceSAndroid Build Coastguard Worker     static const struct
785*35238bceSAndroid Build Coastguard Worker     {
786*35238bceSAndroid Build Coastguard Worker         const char *name;
787*35238bceSAndroid Build Coastguard Worker         uint32_t flags;
788*35238bceSAndroid Build Coastguard Worker     } layoutFlags[] = {
789*35238bceSAndroid Build Coastguard Worker         {"shared", LAYOUT_SHARED}, {"packed", LAYOUT_PACKED}, {"std140", LAYOUT_STD140}, {"std430", LAYOUT_STD430}};
790*35238bceSAndroid Build Coastguard Worker 
791*35238bceSAndroid Build Coastguard Worker     static const struct
792*35238bceSAndroid Build Coastguard Worker     {
793*35238bceSAndroid Build Coastguard Worker         const char *name;
794*35238bceSAndroid Build Coastguard Worker         uint32_t flags;
795*35238bceSAndroid Build Coastguard Worker     } matrixFlags[] = {{"row_major", LAYOUT_ROW_MAJOR}, {"column_major", LAYOUT_COLUMN_MAJOR}};
796*35238bceSAndroid Build Coastguard Worker 
797*35238bceSAndroid Build Coastguard Worker     static const struct
798*35238bceSAndroid Build Coastguard Worker     {
799*35238bceSAndroid Build Coastguard Worker         const char *name;
800*35238bceSAndroid Build Coastguard Worker         SSBOLayoutCase::BufferMode mode;
801*35238bceSAndroid Build Coastguard Worker     } bufferModes[] = {{"per_block_buffer", SSBOLayoutCase::BUFFERMODE_PER_BLOCK},
802*35238bceSAndroid Build Coastguard Worker                        {"single_buffer", SSBOLayoutCase::BUFFERMODE_SINGLE}};
803*35238bceSAndroid Build Coastguard Worker 
804*35238bceSAndroid Build Coastguard Worker     // ubo.single_basic_type
805*35238bceSAndroid Build Coastguard Worker     {
806*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleBasicTypeGroup =
807*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_basic_type", "Single basic variable in single buffer");
808*35238bceSAndroid Build Coastguard Worker         addChild(singleBasicTypeGroup);
809*35238bceSAndroid Build Coastguard Worker 
810*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
811*35238bceSAndroid Build Coastguard Worker         {
812*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
813*35238bceSAndroid Build Coastguard Worker             singleBasicTypeGroup->addChild(layoutGroup);
814*35238bceSAndroid Build Coastguard Worker 
815*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
816*35238bceSAndroid Build Coastguard Worker             {
817*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
818*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
819*35238bceSAndroid Build Coastguard Worker 
820*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeBoolOrBVec(type))
821*35238bceSAndroid Build Coastguard Worker                     layoutGroup->addChild(new BlockBasicTypeCase(m_context, typeName, "",
822*35238bceSAndroid Build Coastguard Worker                                                                  VarType(type, glu::PRECISION_LAST),
823*35238bceSAndroid Build Coastguard Worker                                                                  layoutFlags[layoutFlagNdx].flags, 0));
824*35238bceSAndroid Build Coastguard Worker                 else
825*35238bceSAndroid Build Coastguard Worker                 {
826*35238bceSAndroid Build Coastguard Worker                     for (int precNdx = 0; precNdx < glu::PRECISION_LAST; precNdx++)
827*35238bceSAndroid Build Coastguard Worker                     {
828*35238bceSAndroid Build Coastguard Worker                         const glu::Precision precision = glu::Precision(precNdx);
829*35238bceSAndroid Build Coastguard Worker                         const string caseName          = string(glu::getPrecisionName(precision)) + "_" + typeName;
830*35238bceSAndroid Build Coastguard Worker 
831*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicTypeCase(m_context, caseName.c_str(), "",
832*35238bceSAndroid Build Coastguard Worker                                                                      VarType(type, precision),
833*35238bceSAndroid Build Coastguard Worker                                                                      layoutFlags[layoutFlagNdx].flags, 0));
834*35238bceSAndroid Build Coastguard Worker                     }
835*35238bceSAndroid Build Coastguard Worker                 }
836*35238bceSAndroid Build Coastguard Worker 
837*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
838*35238bceSAndroid Build Coastguard Worker                 {
839*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
840*35238bceSAndroid Build Coastguard Worker                     {
841*35238bceSAndroid Build Coastguard Worker                         for (int precNdx = 0; precNdx < glu::PRECISION_LAST; precNdx++)
842*35238bceSAndroid Build Coastguard Worker                         {
843*35238bceSAndroid Build Coastguard Worker                             const glu::Precision precision = glu::Precision(precNdx);
844*35238bceSAndroid Build Coastguard Worker                             const string caseName          = string(matrixFlags[matFlagNdx].name) + "_" +
845*35238bceSAndroid Build Coastguard Worker                                                     string(glu::getPrecisionName(precision)) + "_" + typeName;
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker                             layoutGroup->addChild(new BlockBasicTypeCase(
848*35238bceSAndroid Build Coastguard Worker                                 m_context, caseName.c_str(), "", glu::VarType(type, precision),
849*35238bceSAndroid Build Coastguard Worker                                 layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, 0));
850*35238bceSAndroid Build Coastguard Worker                         }
851*35238bceSAndroid Build Coastguard Worker                     }
852*35238bceSAndroid Build Coastguard Worker                 }
853*35238bceSAndroid Build Coastguard Worker             }
854*35238bceSAndroid Build Coastguard Worker         }
855*35238bceSAndroid Build Coastguard Worker     }
856*35238bceSAndroid Build Coastguard Worker 
857*35238bceSAndroid Build Coastguard Worker     // ubo.single_basic_array
858*35238bceSAndroid Build Coastguard Worker     {
859*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleBasicArrayGroup =
860*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_basic_array", "Single basic array variable in single buffer");
861*35238bceSAndroid Build Coastguard Worker         addChild(singleBasicArrayGroup);
862*35238bceSAndroid Build Coastguard Worker 
863*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
864*35238bceSAndroid Build Coastguard Worker         {
865*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
866*35238bceSAndroid Build Coastguard Worker             singleBasicArrayGroup->addChild(layoutGroup);
867*35238bceSAndroid Build Coastguard Worker 
868*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
869*35238bceSAndroid Build Coastguard Worker             {
870*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
871*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
872*35238bceSAndroid Build Coastguard Worker                 const int arraySize  = 3;
873*35238bceSAndroid Build Coastguard Worker 
874*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(new BlockBasicTypeCase(
875*35238bceSAndroid Build Coastguard Worker                     m_context, typeName, "",
876*35238bceSAndroid Build Coastguard Worker                     VarType(VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
877*35238bceSAndroid Build Coastguard Worker                             arraySize),
878*35238bceSAndroid Build Coastguard Worker                     layoutFlags[layoutFlagNdx].flags, 0));
879*35238bceSAndroid Build Coastguard Worker 
880*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
881*35238bceSAndroid Build Coastguard Worker                 {
882*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
883*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicTypeCase(
884*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "",
885*35238bceSAndroid Build Coastguard Worker                             VarType(VarType(type, glu::PRECISION_HIGHP), arraySize),
886*35238bceSAndroid Build Coastguard Worker                             layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, 0));
887*35238bceSAndroid Build Coastguard Worker                 }
888*35238bceSAndroid Build Coastguard Worker             }
889*35238bceSAndroid Build Coastguard Worker         }
890*35238bceSAndroid Build Coastguard Worker     }
891*35238bceSAndroid Build Coastguard Worker 
892*35238bceSAndroid Build Coastguard Worker     // ubo.basic_unsized_array
893*35238bceSAndroid Build Coastguard Worker     {
894*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *basicUnsizedArray =
895*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "basic_unsized_array", "Basic unsized array tests");
896*35238bceSAndroid Build Coastguard Worker         addChild(basicUnsizedArray);
897*35238bceSAndroid Build Coastguard Worker 
898*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
899*35238bceSAndroid Build Coastguard Worker         {
900*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
901*35238bceSAndroid Build Coastguard Worker             basicUnsizedArray->addChild(layoutGroup);
902*35238bceSAndroid Build Coastguard Worker 
903*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
904*35238bceSAndroid Build Coastguard Worker             {
905*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
906*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
907*35238bceSAndroid Build Coastguard Worker                 const int arraySize  = 19;
908*35238bceSAndroid Build Coastguard Worker 
909*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(new BlockBasicUnsizedArrayCase(
910*35238bceSAndroid Build Coastguard Worker                     m_context, typeName, "",
911*35238bceSAndroid Build Coastguard Worker                     VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
912*35238bceSAndroid Build Coastguard Worker                     arraySize, layoutFlags[layoutFlagNdx].flags));
913*35238bceSAndroid Build Coastguard Worker 
914*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
915*35238bceSAndroid Build Coastguard Worker                 {
916*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
917*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicUnsizedArrayCase(
918*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "",
919*35238bceSAndroid Build Coastguard Worker                             VarType(type, glu::PRECISION_HIGHP), arraySize,
920*35238bceSAndroid Build Coastguard Worker                             layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags));
921*35238bceSAndroid Build Coastguard Worker                 }
922*35238bceSAndroid Build Coastguard Worker             }
923*35238bceSAndroid Build Coastguard Worker         }
924*35238bceSAndroid Build Coastguard Worker     }
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker     // ubo.2_level_array
927*35238bceSAndroid Build Coastguard Worker     {
928*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *nestedArrayGroup =
929*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "2_level_array", "2-level nested array");
930*35238bceSAndroid Build Coastguard Worker         addChild(nestedArrayGroup);
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
933*35238bceSAndroid Build Coastguard Worker         {
934*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
935*35238bceSAndroid Build Coastguard Worker             nestedArrayGroup->addChild(layoutGroup);
936*35238bceSAndroid Build Coastguard Worker 
937*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
938*35238bceSAndroid Build Coastguard Worker             {
939*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
940*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
941*35238bceSAndroid Build Coastguard Worker                 const int childSize  = 3;
942*35238bceSAndroid Build Coastguard Worker                 const int parentSize = 4;
943*35238bceSAndroid Build Coastguard Worker                 const VarType childType(
944*35238bceSAndroid Build Coastguard Worker                     VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
945*35238bceSAndroid Build Coastguard Worker                     childSize);
946*35238bceSAndroid Build Coastguard Worker                 const VarType fullType(childType, parentSize);
947*35238bceSAndroid Build Coastguard Worker 
948*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(
949*35238bceSAndroid Build Coastguard Worker                     new BlockBasicTypeCase(m_context, typeName, "", fullType, layoutFlags[layoutFlagNdx].flags, 0));
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
952*35238bceSAndroid Build Coastguard Worker                 {
953*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
954*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicTypeCase(
955*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "", fullType,
956*35238bceSAndroid Build Coastguard Worker                             layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, 0));
957*35238bceSAndroid Build Coastguard Worker                 }
958*35238bceSAndroid Build Coastguard Worker             }
959*35238bceSAndroid Build Coastguard Worker         }
960*35238bceSAndroid Build Coastguard Worker     }
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker     // ubo.3_level_array
963*35238bceSAndroid Build Coastguard Worker     {
964*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *nestedArrayGroup =
965*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "3_level_array", "3-level nested array");
966*35238bceSAndroid Build Coastguard Worker         addChild(nestedArrayGroup);
967*35238bceSAndroid Build Coastguard Worker 
968*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
969*35238bceSAndroid Build Coastguard Worker         {
970*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
971*35238bceSAndroid Build Coastguard Worker             nestedArrayGroup->addChild(layoutGroup);
972*35238bceSAndroid Build Coastguard Worker 
973*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
974*35238bceSAndroid Build Coastguard Worker             {
975*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
976*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
977*35238bceSAndroid Build Coastguard Worker                 const int childSize0 = 3;
978*35238bceSAndroid Build Coastguard Worker                 const int childSize1 = 2;
979*35238bceSAndroid Build Coastguard Worker                 const int parentSize = 4;
980*35238bceSAndroid Build Coastguard Worker                 const VarType childType0(
981*35238bceSAndroid Build Coastguard Worker                     VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
982*35238bceSAndroid Build Coastguard Worker                     childSize0);
983*35238bceSAndroid Build Coastguard Worker                 const VarType childType1(childType0, childSize1);
984*35238bceSAndroid Build Coastguard Worker                 const VarType fullType(childType1, parentSize);
985*35238bceSAndroid Build Coastguard Worker 
986*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(
987*35238bceSAndroid Build Coastguard Worker                     new BlockBasicTypeCase(m_context, typeName, "", fullType, layoutFlags[layoutFlagNdx].flags, 0));
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
990*35238bceSAndroid Build Coastguard Worker                 {
991*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
992*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicTypeCase(
993*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "", fullType,
994*35238bceSAndroid Build Coastguard Worker                             layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, 0));
995*35238bceSAndroid Build Coastguard Worker                 }
996*35238bceSAndroid Build Coastguard Worker             }
997*35238bceSAndroid Build Coastguard Worker         }
998*35238bceSAndroid Build Coastguard Worker     }
999*35238bceSAndroid Build Coastguard Worker 
1000*35238bceSAndroid Build Coastguard Worker     // ubo.3_level_unsized_array
1001*35238bceSAndroid Build Coastguard Worker     {
1002*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *nestedArrayGroup =
1003*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "3_level_unsized_array", "3-level nested array, top-level array unsized");
1004*35238bceSAndroid Build Coastguard Worker         addChild(nestedArrayGroup);
1005*35238bceSAndroid Build Coastguard Worker 
1006*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1007*35238bceSAndroid Build Coastguard Worker         {
1008*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
1009*35238bceSAndroid Build Coastguard Worker             nestedArrayGroup->addChild(layoutGroup);
1010*35238bceSAndroid Build Coastguard Worker 
1011*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
1012*35238bceSAndroid Build Coastguard Worker             {
1013*35238bceSAndroid Build Coastguard Worker                 glu::DataType type   = basicTypes[basicTypeNdx];
1014*35238bceSAndroid Build Coastguard Worker                 const char *typeName = glu::getDataTypeName(type);
1015*35238bceSAndroid Build Coastguard Worker                 const int childSize0 = 2;
1016*35238bceSAndroid Build Coastguard Worker                 const int childSize1 = 4;
1017*35238bceSAndroid Build Coastguard Worker                 const int parentSize = 3;
1018*35238bceSAndroid Build Coastguard Worker                 const VarType childType0(
1019*35238bceSAndroid Build Coastguard Worker                     VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
1020*35238bceSAndroid Build Coastguard Worker                     childSize0);
1021*35238bceSAndroid Build Coastguard Worker                 const VarType childType1(childType0, childSize1);
1022*35238bceSAndroid Build Coastguard Worker 
1023*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(new BlockBasicUnsizedArrayCase(m_context, typeName, "", childType1, parentSize,
1024*35238bceSAndroid Build Coastguard Worker                                                                      layoutFlags[layoutFlagNdx].flags));
1025*35238bceSAndroid Build Coastguard Worker 
1026*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
1027*35238bceSAndroid Build Coastguard Worker                 {
1028*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
1029*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicUnsizedArrayCase(
1030*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "", childType1,
1031*35238bceSAndroid Build Coastguard Worker                             parentSize, layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags));
1032*35238bceSAndroid Build Coastguard Worker                 }
1033*35238bceSAndroid Build Coastguard Worker             }
1034*35238bceSAndroid Build Coastguard Worker         }
1035*35238bceSAndroid Build Coastguard Worker     }
1036*35238bceSAndroid Build Coastguard Worker 
1037*35238bceSAndroid Build Coastguard Worker     // ubo.single_struct
1038*35238bceSAndroid Build Coastguard Worker     {
1039*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleStructGroup =
1040*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_struct", "Single struct in uniform block");
1041*35238bceSAndroid Build Coastguard Worker         addChild(singleStructGroup);
1042*35238bceSAndroid Build Coastguard Worker 
1043*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1044*35238bceSAndroid Build Coastguard Worker         {
1045*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1046*35238bceSAndroid Build Coastguard Worker             singleStructGroup->addChild(modeGroup);
1047*35238bceSAndroid Build Coastguard Worker 
1048*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1049*35238bceSAndroid Build Coastguard Worker             {
1050*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1051*35238bceSAndroid Build Coastguard Worker                 {
1052*35238bceSAndroid Build Coastguard Worker                     const uint32_t caseFlags = layoutFlags[layoutFlagNdx].flags;
1053*35238bceSAndroid Build Coastguard Worker                     string caseName          = layoutFlags[layoutFlagNdx].name;
1054*35238bceSAndroid Build Coastguard Worker 
1055*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1056*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1057*35238bceSAndroid Build Coastguard Worker 
1058*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1059*35238bceSAndroid Build Coastguard Worker                         caseName += "_instance_array";
1060*35238bceSAndroid Build Coastguard Worker 
1061*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockSingleStructCase(m_context, caseName.c_str(), "", caseFlags,
1062*35238bceSAndroid Build Coastguard Worker                                                                   bufferModes[modeNdx].mode, isArray ? 3 : 0));
1063*35238bceSAndroid Build Coastguard Worker                 }
1064*35238bceSAndroid Build Coastguard Worker             }
1065*35238bceSAndroid Build Coastguard Worker         }
1066*35238bceSAndroid Build Coastguard Worker     }
1067*35238bceSAndroid Build Coastguard Worker 
1068*35238bceSAndroid Build Coastguard Worker     // ubo.single_struct_array
1069*35238bceSAndroid Build Coastguard Worker     {
1070*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleStructArrayGroup =
1071*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_struct_array", "Struct array in one uniform block");
1072*35238bceSAndroid Build Coastguard Worker         addChild(singleStructArrayGroup);
1073*35238bceSAndroid Build Coastguard Worker 
1074*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1075*35238bceSAndroid Build Coastguard Worker         {
1076*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1077*35238bceSAndroid Build Coastguard Worker             singleStructArrayGroup->addChild(modeGroup);
1078*35238bceSAndroid Build Coastguard Worker 
1079*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1080*35238bceSAndroid Build Coastguard Worker             {
1081*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1082*35238bceSAndroid Build Coastguard Worker                 {
1083*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1084*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1085*35238bceSAndroid Build Coastguard Worker 
1086*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1087*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1088*35238bceSAndroid Build Coastguard Worker 
1089*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1090*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1091*35238bceSAndroid Build Coastguard Worker 
1092*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockSingleStructArrayCase(m_context, baseName.c_str(), "", baseFlags,
1093*35238bceSAndroid Build Coastguard Worker                                                                        bufferModes[modeNdx].mode, isArray ? 3 : 0));
1094*35238bceSAndroid Build Coastguard Worker                 }
1095*35238bceSAndroid Build Coastguard Worker             }
1096*35238bceSAndroid Build Coastguard Worker         }
1097*35238bceSAndroid Build Coastguard Worker     }
1098*35238bceSAndroid Build Coastguard Worker 
1099*35238bceSAndroid Build Coastguard Worker     // ubo.single_nested_struct
1100*35238bceSAndroid Build Coastguard Worker     {
1101*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleNestedStructGroup =
1102*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_nested_struct", "Nested struct in one uniform block");
1103*35238bceSAndroid Build Coastguard Worker         addChild(singleNestedStructGroup);
1104*35238bceSAndroid Build Coastguard Worker 
1105*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1106*35238bceSAndroid Build Coastguard Worker         {
1107*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1108*35238bceSAndroid Build Coastguard Worker             singleNestedStructGroup->addChild(modeGroup);
1109*35238bceSAndroid Build Coastguard Worker 
1110*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1111*35238bceSAndroid Build Coastguard Worker             {
1112*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1113*35238bceSAndroid Build Coastguard Worker                 {
1114*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1115*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1116*35238bceSAndroid Build Coastguard Worker 
1117*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1118*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1119*35238bceSAndroid Build Coastguard Worker 
1120*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1121*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1122*35238bceSAndroid Build Coastguard Worker 
1123*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockSingleNestedStructCase(m_context, baseName.c_str(), "", baseFlags,
1124*35238bceSAndroid Build Coastguard Worker                                                                         bufferModes[modeNdx].mode, isArray ? 3 : 0));
1125*35238bceSAndroid Build Coastguard Worker                 }
1126*35238bceSAndroid Build Coastguard Worker             }
1127*35238bceSAndroid Build Coastguard Worker         }
1128*35238bceSAndroid Build Coastguard Worker     }
1129*35238bceSAndroid Build Coastguard Worker 
1130*35238bceSAndroid Build Coastguard Worker     // ubo.single_nested_struct_array
1131*35238bceSAndroid Build Coastguard Worker     {
1132*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleNestedStructArrayGroup =
1133*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_nested_struct_array", "Nested struct array in one uniform block");
1134*35238bceSAndroid Build Coastguard Worker         addChild(singleNestedStructArrayGroup);
1135*35238bceSAndroid Build Coastguard Worker 
1136*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1137*35238bceSAndroid Build Coastguard Worker         {
1138*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1139*35238bceSAndroid Build Coastguard Worker             singleNestedStructArrayGroup->addChild(modeGroup);
1140*35238bceSAndroid Build Coastguard Worker 
1141*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1142*35238bceSAndroid Build Coastguard Worker             {
1143*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1144*35238bceSAndroid Build Coastguard Worker                 {
1145*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1146*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1147*35238bceSAndroid Build Coastguard Worker 
1148*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1149*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1150*35238bceSAndroid Build Coastguard Worker 
1151*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1152*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1153*35238bceSAndroid Build Coastguard Worker 
1154*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockSingleNestedStructArrayCase(
1155*35238bceSAndroid Build Coastguard Worker                         m_context, baseName.c_str(), "", baseFlags, bufferModes[modeNdx].mode, isArray ? 3 : 0));
1156*35238bceSAndroid Build Coastguard Worker                 }
1157*35238bceSAndroid Build Coastguard Worker             }
1158*35238bceSAndroid Build Coastguard Worker         }
1159*35238bceSAndroid Build Coastguard Worker     }
1160*35238bceSAndroid Build Coastguard Worker 
1161*35238bceSAndroid Build Coastguard Worker     // ubo.unsized_struct_array
1162*35238bceSAndroid Build Coastguard Worker     {
1163*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleStructArrayGroup =
1164*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "unsized_struct_array", "Unsized struct array in one uniform block");
1165*35238bceSAndroid Build Coastguard Worker         addChild(singleStructArrayGroup);
1166*35238bceSAndroid Build Coastguard Worker 
1167*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1168*35238bceSAndroid Build Coastguard Worker         {
1169*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1170*35238bceSAndroid Build Coastguard Worker             singleStructArrayGroup->addChild(modeGroup);
1171*35238bceSAndroid Build Coastguard Worker 
1172*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1173*35238bceSAndroid Build Coastguard Worker             {
1174*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1175*35238bceSAndroid Build Coastguard Worker                 {
1176*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1177*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1178*35238bceSAndroid Build Coastguard Worker 
1179*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1180*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1181*35238bceSAndroid Build Coastguard Worker 
1182*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1183*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1184*35238bceSAndroid Build Coastguard Worker 
1185*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockUnsizedStructArrayCase(m_context, baseName.c_str(), "", baseFlags,
1186*35238bceSAndroid Build Coastguard Worker                                                                         bufferModes[modeNdx].mode, isArray ? 3 : 0));
1187*35238bceSAndroid Build Coastguard Worker                 }
1188*35238bceSAndroid Build Coastguard Worker             }
1189*35238bceSAndroid Build Coastguard Worker         }
1190*35238bceSAndroid Build Coastguard Worker     }
1191*35238bceSAndroid Build Coastguard Worker 
1192*35238bceSAndroid Build Coastguard Worker     // ubo.2_level_unsized_struct_array
1193*35238bceSAndroid Build Coastguard Worker     {
1194*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *structArrayGroup = new tcu::TestCaseGroup(
1195*35238bceSAndroid Build Coastguard Worker             m_testCtx, "2_level_unsized_struct_array", "Unsized 2-level struct array in one uniform block");
1196*35238bceSAndroid Build Coastguard Worker         addChild(structArrayGroup);
1197*35238bceSAndroid Build Coastguard Worker 
1198*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1199*35238bceSAndroid Build Coastguard Worker         {
1200*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1201*35238bceSAndroid Build Coastguard Worker             structArrayGroup->addChild(modeGroup);
1202*35238bceSAndroid Build Coastguard Worker 
1203*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1204*35238bceSAndroid Build Coastguard Worker             {
1205*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1206*35238bceSAndroid Build Coastguard Worker                 {
1207*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1208*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1209*35238bceSAndroid Build Coastguard Worker 
1210*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1211*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1212*35238bceSAndroid Build Coastguard Worker 
1213*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1214*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1215*35238bceSAndroid Build Coastguard Worker 
1216*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new Block2LevelUnsizedStructArrayCase(
1217*35238bceSAndroid Build Coastguard Worker                         m_context, baseName.c_str(), "", baseFlags, bufferModes[modeNdx].mode, isArray ? 3 : 0));
1218*35238bceSAndroid Build Coastguard Worker                 }
1219*35238bceSAndroid Build Coastguard Worker             }
1220*35238bceSAndroid Build Coastguard Worker         }
1221*35238bceSAndroid Build Coastguard Worker     }
1222*35238bceSAndroid Build Coastguard Worker 
1223*35238bceSAndroid Build Coastguard Worker     // ubo.unsized_nested_struct_array
1224*35238bceSAndroid Build Coastguard Worker     {
1225*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleNestedStructArrayGroup = new tcu::TestCaseGroup(
1226*35238bceSAndroid Build Coastguard Worker             m_testCtx, "unsized_nested_struct_array", "Unsized, nested struct array in one uniform block");
1227*35238bceSAndroid Build Coastguard Worker         addChild(singleNestedStructArrayGroup);
1228*35238bceSAndroid Build Coastguard Worker 
1229*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1230*35238bceSAndroid Build Coastguard Worker         {
1231*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1232*35238bceSAndroid Build Coastguard Worker             singleNestedStructArrayGroup->addChild(modeGroup);
1233*35238bceSAndroid Build Coastguard Worker 
1234*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1235*35238bceSAndroid Build Coastguard Worker             {
1236*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1237*35238bceSAndroid Build Coastguard Worker                 {
1238*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1239*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1240*35238bceSAndroid Build Coastguard Worker 
1241*35238bceSAndroid Build Coastguard Worker                     if (bufferModes[modeNdx].mode == SSBOLayoutCase::BUFFERMODE_SINGLE && isArray == 0)
1242*35238bceSAndroid Build Coastguard Worker                         continue; // Doesn't make sense to add this variant.
1243*35238bceSAndroid Build Coastguard Worker 
1244*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1245*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1246*35238bceSAndroid Build Coastguard Worker 
1247*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockUnsizedNestedStructArrayCase(
1248*35238bceSAndroid Build Coastguard Worker                         m_context, baseName.c_str(), "", baseFlags, bufferModes[modeNdx].mode, isArray ? 3 : 0));
1249*35238bceSAndroid Build Coastguard Worker                 }
1250*35238bceSAndroid Build Coastguard Worker             }
1251*35238bceSAndroid Build Coastguard Worker         }
1252*35238bceSAndroid Build Coastguard Worker     }
1253*35238bceSAndroid Build Coastguard Worker 
1254*35238bceSAndroid Build Coastguard Worker     // ubo.instance_array_basic_type
1255*35238bceSAndroid Build Coastguard Worker     {
1256*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *instanceArrayBasicTypeGroup =
1257*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "instance_array_basic_type", "Single basic variable in instance array");
1258*35238bceSAndroid Build Coastguard Worker         addChild(instanceArrayBasicTypeGroup);
1259*35238bceSAndroid Build Coastguard Worker 
1260*35238bceSAndroid Build Coastguard Worker         for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1261*35238bceSAndroid Build Coastguard Worker         {
1262*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *layoutGroup = new tcu::TestCaseGroup(m_testCtx, layoutFlags[layoutFlagNdx].name, "");
1263*35238bceSAndroid Build Coastguard Worker             instanceArrayBasicTypeGroup->addChild(layoutGroup);
1264*35238bceSAndroid Build Coastguard Worker 
1265*35238bceSAndroid Build Coastguard Worker             for (int basicTypeNdx = 0; basicTypeNdx < DE_LENGTH_OF_ARRAY(basicTypes); basicTypeNdx++)
1266*35238bceSAndroid Build Coastguard Worker             {
1267*35238bceSAndroid Build Coastguard Worker                 glu::DataType type     = basicTypes[basicTypeNdx];
1268*35238bceSAndroid Build Coastguard Worker                 const char *typeName   = glu::getDataTypeName(type);
1269*35238bceSAndroid Build Coastguard Worker                 const int numInstances = 3;
1270*35238bceSAndroid Build Coastguard Worker 
1271*35238bceSAndroid Build Coastguard Worker                 layoutGroup->addChild(new BlockBasicTypeCase(
1272*35238bceSAndroid Build Coastguard Worker                     m_context, typeName, "",
1273*35238bceSAndroid Build Coastguard Worker                     VarType(type, glu::isDataTypeBoolOrBVec(type) ? glu::PRECISION_LAST : glu::PRECISION_HIGHP),
1274*35238bceSAndroid Build Coastguard Worker                     layoutFlags[layoutFlagNdx].flags, numInstances));
1275*35238bceSAndroid Build Coastguard Worker 
1276*35238bceSAndroid Build Coastguard Worker                 if (glu::isDataTypeMatrix(type))
1277*35238bceSAndroid Build Coastguard Worker                 {
1278*35238bceSAndroid Build Coastguard Worker                     for (int matFlagNdx = 0; matFlagNdx < DE_LENGTH_OF_ARRAY(matrixFlags); matFlagNdx++)
1279*35238bceSAndroid Build Coastguard Worker                         layoutGroup->addChild(new BlockBasicTypeCase(
1280*35238bceSAndroid Build Coastguard Worker                             m_context, (string(matrixFlags[matFlagNdx].name) + "_" + typeName).c_str(), "",
1281*35238bceSAndroid Build Coastguard Worker                             VarType(type, glu::PRECISION_HIGHP),
1282*35238bceSAndroid Build Coastguard Worker                             layoutFlags[layoutFlagNdx].flags | matrixFlags[matFlagNdx].flags, numInstances));
1283*35238bceSAndroid Build Coastguard Worker                 }
1284*35238bceSAndroid Build Coastguard Worker             }
1285*35238bceSAndroid Build Coastguard Worker         }
1286*35238bceSAndroid Build Coastguard Worker     }
1287*35238bceSAndroid Build Coastguard Worker 
1288*35238bceSAndroid Build Coastguard Worker     // ubo.multi_basic_types
1289*35238bceSAndroid Build Coastguard Worker     {
1290*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *multiBasicTypesGroup =
1291*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "multi_basic_types", "Multiple buffers with basic types");
1292*35238bceSAndroid Build Coastguard Worker         addChild(multiBasicTypesGroup);
1293*35238bceSAndroid Build Coastguard Worker 
1294*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1295*35238bceSAndroid Build Coastguard Worker         {
1296*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1297*35238bceSAndroid Build Coastguard Worker             multiBasicTypesGroup->addChild(modeGroup);
1298*35238bceSAndroid Build Coastguard Worker 
1299*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1300*35238bceSAndroid Build Coastguard Worker             {
1301*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1302*35238bceSAndroid Build Coastguard Worker                 {
1303*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1304*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1305*35238bceSAndroid Build Coastguard Worker 
1306*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1307*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1308*35238bceSAndroid Build Coastguard Worker 
1309*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockMultiBasicTypesCase(m_context, baseName.c_str(), "", baseFlags,
1310*35238bceSAndroid Build Coastguard Worker                                                                      baseFlags, bufferModes[modeNdx].mode,
1311*35238bceSAndroid Build Coastguard Worker                                                                      isArray ? 3 : 0));
1312*35238bceSAndroid Build Coastguard Worker                 }
1313*35238bceSAndroid Build Coastguard Worker             }
1314*35238bceSAndroid Build Coastguard Worker         }
1315*35238bceSAndroid Build Coastguard Worker     }
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker     // ubo.multi_nested_struct
1318*35238bceSAndroid Build Coastguard Worker     {
1319*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *multiNestedStructGroup =
1320*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "multi_nested_struct", "Multiple buffers with nested structs");
1321*35238bceSAndroid Build Coastguard Worker         addChild(multiNestedStructGroup);
1322*35238bceSAndroid Build Coastguard Worker 
1323*35238bceSAndroid Build Coastguard Worker         for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(bufferModes); modeNdx++)
1324*35238bceSAndroid Build Coastguard Worker         {
1325*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferModes[modeNdx].name, "");
1326*35238bceSAndroid Build Coastguard Worker             multiNestedStructGroup->addChild(modeGroup);
1327*35238bceSAndroid Build Coastguard Worker 
1328*35238bceSAndroid Build Coastguard Worker             for (int layoutFlagNdx = 0; layoutFlagNdx < DE_LENGTH_OF_ARRAY(layoutFlags); layoutFlagNdx++)
1329*35238bceSAndroid Build Coastguard Worker             {
1330*35238bceSAndroid Build Coastguard Worker                 for (int isArray = 0; isArray < 2; isArray++)
1331*35238bceSAndroid Build Coastguard Worker                 {
1332*35238bceSAndroid Build Coastguard Worker                     std::string baseName = layoutFlags[layoutFlagNdx].name;
1333*35238bceSAndroid Build Coastguard Worker                     uint32_t baseFlags   = layoutFlags[layoutFlagNdx].flags;
1334*35238bceSAndroid Build Coastguard Worker 
1335*35238bceSAndroid Build Coastguard Worker                     if (isArray)
1336*35238bceSAndroid Build Coastguard Worker                         baseName += "_instance_array";
1337*35238bceSAndroid Build Coastguard Worker 
1338*35238bceSAndroid Build Coastguard Worker                     modeGroup->addChild(new BlockMultiNestedStructCase(m_context, baseName.c_str(), "", baseFlags,
1339*35238bceSAndroid Build Coastguard Worker                                                                        baseFlags, bufferModes[modeNdx].mode,
1340*35238bceSAndroid Build Coastguard Worker                                                                        isArray ? 3 : 0));
1341*35238bceSAndroid Build Coastguard Worker                 }
1342*35238bceSAndroid Build Coastguard Worker             }
1343*35238bceSAndroid Build Coastguard Worker         }
1344*35238bceSAndroid Build Coastguard Worker     }
1345*35238bceSAndroid Build Coastguard Worker 
1346*35238bceSAndroid Build Coastguard Worker     // ubo.random
1347*35238bceSAndroid Build Coastguard Worker     {
1348*35238bceSAndroid Build Coastguard Worker         const uint32_t allLayouts    = FEATURE_PACKED_LAYOUT | FEATURE_SHARED_LAYOUT | FEATURE_STD140_LAYOUT;
1349*35238bceSAndroid Build Coastguard Worker         const uint32_t allBasicTypes = FEATURE_VECTORS | FEATURE_MATRICES;
1350*35238bceSAndroid Build Coastguard Worker         const uint32_t unused        = FEATURE_UNUSED_MEMBERS | FEATURE_UNUSED_VARS;
1351*35238bceSAndroid Build Coastguard Worker         const uint32_t unsized       = FEATURE_UNSIZED_ARRAYS;
1352*35238bceSAndroid Build Coastguard Worker         const uint32_t matFlags      = FEATURE_MATRIX_LAYOUT;
1353*35238bceSAndroid Build Coastguard Worker 
1354*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *randomGroup = new tcu::TestCaseGroup(m_testCtx, "random", "Random Uniform Block cases");
1355*35238bceSAndroid Build Coastguard Worker         addChild(randomGroup);
1356*35238bceSAndroid Build Coastguard Worker 
1357*35238bceSAndroid Build Coastguard Worker         // Basic types.
1358*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "scalar_types", "Scalar types only, per-block buffers",
1359*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK, allLayouts | unused, 25, 0);
1360*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "vector_types", "Scalar and vector types only, per-block buffers",
1361*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK, allLayouts | unused | FEATURE_VECTORS, 25, 25);
1362*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "basic_types", "All basic types, per-block buffers",
1363*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK, allLayouts | unused | allBasicTypes | matFlags, 25,
1364*35238bceSAndroid Build Coastguard Worker                               50);
1365*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "basic_arrays", "Arrays, per-block buffers",
1366*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1367*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | FEATURE_ARRAYS, 25, 50);
1368*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "unsized_arrays", "Unsized arrays, per-block buffers",
1369*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1370*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_ARRAYS, 25, 50);
1371*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "arrays_of_arrays", "Arrays of arrays, per-block buffers",
1372*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1373*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_ARRAYS |
1374*35238bceSAndroid Build Coastguard Worker                                   FEATURE_ARRAYS_OF_ARRAYS,
1375*35238bceSAndroid Build Coastguard Worker                               25, 950);
1376*35238bceSAndroid Build Coastguard Worker 
1377*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "basic_instance_arrays",
1378*35238bceSAndroid Build Coastguard Worker                               "Basic instance arrays, per-block buffers", SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1379*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_INSTANCE_ARRAYS, 25,
1380*35238bceSAndroid Build Coastguard Worker                               75);
1381*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "nested_structs", "Nested structs, per-block buffers",
1382*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1383*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_STRUCTS, 25, 100);
1384*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "nested_structs_arrays",
1385*35238bceSAndroid Build Coastguard Worker                               "Nested structs, arrays, per-block buffers", SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1386*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_STRUCTS |
1387*35238bceSAndroid Build Coastguard Worker                                   FEATURE_ARRAYS | FEATURE_ARRAYS_OF_ARRAYS,
1388*35238bceSAndroid Build Coastguard Worker                               25, 150);
1389*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(
1390*35238bceSAndroid Build Coastguard Worker             randomGroup, m_context, "nested_structs_instance_arrays",
1391*35238bceSAndroid Build Coastguard Worker             "Nested structs, instance arrays, per-block buffers", SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1392*35238bceSAndroid Build Coastguard Worker             allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_STRUCTS | FEATURE_INSTANCE_ARRAYS, 25,
1393*35238bceSAndroid Build Coastguard Worker             125);
1394*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "nested_structs_arrays_instance_arrays",
1395*35238bceSAndroid Build Coastguard Worker                               "Nested structs, instance arrays, per-block buffers",
1396*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK,
1397*35238bceSAndroid Build Coastguard Worker                               allLayouts | unused | allBasicTypes | matFlags | unsized | FEATURE_STRUCTS |
1398*35238bceSAndroid Build Coastguard Worker                                   FEATURE_ARRAYS | FEATURE_ARRAYS_OF_ARRAYS | FEATURE_INSTANCE_ARRAYS,
1399*35238bceSAndroid Build Coastguard Worker                               25, 175);
1400*35238bceSAndroid Build Coastguard Worker 
1401*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "all_per_block_buffers", "All random features, per-block buffers",
1402*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_PER_BLOCK, ~0u, 50, 200);
1403*35238bceSAndroid Build Coastguard Worker         createRandomCaseGroup(randomGroup, m_context, "all_shared_buffer", "All random features, shared buffer",
1404*35238bceSAndroid Build Coastguard Worker                               SSBOLayoutCase::BUFFERMODE_SINGLE, ~0u, 50, 250);
1405*35238bceSAndroid Build Coastguard Worker     }
1406*35238bceSAndroid Build Coastguard Worker }
1407*35238bceSAndroid Build Coastguard Worker 
1408*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1409*35238bceSAndroid Build Coastguard Worker } // namespace gles31
1410*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1411