1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Texture wrap mode test case
22*35238bceSAndroid Build Coastguard Worker *
23*35238bceSAndroid Build Coastguard Worker * \todo [petri]
24*35238bceSAndroid Build Coastguard Worker * - loop body cases (do different operations inside the loops)
25*35238bceSAndroid Build Coastguard Worker * - more complex nested loops
26*35238bceSAndroid Build Coastguard Worker * * random generated?
27*35238bceSAndroid Build Coastguard Worker * * dataflow variations
28*35238bceSAndroid Build Coastguard Worker * * mixed loop types
29*35238bceSAndroid Build Coastguard Worker * -
30*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker #include "es3fShaderLoopTests.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glsShaderLibrary.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
37*35238bceSAndroid Build Coastguard Worker
38*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
40*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker #include <map>
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using namespace std;
45*35238bceSAndroid Build Coastguard Worker using namespace tcu;
46*35238bceSAndroid Build Coastguard Worker using namespace glu;
47*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker namespace deqp
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker namespace gles3
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker namespace Functional
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker // Repeated with for, while, do-while. Examples given as 'for' loops.
57*35238bceSAndroid Build Coastguard Worker // Repeated for const, uniform, dynamic loops.
58*35238bceSAndroid Build Coastguard Worker enum LoopCase
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker LOOPCASE_EMPTY_BODY = 0, // for (...) { }
61*35238bceSAndroid Build Coastguard Worker LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_FIRST, // for (...) { break; <body>; }
62*35238bceSAndroid Build Coastguard Worker LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_LAST, // for (...) { <body>; break; }
63*35238bceSAndroid Build Coastguard Worker LOOPCASE_INFINITE_WITH_CONDITIONAL_BREAK, // for (...) { <body>; if (cond) break; }
64*35238bceSAndroid Build Coastguard Worker LOOPCASE_SINGLE_STATEMENT, // for (...) statement;
65*35238bceSAndroid Build Coastguard Worker LOOPCASE_COMPOUND_STATEMENT, // for (...) { statement; statement; }
66*35238bceSAndroid Build Coastguard Worker LOOPCASE_SEQUENCE_STATEMENT, // for (...) statement, statement;
67*35238bceSAndroid Build Coastguard Worker LOOPCASE_NO_ITERATIONS, // for (i=0; i<0; i++) ...
68*35238bceSAndroid Build Coastguard Worker LOOPCASE_SINGLE_ITERATION, // for (i=0; i<1; i++) ...
69*35238bceSAndroid Build Coastguard Worker LOOPCASE_SELECT_ITERATION_COUNT, // for (i=0; i<a?b:c; i++) ...
70*35238bceSAndroid Build Coastguard Worker LOOPCASE_CONDITIONAL_CONTINUE, // for (...) { if (cond) continue; }
71*35238bceSAndroid Build Coastguard Worker LOOPCASE_UNCONDITIONAL_CONTINUE, // for (...) { <body>; continue; }
72*35238bceSAndroid Build Coastguard Worker LOOPCASE_ONLY_CONTINUE, // for (...) { continue; }
73*35238bceSAndroid Build Coastguard Worker LOOPCASE_DOUBLE_CONTINUE, // for (...) { if (cond) continue; <body>; continue; }
74*35238bceSAndroid Build Coastguard Worker LOOPCASE_CONDITIONAL_BREAK, // for (...) { if (cond) break; }
75*35238bceSAndroid Build Coastguard Worker LOOPCASE_UNCONDITIONAL_BREAK, // for (...) { <body>; break; }
76*35238bceSAndroid Build Coastguard Worker LOOPCASE_PRE_INCREMENT, // for (...; ++i) { <body>; }
77*35238bceSAndroid Build Coastguard Worker LOOPCASE_POST_INCREMENT, // for (...; i++) { <body>; }
78*35238bceSAndroid Build Coastguard Worker LOOPCASE_MIXED_BREAK_CONTINUE,
79*35238bceSAndroid Build Coastguard Worker LOOPCASE_VECTOR_COUNTER, // for (ivec3 ndx = ...; ndx.x < ndx.y; ndx.x += ndx.z) { ... }
80*35238bceSAndroid Build Coastguard Worker LOOPCASE_101_ITERATIONS, // loop for 101 iterations
81*35238bceSAndroid Build Coastguard Worker LOOPCASE_SEQUENCE, // two loops in sequence
82*35238bceSAndroid Build Coastguard Worker LOOPCASE_NESTED, // two nested loops
83*35238bceSAndroid Build Coastguard Worker LOOPCASE_NESTED_SEQUENCE, // two loops in sequence nested inside a third
84*35238bceSAndroid Build Coastguard Worker LOOPCASE_NESTED_TRICKY_DATAFLOW_1, // nested loops with tricky data flow
85*35238bceSAndroid Build Coastguard Worker LOOPCASE_NESTED_TRICKY_DATAFLOW_2, // nested loops with tricky data flow
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker //LOOPCASE_MULTI_DECLARATION, // for (int i,j,k; ...) ... -- illegal?
88*35238bceSAndroid Build Coastguard Worker
89*35238bceSAndroid Build Coastguard Worker LOOPCASE_LAST
90*35238bceSAndroid Build Coastguard Worker };
91*35238bceSAndroid Build Coastguard Worker
getLoopCaseName(LoopCase loopCase)92*35238bceSAndroid Build Coastguard Worker static const char *getLoopCaseName(LoopCase loopCase)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker static const char *s_names[] = {
95*35238bceSAndroid Build Coastguard Worker "empty_body",
96*35238bceSAndroid Build Coastguard Worker "infinite_with_unconditional_break_first",
97*35238bceSAndroid Build Coastguard Worker "infinite_with_unconditional_break_last",
98*35238bceSAndroid Build Coastguard Worker "infinite_with_conditional_break",
99*35238bceSAndroid Build Coastguard Worker "single_statement",
100*35238bceSAndroid Build Coastguard Worker "compound_statement",
101*35238bceSAndroid Build Coastguard Worker "sequence_statement",
102*35238bceSAndroid Build Coastguard Worker "no_iterations",
103*35238bceSAndroid Build Coastguard Worker "single_iteration",
104*35238bceSAndroid Build Coastguard Worker "select_iteration_count",
105*35238bceSAndroid Build Coastguard Worker "conditional_continue",
106*35238bceSAndroid Build Coastguard Worker "unconditional_continue",
107*35238bceSAndroid Build Coastguard Worker "only_continue",
108*35238bceSAndroid Build Coastguard Worker "double_continue",
109*35238bceSAndroid Build Coastguard Worker "conditional_break",
110*35238bceSAndroid Build Coastguard Worker "unconditional_break",
111*35238bceSAndroid Build Coastguard Worker "pre_increment",
112*35238bceSAndroid Build Coastguard Worker "post_increment",
113*35238bceSAndroid Build Coastguard Worker "mixed_break_continue",
114*35238bceSAndroid Build Coastguard Worker "vector_counter",
115*35238bceSAndroid Build Coastguard Worker "101_iterations",
116*35238bceSAndroid Build Coastguard Worker "sequence",
117*35238bceSAndroid Build Coastguard Worker "nested",
118*35238bceSAndroid Build Coastguard Worker "nested_sequence",
119*35238bceSAndroid Build Coastguard Worker "nested_tricky_dataflow_1",
120*35238bceSAndroid Build Coastguard Worker "nested_tricky_dataflow_2"
121*35238bceSAndroid Build Coastguard Worker //"multi_declaration",
122*35238bceSAndroid Build Coastguard Worker };
123*35238bceSAndroid Build Coastguard Worker
124*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == LOOPCASE_LAST);
125*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deInBounds32((int)loopCase, 0, LOOPCASE_LAST));
126*35238bceSAndroid Build Coastguard Worker return s_names[(int)loopCase];
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker
129*35238bceSAndroid Build Coastguard Worker // Complex loop cases.
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker /*enum LoopBody
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker LOOPBODY_READ_UNIFORM = 0,
134*35238bceSAndroid Build Coastguard Worker LOOPBODY_READ_UNIFORM_ARRAY,
135*35238bceSAndroid Build Coastguard Worker LOOPBODY_READ_
136*35238bceSAndroid Build Coastguard Worker };*/
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker enum LoopType
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker LOOPTYPE_FOR = 0,
141*35238bceSAndroid Build Coastguard Worker LOOPTYPE_WHILE,
142*35238bceSAndroid Build Coastguard Worker LOOPTYPE_DO_WHILE,
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker LOOPTYPE_LAST
145*35238bceSAndroid Build Coastguard Worker };
146*35238bceSAndroid Build Coastguard Worker
getLoopTypeName(LoopType loopType)147*35238bceSAndroid Build Coastguard Worker static const char *getLoopTypeName(LoopType loopType)
148*35238bceSAndroid Build Coastguard Worker {
149*35238bceSAndroid Build Coastguard Worker static const char *s_names[] = {"for", "while", "do_while"};
150*35238bceSAndroid Build Coastguard Worker
151*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == LOOPTYPE_LAST);
152*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deInBounds32((int)loopType, 0, LOOPTYPE_LAST));
153*35238bceSAndroid Build Coastguard Worker return s_names[(int)loopType];
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker enum LoopCountType
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker LOOPCOUNT_CONSTANT = 0,
159*35238bceSAndroid Build Coastguard Worker LOOPCOUNT_UNIFORM,
160*35238bceSAndroid Build Coastguard Worker LOOPCOUNT_DYNAMIC,
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker LOOPCOUNT_LAST
163*35238bceSAndroid Build Coastguard Worker };
164*35238bceSAndroid Build Coastguard Worker
getLoopCountTypeName(LoopCountType countType)165*35238bceSAndroid Build Coastguard Worker static const char *getLoopCountTypeName(LoopCountType countType)
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker static const char *s_names[] = {"constant", "uniform", "dynamic"};
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == LOOPCOUNT_LAST);
170*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deInBounds32((int)countType, 0, LOOPCOUNT_LAST));
171*35238bceSAndroid Build Coastguard Worker return s_names[(int)countType];
172*35238bceSAndroid Build Coastguard Worker }
173*35238bceSAndroid Build Coastguard Worker
evalLoop0Iters(ShaderEvalContext & c)174*35238bceSAndroid Build Coastguard Worker static void evalLoop0Iters(ShaderEvalContext &c)
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker c.color.xyz() = c.coords.swizzle(0, 1, 2);
177*35238bceSAndroid Build Coastguard Worker }
evalLoop1Iters(ShaderEvalContext & c)178*35238bceSAndroid Build Coastguard Worker static void evalLoop1Iters(ShaderEvalContext &c)
179*35238bceSAndroid Build Coastguard Worker {
180*35238bceSAndroid Build Coastguard Worker c.color.xyz() = c.coords.swizzle(1, 2, 3);
181*35238bceSAndroid Build Coastguard Worker }
evalLoop2Iters(ShaderEvalContext & c)182*35238bceSAndroid Build Coastguard Worker static void evalLoop2Iters(ShaderEvalContext &c)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker c.color.xyz() = c.coords.swizzle(2, 3, 0);
185*35238bceSAndroid Build Coastguard Worker }
evalLoop3Iters(ShaderEvalContext & c)186*35238bceSAndroid Build Coastguard Worker static void evalLoop3Iters(ShaderEvalContext &c)
187*35238bceSAndroid Build Coastguard Worker {
188*35238bceSAndroid Build Coastguard Worker c.color.xyz() = c.coords.swizzle(3, 0, 1);
189*35238bceSAndroid Build Coastguard Worker }
190*35238bceSAndroid Build Coastguard Worker
getLoopEvalFunc(int numIters)191*35238bceSAndroid Build Coastguard Worker static ShaderEvalFunc getLoopEvalFunc(int numIters)
192*35238bceSAndroid Build Coastguard Worker {
193*35238bceSAndroid Build Coastguard Worker switch (numIters % 4)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker case 0:
196*35238bceSAndroid Build Coastguard Worker return evalLoop0Iters;
197*35238bceSAndroid Build Coastguard Worker case 1:
198*35238bceSAndroid Build Coastguard Worker return evalLoop1Iters;
199*35238bceSAndroid Build Coastguard Worker case 2:
200*35238bceSAndroid Build Coastguard Worker return evalLoop2Iters;
201*35238bceSAndroid Build Coastguard Worker case 3:
202*35238bceSAndroid Build Coastguard Worker return evalLoop3Iters;
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker DE_FATAL("Invalid loop iteration count.");
206*35238bceSAndroid Build Coastguard Worker return NULL;
207*35238bceSAndroid Build Coastguard Worker }
208*35238bceSAndroid Build Coastguard Worker
209*35238bceSAndroid Build Coastguard Worker // ShaderLoopCase
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker class ShaderLoopCase : public ShaderRenderCase
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker public:
214*35238bceSAndroid Build Coastguard Worker ShaderLoopCase(Context &context, const char *name, const char *description, bool isVertexCase,
215*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc, const char *vertShaderSource, const char *fragShaderSource);
216*35238bceSAndroid Build Coastguard Worker virtual ~ShaderLoopCase(void);
217*35238bceSAndroid Build Coastguard Worker
218*35238bceSAndroid Build Coastguard Worker private:
219*35238bceSAndroid Build Coastguard Worker ShaderLoopCase(const ShaderLoopCase &); // not allowed!
220*35238bceSAndroid Build Coastguard Worker ShaderLoopCase &operator=(const ShaderLoopCase &); // not allowed!
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker virtual void setup(int programID);
223*35238bceSAndroid Build Coastguard Worker virtual void setupUniforms(int programID, const Vec4 &constCoords);
224*35238bceSAndroid Build Coastguard Worker };
225*35238bceSAndroid Build Coastguard Worker
ShaderLoopCase(Context & context,const char * name,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,const char * vertShaderSource,const char * fragShaderSource)226*35238bceSAndroid Build Coastguard Worker ShaderLoopCase::ShaderLoopCase(Context &context, const char *name, const char *description, bool isVertexCase,
227*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc, const char *vertShaderSource, const char *fragShaderSource)
228*35238bceSAndroid Build Coastguard Worker : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
229*35238bceSAndroid Build Coastguard Worker description, isVertexCase, evalFunc)
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = vertShaderSource;
232*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragShaderSource;
233*35238bceSAndroid Build Coastguard Worker }
234*35238bceSAndroid Build Coastguard Worker
~ShaderLoopCase(void)235*35238bceSAndroid Build Coastguard Worker ShaderLoopCase::~ShaderLoopCase(void)
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker }
238*35238bceSAndroid Build Coastguard Worker
setup(int programID)239*35238bceSAndroid Build Coastguard Worker void ShaderLoopCase::setup(int programID)
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker DE_UNREF(programID);
242*35238bceSAndroid Build Coastguard Worker }
243*35238bceSAndroid Build Coastguard Worker
setupUniforms(int programID,const Vec4 & constCoords)244*35238bceSAndroid Build Coastguard Worker void ShaderLoopCase::setupUniforms(int programID, const Vec4 &constCoords)
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker DE_UNREF(programID);
247*35238bceSAndroid Build Coastguard Worker DE_UNREF(constCoords);
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker // Test case creation.
251*35238bceSAndroid Build Coastguard Worker
createGenericLoopCase(Context & context,const char * caseName,const char * description,bool isVertexCase,LoopType loopType,LoopCountType loopCountType,Precision loopCountPrecision,DataType loopCountDataType)252*35238bceSAndroid Build Coastguard Worker static ShaderLoopCase *createGenericLoopCase(Context &context, const char *caseName, const char *description,
253*35238bceSAndroid Build Coastguard Worker bool isVertexCase, LoopType loopType, LoopCountType loopCountType,
254*35238bceSAndroid Build Coastguard Worker Precision loopCountPrecision, DataType loopCountDataType)
255*35238bceSAndroid Build Coastguard Worker {
256*35238bceSAndroid Build Coastguard Worker std::ostringstream vtx;
257*35238bceSAndroid Build Coastguard Worker std::ostringstream frag;
258*35238bceSAndroid Build Coastguard Worker std::ostringstream &op = isVertexCase ? vtx : frag;
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker vtx << "#version 300 es\n";
261*35238bceSAndroid Build Coastguard Worker frag << "#version 300 es\n";
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker vtx << "in highp vec4 a_position;\n";
264*35238bceSAndroid Build Coastguard Worker vtx << "in highp vec4 a_coords;\n";
265*35238bceSAndroid Build Coastguard Worker frag << "layout(location = 0) out mediump vec4 o_color;\n";
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
268*35238bceSAndroid Build Coastguard Worker vtx << "in mediump float a_one;\n";
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker vtx << "out mediump vec3 v_color;\n";
273*35238bceSAndroid Build Coastguard Worker frag << "in mediump vec3 v_color;\n";
274*35238bceSAndroid Build Coastguard Worker }
275*35238bceSAndroid Build Coastguard Worker else
276*35238bceSAndroid Build Coastguard Worker {
277*35238bceSAndroid Build Coastguard Worker vtx << "out mediump vec4 v_coords;\n";
278*35238bceSAndroid Build Coastguard Worker frag << "in mediump vec4 v_coords;\n";
279*35238bceSAndroid Build Coastguard Worker
280*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
281*35238bceSAndroid Build Coastguard Worker {
282*35238bceSAndroid Build Coastguard Worker vtx << "out mediump float v_one;\n";
283*35238bceSAndroid Build Coastguard Worker frag << "in mediump float v_one;\n";
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker }
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Worker // \todo [petri] Pass numLoopIters from outside?
288*35238bceSAndroid Build Coastguard Worker int numLoopIters = 3;
289*35238bceSAndroid Build Coastguard Worker bool isIntCounter = isDataTypeIntOrIVec(loopCountDataType);
290*35238bceSAndroid Build Coastguard Worker
291*35238bceSAndroid Build Coastguard Worker if (isIntCounter)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_UNIFORM || loopCountType == LOOPCOUNT_DYNAMIC)
294*35238bceSAndroid Build Coastguard Worker op << "uniform ${COUNTER_PRECISION} int " << getIntUniformName(numLoopIters) << ";\n";
295*35238bceSAndroid Build Coastguard Worker }
296*35238bceSAndroid Build Coastguard Worker else
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_UNIFORM || loopCountType == LOOPCOUNT_DYNAMIC)
299*35238bceSAndroid Build Coastguard Worker op << "uniform ${COUNTER_PRECISION} float " << getFloatFractionUniformName(numLoopIters) << ";\n";
300*35238bceSAndroid Build Coastguard Worker
301*35238bceSAndroid Build Coastguard Worker if (numLoopIters != 1)
302*35238bceSAndroid Build Coastguard Worker op << "uniform ${COUNTER_PRECISION} float uf_one;\n";
303*35238bceSAndroid Build Coastguard Worker }
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker vtx << "\n";
306*35238bceSAndroid Build Coastguard Worker vtx << "void main()\n";
307*35238bceSAndroid Build Coastguard Worker vtx << "{\n";
308*35238bceSAndroid Build Coastguard Worker vtx << " gl_Position = a_position;\n";
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker frag << "\n";
311*35238bceSAndroid Build Coastguard Worker frag << "void main()\n";
312*35238bceSAndroid Build Coastguard Worker frag << "{\n";
313*35238bceSAndroid Build Coastguard Worker
314*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
315*35238bceSAndroid Build Coastguard Worker vtx << " ${PRECISION} vec4 coords = a_coords;\n";
316*35238bceSAndroid Build Coastguard Worker else
317*35238bceSAndroid Build Coastguard Worker frag << " ${PRECISION} vec4 coords = v_coords;\n";
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
320*35238bceSAndroid Build Coastguard Worker {
321*35238bceSAndroid Build Coastguard Worker if (isIntCounter)
322*35238bceSAndroid Build Coastguard Worker {
323*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
324*35238bceSAndroid Build Coastguard Worker vtx << " ${COUNTER_PRECISION} int one = int(a_one + 0.5);\n";
325*35238bceSAndroid Build Coastguard Worker else
326*35238bceSAndroid Build Coastguard Worker frag << " ${COUNTER_PRECISION} int one = int(v_one + 0.5);\n";
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker else
329*35238bceSAndroid Build Coastguard Worker {
330*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
331*35238bceSAndroid Build Coastguard Worker vtx << " ${COUNTER_PRECISION} float one = a_one;\n";
332*35238bceSAndroid Build Coastguard Worker else
333*35238bceSAndroid Build Coastguard Worker frag << " ${COUNTER_PRECISION} float one = v_one;\n";
334*35238bceSAndroid Build Coastguard Worker }
335*35238bceSAndroid Build Coastguard Worker }
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker // Read array.
338*35238bceSAndroid Build Coastguard Worker op << " ${PRECISION} vec4 res = coords;\n";
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker // Loop iteration count.
341*35238bceSAndroid Build Coastguard Worker string iterMaxStr;
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker if (isIntCounter)
344*35238bceSAndroid Build Coastguard Worker {
345*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
346*35238bceSAndroid Build Coastguard Worker iterMaxStr = de::toString(numLoopIters);
347*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
348*35238bceSAndroid Build Coastguard Worker iterMaxStr = getIntUniformName(numLoopIters);
349*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
350*35238bceSAndroid Build Coastguard Worker iterMaxStr = string(getIntUniformName(numLoopIters)) + "*one";
351*35238bceSAndroid Build Coastguard Worker else
352*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker else
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
357*35238bceSAndroid Build Coastguard Worker iterMaxStr = "1.0";
358*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
359*35238bceSAndroid Build Coastguard Worker iterMaxStr = "uf_one";
360*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
361*35238bceSAndroid Build Coastguard Worker iterMaxStr = "uf_one*one";
362*35238bceSAndroid Build Coastguard Worker else
363*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker
366*35238bceSAndroid Build Coastguard Worker // Loop operations.
367*35238bceSAndroid Build Coastguard Worker string initValue = isIntCounter ? "0" : "0.05";
368*35238bceSAndroid Build Coastguard Worker string loopCountDeclStr = "${COUNTER_PRECISION} ${LOOP_VAR_TYPE} ndx = " + initValue;
369*35238bceSAndroid Build Coastguard Worker string loopCmpStr = ("ndx < " + iterMaxStr);
370*35238bceSAndroid Build Coastguard Worker string incrementStr;
371*35238bceSAndroid Build Coastguard Worker if (isIntCounter)
372*35238bceSAndroid Build Coastguard Worker incrementStr = "ndx++";
373*35238bceSAndroid Build Coastguard Worker else
374*35238bceSAndroid Build Coastguard Worker {
375*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
376*35238bceSAndroid Build Coastguard Worker incrementStr = string("ndx += ") + de::toString(1.0f / (float)numLoopIters);
377*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
378*35238bceSAndroid Build Coastguard Worker incrementStr = string("ndx += ") + getFloatFractionUniformName(numLoopIters);
379*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
380*35238bceSAndroid Build Coastguard Worker incrementStr = string("ndx += ") + getFloatFractionUniformName(numLoopIters) + "*one";
381*35238bceSAndroid Build Coastguard Worker else
382*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
383*35238bceSAndroid Build Coastguard Worker }
384*35238bceSAndroid Build Coastguard Worker
385*35238bceSAndroid Build Coastguard Worker // Loop body.
386*35238bceSAndroid Build Coastguard Worker string loopBody;
387*35238bceSAndroid Build Coastguard Worker
388*35238bceSAndroid Build Coastguard Worker loopBody = " res = res.yzwx;\n";
389*35238bceSAndroid Build Coastguard Worker
390*35238bceSAndroid Build Coastguard Worker if (loopType == LOOPTYPE_FOR)
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker op << " for (" + loopCountDeclStr + "; " + loopCmpStr + "; " + incrementStr + ")\n";
393*35238bceSAndroid Build Coastguard Worker op << " {\n";
394*35238bceSAndroid Build Coastguard Worker op << loopBody;
395*35238bceSAndroid Build Coastguard Worker op << " }\n";
396*35238bceSAndroid Build Coastguard Worker }
397*35238bceSAndroid Build Coastguard Worker else if (loopType == LOOPTYPE_WHILE)
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker op << "\t" << loopCountDeclStr + ";\n";
400*35238bceSAndroid Build Coastguard Worker op << " while (" + loopCmpStr + ")\n";
401*35238bceSAndroid Build Coastguard Worker op << " {\n";
402*35238bceSAndroid Build Coastguard Worker op << loopBody;
403*35238bceSAndroid Build Coastguard Worker op << "\t\t" + incrementStr + ";\n";
404*35238bceSAndroid Build Coastguard Worker op << " }\n";
405*35238bceSAndroid Build Coastguard Worker }
406*35238bceSAndroid Build Coastguard Worker else if (loopType == LOOPTYPE_DO_WHILE)
407*35238bceSAndroid Build Coastguard Worker {
408*35238bceSAndroid Build Coastguard Worker op << "\t" << loopCountDeclStr + ";\n";
409*35238bceSAndroid Build Coastguard Worker op << " do\n";
410*35238bceSAndroid Build Coastguard Worker op << " {\n";
411*35238bceSAndroid Build Coastguard Worker op << loopBody;
412*35238bceSAndroid Build Coastguard Worker op << "\t\t" + incrementStr + ";\n";
413*35238bceSAndroid Build Coastguard Worker op << " } while (" + loopCmpStr + ");\n";
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker else
416*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker vtx << " v_color = res.rgb;\n";
421*35238bceSAndroid Build Coastguard Worker frag << " o_color = vec4(v_color.rgb, 1.0);\n";
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker else
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker vtx << " v_coords = a_coords;\n";
426*35238bceSAndroid Build Coastguard Worker frag << " o_color = vec4(res.rgb, 1.0);\n";
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
429*35238bceSAndroid Build Coastguard Worker vtx << " v_one = a_one;\n";
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker
432*35238bceSAndroid Build Coastguard Worker vtx << "}\n";
433*35238bceSAndroid Build Coastguard Worker frag << "}\n";
434*35238bceSAndroid Build Coastguard Worker
435*35238bceSAndroid Build Coastguard Worker // Fill in shader templates.
436*35238bceSAndroid Build Coastguard Worker map<string, string> params;
437*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("LOOP_VAR_TYPE", getDataTypeName(loopCountDataType)));
438*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("PRECISION", "mediump"));
439*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("COUNTER_PRECISION", getPrecisionName(loopCountPrecision)));
440*35238bceSAndroid Build Coastguard Worker
441*35238bceSAndroid Build Coastguard Worker StringTemplate vertTemplate(vtx.str().c_str());
442*35238bceSAndroid Build Coastguard Worker StringTemplate fragTemplate(frag.str().c_str());
443*35238bceSAndroid Build Coastguard Worker string vertexShaderSource = vertTemplate.specialize(params);
444*35238bceSAndroid Build Coastguard Worker string fragmentShaderSource = fragTemplate.specialize(params);
445*35238bceSAndroid Build Coastguard Worker
446*35238bceSAndroid Build Coastguard Worker // Create the case.
447*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc = getLoopEvalFunc(numLoopIters);
448*35238bceSAndroid Build Coastguard Worker return new ShaderLoopCase(context, caseName, description, isVertexCase, evalFunc, vertexShaderSource.c_str(),
449*35238bceSAndroid Build Coastguard Worker fragmentShaderSource.c_str());
450*35238bceSAndroid Build Coastguard Worker }
451*35238bceSAndroid Build Coastguard Worker
452*35238bceSAndroid Build Coastguard Worker // \todo [petri] Generalize to float as well?
createSpecialLoopCase(Context & context,const char * caseName,const char * description,bool isVertexCase,LoopCase loopCase,LoopType loopType,LoopCountType loopCountType)453*35238bceSAndroid Build Coastguard Worker static ShaderLoopCase *createSpecialLoopCase(Context &context, const char *caseName, const char *description,
454*35238bceSAndroid Build Coastguard Worker bool isVertexCase, LoopCase loopCase, LoopType loopType,
455*35238bceSAndroid Build Coastguard Worker LoopCountType loopCountType)
456*35238bceSAndroid Build Coastguard Worker {
457*35238bceSAndroid Build Coastguard Worker std::ostringstream vtx;
458*35238bceSAndroid Build Coastguard Worker std::ostringstream frag;
459*35238bceSAndroid Build Coastguard Worker std::ostringstream &op = isVertexCase ? vtx : frag;
460*35238bceSAndroid Build Coastguard Worker
461*35238bceSAndroid Build Coastguard Worker vtx << "#version 300 es\n";
462*35238bceSAndroid Build Coastguard Worker frag << "#version 300 es\n";
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker vtx << "in highp vec4 a_position;\n";
465*35238bceSAndroid Build Coastguard Worker vtx << "in highp vec4 a_coords;\n";
466*35238bceSAndroid Build Coastguard Worker frag << "layout(location = 0) out mediump vec4 o_color;\n";
467*35238bceSAndroid Build Coastguard Worker
468*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
469*35238bceSAndroid Build Coastguard Worker vtx << "in mediump float a_one;\n";
470*35238bceSAndroid Build Coastguard Worker
471*35238bceSAndroid Build Coastguard Worker // Attribute and varyings.
472*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
473*35238bceSAndroid Build Coastguard Worker {
474*35238bceSAndroid Build Coastguard Worker vtx << "out mediump vec3 v_color;\n";
475*35238bceSAndroid Build Coastguard Worker frag << "in mediump vec3 v_color;\n";
476*35238bceSAndroid Build Coastguard Worker }
477*35238bceSAndroid Build Coastguard Worker else
478*35238bceSAndroid Build Coastguard Worker {
479*35238bceSAndroid Build Coastguard Worker vtx << "out mediump vec4 v_coords;\n";
480*35238bceSAndroid Build Coastguard Worker frag << "in mediump vec4 v_coords;\n";
481*35238bceSAndroid Build Coastguard Worker
482*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker vtx << "out mediump float v_one;\n";
485*35238bceSAndroid Build Coastguard Worker frag << "in mediump float v_one;\n";
486*35238bceSAndroid Build Coastguard Worker }
487*35238bceSAndroid Build Coastguard Worker }
488*35238bceSAndroid Build Coastguard Worker
489*35238bceSAndroid Build Coastguard Worker if (loopCase == LOOPCASE_SELECT_ITERATION_COUNT)
490*35238bceSAndroid Build Coastguard Worker op << "uniform bool ub_true;\n";
491*35238bceSAndroid Build Coastguard Worker
492*35238bceSAndroid Build Coastguard Worker op << "uniform ${COUNTER_PRECISION} int ui_zero, ui_one, ui_two, ui_three, ui_four, ui_five, ui_six;\n";
493*35238bceSAndroid Build Coastguard Worker if (loopCase == LOOPCASE_101_ITERATIONS)
494*35238bceSAndroid Build Coastguard Worker op << "uniform ${COUNTER_PRECISION} int ui_oneHundredOne;\n";
495*35238bceSAndroid Build Coastguard Worker
496*35238bceSAndroid Build Coastguard Worker int iterCount = 3; // value to use in loop
497*35238bceSAndroid Build Coastguard Worker int numIters = 3; // actual number of iterations
498*35238bceSAndroid Build Coastguard Worker
499*35238bceSAndroid Build Coastguard Worker vtx << "\n";
500*35238bceSAndroid Build Coastguard Worker vtx << "void main()\n";
501*35238bceSAndroid Build Coastguard Worker vtx << "{\n";
502*35238bceSAndroid Build Coastguard Worker vtx << " gl_Position = a_position;\n";
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker frag << "\n";
505*35238bceSAndroid Build Coastguard Worker frag << "void main()\n";
506*35238bceSAndroid Build Coastguard Worker frag << "{\n";
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
509*35238bceSAndroid Build Coastguard Worker {
510*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
511*35238bceSAndroid Build Coastguard Worker vtx << " ${COUNTER_PRECISION} int one = int(a_one + 0.5);\n";
512*35238bceSAndroid Build Coastguard Worker else
513*35238bceSAndroid Build Coastguard Worker frag << " ${COUNTER_PRECISION} int one = int(v_one + 0.5);\n";
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker
516*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
517*35238bceSAndroid Build Coastguard Worker vtx << " ${PRECISION} vec4 coords = a_coords;\n";
518*35238bceSAndroid Build Coastguard Worker else
519*35238bceSAndroid Build Coastguard Worker frag << " ${PRECISION} vec4 coords = v_coords;\n";
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker // Read array.
522*35238bceSAndroid Build Coastguard Worker op << " ${PRECISION} vec4 res = coords;\n";
523*35238bceSAndroid Build Coastguard Worker
524*35238bceSAndroid Build Coastguard Worker // Handle all loop types.
525*35238bceSAndroid Build Coastguard Worker string counterPrecisionStr = "mediump";
526*35238bceSAndroid Build Coastguard Worker string forLoopStr;
527*35238bceSAndroid Build Coastguard Worker string whileLoopStr;
528*35238bceSAndroid Build Coastguard Worker string doWhileLoopPreStr;
529*35238bceSAndroid Build Coastguard Worker string doWhileLoopPostStr;
530*35238bceSAndroid Build Coastguard Worker
531*35238bceSAndroid Build Coastguard Worker if (loopType == LOOPTYPE_FOR)
532*35238bceSAndroid Build Coastguard Worker {
533*35238bceSAndroid Build Coastguard Worker switch (loopCase)
534*35238bceSAndroid Build Coastguard Worker {
535*35238bceSAndroid Build Coastguard Worker case LOOPCASE_EMPTY_BODY:
536*35238bceSAndroid Build Coastguard Worker numIters = 0;
537*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} {}\n";
538*35238bceSAndroid Build Coastguard Worker break;
539*35238bceSAndroid Build Coastguard Worker
540*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_FIRST:
541*35238bceSAndroid Build Coastguard Worker numIters = 0;
542*35238bceSAndroid Build Coastguard Worker op << " for (;;) { break; res = res.yzwx; }\n";
543*35238bceSAndroid Build Coastguard Worker break;
544*35238bceSAndroid Build Coastguard Worker
545*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_LAST:
546*35238bceSAndroid Build Coastguard Worker numIters = 1;
547*35238bceSAndroid Build Coastguard Worker op << " for (;;) { res = res.yzwx; break; }\n";
548*35238bceSAndroid Build Coastguard Worker break;
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_CONDITIONAL_BREAK:
551*35238bceSAndroid Build Coastguard Worker numIters = 2;
552*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
553*35238bceSAndroid Build Coastguard Worker op << " for (;;) { res = res.yzwx; if (i == ${ONE}) break; i++; }\n";
554*35238bceSAndroid Build Coastguard Worker break;
555*35238bceSAndroid Build Coastguard Worker
556*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_STATEMENT:
557*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} res = res.yzwx;\n";
558*35238bceSAndroid Build Coastguard Worker break;
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker case LOOPCASE_COMPOUND_STATEMENT:
561*35238bceSAndroid Build Coastguard Worker iterCount = 2;
562*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
563*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { res = res.yzwx; res = res.yzwx; }\n";
564*35238bceSAndroid Build Coastguard Worker break;
565*35238bceSAndroid Build Coastguard Worker
566*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE_STATEMENT:
567*35238bceSAndroid Build Coastguard Worker iterCount = 2;
568*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
569*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} res = res.yzwx, res = res.yzwx;\n";
570*35238bceSAndroid Build Coastguard Worker break;
571*35238bceSAndroid Build Coastguard Worker
572*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NO_ITERATIONS:
573*35238bceSAndroid Build Coastguard Worker iterCount = 0;
574*35238bceSAndroid Build Coastguard Worker numIters = 0;
575*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} res = res.yzwx;\n";
576*35238bceSAndroid Build Coastguard Worker break;
577*35238bceSAndroid Build Coastguard Worker
578*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_ITERATION:
579*35238bceSAndroid Build Coastguard Worker iterCount = 1;
580*35238bceSAndroid Build Coastguard Worker numIters = 1;
581*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} res = res.yzwx;\n";
582*35238bceSAndroid Build Coastguard Worker break;
583*35238bceSAndroid Build Coastguard Worker
584*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SELECT_ITERATION_COUNT:
585*35238bceSAndroid Build Coastguard Worker op << " for (int i = 0; i < (ub_true ? ${ITER_COUNT} : 0); i++) res = res.yzwx;\n";
586*35238bceSAndroid Build Coastguard Worker break;
587*35238bceSAndroid Build Coastguard Worker
588*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_CONTINUE:
589*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
590*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { if (i == ${TWO}) continue; res = res.yzwx; }\n";
591*35238bceSAndroid Build Coastguard Worker break;
592*35238bceSAndroid Build Coastguard Worker
593*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_CONTINUE:
594*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { res = res.yzwx; continue; }\n";
595*35238bceSAndroid Build Coastguard Worker break;
596*35238bceSAndroid Build Coastguard Worker
597*35238bceSAndroid Build Coastguard Worker case LOOPCASE_ONLY_CONTINUE:
598*35238bceSAndroid Build Coastguard Worker numIters = 0;
599*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { continue; }\n";
600*35238bceSAndroid Build Coastguard Worker break;
601*35238bceSAndroid Build Coastguard Worker
602*35238bceSAndroid Build Coastguard Worker case LOOPCASE_DOUBLE_CONTINUE:
603*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
604*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { if (i == ${TWO}) continue; res = res.yzwx; continue; }\n";
605*35238bceSAndroid Build Coastguard Worker break;
606*35238bceSAndroid Build Coastguard Worker
607*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_BREAK:
608*35238bceSAndroid Build Coastguard Worker numIters = 2;
609*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { if (i == ${TWO}) break; res = res.yzwx; }\n";
610*35238bceSAndroid Build Coastguard Worker break;
611*35238bceSAndroid Build Coastguard Worker
612*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_BREAK:
613*35238bceSAndroid Build Coastguard Worker numIters = 1;
614*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { res = res.yzwx; break; }\n";
615*35238bceSAndroid Build Coastguard Worker break;
616*35238bceSAndroid Build Coastguard Worker
617*35238bceSAndroid Build Coastguard Worker case LOOPCASE_PRE_INCREMENT:
618*35238bceSAndroid Build Coastguard Worker op << " for (int i = 0; i < ${ITER_COUNT}; ++i) { res = res.yzwx; }\n";
619*35238bceSAndroid Build Coastguard Worker break;
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker case LOOPCASE_POST_INCREMENT:
622*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { res = res.yzwx; }\n";
623*35238bceSAndroid Build Coastguard Worker break;
624*35238bceSAndroid Build Coastguard Worker
625*35238bceSAndroid Build Coastguard Worker case LOOPCASE_MIXED_BREAK_CONTINUE:
626*35238bceSAndroid Build Coastguard Worker numIters = 2;
627*35238bceSAndroid Build Coastguard Worker iterCount = 5;
628*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} { if (i == 0) continue; else if (i == 3) break; res = res.yzwx; }\n";
629*35238bceSAndroid Build Coastguard Worker break;
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker case LOOPCASE_VECTOR_COUNTER:
632*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} ivec4 i = ivec4(0, 1, ${ITER_COUNT}, 0); i.x < i.z; i.x += i.y) { res "
633*35238bceSAndroid Build Coastguard Worker "= "
634*35238bceSAndroid Build Coastguard Worker "res.yzwx; }\n";
635*35238bceSAndroid Build Coastguard Worker break;
636*35238bceSAndroid Build Coastguard Worker
637*35238bceSAndroid Build Coastguard Worker case LOOPCASE_101_ITERATIONS:
638*35238bceSAndroid Build Coastguard Worker numIters = iterCount = 101;
639*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP} res = res.yzwx;\n";
640*35238bceSAndroid Build Coastguard Worker break;
641*35238bceSAndroid Build Coastguard Worker
642*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE:
643*35238bceSAndroid Build Coastguard Worker iterCount = 5;
644*35238bceSAndroid Build Coastguard Worker numIters = 5;
645*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i;\n";
646*35238bceSAndroid Build Coastguard Worker op << " for (i = 0; i < ${TWO}; i++) { res = res.yzwx; }\n";
647*35238bceSAndroid Build Coastguard Worker op << " for (; i < ${ITER_COUNT}; i++) { res = res.yzwx; }\n";
648*35238bceSAndroid Build Coastguard Worker break;
649*35238bceSAndroid Build Coastguard Worker
650*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED:
651*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
652*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int i = 0; i < ${TWO}; i++)\n";
653*35238bceSAndroid Build Coastguard Worker op << " {\n";
654*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int j = 0; j < ${ITER_COUNT}; j++)\n";
655*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
656*35238bceSAndroid Build Coastguard Worker op << " }\n";
657*35238bceSAndroid Build Coastguard Worker break;
658*35238bceSAndroid Build Coastguard Worker
659*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_SEQUENCE:
660*35238bceSAndroid Build Coastguard Worker numIters = 3 * iterCount;
661*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int i = 0; i < ${ITER_COUNT}; i++)\n";
662*35238bceSAndroid Build Coastguard Worker op << " {\n";
663*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int j = 0; j < ${TWO}; j++)\n";
664*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
665*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int j = 0; j < ${ONE}; j++)\n";
666*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
667*35238bceSAndroid Build Coastguard Worker op << " }\n";
668*35238bceSAndroid Build Coastguard Worker break;
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_1:
671*35238bceSAndroid Build Coastguard Worker numIters = 2;
672*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP}\n";
673*35238bceSAndroid Build Coastguard Worker op << " {\n";
674*35238bceSAndroid Build Coastguard Worker op << " res = coords; // ignore outer loop effect \n";
675*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int j = 0; j < ${TWO}; j++)\n";
676*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
677*35238bceSAndroid Build Coastguard Worker op << " }\n";
678*35238bceSAndroid Build Coastguard Worker break;
679*35238bceSAndroid Build Coastguard Worker
680*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_2:
681*35238bceSAndroid Build Coastguard Worker numIters = iterCount;
682*35238bceSAndroid Build Coastguard Worker op << " ${FOR_LOOP}\n";
683*35238bceSAndroid Build Coastguard Worker op << " {\n";
684*35238bceSAndroid Build Coastguard Worker op << " res = coords.wxyz;\n";
685*35238bceSAndroid Build Coastguard Worker op << " for (${COUNTER_PRECISION} int j = 0; j < ${TWO}; j++)\n";
686*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
687*35238bceSAndroid Build Coastguard Worker op << " coords = res;\n";
688*35238bceSAndroid Build Coastguard Worker op << " }\n";
689*35238bceSAndroid Build Coastguard Worker break;
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker default:
692*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
693*35238bceSAndroid Build Coastguard Worker }
694*35238bceSAndroid Build Coastguard Worker
695*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
696*35238bceSAndroid Build Coastguard Worker forLoopStr =
697*35238bceSAndroid Build Coastguard Worker string("for (") + counterPrecisionStr + " int i = 0; i < " + de::toString(iterCount) + "; i++)";
698*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
699*35238bceSAndroid Build Coastguard Worker forLoopStr =
700*35238bceSAndroid Build Coastguard Worker string("for (") + counterPrecisionStr + " int i = 0; i < " + getIntUniformName(iterCount) + "; i++)";
701*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
702*35238bceSAndroid Build Coastguard Worker forLoopStr = string("for (") + counterPrecisionStr + " int i = 0; i < one*" + getIntUniformName(iterCount) +
703*35238bceSAndroid Build Coastguard Worker "; i++)";
704*35238bceSAndroid Build Coastguard Worker else
705*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
706*35238bceSAndroid Build Coastguard Worker }
707*35238bceSAndroid Build Coastguard Worker else if (loopType == LOOPTYPE_WHILE)
708*35238bceSAndroid Build Coastguard Worker {
709*35238bceSAndroid Build Coastguard Worker switch (loopCase)
710*35238bceSAndroid Build Coastguard Worker {
711*35238bceSAndroid Build Coastguard Worker case LOOPCASE_EMPTY_BODY:
712*35238bceSAndroid Build Coastguard Worker numIters = 0;
713*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} {}\n";
714*35238bceSAndroid Build Coastguard Worker break;
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_FIRST:
717*35238bceSAndroid Build Coastguard Worker numIters = 0;
718*35238bceSAndroid Build Coastguard Worker op << " while (true) { break; res = res.yzwx; }\n";
719*35238bceSAndroid Build Coastguard Worker break;
720*35238bceSAndroid Build Coastguard Worker
721*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_LAST:
722*35238bceSAndroid Build Coastguard Worker numIters = 1;
723*35238bceSAndroid Build Coastguard Worker op << " while (true) { res = res.yzwx; break; }\n";
724*35238bceSAndroid Build Coastguard Worker break;
725*35238bceSAndroid Build Coastguard Worker
726*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_CONDITIONAL_BREAK:
727*35238bceSAndroid Build Coastguard Worker numIters = 2;
728*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
729*35238bceSAndroid Build Coastguard Worker op << " while (true) { res = res.yzwx; if (i == ${ONE}) break; i++; }\n";
730*35238bceSAndroid Build Coastguard Worker break;
731*35238bceSAndroid Build Coastguard Worker
732*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_STATEMENT:
733*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} res = res.yzwx;\n";
734*35238bceSAndroid Build Coastguard Worker break;
735*35238bceSAndroid Build Coastguard Worker
736*35238bceSAndroid Build Coastguard Worker case LOOPCASE_COMPOUND_STATEMENT:
737*35238bceSAndroid Build Coastguard Worker iterCount = 2;
738*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
739*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { res = res.yzwx; res = res.yzwx; }\n";
740*35238bceSAndroid Build Coastguard Worker break;
741*35238bceSAndroid Build Coastguard Worker
742*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE_STATEMENT:
743*35238bceSAndroid Build Coastguard Worker iterCount = 2;
744*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
745*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} res = res.yzwx, res = res.yzwx;\n";
746*35238bceSAndroid Build Coastguard Worker break;
747*35238bceSAndroid Build Coastguard Worker
748*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NO_ITERATIONS:
749*35238bceSAndroid Build Coastguard Worker iterCount = 0;
750*35238bceSAndroid Build Coastguard Worker numIters = 0;
751*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} res = res.yzwx;\n";
752*35238bceSAndroid Build Coastguard Worker break;
753*35238bceSAndroid Build Coastguard Worker
754*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_ITERATION:
755*35238bceSAndroid Build Coastguard Worker iterCount = 1;
756*35238bceSAndroid Build Coastguard Worker numIters = 1;
757*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} res = res.yzwx;\n";
758*35238bceSAndroid Build Coastguard Worker break;
759*35238bceSAndroid Build Coastguard Worker
760*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SELECT_ITERATION_COUNT:
761*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
762*35238bceSAndroid Build Coastguard Worker op << " while (i < (ub_true ? ${ITER_COUNT} : 0)) { res = res.yzwx; i++; }\n";
763*35238bceSAndroid Build Coastguard Worker break;
764*35238bceSAndroid Build Coastguard Worker
765*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_CONTINUE:
766*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
767*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { if (i == ${TWO}) continue; res = res.yzwx; }\n";
768*35238bceSAndroid Build Coastguard Worker break;
769*35238bceSAndroid Build Coastguard Worker
770*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_CONTINUE:
771*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { res = res.yzwx; continue; }\n";
772*35238bceSAndroid Build Coastguard Worker break;
773*35238bceSAndroid Build Coastguard Worker
774*35238bceSAndroid Build Coastguard Worker case LOOPCASE_ONLY_CONTINUE:
775*35238bceSAndroid Build Coastguard Worker numIters = 0;
776*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { continue; }\n";
777*35238bceSAndroid Build Coastguard Worker break;
778*35238bceSAndroid Build Coastguard Worker
779*35238bceSAndroid Build Coastguard Worker case LOOPCASE_DOUBLE_CONTINUE:
780*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
781*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { if (i == ${ONE}) continue; res = res.yzwx; continue; }\n";
782*35238bceSAndroid Build Coastguard Worker break;
783*35238bceSAndroid Build Coastguard Worker
784*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_BREAK:
785*35238bceSAndroid Build Coastguard Worker numIters = 2;
786*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { if (i == ${THREE}) break; res = res.yzwx; }\n";
787*35238bceSAndroid Build Coastguard Worker break;
788*35238bceSAndroid Build Coastguard Worker
789*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_BREAK:
790*35238bceSAndroid Build Coastguard Worker numIters = 1;
791*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { res = res.yzwx; break; }\n";
792*35238bceSAndroid Build Coastguard Worker break;
793*35238bceSAndroid Build Coastguard Worker
794*35238bceSAndroid Build Coastguard Worker case LOOPCASE_PRE_INCREMENT:
795*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
796*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
797*35238bceSAndroid Build Coastguard Worker op << " while (++i < ${ITER_COUNT}) { res = res.yzwx; }\n";
798*35238bceSAndroid Build Coastguard Worker break;
799*35238bceSAndroid Build Coastguard Worker
800*35238bceSAndroid Build Coastguard Worker case LOOPCASE_POST_INCREMENT:
801*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
802*35238bceSAndroid Build Coastguard Worker op << " while (i++ < ${ITER_COUNT}) { res = res.yzwx; }\n";
803*35238bceSAndroid Build Coastguard Worker break;
804*35238bceSAndroid Build Coastguard Worker
805*35238bceSAndroid Build Coastguard Worker case LOOPCASE_MIXED_BREAK_CONTINUE:
806*35238bceSAndroid Build Coastguard Worker numIters = 2;
807*35238bceSAndroid Build Coastguard Worker iterCount = 5;
808*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} { if (i == 0) continue; else if (i == 3) break; res = res.yzwx; }\n";
809*35238bceSAndroid Build Coastguard Worker break;
810*35238bceSAndroid Build Coastguard Worker
811*35238bceSAndroid Build Coastguard Worker case LOOPCASE_VECTOR_COUNTER:
812*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} ivec4 i = ivec4(0, 1, ${ITER_COUNT}, 0);\n";
813*35238bceSAndroid Build Coastguard Worker op << " while (i.x < i.z) { res = res.yzwx; i.x += i.y; }\n";
814*35238bceSAndroid Build Coastguard Worker break;
815*35238bceSAndroid Build Coastguard Worker
816*35238bceSAndroid Build Coastguard Worker case LOOPCASE_101_ITERATIONS:
817*35238bceSAndroid Build Coastguard Worker numIters = iterCount = 101;
818*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP} res = res.yzwx;\n";
819*35238bceSAndroid Build Coastguard Worker break;
820*35238bceSAndroid Build Coastguard Worker
821*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE:
822*35238bceSAndroid Build Coastguard Worker iterCount = 6;
823*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
824*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
825*35238bceSAndroid Build Coastguard Worker op << " while (i++ < ${TWO}) { res = res.yzwx; }\n";
826*35238bceSAndroid Build Coastguard Worker op << " while (i++ < ${ITER_COUNT}) { res = res.yzwx; }\n"; // \note skips one iteration
827*35238bceSAndroid Build Coastguard Worker break;
828*35238bceSAndroid Build Coastguard Worker
829*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED:
830*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
831*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
832*35238bceSAndroid Build Coastguard Worker op << " while (i++ < ${TWO})\n";
833*35238bceSAndroid Build Coastguard Worker op << " {\n";
834*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
835*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${ITER_COUNT})\n";
836*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
837*35238bceSAndroid Build Coastguard Worker op << " }\n";
838*35238bceSAndroid Build Coastguard Worker break;
839*35238bceSAndroid Build Coastguard Worker
840*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_SEQUENCE:
841*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
842*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
843*35238bceSAndroid Build Coastguard Worker op << " while (i++ < ${ITER_COUNT})\n";
844*35238bceSAndroid Build Coastguard Worker op << " {\n";
845*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
846*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${ONE})\n";
847*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
848*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${THREE})\n"; // \note skips one iteration
849*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
850*35238bceSAndroid Build Coastguard Worker op << " }\n";
851*35238bceSAndroid Build Coastguard Worker break;
852*35238bceSAndroid Build Coastguard Worker
853*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_1:
854*35238bceSAndroid Build Coastguard Worker numIters = 2;
855*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP}\n";
856*35238bceSAndroid Build Coastguard Worker op << " {\n";
857*35238bceSAndroid Build Coastguard Worker op << " res = coords; // ignore outer loop effect \n";
858*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
859*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${TWO})\n";
860*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
861*35238bceSAndroid Build Coastguard Worker op << " }\n";
862*35238bceSAndroid Build Coastguard Worker break;
863*35238bceSAndroid Build Coastguard Worker
864*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_2:
865*35238bceSAndroid Build Coastguard Worker numIters = iterCount;
866*35238bceSAndroid Build Coastguard Worker op << " ${WHILE_LOOP}\n";
867*35238bceSAndroid Build Coastguard Worker op << " {\n";
868*35238bceSAndroid Build Coastguard Worker op << " res = coords.wxyz;\n";
869*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
870*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${TWO})\n";
871*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
872*35238bceSAndroid Build Coastguard Worker op << " coords = res;\n";
873*35238bceSAndroid Build Coastguard Worker op << " }\n";
874*35238bceSAndroid Build Coastguard Worker break;
875*35238bceSAndroid Build Coastguard Worker
876*35238bceSAndroid Build Coastguard Worker default:
877*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
878*35238bceSAndroid Build Coastguard Worker }
879*35238bceSAndroid Build Coastguard Worker
880*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
881*35238bceSAndroid Build Coastguard Worker whileLoopStr = string("\t") + counterPrecisionStr + " int i = 0;\n" + " while(i++ < " +
882*35238bceSAndroid Build Coastguard Worker de::toString(iterCount) + ")";
883*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
884*35238bceSAndroid Build Coastguard Worker whileLoopStr = string("\t") + counterPrecisionStr + " int i = 0;\n" + " while(i++ < " +
885*35238bceSAndroid Build Coastguard Worker getIntUniformName(iterCount) + ")";
886*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
887*35238bceSAndroid Build Coastguard Worker whileLoopStr = string("\t") + counterPrecisionStr + " int i = 0;\n" + " while(i++ < one*" +
888*35238bceSAndroid Build Coastguard Worker getIntUniformName(iterCount) + ")";
889*35238bceSAndroid Build Coastguard Worker else
890*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
891*35238bceSAndroid Build Coastguard Worker }
892*35238bceSAndroid Build Coastguard Worker else
893*35238bceSAndroid Build Coastguard Worker {
894*35238bceSAndroid Build Coastguard Worker DE_ASSERT(loopType == LOOPTYPE_DO_WHILE);
895*35238bceSAndroid Build Coastguard Worker
896*35238bceSAndroid Build Coastguard Worker switch (loopCase)
897*35238bceSAndroid Build Coastguard Worker {
898*35238bceSAndroid Build Coastguard Worker case LOOPCASE_EMPTY_BODY:
899*35238bceSAndroid Build Coastguard Worker numIters = 0;
900*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} {} ${DO_WHILE_POST}\n";
901*35238bceSAndroid Build Coastguard Worker break;
902*35238bceSAndroid Build Coastguard Worker
903*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_FIRST:
904*35238bceSAndroid Build Coastguard Worker numIters = 0;
905*35238bceSAndroid Build Coastguard Worker op << " do { break; res = res.yzwx; } while (true);\n";
906*35238bceSAndroid Build Coastguard Worker break;
907*35238bceSAndroid Build Coastguard Worker
908*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_UNCONDITIONAL_BREAK_LAST:
909*35238bceSAndroid Build Coastguard Worker numIters = 1;
910*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; break; } while (true);\n";
911*35238bceSAndroid Build Coastguard Worker break;
912*35238bceSAndroid Build Coastguard Worker
913*35238bceSAndroid Build Coastguard Worker case LOOPCASE_INFINITE_WITH_CONDITIONAL_BREAK:
914*35238bceSAndroid Build Coastguard Worker numIters = 2;
915*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
916*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; if (i == ${ONE}) break; i++; } while (true);\n";
917*35238bceSAndroid Build Coastguard Worker break;
918*35238bceSAndroid Build Coastguard Worker
919*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_STATEMENT:
920*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} res = res.yzwx; ${DO_WHILE_POST}\n";
921*35238bceSAndroid Build Coastguard Worker break;
922*35238bceSAndroid Build Coastguard Worker
923*35238bceSAndroid Build Coastguard Worker case LOOPCASE_COMPOUND_STATEMENT:
924*35238bceSAndroid Build Coastguard Worker iterCount = 2;
925*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
926*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { res = res.yzwx; res = res.yzwx; } ${DO_WHILE_POST}\n";
927*35238bceSAndroid Build Coastguard Worker break;
928*35238bceSAndroid Build Coastguard Worker
929*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE_STATEMENT:
930*35238bceSAndroid Build Coastguard Worker iterCount = 2;
931*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
932*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} res = res.yzwx, res = res.yzwx; ${DO_WHILE_POST}\n";
933*35238bceSAndroid Build Coastguard Worker break;
934*35238bceSAndroid Build Coastguard Worker
935*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NO_ITERATIONS:
936*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
937*35238bceSAndroid Build Coastguard Worker break;
938*35238bceSAndroid Build Coastguard Worker
939*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SINGLE_ITERATION:
940*35238bceSAndroid Build Coastguard Worker iterCount = 1;
941*35238bceSAndroid Build Coastguard Worker numIters = 1;
942*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} res = res.yzwx; ${DO_WHILE_POST}\n";
943*35238bceSAndroid Build Coastguard Worker break;
944*35238bceSAndroid Build Coastguard Worker
945*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SELECT_ITERATION_COUNT:
946*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
947*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while (++i < (ub_true ? ${ITER_COUNT} : 0));\n";
948*35238bceSAndroid Build Coastguard Worker break;
949*35238bceSAndroid Build Coastguard Worker
950*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_CONTINUE:
951*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
952*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { if (i == ${TWO}) continue; res = res.yzwx; } ${DO_WHILE_POST}\n";
953*35238bceSAndroid Build Coastguard Worker break;
954*35238bceSAndroid Build Coastguard Worker
955*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_CONTINUE:
956*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { res = res.yzwx; continue; } ${DO_WHILE_POST}\n";
957*35238bceSAndroid Build Coastguard Worker break;
958*35238bceSAndroid Build Coastguard Worker
959*35238bceSAndroid Build Coastguard Worker case LOOPCASE_ONLY_CONTINUE:
960*35238bceSAndroid Build Coastguard Worker numIters = 0;
961*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { continue; } ${DO_WHILE_POST}\n";
962*35238bceSAndroid Build Coastguard Worker break;
963*35238bceSAndroid Build Coastguard Worker
964*35238bceSAndroid Build Coastguard Worker case LOOPCASE_DOUBLE_CONTINUE:
965*35238bceSAndroid Build Coastguard Worker numIters = iterCount - 1;
966*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { if (i == ${TWO}) continue; res = res.yzwx; continue; } ${DO_WHILE_POST}\n";
967*35238bceSAndroid Build Coastguard Worker break;
968*35238bceSAndroid Build Coastguard Worker
969*35238bceSAndroid Build Coastguard Worker case LOOPCASE_CONDITIONAL_BREAK:
970*35238bceSAndroid Build Coastguard Worker numIters = 2;
971*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { res = res.yzwx; if (i == ${ONE}) break; } ${DO_WHILE_POST}\n";
972*35238bceSAndroid Build Coastguard Worker break;
973*35238bceSAndroid Build Coastguard Worker
974*35238bceSAndroid Build Coastguard Worker case LOOPCASE_UNCONDITIONAL_BREAK:
975*35238bceSAndroid Build Coastguard Worker numIters = 1;
976*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { res = res.yzwx; break; } ${DO_WHILE_POST}\n";
977*35238bceSAndroid Build Coastguard Worker break;
978*35238bceSAndroid Build Coastguard Worker
979*35238bceSAndroid Build Coastguard Worker case LOOPCASE_PRE_INCREMENT:
980*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
981*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while (++i < ${ITER_COUNT});\n";
982*35238bceSAndroid Build Coastguard Worker break;
983*35238bceSAndroid Build Coastguard Worker
984*35238bceSAndroid Build Coastguard Worker case LOOPCASE_POST_INCREMENT:
985*35238bceSAndroid Build Coastguard Worker numIters = iterCount + 1;
986*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
987*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while (i++ < ${ITER_COUNT});\n";
988*35238bceSAndroid Build Coastguard Worker break;
989*35238bceSAndroid Build Coastguard Worker
990*35238bceSAndroid Build Coastguard Worker case LOOPCASE_MIXED_BREAK_CONTINUE:
991*35238bceSAndroid Build Coastguard Worker numIters = 2;
992*35238bceSAndroid Build Coastguard Worker iterCount = 5;
993*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} { if (i == 0) continue; else if (i == 3) break; res = res.yzwx; } "
994*35238bceSAndroid Build Coastguard Worker "${DO_WHILE_POST}\n";
995*35238bceSAndroid Build Coastguard Worker break;
996*35238bceSAndroid Build Coastguard Worker
997*35238bceSAndroid Build Coastguard Worker case LOOPCASE_VECTOR_COUNTER:
998*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} ivec4 i = ivec4(0, 1, ${ITER_COUNT}, 0);\n";
999*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while ((i.x += i.y) < i.z);\n";
1000*35238bceSAndroid Build Coastguard Worker break;
1001*35238bceSAndroid Build Coastguard Worker
1002*35238bceSAndroid Build Coastguard Worker case LOOPCASE_101_ITERATIONS:
1003*35238bceSAndroid Build Coastguard Worker numIters = iterCount = 101;
1004*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE} res = res.yzwx; ${DO_WHILE_POST}\n";
1005*35238bceSAndroid Build Coastguard Worker break;
1006*35238bceSAndroid Build Coastguard Worker
1007*35238bceSAndroid Build Coastguard Worker case LOOPCASE_SEQUENCE:
1008*35238bceSAndroid Build Coastguard Worker iterCount = 5;
1009*35238bceSAndroid Build Coastguard Worker numIters = 5;
1010*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
1011*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while (++i < ${TWO});\n";
1012*35238bceSAndroid Build Coastguard Worker op << " do { res = res.yzwx; } while (++i < ${ITER_COUNT});\n";
1013*35238bceSAndroid Build Coastguard Worker break;
1014*35238bceSAndroid Build Coastguard Worker
1015*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED:
1016*35238bceSAndroid Build Coastguard Worker numIters = 2 * iterCount;
1017*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
1018*35238bceSAndroid Build Coastguard Worker op << " do\n";
1019*35238bceSAndroid Build Coastguard Worker op << " {\n";
1020*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
1021*35238bceSAndroid Build Coastguard Worker op << " do\n";
1022*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
1023*35238bceSAndroid Build Coastguard Worker op << " while (++j < ${ITER_COUNT});\n";
1024*35238bceSAndroid Build Coastguard Worker op << " } while (++i < ${TWO});\n";
1025*35238bceSAndroid Build Coastguard Worker break;
1026*35238bceSAndroid Build Coastguard Worker
1027*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_SEQUENCE:
1028*35238bceSAndroid Build Coastguard Worker numIters = 3 * iterCount;
1029*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int i = 0;\n";
1030*35238bceSAndroid Build Coastguard Worker op << " do\n";
1031*35238bceSAndroid Build Coastguard Worker op << " {\n";
1032*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
1033*35238bceSAndroid Build Coastguard Worker op << " do\n";
1034*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
1035*35238bceSAndroid Build Coastguard Worker op << " while (++j < ${TWO});\n";
1036*35238bceSAndroid Build Coastguard Worker op << " do\n";
1037*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
1038*35238bceSAndroid Build Coastguard Worker op << " while (++j < ${THREE});\n";
1039*35238bceSAndroid Build Coastguard Worker op << " } while (++i < ${ITER_COUNT});\n";
1040*35238bceSAndroid Build Coastguard Worker break;
1041*35238bceSAndroid Build Coastguard Worker
1042*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_1:
1043*35238bceSAndroid Build Coastguard Worker numIters = 2;
1044*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE}\n";
1045*35238bceSAndroid Build Coastguard Worker op << " {\n";
1046*35238bceSAndroid Build Coastguard Worker op << " res = coords; // ignore outer loop effect \n";
1047*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
1048*35238bceSAndroid Build Coastguard Worker op << " do\n";
1049*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
1050*35238bceSAndroid Build Coastguard Worker op << " while (++j < ${TWO});\n";
1051*35238bceSAndroid Build Coastguard Worker op << " } ${DO_WHILE_POST}\n";
1052*35238bceSAndroid Build Coastguard Worker break;
1053*35238bceSAndroid Build Coastguard Worker
1054*35238bceSAndroid Build Coastguard Worker case LOOPCASE_NESTED_TRICKY_DATAFLOW_2:
1055*35238bceSAndroid Build Coastguard Worker numIters = iterCount;
1056*35238bceSAndroid Build Coastguard Worker op << " ${DO_WHILE_PRE}\n";
1057*35238bceSAndroid Build Coastguard Worker op << " {\n";
1058*35238bceSAndroid Build Coastguard Worker op << " res = coords.wxyz;\n";
1059*35238bceSAndroid Build Coastguard Worker op << " ${COUNTER_PRECISION} int j = 0;\n";
1060*35238bceSAndroid Build Coastguard Worker op << " while (j++ < ${TWO})\n";
1061*35238bceSAndroid Build Coastguard Worker op << " res = res.yzwx;\n";
1062*35238bceSAndroid Build Coastguard Worker op << " coords = res;\n";
1063*35238bceSAndroid Build Coastguard Worker op << " } ${DO_WHILE_POST}\n";
1064*35238bceSAndroid Build Coastguard Worker break;
1065*35238bceSAndroid Build Coastguard Worker
1066*35238bceSAndroid Build Coastguard Worker default:
1067*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1068*35238bceSAndroid Build Coastguard Worker }
1069*35238bceSAndroid Build Coastguard Worker
1070*35238bceSAndroid Build Coastguard Worker doWhileLoopPreStr = string("\t") + counterPrecisionStr + " int i = 0;\n" + "\tdo ";
1071*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
1072*35238bceSAndroid Build Coastguard Worker doWhileLoopPostStr = string(" while (++i < ") + de::toString(iterCount) + ");\n";
1073*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
1074*35238bceSAndroid Build Coastguard Worker doWhileLoopPostStr = string(" while (++i < ") + getIntUniformName(iterCount) + ");\n";
1075*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
1076*35238bceSAndroid Build Coastguard Worker doWhileLoopPostStr = string(" while (++i < one*") + getIntUniformName(iterCount) + ");\n";
1077*35238bceSAndroid Build Coastguard Worker else
1078*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1079*35238bceSAndroid Build Coastguard Worker }
1080*35238bceSAndroid Build Coastguard Worker
1081*35238bceSAndroid Build Coastguard Worker // Shader footers.
1082*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
1083*35238bceSAndroid Build Coastguard Worker {
1084*35238bceSAndroid Build Coastguard Worker vtx << " v_color = res.rgb;\n";
1085*35238bceSAndroid Build Coastguard Worker frag << " o_color = vec4(v_color.rgb, 1.0);\n";
1086*35238bceSAndroid Build Coastguard Worker }
1087*35238bceSAndroid Build Coastguard Worker else
1088*35238bceSAndroid Build Coastguard Worker {
1089*35238bceSAndroid Build Coastguard Worker vtx << " v_coords = a_coords;\n";
1090*35238bceSAndroid Build Coastguard Worker frag << " o_color = vec4(res.rgb, 1.0);\n";
1091*35238bceSAndroid Build Coastguard Worker
1092*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_DYNAMIC)
1093*35238bceSAndroid Build Coastguard Worker vtx << " v_one = a_one;\n";
1094*35238bceSAndroid Build Coastguard Worker }
1095*35238bceSAndroid Build Coastguard Worker
1096*35238bceSAndroid Build Coastguard Worker vtx << "}\n";
1097*35238bceSAndroid Build Coastguard Worker frag << "}\n";
1098*35238bceSAndroid Build Coastguard Worker
1099*35238bceSAndroid Build Coastguard Worker // Constants.
1100*35238bceSAndroid Build Coastguard Worker string oneStr;
1101*35238bceSAndroid Build Coastguard Worker string twoStr;
1102*35238bceSAndroid Build Coastguard Worker string threeStr;
1103*35238bceSAndroid Build Coastguard Worker string iterCountStr;
1104*35238bceSAndroid Build Coastguard Worker
1105*35238bceSAndroid Build Coastguard Worker if (loopCountType == LOOPCOUNT_CONSTANT)
1106*35238bceSAndroid Build Coastguard Worker {
1107*35238bceSAndroid Build Coastguard Worker oneStr = "1";
1108*35238bceSAndroid Build Coastguard Worker twoStr = "2";
1109*35238bceSAndroid Build Coastguard Worker threeStr = "3";
1110*35238bceSAndroid Build Coastguard Worker iterCountStr = de::toString(iterCount);
1111*35238bceSAndroid Build Coastguard Worker }
1112*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_UNIFORM)
1113*35238bceSAndroid Build Coastguard Worker {
1114*35238bceSAndroid Build Coastguard Worker oneStr = "ui_one";
1115*35238bceSAndroid Build Coastguard Worker twoStr = "ui_two";
1116*35238bceSAndroid Build Coastguard Worker threeStr = "ui_three";
1117*35238bceSAndroid Build Coastguard Worker iterCountStr = getIntUniformName(iterCount);
1118*35238bceSAndroid Build Coastguard Worker }
1119*35238bceSAndroid Build Coastguard Worker else if (loopCountType == LOOPCOUNT_DYNAMIC)
1120*35238bceSAndroid Build Coastguard Worker {
1121*35238bceSAndroid Build Coastguard Worker oneStr = "one*ui_one";
1122*35238bceSAndroid Build Coastguard Worker twoStr = "one*ui_two";
1123*35238bceSAndroid Build Coastguard Worker threeStr = "one*ui_three";
1124*35238bceSAndroid Build Coastguard Worker iterCountStr = string("one*") + getIntUniformName(iterCount);
1125*35238bceSAndroid Build Coastguard Worker }
1126*35238bceSAndroid Build Coastguard Worker else
1127*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1128*35238bceSAndroid Build Coastguard Worker
1129*35238bceSAndroid Build Coastguard Worker // Fill in shader templates.
1130*35238bceSAndroid Build Coastguard Worker map<string, string> params;
1131*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("PRECISION", "mediump"));
1132*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("ITER_COUNT", iterCountStr));
1133*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("COUNTER_PRECISION", counterPrecisionStr));
1134*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("FOR_LOOP", forLoopStr));
1135*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("WHILE_LOOP", whileLoopStr));
1136*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("DO_WHILE_PRE", doWhileLoopPreStr));
1137*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("DO_WHILE_POST", doWhileLoopPostStr));
1138*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("ONE", oneStr));
1139*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("TWO", twoStr));
1140*35238bceSAndroid Build Coastguard Worker params.insert(pair<string, string>("THREE", threeStr));
1141*35238bceSAndroid Build Coastguard Worker
1142*35238bceSAndroid Build Coastguard Worker StringTemplate vertTemplate(vtx.str().c_str());
1143*35238bceSAndroid Build Coastguard Worker StringTemplate fragTemplate(frag.str().c_str());
1144*35238bceSAndroid Build Coastguard Worker string vertexShaderSource = vertTemplate.specialize(params);
1145*35238bceSAndroid Build Coastguard Worker string fragmentShaderSource = fragTemplate.specialize(params);
1146*35238bceSAndroid Build Coastguard Worker
1147*35238bceSAndroid Build Coastguard Worker // Create the case.
1148*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc = getLoopEvalFunc(numIters);
1149*35238bceSAndroid Build Coastguard Worker return new ShaderLoopCase(context, caseName, description, isVertexCase, evalFunc, vertexShaderSource.c_str(),
1150*35238bceSAndroid Build Coastguard Worker fragmentShaderSource.c_str());
1151*35238bceSAndroid Build Coastguard Worker }
1152*35238bceSAndroid Build Coastguard Worker
1153*35238bceSAndroid Build Coastguard Worker // ShaderLoopTests.
1154*35238bceSAndroid Build Coastguard Worker
ShaderLoopTests(Context & context)1155*35238bceSAndroid Build Coastguard Worker ShaderLoopTests::ShaderLoopTests(Context &context) : TestCaseGroup(context, "loops", "Loop Tests")
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker }
1158*35238bceSAndroid Build Coastguard Worker
~ShaderLoopTests(void)1159*35238bceSAndroid Build Coastguard Worker ShaderLoopTests::~ShaderLoopTests(void)
1160*35238bceSAndroid Build Coastguard Worker {
1161*35238bceSAndroid Build Coastguard Worker }
1162*35238bceSAndroid Build Coastguard Worker
init(void)1163*35238bceSAndroid Build Coastguard Worker void ShaderLoopTests::init(void)
1164*35238bceSAndroid Build Coastguard Worker {
1165*35238bceSAndroid Build Coastguard Worker // Loop cases.
1166*35238bceSAndroid Build Coastguard Worker
1167*35238bceSAndroid Build Coastguard Worker static const ShaderType s_shaderTypes[] = {SHADERTYPE_VERTEX, SHADERTYPE_FRAGMENT};
1168*35238bceSAndroid Build Coastguard Worker
1169*35238bceSAndroid Build Coastguard Worker static const DataType s_countDataType[] = {TYPE_INT, TYPE_FLOAT};
1170*35238bceSAndroid Build Coastguard Worker
1171*35238bceSAndroid Build Coastguard Worker for (int loopType = 0; loopType < LOOPTYPE_LAST; loopType++)
1172*35238bceSAndroid Build Coastguard Worker {
1173*35238bceSAndroid Build Coastguard Worker const char *loopTypeName = getLoopTypeName((LoopType)loopType);
1174*35238bceSAndroid Build Coastguard Worker
1175*35238bceSAndroid Build Coastguard Worker for (int loopCountType = 0; loopCountType < LOOPCOUNT_LAST; loopCountType++)
1176*35238bceSAndroid Build Coastguard Worker {
1177*35238bceSAndroid Build Coastguard Worker const char *loopCountName = getLoopCountTypeName((LoopCountType)loopCountType);
1178*35238bceSAndroid Build Coastguard Worker
1179*35238bceSAndroid Build Coastguard Worker string groupName = string(loopTypeName) + "_" + string(loopCountName) + "_iterations";
1180*35238bceSAndroid Build Coastguard Worker string groupDesc = string("Loop tests with ") + loopCountName + " loop counter.";
1181*35238bceSAndroid Build Coastguard Worker TestCaseGroup *group = new TestCaseGroup(m_context, groupName.c_str(), groupDesc.c_str());
1182*35238bceSAndroid Build Coastguard Worker addChild(group);
1183*35238bceSAndroid Build Coastguard Worker
1184*35238bceSAndroid Build Coastguard Worker // Generic cases.
1185*35238bceSAndroid Build Coastguard Worker
1186*35238bceSAndroid Build Coastguard Worker for (int precision = 0; precision < PRECISION_LAST; precision++)
1187*35238bceSAndroid Build Coastguard Worker {
1188*35238bceSAndroid Build Coastguard Worker const char *precisionName = getPrecisionName((Precision)precision);
1189*35238bceSAndroid Build Coastguard Worker
1190*35238bceSAndroid Build Coastguard Worker for (int dataTypeNdx = 0; dataTypeNdx < DE_LENGTH_OF_ARRAY(s_countDataType); dataTypeNdx++)
1191*35238bceSAndroid Build Coastguard Worker {
1192*35238bceSAndroid Build Coastguard Worker DataType loopDataType = s_countDataType[dataTypeNdx];
1193*35238bceSAndroid Build Coastguard Worker const char *dataTypeName = getDataTypeName(loopDataType);
1194*35238bceSAndroid Build Coastguard Worker
1195*35238bceSAndroid Build Coastguard Worker for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
1196*35238bceSAndroid Build Coastguard Worker {
1197*35238bceSAndroid Build Coastguard Worker ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
1198*35238bceSAndroid Build Coastguard Worker const char *shaderTypeName = getShaderTypeName(shaderType);
1199*35238bceSAndroid Build Coastguard Worker bool isVertexCase = (shaderType == SHADERTYPE_VERTEX);
1200*35238bceSAndroid Build Coastguard Worker
1201*35238bceSAndroid Build Coastguard Worker string name = string("basic_") + precisionName + "_" + dataTypeName + "_" + shaderTypeName;
1202*35238bceSAndroid Build Coastguard Worker string desc = string(loopTypeName) + " loop with " + precisionName + dataTypeName + " " +
1203*35238bceSAndroid Build Coastguard Worker loopCountName + " iteration count in " + shaderTypeName + " shader.";
1204*35238bceSAndroid Build Coastguard Worker group->addChild(createGenericLoopCase(m_context, name.c_str(), desc.c_str(), isVertexCase,
1205*35238bceSAndroid Build Coastguard Worker (LoopType)loopType, (LoopCountType)loopCountType,
1206*35238bceSAndroid Build Coastguard Worker (Precision)precision, loopDataType));
1207*35238bceSAndroid Build Coastguard Worker }
1208*35238bceSAndroid Build Coastguard Worker }
1209*35238bceSAndroid Build Coastguard Worker }
1210*35238bceSAndroid Build Coastguard Worker
1211*35238bceSAndroid Build Coastguard Worker // Special cases.
1212*35238bceSAndroid Build Coastguard Worker
1213*35238bceSAndroid Build Coastguard Worker for (int loopCase = 0; loopCase < LOOPCASE_LAST; loopCase++)
1214*35238bceSAndroid Build Coastguard Worker {
1215*35238bceSAndroid Build Coastguard Worker const char *loopCaseName = getLoopCaseName((LoopCase)loopCase);
1216*35238bceSAndroid Build Coastguard Worker
1217*35238bceSAndroid Build Coastguard Worker // no-iterations not possible with do-while.
1218*35238bceSAndroid Build Coastguard Worker if ((loopCase == LOOPCASE_NO_ITERATIONS) && (loopType == LOOPTYPE_DO_WHILE))
1219*35238bceSAndroid Build Coastguard Worker continue;
1220*35238bceSAndroid Build Coastguard Worker
1221*35238bceSAndroid Build Coastguard Worker for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
1222*35238bceSAndroid Build Coastguard Worker {
1223*35238bceSAndroid Build Coastguard Worker ShaderType shaderType = s_shaderTypes[shaderTypeNdx];
1224*35238bceSAndroid Build Coastguard Worker const char *shaderTypeName = getShaderTypeName(shaderType);
1225*35238bceSAndroid Build Coastguard Worker bool isVertexCase = (shaderType == SHADERTYPE_VERTEX);
1226*35238bceSAndroid Build Coastguard Worker
1227*35238bceSAndroid Build Coastguard Worker string name = string(loopCaseName) + "_" + shaderTypeName;
1228*35238bceSAndroid Build Coastguard Worker string desc = string(loopCaseName) + " loop with " + loopTypeName + " iteration count in " +
1229*35238bceSAndroid Build Coastguard Worker shaderTypeName + " shader.";
1230*35238bceSAndroid Build Coastguard Worker group->addChild(createSpecialLoopCase(m_context, name.c_str(), desc.c_str(), isVertexCase,
1231*35238bceSAndroid Build Coastguard Worker (LoopCase)loopCase, (LoopType)loopType,
1232*35238bceSAndroid Build Coastguard Worker (LoopCountType)loopCountType));
1233*35238bceSAndroid Build Coastguard Worker }
1234*35238bceSAndroid Build Coastguard Worker }
1235*35238bceSAndroid Build Coastguard Worker }
1236*35238bceSAndroid Build Coastguard Worker }
1237*35238bceSAndroid Build Coastguard Worker
1238*35238bceSAndroid Build Coastguard Worker // Additional smaller handwritten tests.
1239*35238bceSAndroid Build Coastguard Worker const std::vector<tcu::TestNode *> children =
1240*35238bceSAndroid Build Coastguard Worker gls::ShaderLibrary(m_context.getTestContext(), m_context.getRenderContext(), m_context.getContextInfo())
1241*35238bceSAndroid Build Coastguard Worker .loadShaderFile("shaders/loops.test");
1242*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < (int)children.size(); i++)
1243*35238bceSAndroid Build Coastguard Worker addChild(children[i]);
1244*35238bceSAndroid Build Coastguard Worker }
1245*35238bceSAndroid Build Coastguard Worker
1246*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1247*35238bceSAndroid Build Coastguard Worker } // namespace gles3
1248*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1249