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