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 Invariance tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fShaderInvarianceTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker namespace deqp
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace gles3
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace Functional
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 class FormatArgumentList;
49*35238bceSAndroid Build Coastguard Worker
genRandomVector(de::Random & rnd)50*35238bceSAndroid Build Coastguard Worker static tcu::Vec4 genRandomVector(de::Random &rnd)
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker tcu::Vec4 retVal;
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker retVal.x() = rnd.getFloat(-1.0f, 1.0f);
55*35238bceSAndroid Build Coastguard Worker retVal.y() = rnd.getFloat(-1.0f, 1.0f);
56*35238bceSAndroid Build Coastguard Worker retVal.z() = rnd.getFloat(-1.0f, 1.0f);
57*35238bceSAndroid Build Coastguard Worker retVal.w() = rnd.getFloat(0.2f, 1.0f);
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard Worker return retVal;
60*35238bceSAndroid Build Coastguard Worker }
61*35238bceSAndroid Build Coastguard Worker
62*35238bceSAndroid Build Coastguard Worker class FormatArgument
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker public:
65*35238bceSAndroid Build Coastguard Worker FormatArgument(const char *name, const std::string &value);
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker private:
68*35238bceSAndroid Build Coastguard Worker friend class FormatArgumentList;
69*35238bceSAndroid Build Coastguard Worker
70*35238bceSAndroid Build Coastguard Worker const char *const m_name;
71*35238bceSAndroid Build Coastguard Worker const std::string m_value;
72*35238bceSAndroid Build Coastguard Worker };
73*35238bceSAndroid Build Coastguard Worker
FormatArgument(const char * name,const std::string & value)74*35238bceSAndroid Build Coastguard Worker FormatArgument::FormatArgument(const char *name, const std::string &value) : m_name(name), m_value(value)
75*35238bceSAndroid Build Coastguard Worker {
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker class FormatArgumentList
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker public:
81*35238bceSAndroid Build Coastguard Worker FormatArgumentList(void);
82*35238bceSAndroid Build Coastguard Worker
83*35238bceSAndroid Build Coastguard Worker FormatArgumentList &operator<<(const FormatArgument &);
84*35238bceSAndroid Build Coastguard Worker const std::map<std::string, std::string> &getArguments(void) const;
85*35238bceSAndroid Build Coastguard Worker
86*35238bceSAndroid Build Coastguard Worker private:
87*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> m_formatArguments;
88*35238bceSAndroid Build Coastguard Worker };
89*35238bceSAndroid Build Coastguard Worker
FormatArgumentList(void)90*35238bceSAndroid Build Coastguard Worker FormatArgumentList::FormatArgumentList(void)
91*35238bceSAndroid Build Coastguard Worker {
92*35238bceSAndroid Build Coastguard Worker }
93*35238bceSAndroid Build Coastguard Worker
operator <<(const FormatArgument & arg)94*35238bceSAndroid Build Coastguard Worker FormatArgumentList &FormatArgumentList::operator<<(const FormatArgument &arg)
95*35238bceSAndroid Build Coastguard Worker {
96*35238bceSAndroid Build Coastguard Worker m_formatArguments[arg.m_name] = arg.m_value;
97*35238bceSAndroid Build Coastguard Worker return *this;
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker
getArguments(void) const100*35238bceSAndroid Build Coastguard Worker const std::map<std::string, std::string> &FormatArgumentList::getArguments(void) const
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker return m_formatArguments;
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
formatGLSL(const char * templateString,const FormatArgumentList & args)105*35238bceSAndroid Build Coastguard Worker static std::string formatGLSL(const char *templateString, const FormatArgumentList &args)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker const std::map<std::string, std::string> ¶ms = args.getArguments();
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker return tcu::StringTemplate(std::string(templateString)).specialize(params);
110*35238bceSAndroid Build Coastguard Worker }
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
113*35238bceSAndroid Build Coastguard Worker * \brief Vertex shader invariance test
114*35238bceSAndroid Build Coastguard Worker *
115*35238bceSAndroid Build Coastguard Worker * Test vertex shader invariance by drawing a test pattern two times, each
116*35238bceSAndroid Build Coastguard Worker * time with a different shader. Shaders have set identical values to
117*35238bceSAndroid Build Coastguard Worker * invariant gl_Position using identical expressions. No fragments from the
118*35238bceSAndroid Build Coastguard Worker * first pass using should remain visible.
119*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
120*35238bceSAndroid Build Coastguard Worker class InvarianceTest : public TestCase
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker public:
123*35238bceSAndroid Build Coastguard Worker struct ShaderPair
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker std::string vertexShaderSource0;
126*35238bceSAndroid Build Coastguard Worker std::string fragmentShaderSource0;
127*35238bceSAndroid Build Coastguard Worker std::string vertexShaderSource1;
128*35238bceSAndroid Build Coastguard Worker std::string fragmentShaderSource1;
129*35238bceSAndroid Build Coastguard Worker };
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker InvarianceTest(Context &ctx, const char *name, const char *desc);
132*35238bceSAndroid Build Coastguard Worker ~InvarianceTest(void);
133*35238bceSAndroid Build Coastguard Worker
134*35238bceSAndroid Build Coastguard Worker void init(void);
135*35238bceSAndroid Build Coastguard Worker void deinit(void);
136*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker private:
139*35238bceSAndroid Build Coastguard Worker virtual ShaderPair genShaders(void) const = DE_NULL;
140*35238bceSAndroid Build Coastguard Worker bool checkImage(const tcu::Surface &) const;
141*35238bceSAndroid Build Coastguard Worker
142*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_shader0;
143*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_shader1;
144*35238bceSAndroid Build Coastguard Worker glw::GLuint m_arrayBuf;
145*35238bceSAndroid Build Coastguard Worker int m_verticesInPattern;
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker const int m_renderSize;
148*35238bceSAndroid Build Coastguard Worker };
149*35238bceSAndroid Build Coastguard Worker
InvarianceTest(Context & ctx,const char * name,const char * desc)150*35238bceSAndroid Build Coastguard Worker InvarianceTest::InvarianceTest(Context &ctx, const char *name, const char *desc)
151*35238bceSAndroid Build Coastguard Worker : TestCase(ctx, name, desc)
152*35238bceSAndroid Build Coastguard Worker , m_shader0(DE_NULL)
153*35238bceSAndroid Build Coastguard Worker , m_shader1(DE_NULL)
154*35238bceSAndroid Build Coastguard Worker , m_arrayBuf(0)
155*35238bceSAndroid Build Coastguard Worker , m_verticesInPattern(0)
156*35238bceSAndroid Build Coastguard Worker , m_renderSize(256)
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker }
159*35238bceSAndroid Build Coastguard Worker
~InvarianceTest(void)160*35238bceSAndroid Build Coastguard Worker InvarianceTest::~InvarianceTest(void)
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker deinit();
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker
init(void)165*35238bceSAndroid Build Coastguard Worker void InvarianceTest::init(void)
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker // Invariance tests require drawing to the screen and reading back results.
168*35238bceSAndroid Build Coastguard Worker // Tests results are not reliable if the resolution is too small
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getWidth() < m_renderSize ||
171*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getHeight() < m_renderSize)
172*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError(std::string("Render target size must be at least ") +
173*35238bceSAndroid Build Coastguard Worker de::toString(m_renderSize) + "x" + de::toString(m_renderSize));
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker
176*35238bceSAndroid Build Coastguard Worker // Gen shaders
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker ShaderPair vertexShaders = genShaders();
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard Worker m_shader0 =
181*35238bceSAndroid Build Coastguard Worker new glu::ShaderProgram(m_context.getRenderContext(),
182*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::VertexSource(vertexShaders.vertexShaderSource0)
183*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(vertexShaders.fragmentShaderSource0));
184*35238bceSAndroid Build Coastguard Worker if (!m_shader0->isOk())
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_shader0;
187*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Test shader compile failed.");
188*35238bceSAndroid Build Coastguard Worker }
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker m_shader1 =
191*35238bceSAndroid Build Coastguard Worker new glu::ShaderProgram(m_context.getRenderContext(),
192*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::VertexSource(vertexShaders.vertexShaderSource1)
193*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(vertexShaders.fragmentShaderSource1));
194*35238bceSAndroid Build Coastguard Worker if (!m_shader1->isOk())
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_shader1;
197*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Test shader compile failed.");
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker // log
201*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Shader 1:" << tcu::TestLog::EndMessage << *m_shader0
202*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Shader 2:" << tcu::TestLog::EndMessage << *m_shader1;
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker // Gen test pattern
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker const int numTriangles = 72;
208*35238bceSAndroid Build Coastguard Worker de::Random rnd(123);
209*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> triangles(numTriangles * 3 * 2);
210*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
211*35238bceSAndroid Build Coastguard Worker
212*35238bceSAndroid Build Coastguard Worker // Narrow triangle pattern
213*35238bceSAndroid Build Coastguard Worker for (int triNdx = 0; triNdx < numTriangles; ++triNdx)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 vertex1 = genRandomVector(rnd);
216*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 vertex2 = genRandomVector(rnd);
217*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 vertex3 = vertex2 + genRandomVector(rnd) * 0.01f; // generate narrow triangles
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker triangles[triNdx * 3 + 0] = vertex1;
220*35238bceSAndroid Build Coastguard Worker triangles[triNdx * 3 + 1] = vertex2;
221*35238bceSAndroid Build Coastguard Worker triangles[triNdx * 3 + 2] = vertex3;
222*35238bceSAndroid Build Coastguard Worker }
223*35238bceSAndroid Build Coastguard Worker
224*35238bceSAndroid Build Coastguard Worker // Normal triangle pattern
225*35238bceSAndroid Build Coastguard Worker for (int triNdx = 0; triNdx < numTriangles; ++triNdx)
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker triangles[(numTriangles + triNdx) * 3 + 0] = genRandomVector(rnd);
228*35238bceSAndroid Build Coastguard Worker triangles[(numTriangles + triNdx) * 3 + 1] = genRandomVector(rnd);
229*35238bceSAndroid Build Coastguard Worker triangles[(numTriangles + triNdx) * 3 + 2] = genRandomVector(rnd);
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker // upload
233*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_arrayBuf);
234*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_arrayBuf);
235*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (int)(triangles.size() * sizeof(tcu::Vec4)), &triangles[0], GL_STATIC_DRAW);
236*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "buffer gen");
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker m_verticesInPattern = numTriangles * 3;
239*35238bceSAndroid Build Coastguard Worker }
240*35238bceSAndroid Build Coastguard Worker }
241*35238bceSAndroid Build Coastguard Worker
deinit(void)242*35238bceSAndroid Build Coastguard Worker void InvarianceTest::deinit(void)
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker delete m_shader0;
245*35238bceSAndroid Build Coastguard Worker delete m_shader1;
246*35238bceSAndroid Build Coastguard Worker
247*35238bceSAndroid Build Coastguard Worker m_shader0 = DE_NULL;
248*35238bceSAndroid Build Coastguard Worker m_shader1 = DE_NULL;
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker if (m_arrayBuf)
251*35238bceSAndroid Build Coastguard Worker {
252*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_arrayBuf);
253*35238bceSAndroid Build Coastguard Worker m_arrayBuf = 0;
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker
iterate(void)257*35238bceSAndroid Build Coastguard Worker InvarianceTest::IterateResult InvarianceTest::iterate(void)
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
260*35238bceSAndroid Build Coastguard Worker const bool depthBufferExists = m_context.getRenderTarget().getDepthBits() != 0;
261*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(m_renderSize, m_renderSize);
262*35238bceSAndroid Build Coastguard Worker bool error = false;
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker // Prepare draw
265*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
266*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
267*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, m_renderSize, m_renderSize);
268*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_arrayBuf);
269*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "setup draw");
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing position invariance." << tcu::TestLog::EndMessage;
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker // Draw position check passes
274*35238bceSAndroid Build Coastguard Worker for (int passNdx = 0; passNdx < 2; ++passNdx)
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram &shader = (passNdx == 0) ? (*m_shader0) : (*m_shader1);
277*35238bceSAndroid Build Coastguard Worker const glw::GLint positionLoc = gl.getAttribLocation(shader.getProgram(), "a_input");
278*35238bceSAndroid Build Coastguard Worker const glw::GLint colorLoc = gl.getUniformLocation(shader.getProgram(), "u_color");
279*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 red = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
280*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 green = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
281*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = (passNdx == 0) ? (red) : (green);
282*35238bceSAndroid Build Coastguard Worker const char *const colorStr = (passNdx == 0) ? ("red - purple") : ("green");
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Drawing position test pattern using shader " << (passNdx + 1)
285*35238bceSAndroid Build Coastguard Worker << ". Primitive color: " << colorStr << "." << tcu::TestLog::EndMessage;
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Worker gl.useProgram(shader.getProgram());
288*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(colorLoc, 1, color.getPtr());
289*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(positionLoc);
290*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), DE_NULL);
291*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, m_verticesInPattern);
292*35238bceSAndroid Build Coastguard Worker gl.disableVertexAttribArray(positionLoc);
293*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "draw pass");
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker
296*35238bceSAndroid Build Coastguard Worker // Read result
297*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
298*35238bceSAndroid Build Coastguard Worker
299*35238bceSAndroid Build Coastguard Worker // Check there are no red pixels
300*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
301*35238bceSAndroid Build Coastguard Worker << "Verifying output. Expecting only green or background colored pixels."
302*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
303*35238bceSAndroid Build Coastguard Worker error |= !checkImage(resultSurface);
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker if (!depthBufferExists)
306*35238bceSAndroid Build Coastguard Worker {
307*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Depth buffer not available, skipping z-test."
308*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker else
311*35238bceSAndroid Build Coastguard Worker {
312*35238bceSAndroid Build Coastguard Worker // Test with Z-test
313*35238bceSAndroid Build Coastguard Worker gl.clearDepthf(1.0f);
314*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
315*35238bceSAndroid Build Coastguard Worker gl.enable(GL_DEPTH_TEST);
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
318*35238bceSAndroid Build Coastguard Worker << "Testing position invariance with z-test. Enabling GL_DEPTH_TEST."
319*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
320*35238bceSAndroid Build Coastguard Worker
321*35238bceSAndroid Build Coastguard Worker // Draw position check passes
322*35238bceSAndroid Build Coastguard Worker for (int passNdx = 0; passNdx < 2; ++passNdx)
323*35238bceSAndroid Build Coastguard Worker {
324*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram &shader = (passNdx == 0) ? (*m_shader0) : (*m_shader1);
325*35238bceSAndroid Build Coastguard Worker const glw::GLint positionLoc = gl.getAttribLocation(shader.getProgram(), "a_input");
326*35238bceSAndroid Build Coastguard Worker const glw::GLint colorLoc = gl.getUniformLocation(shader.getProgram(), "u_color");
327*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 red = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
328*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 green = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
329*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = (passNdx == 0) ? (red) : (green);
330*35238bceSAndroid Build Coastguard Worker const glw::GLenum depthFunc = (passNdx == 0) ? (GL_ALWAYS) : (GL_EQUAL);
331*35238bceSAndroid Build Coastguard Worker const char *const depthFuncStr = (passNdx == 0) ? ("GL_ALWAYS") : ("GL_EQUAL");
332*35238bceSAndroid Build Coastguard Worker const char *const colorStr = (passNdx == 0) ? ("red - purple") : ("green");
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Drawing Z-test pattern using shader " << (passNdx + 1)
335*35238bceSAndroid Build Coastguard Worker << ". Primitive color: " << colorStr << ". DepthFunc: " << depthFuncStr
336*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Worker gl.useProgram(shader.getProgram());
339*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(colorLoc, 1, color.getPtr());
340*35238bceSAndroid Build Coastguard Worker gl.depthFunc(depthFunc);
341*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(positionLoc);
342*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, sizeof(tcu::Vec4), DE_NULL);
343*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, m_verticesInPattern,
344*35238bceSAndroid Build Coastguard Worker m_verticesInPattern); // !< buffer contains 2 m_verticesInPattern-sized patterns
345*35238bceSAndroid Build Coastguard Worker gl.disableVertexAttribArray(positionLoc);
346*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "draw pass");
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker // Read result
350*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
351*35238bceSAndroid Build Coastguard Worker
352*35238bceSAndroid Build Coastguard Worker // Check there are no red pixels
353*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
354*35238bceSAndroid Build Coastguard Worker << "Verifying output. Expecting only green or background colored pixels."
355*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
356*35238bceSAndroid Build Coastguard Worker error |= !checkImage(resultSurface);
357*35238bceSAndroid Build Coastguard Worker }
358*35238bceSAndroid Build Coastguard Worker
359*35238bceSAndroid Build Coastguard Worker // Report result
360*35238bceSAndroid Build Coastguard Worker if (error)
361*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Detected variance between two invariant values");
362*35238bceSAndroid Build Coastguard Worker else
363*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker return STOP;
366*35238bceSAndroid Build Coastguard Worker }
367*35238bceSAndroid Build Coastguard Worker
checkImage(const tcu::Surface & surface) const368*35238bceSAndroid Build Coastguard Worker bool InvarianceTest::checkImage(const tcu::Surface &surface) const
369*35238bceSAndroid Build Coastguard Worker {
370*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 okColor = tcu::IVec4(0, 255, 0, 255);
371*35238bceSAndroid Build Coastguard Worker const tcu::RGBA errColor = tcu::RGBA(255, 0, 0, 255);
372*35238bceSAndroid Build Coastguard Worker bool error = false;
373*35238bceSAndroid Build Coastguard Worker tcu::Surface errorMask(m_renderSize, m_renderSize);
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard Worker tcu::clear(errorMask.getAccess(), okColor);
376*35238bceSAndroid Build Coastguard Worker
377*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < m_renderSize; ++y)
378*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < m_renderSize; ++x)
379*35238bceSAndroid Build Coastguard Worker {
380*35238bceSAndroid Build Coastguard Worker const tcu::RGBA col = surface.getPixel(x, y);
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker if (col.getRed() != 0)
383*35238bceSAndroid Build Coastguard Worker {
384*35238bceSAndroid Build Coastguard Worker errorMask.setPixel(x, y, errColor);
385*35238bceSAndroid Build Coastguard Worker error = true;
386*35238bceSAndroid Build Coastguard Worker }
387*35238bceSAndroid Build Coastguard Worker }
388*35238bceSAndroid Build Coastguard Worker
389*35238bceSAndroid Build Coastguard Worker // report error
390*35238bceSAndroid Build Coastguard Worker if (error)
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
393*35238bceSAndroid Build Coastguard Worker << "Invalid pixels found (fragments from first render pass found). Variance detected."
394*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
395*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::ImageSet("Results", "Result verification")
396*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Image("Result", "Result", surface)
397*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Image("Error mask", "Error mask", errorMask) << tcu::TestLog::EndImageSet;
398*35238bceSAndroid Build Coastguard Worker
399*35238bceSAndroid Build Coastguard Worker return false;
400*35238bceSAndroid Build Coastguard Worker }
401*35238bceSAndroid Build Coastguard Worker else
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "No variance found." << tcu::TestLog::EndMessage;
404*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::ImageSet("Results", "Result verification")
405*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Image("Result", "Result", surface) << tcu::TestLog::EndImageSet;
406*35238bceSAndroid Build Coastguard Worker
407*35238bceSAndroid Build Coastguard Worker return true;
408*35238bceSAndroid Build Coastguard Worker }
409*35238bceSAndroid Build Coastguard Worker }
410*35238bceSAndroid Build Coastguard Worker
411*35238bceSAndroid Build Coastguard Worker class BasicInvarianceTest : public InvarianceTest
412*35238bceSAndroid Build Coastguard Worker {
413*35238bceSAndroid Build Coastguard Worker public:
414*35238bceSAndroid Build Coastguard Worker BasicInvarianceTest(Context &ctx, const char *name, const char *desc, const std::string &vertexShader1,
415*35238bceSAndroid Build Coastguard Worker const std::string &vertexShader2);
416*35238bceSAndroid Build Coastguard Worker ShaderPair genShaders(void) const;
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker private:
419*35238bceSAndroid Build Coastguard Worker const std::string m_vertexShader1;
420*35238bceSAndroid Build Coastguard Worker const std::string m_vertexShader2;
421*35238bceSAndroid Build Coastguard Worker const std::string m_fragmentShader;
422*35238bceSAndroid Build Coastguard Worker static const char *const s_basicFragmentShader;
423*35238bceSAndroid Build Coastguard Worker };
424*35238bceSAndroid Build Coastguard Worker
425*35238bceSAndroid Build Coastguard Worker const char *const BasicInvarianceTest::s_basicFragmentShader =
426*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
427*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 fragColor;\n"
428*35238bceSAndroid Build Coastguard Worker "uniform mediump vec4 u_color;\n"
429*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_unrelated;\n"
430*35238bceSAndroid Build Coastguard Worker "void main ()\n"
431*35238bceSAndroid Build Coastguard Worker "{\n"
432*35238bceSAndroid Build Coastguard Worker " mediump float blue = dot(v_unrelated, vec4(1.0, 1.0, 1.0, 1.0));\n"
433*35238bceSAndroid Build Coastguard Worker " fragColor = vec4(u_color.r, u_color.g, blue, u_color.a);\n"
434*35238bceSAndroid Build Coastguard Worker "}\n";
435*35238bceSAndroid Build Coastguard Worker
BasicInvarianceTest(Context & ctx,const char * name,const char * desc,const std::string & vertexShader1,const std::string & vertexShader2)436*35238bceSAndroid Build Coastguard Worker BasicInvarianceTest::BasicInvarianceTest(Context &ctx, const char *name, const char *desc,
437*35238bceSAndroid Build Coastguard Worker const std::string &vertexShader1, const std::string &vertexShader2)
438*35238bceSAndroid Build Coastguard Worker : InvarianceTest(ctx, name, desc)
439*35238bceSAndroid Build Coastguard Worker , m_vertexShader1(vertexShader1)
440*35238bceSAndroid Build Coastguard Worker , m_vertexShader2(vertexShader2)
441*35238bceSAndroid Build Coastguard Worker , m_fragmentShader(s_basicFragmentShader)
442*35238bceSAndroid Build Coastguard Worker {
443*35238bceSAndroid Build Coastguard Worker }
444*35238bceSAndroid Build Coastguard Worker
genShaders(void) const445*35238bceSAndroid Build Coastguard Worker BasicInvarianceTest::ShaderPair BasicInvarianceTest::genShaders(void) const
446*35238bceSAndroid Build Coastguard Worker {
447*35238bceSAndroid Build Coastguard Worker ShaderPair retVal;
448*35238bceSAndroid Build Coastguard Worker
449*35238bceSAndroid Build Coastguard Worker retVal.vertexShaderSource0 = m_vertexShader1;
450*35238bceSAndroid Build Coastguard Worker retVal.vertexShaderSource1 = m_vertexShader2;
451*35238bceSAndroid Build Coastguard Worker retVal.fragmentShaderSource0 = m_fragmentShader;
452*35238bceSAndroid Build Coastguard Worker retVal.fragmentShaderSource1 = m_fragmentShader;
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker return retVal;
455*35238bceSAndroid Build Coastguard Worker }
456*35238bceSAndroid Build Coastguard Worker
457*35238bceSAndroid Build Coastguard Worker } // namespace
458*35238bceSAndroid Build Coastguard Worker
ShaderInvarianceTests(Context & context)459*35238bceSAndroid Build Coastguard Worker ShaderInvarianceTests::ShaderInvarianceTests(Context &context)
460*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "invariance", "Invariance tests")
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker
~ShaderInvarianceTests(void)464*35238bceSAndroid Build Coastguard Worker ShaderInvarianceTests::~ShaderInvarianceTests(void)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker
init(void)468*35238bceSAndroid Build Coastguard Worker void ShaderInvarianceTests::init(void)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker static const struct PrecisionCase
471*35238bceSAndroid Build Coastguard Worker {
472*35238bceSAndroid Build Coastguard Worker glu::Precision prec;
473*35238bceSAndroid Build Coastguard Worker const char *name;
474*35238bceSAndroid Build Coastguard Worker
475*35238bceSAndroid Build Coastguard Worker // set literals in the glsl to be in the representable range
476*35238bceSAndroid Build Coastguard Worker const char *highValue; // !< highValue < maxValue
477*35238bceSAndroid Build Coastguard Worker const char *invHighValue;
478*35238bceSAndroid Build Coastguard Worker const char *mediumValue; // !< mediumValue^2 < maxValue
479*35238bceSAndroid Build Coastguard Worker const char *lowValue; // !< lowValue^4 < maxValue
480*35238bceSAndroid Build Coastguard Worker const char *invlowValue;
481*35238bceSAndroid Build Coastguard Worker int loopIterations;
482*35238bceSAndroid Build Coastguard Worker int loopPartialIterations;
483*35238bceSAndroid Build Coastguard Worker int loopNormalizationExponent;
484*35238bceSAndroid Build Coastguard Worker const char *loopNormalizationConstantLiteral;
485*35238bceSAndroid Build Coastguard Worker const char *loopMultiplier;
486*35238bceSAndroid Build Coastguard Worker const char *sumLoopNormalizationConstantLiteral;
487*35238bceSAndroid Build Coastguard Worker } precisions[] = {
488*35238bceSAndroid Build Coastguard Worker {glu::PRECISION_HIGHP, "highp", "1.0e20", "1.0e-20", "1.0e14", "1.0e9", "1.0e-9", 14, 11, 2, "1.0e4", "1.9",
489*35238bceSAndroid Build Coastguard Worker "1.0e3"},
490*35238bceSAndroid Build Coastguard Worker {glu::PRECISION_MEDIUMP, "mediump", "1.0e4", "1.0e-4", "1.0e2", "1.0e1", "1.0e-1", 13, 11, 2, "1.0e4", "1.9",
491*35238bceSAndroid Build Coastguard Worker "1.0e3"},
492*35238bceSAndroid Build Coastguard Worker {glu::PRECISION_LOWP, "lowp", "0.9", "1.1", "1.1", "1.15", "0.87", 6, 2, 0, "2.0", "1.1", "1.0"},
493*35238bceSAndroid Build Coastguard Worker };
494*35238bceSAndroid Build Coastguard Worker
495*35238bceSAndroid Build Coastguard Worker for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); ++precNdx)
496*35238bceSAndroid Build Coastguard Worker {
497*35238bceSAndroid Build Coastguard Worker const char *const precisionName = precisions[precNdx].name;
498*35238bceSAndroid Build Coastguard Worker const glu::Precision precision = precisions[precNdx].prec;
499*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const group =
500*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, precisionName, "Invariance tests using the given precision.");
501*35238bceSAndroid Build Coastguard Worker
502*35238bceSAndroid Build Coastguard Worker const FormatArgumentList args =
503*35238bceSAndroid Build Coastguard Worker FormatArgumentList() << FormatArgument("VERSION", "#version 300 es\n") << FormatArgument("IN", "in")
504*35238bceSAndroid Build Coastguard Worker << FormatArgument("OUT", "out") << FormatArgument("IN_PREC", precisionName)
505*35238bceSAndroid Build Coastguard Worker << FormatArgument("HIGH_VALUE", de::toString(precisions[precNdx].highValue))
506*35238bceSAndroid Build Coastguard Worker << FormatArgument("HIGH_VALUE_INV", de::toString(precisions[precNdx].invHighValue))
507*35238bceSAndroid Build Coastguard Worker << FormatArgument("MEDIUM_VALUE", de::toString(precisions[precNdx].mediumValue))
508*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOW_VALUE", de::toString(precisions[precNdx].lowValue))
509*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOW_VALUE_INV", de::toString(precisions[precNdx].invlowValue))
510*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOOP_ITERS", de::toString(precisions[precNdx].loopIterations))
511*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOOP_ITERS_PARTIAL",
512*35238bceSAndroid Build Coastguard Worker de::toString(precisions[precNdx].loopPartialIterations))
513*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOOP_NORM_FRACT_EXP",
514*35238bceSAndroid Build Coastguard Worker de::toString(precisions[precNdx].loopNormalizationExponent))
515*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOOP_NORM_LITERAL",
516*35238bceSAndroid Build Coastguard Worker precisions[precNdx].loopNormalizationConstantLiteral)
517*35238bceSAndroid Build Coastguard Worker << FormatArgument("LOOP_MULTIPLIER", precisions[precNdx].loopMultiplier)
518*35238bceSAndroid Build Coastguard Worker << FormatArgument("SUM_LOOP_NORM_LITERAL",
519*35238bceSAndroid Build Coastguard Worker precisions[precNdx].sumLoopNormalizationConstantLiteral);
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker addChild(group);
522*35238bceSAndroid Build Coastguard Worker
523*35238bceSAndroid Build Coastguard Worker // subexpression cases
524*35238bceSAndroid Build Coastguard Worker {
525*35238bceSAndroid Build Coastguard Worker // First shader shares "${HIGH_VALUE}*a_input.x*a_input.xxxx + ${HIGH_VALUE}*a_input.y*a_input.yyyy" with unrelated output variable. Reordering might result in accuracy loss
526*35238bceSAndroid Build Coastguard Worker // due to the high exponent. In the second shader, the high exponent may be removed during compilation.
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
529*35238bceSAndroid Build Coastguard Worker m_context, "common_subexpression_0", "Shader shares a subexpression with an unrelated variable.",
530*35238bceSAndroid Build Coastguard Worker formatGLSL(
531*35238bceSAndroid Build Coastguard Worker "${VERSION}"
532*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
533*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
534*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
535*35238bceSAndroid Build Coastguard Worker "void main ()\n"
536*35238bceSAndroid Build Coastguard Worker "{\n"
537*35238bceSAndroid Build Coastguard Worker " v_unrelated = a_input.xzxz + (${HIGH_VALUE}*a_input.x*a_input.xxxx + "
538*35238bceSAndroid Build Coastguard Worker "${HIGH_VALUE}*a_input.y*a_input.yyyy) * (1.08 * a_input.zyzy * a_input.xzxz) * ${HIGH_VALUE_INV} "
539*35238bceSAndroid Build Coastguard Worker "* (a_input.z * a_input.zzxz - a_input.z * a_input.zzxz) + (${HIGH_VALUE}*a_input.x*a_input.xxxx + "
540*35238bceSAndroid Build Coastguard Worker "${HIGH_VALUE}*a_input.y*a_input.yyyy) / ${HIGH_VALUE};\n"
541*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + (${HIGH_VALUE}*a_input.x*a_input.xxxx + "
542*35238bceSAndroid Build Coastguard Worker "${HIGH_VALUE}*a_input.y*a_input.yyyy) * ${HIGH_VALUE_INV};\n"
543*35238bceSAndroid Build Coastguard Worker "}\n",
544*35238bceSAndroid Build Coastguard Worker args),
545*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
546*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
547*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
548*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
549*35238bceSAndroid Build Coastguard Worker "void main ()\n"
550*35238bceSAndroid Build Coastguard Worker "{\n"
551*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
552*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + (${HIGH_VALUE}*a_input.x*a_input.xxxx + "
553*35238bceSAndroid Build Coastguard Worker "${HIGH_VALUE}*a_input.y*a_input.yyyy) * ${HIGH_VALUE_INV};\n"
554*35238bceSAndroid Build Coastguard Worker "}\n",
555*35238bceSAndroid Build Coastguard Worker args)));
556*35238bceSAndroid Build Coastguard Worker
557*35238bceSAndroid Build Coastguard Worker // In the first shader, the unrelated variable "d" has mathematically the same expression as "e", but the different
558*35238bceSAndroid Build Coastguard Worker // order of calculation might cause different results.
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
561*35238bceSAndroid Build Coastguard Worker m_context, "common_subexpression_1", "Shader shares a subexpression with an unrelated variable.",
562*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
563*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
564*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
565*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
566*35238bceSAndroid Build Coastguard Worker "void main ()\n"
567*35238bceSAndroid Build Coastguard Worker "{\n"
568*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 a = ${HIGH_VALUE} * a_input.zzxx + a_input.xzxy - ${HIGH_VALUE} * "
569*35238bceSAndroid Build Coastguard Worker "a_input.zzxx;\n"
570*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 b = ${HIGH_VALUE} * a_input.zzxx;\n"
571*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = b - ${HIGH_VALUE} * a_input.zzxx + a_input.xzxy;\n"
572*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 d = (${LOW_VALUE} * a_input.yzxx) * (${LOW_VALUE} * a_input.yzzw) * "
573*35238bceSAndroid Build Coastguard Worker "(1.1*${LOW_VALUE_INV} * a_input.yzxx) * (${LOW_VALUE_INV} * a_input.xzzy);\n"
574*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 e = ((${LOW_VALUE} * a_input.yzxx) * (1.1*${LOW_VALUE_INV} * "
575*35238bceSAndroid Build Coastguard Worker "a_input.yzxx)) * ((${LOW_VALUE_INV} * a_input.xzzy) * (${LOW_VALUE} * a_input.yzzw));\n"
576*35238bceSAndroid Build Coastguard Worker " v_unrelated = a + b + c + d + e;\n"
577*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + fract(c) + e;\n"
578*35238bceSAndroid Build Coastguard Worker "}\n",
579*35238bceSAndroid Build Coastguard Worker args),
580*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
581*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
582*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
583*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
584*35238bceSAndroid Build Coastguard Worker "void main ()\n"
585*35238bceSAndroid Build Coastguard Worker "{\n"
586*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 b = ${HIGH_VALUE} * a_input.zzxx;\n"
587*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = b - ${HIGH_VALUE} * a_input.zzxx + a_input.xzxy;\n"
588*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 e = ((${LOW_VALUE} * a_input.yzxx) * (1.1*${LOW_VALUE_INV} * "
589*35238bceSAndroid Build Coastguard Worker "a_input.yzxx)) * ((${LOW_VALUE_INV} * a_input.xzzy) * (${LOW_VALUE} * a_input.yzzw));\n"
590*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
591*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + fract(c) + e;\n"
592*35238bceSAndroid Build Coastguard Worker "}\n",
593*35238bceSAndroid Build Coastguard Worker args)));
594*35238bceSAndroid Build Coastguard Worker
595*35238bceSAndroid Build Coastguard Worker // Intermediate values used by an unrelated output variable
596*35238bceSAndroid Build Coastguard Worker
597*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
598*35238bceSAndroid Build Coastguard Worker m_context, "common_subexpression_2", "Shader shares a subexpression with an unrelated variable.",
599*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
600*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
601*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
602*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
603*35238bceSAndroid Build Coastguard Worker "void main ()\n"
604*35238bceSAndroid Build Coastguard Worker "{\n"
605*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 a = ${MEDIUM_VALUE} * (a_input.xxxx + a_input.yyyy);\n"
606*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 b = (${MEDIUM_VALUE} * (a_input.xxxx + a_input.yyyy)) * "
607*35238bceSAndroid Build Coastguard Worker "(${MEDIUM_VALUE} * (a_input.xxxx + a_input.yyyy)) / ${MEDIUM_VALUE} / ${MEDIUM_VALUE};\n"
608*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = a * a;\n"
609*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 d = c / ${MEDIUM_VALUE} / ${MEDIUM_VALUE};\n"
610*35238bceSAndroid Build Coastguard Worker " v_unrelated = a + b + c + d;\n"
611*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + d;\n"
612*35238bceSAndroid Build Coastguard Worker "}\n",
613*35238bceSAndroid Build Coastguard Worker args),
614*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
615*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
616*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
617*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
618*35238bceSAndroid Build Coastguard Worker "void main ()\n"
619*35238bceSAndroid Build Coastguard Worker "{\n"
620*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 a = ${MEDIUM_VALUE} * (a_input.xxxx + a_input.yyyy);\n"
621*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = a * a;\n"
622*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 d = c / ${MEDIUM_VALUE} / ${MEDIUM_VALUE};\n"
623*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
624*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + d;\n"
625*35238bceSAndroid Build Coastguard Worker "}\n",
626*35238bceSAndroid Build Coastguard Worker args)));
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker // Invariant value can be calculated using unrelated value
629*35238bceSAndroid Build Coastguard Worker
630*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(m_context, "common_subexpression_3",
631*35238bceSAndroid Build Coastguard Worker "Shader shares a subexpression with an unrelated variable.",
632*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
633*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
634*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
635*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
636*35238bceSAndroid Build Coastguard Worker "void main ()\n"
637*35238bceSAndroid Build Coastguard Worker "{\n"
638*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} float x = a_input.x * 0.2;\n"
639*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 a = a_input.xxyx * 0.7;\n"
640*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 b = a_input.yxyz * 0.7;\n"
641*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = a_input.zxyx * 0.5;\n"
642*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 f = x*a + x*b + x*c;\n"
643*35238bceSAndroid Build Coastguard Worker " v_unrelated = f;\n"
644*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 g = x * (a + b + c);\n"
645*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + g;\n"
646*35238bceSAndroid Build Coastguard Worker "}\n",
647*35238bceSAndroid Build Coastguard Worker args),
648*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
649*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
650*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
651*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
652*35238bceSAndroid Build Coastguard Worker "void main ()\n"
653*35238bceSAndroid Build Coastguard Worker "{\n"
654*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} float x = a_input.x * 0.2;\n"
655*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 a = a_input.xxyx * 0.7;\n"
656*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 b = a_input.yxyz * 0.7;\n"
657*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 c = a_input.zxyx * 0.5;\n"
658*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
659*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 g = x * (a + b + c);\n"
660*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + g;\n"
661*35238bceSAndroid Build Coastguard Worker "}\n",
662*35238bceSAndroid Build Coastguard Worker args)));
663*35238bceSAndroid Build Coastguard Worker }
664*35238bceSAndroid Build Coastguard Worker
665*35238bceSAndroid Build Coastguard Worker // shared subexpression of different precision
666*35238bceSAndroid Build Coastguard Worker {
667*35238bceSAndroid Build Coastguard Worker for (int precisionOther = glu::PRECISION_LOWP; precisionOther != glu::PRECISION_LAST; ++precisionOther)
668*35238bceSAndroid Build Coastguard Worker {
669*35238bceSAndroid Build Coastguard Worker const char *const unrelatedPrec = glu::getPrecisionName((glu::Precision)precisionOther);
670*35238bceSAndroid Build Coastguard Worker const glu::Precision minPrecision =
671*35238bceSAndroid Build Coastguard Worker (precisionOther < (int)precision) ? ((glu::Precision)precisionOther) : (precision);
672*35238bceSAndroid Build Coastguard Worker const char *const multiplierStr =
673*35238bceSAndroid Build Coastguard Worker (minPrecision == glu::PRECISION_LOWP) ? ("0.8, 0.4, -0.2, 0.3") : ("1.0e1, 5.0e2, 2.0e2, 1.0");
674*35238bceSAndroid Build Coastguard Worker const char *const normalizationStrUsed =
675*35238bceSAndroid Build Coastguard Worker (minPrecision == glu::PRECISION_LOWP) ?
676*35238bceSAndroid Build Coastguard Worker ("vec4(fract(used2).xyz, 0.0)") :
677*35238bceSAndroid Build Coastguard Worker ("vec4(fract(used2 / 1.0e2).xyz - fract(used2 / 1.0e3).xyz, 0.0)");
678*35238bceSAndroid Build Coastguard Worker const char *const normalizationStrUnrelated =
679*35238bceSAndroid Build Coastguard Worker (minPrecision == glu::PRECISION_LOWP) ?
680*35238bceSAndroid Build Coastguard Worker ("vec4(fract(unrelated2).xyz, 0.0)") :
681*35238bceSAndroid Build Coastguard Worker ("vec4(fract(unrelated2 / 1.0e2).xyz - fract(unrelated2 / 1.0e3).xyz, 0.0)");
682*35238bceSAndroid Build Coastguard Worker
683*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
684*35238bceSAndroid Build Coastguard Worker m_context, ("subexpression_precision_" + std::string(unrelatedPrec)).c_str(),
685*35238bceSAndroid Build Coastguard Worker "Shader shares subexpression of different precision with an unrelated variable.",
686*35238bceSAndroid Build Coastguard Worker formatGLSL(
687*35238bceSAndroid Build Coastguard Worker "${VERSION}"
688*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
689*35238bceSAndroid Build Coastguard Worker "${OUT} ${UNRELATED_PREC} vec4 v_unrelated;\n"
690*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
691*35238bceSAndroid Build Coastguard Worker "void main ()\n"
692*35238bceSAndroid Build Coastguard Worker "{\n"
693*35238bceSAndroid Build Coastguard Worker " ${UNRELATED_PREC} vec4 unrelated0 = a_input + vec4(0.1, 0.2, 0.3, 0.4);\n"
694*35238bceSAndroid Build Coastguard Worker " ${UNRELATED_PREC} vec4 unrelated1 = vec4(${MULTIPLIER}) * unrelated0.xywz + unrelated0;\n"
695*35238bceSAndroid Build Coastguard Worker " ${UNRELATED_PREC} vec4 unrelated2 = refract(unrelated1, unrelated0, distance(unrelated0, "
696*35238bceSAndroid Build Coastguard Worker "unrelated1));\n"
697*35238bceSAndroid Build Coastguard Worker " v_unrelated = a_input + 0.02 * ${NORMALIZE_UNRELATED};\n"
698*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used0 = a_input + vec4(0.1, 0.2, 0.3, 0.4);\n"
699*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used1 = vec4(${MULTIPLIER}) * used0.xywz + used0;\n"
700*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used2 = refract(used1, used0, distance(used0, used1));\n"
701*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.02 * ${NORMALIZE_USED};\n"
702*35238bceSAndroid Build Coastguard Worker "}\n",
703*35238bceSAndroid Build Coastguard Worker FormatArgumentList(args) << FormatArgument("UNRELATED_PREC", unrelatedPrec)
704*35238bceSAndroid Build Coastguard Worker << FormatArgument("MULTIPLIER", multiplierStr)
705*35238bceSAndroid Build Coastguard Worker << FormatArgument("NORMALIZE_USED", normalizationStrUsed)
706*35238bceSAndroid Build Coastguard Worker << FormatArgument("NORMALIZE_UNRELATED", normalizationStrUnrelated)),
707*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
708*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
709*35238bceSAndroid Build Coastguard Worker "${OUT} ${UNRELATED_PREC} vec4 v_unrelated;\n"
710*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
711*35238bceSAndroid Build Coastguard Worker "void main ()\n"
712*35238bceSAndroid Build Coastguard Worker "{\n"
713*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
714*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used0 = a_input + vec4(0.1, 0.2, 0.3, 0.4);\n"
715*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used1 = vec4(${MULTIPLIER}) * used0.xywz + used0;\n"
716*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 used2 = refract(used1, used0, distance(used0, used1));\n"
717*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.02 * ${NORMALIZE_USED};\n"
718*35238bceSAndroid Build Coastguard Worker "}\n",
719*35238bceSAndroid Build Coastguard Worker FormatArgumentList(args)
720*35238bceSAndroid Build Coastguard Worker << FormatArgument("UNRELATED_PREC", unrelatedPrec)
721*35238bceSAndroid Build Coastguard Worker << FormatArgument("MULTIPLIER", multiplierStr)
722*35238bceSAndroid Build Coastguard Worker << FormatArgument("NORMALIZE_USED", normalizationStrUsed)
723*35238bceSAndroid Build Coastguard Worker << FormatArgument("NORMALIZE_UNRELATED", normalizationStrUnrelated))));
724*35238bceSAndroid Build Coastguard Worker }
725*35238bceSAndroid Build Coastguard Worker }
726*35238bceSAndroid Build Coastguard Worker
727*35238bceSAndroid Build Coastguard Worker // loops
728*35238bceSAndroid Build Coastguard Worker {
729*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
730*35238bceSAndroid Build Coastguard Worker m_context, "loop_0", "Invariant value set using a loop",
731*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
732*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
733*35238bceSAndroid Build Coastguard Worker "${OUT} highp vec4 v_unrelated;\n"
734*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
735*35238bceSAndroid Build Coastguard Worker "void main ()\n"
736*35238bceSAndroid Build Coastguard Worker "{\n"
737*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
738*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
739*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
740*35238bceSAndroid Build Coastguard Worker " {\n"
741*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
742*35238bceSAndroid Build Coastguard Worker " v_unrelated += value;\n"
743*35238bceSAndroid Build Coastguard Worker " }\n"
744*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(value.xyz / ${LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
745*35238bceSAndroid Build Coastguard Worker "}\n",
746*35238bceSAndroid Build Coastguard Worker args),
747*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
748*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
749*35238bceSAndroid Build Coastguard Worker "${OUT} highp vec4 v_unrelated;\n"
750*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
751*35238bceSAndroid Build Coastguard Worker "void main ()\n"
752*35238bceSAndroid Build Coastguard Worker "{\n"
753*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
754*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
755*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
756*35238bceSAndroid Build Coastguard Worker " {\n"
757*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
758*35238bceSAndroid Build Coastguard Worker " }\n"
759*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(value.xyz / ${LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
760*35238bceSAndroid Build Coastguard Worker "}\n",
761*35238bceSAndroid Build Coastguard Worker args)));
762*35238bceSAndroid Build Coastguard Worker
763*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
764*35238bceSAndroid Build Coastguard Worker m_context, "loop_1", "Invariant value set using a loop",
765*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
766*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
767*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
768*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
769*35238bceSAndroid Build Coastguard Worker "void main ()\n"
770*35238bceSAndroid Build Coastguard Worker "{\n"
771*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
772*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
773*35238bceSAndroid Build Coastguard Worker " {\n"
774*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
775*35238bceSAndroid Build Coastguard Worker " if (i == ${LOOP_ITERS_PARTIAL})\n"
776*35238bceSAndroid Build Coastguard Worker " v_unrelated = value;\n"
777*35238bceSAndroid Build Coastguard Worker " }\n"
778*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(value.xyz / ${LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
779*35238bceSAndroid Build Coastguard Worker "}\n",
780*35238bceSAndroid Build Coastguard Worker args),
781*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
782*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
783*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
784*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
785*35238bceSAndroid Build Coastguard Worker "void main ()\n"
786*35238bceSAndroid Build Coastguard Worker "{\n"
787*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
788*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
789*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
790*35238bceSAndroid Build Coastguard Worker " {\n"
791*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
792*35238bceSAndroid Build Coastguard Worker " }\n"
793*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(value.xyz / ${LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
794*35238bceSAndroid Build Coastguard Worker "}\n",
795*35238bceSAndroid Build Coastguard Worker args)));
796*35238bceSAndroid Build Coastguard Worker
797*35238bceSAndroid Build Coastguard Worker group->addChild(
798*35238bceSAndroid Build Coastguard Worker new BasicInvarianceTest(m_context, "loop_2", "Invariant value set using a loop",
799*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
800*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
801*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
802*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
803*35238bceSAndroid Build Coastguard Worker "void main ()\n"
804*35238bceSAndroid Build Coastguard Worker "{\n"
805*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
806*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, -1.0, 1.0);\n"
807*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
808*35238bceSAndroid Build Coastguard Worker " {\n"
809*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
810*35238bceSAndroid Build Coastguard Worker " if (i == ${LOOP_ITERS_PARTIAL})\n"
811*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.05 * vec4(fract(value.xyz / "
812*35238bceSAndroid Build Coastguard Worker "1.0e${LOOP_NORM_FRACT_EXP}), 1.0);\n"
813*35238bceSAndroid Build Coastguard Worker " else\n"
814*35238bceSAndroid Build Coastguard Worker " v_unrelated = value + a_input;\n"
815*35238bceSAndroid Build Coastguard Worker " }\n"
816*35238bceSAndroid Build Coastguard Worker "}\n",
817*35238bceSAndroid Build Coastguard Worker args),
818*35238bceSAndroid Build Coastguard Worker formatGLSL("${VERSION}"
819*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
820*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
821*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
822*35238bceSAndroid Build Coastguard Worker "void main ()\n"
823*35238bceSAndroid Build Coastguard Worker "{\n"
824*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
825*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, -1.0, 1.0);\n"
826*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
827*35238bceSAndroid Build Coastguard Worker " {\n"
828*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
829*35238bceSAndroid Build Coastguard Worker " if (i == ${LOOP_ITERS_PARTIAL})\n"
830*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.05 * vec4(fract(value.xyz / "
831*35238bceSAndroid Build Coastguard Worker "1.0e${LOOP_NORM_FRACT_EXP}), 1.0);\n"
832*35238bceSAndroid Build Coastguard Worker " else\n"
833*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
834*35238bceSAndroid Build Coastguard Worker " }\n"
835*35238bceSAndroid Build Coastguard Worker "}\n",
836*35238bceSAndroid Build Coastguard Worker args)));
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
839*35238bceSAndroid Build Coastguard Worker m_context, "loop_3", "Invariant value set using a loop",
840*35238bceSAndroid Build Coastguard Worker formatGLSL(
841*35238bceSAndroid Build Coastguard Worker "${VERSION}"
842*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
843*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
844*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
845*35238bceSAndroid Build Coastguard Worker "void main ()\n"
846*35238bceSAndroid Build Coastguard Worker "{\n"
847*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
848*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
849*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
850*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
851*35238bceSAndroid Build Coastguard Worker " {\n"
852*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
853*35238bceSAndroid Build Coastguard Worker " gl_Position += vec4(value.xyz / ${SUM_LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
854*35238bceSAndroid Build Coastguard Worker " v_unrelated = gl_Position.xyzx * a_input;\n"
855*35238bceSAndroid Build Coastguard Worker " }\n"
856*35238bceSAndroid Build Coastguard Worker "}\n",
857*35238bceSAndroid Build Coastguard Worker args),
858*35238bceSAndroid Build Coastguard Worker formatGLSL(
859*35238bceSAndroid Build Coastguard Worker "${VERSION}"
860*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
861*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
862*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
863*35238bceSAndroid Build Coastguard Worker "void main ()\n"
864*35238bceSAndroid Build Coastguard Worker "{\n"
865*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value = a_input;\n"
866*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
867*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
868*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
869*35238bceSAndroid Build Coastguard Worker " {\n"
870*35238bceSAndroid Build Coastguard Worker " value *= ${LOOP_MULTIPLIER};\n"
871*35238bceSAndroid Build Coastguard Worker " gl_Position += vec4(value.xyz / ${SUM_LOOP_NORM_LITERAL} + a_input.xyz * 0.1, 1.0);\n"
872*35238bceSAndroid Build Coastguard Worker " }\n"
873*35238bceSAndroid Build Coastguard Worker "}\n",
874*35238bceSAndroid Build Coastguard Worker args)));
875*35238bceSAndroid Build Coastguard Worker
876*35238bceSAndroid Build Coastguard Worker group->addChild(new BasicInvarianceTest(
877*35238bceSAndroid Build Coastguard Worker m_context, "loop_4", "Invariant value set using a loop",
878*35238bceSAndroid Build Coastguard Worker formatGLSL(
879*35238bceSAndroid Build Coastguard Worker "${VERSION}"
880*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
881*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
882*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
883*35238bceSAndroid Build Coastguard Worker "void main ()\n"
884*35238bceSAndroid Build Coastguard Worker "{\n"
885*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 position = vec4(0.0, 0.0, 0.0, 0.0);\n"
886*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value1 = a_input;\n"
887*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value2 = a_input;\n"
888*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
889*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
890*35238bceSAndroid Build Coastguard Worker " {\n"
891*35238bceSAndroid Build Coastguard Worker " value1 *= ${LOOP_MULTIPLIER};\n"
892*35238bceSAndroid Build Coastguard Worker " v_unrelated = v_unrelated*1.3 + a_input.xyzx * value1.xyxw;\n"
893*35238bceSAndroid Build Coastguard Worker " }\n"
894*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
895*35238bceSAndroid Build Coastguard Worker " {\n"
896*35238bceSAndroid Build Coastguard Worker " value2 *= ${LOOP_MULTIPLIER};\n"
897*35238bceSAndroid Build Coastguard Worker " position = position*1.3 + a_input.xyzx * value2.xyxw;\n"
898*35238bceSAndroid Build Coastguard Worker " }\n"
899*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.05 * vec4(fract(position.xyz / 1.0e${LOOP_NORM_FRACT_EXP}), 1.0);\n"
900*35238bceSAndroid Build Coastguard Worker "}\n",
901*35238bceSAndroid Build Coastguard Worker args),
902*35238bceSAndroid Build Coastguard Worker formatGLSL(
903*35238bceSAndroid Build Coastguard Worker "${VERSION}"
904*35238bceSAndroid Build Coastguard Worker "${IN} ${IN_PREC} vec4 a_input;\n"
905*35238bceSAndroid Build Coastguard Worker "${OUT} mediump vec4 v_unrelated;\n"
906*35238bceSAndroid Build Coastguard Worker "invariant gl_Position;\n"
907*35238bceSAndroid Build Coastguard Worker "void main ()\n"
908*35238bceSAndroid Build Coastguard Worker "{\n"
909*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 position = vec4(0.0, 0.0, 0.0, 0.0);\n"
910*35238bceSAndroid Build Coastguard Worker " ${IN_PREC} vec4 value2 = a_input;\n"
911*35238bceSAndroid Build Coastguard Worker " v_unrelated = vec4(0.0, 0.0, 0.0, 0.0);\n"
912*35238bceSAndroid Build Coastguard Worker " for (mediump int i = 0; i < ${LOOP_ITERS}; ++i)\n"
913*35238bceSAndroid Build Coastguard Worker " {\n"
914*35238bceSAndroid Build Coastguard Worker " value2 *= ${LOOP_MULTIPLIER};\n"
915*35238bceSAndroid Build Coastguard Worker " position = position*1.3 + a_input.xyzx * value2.xyxw;\n"
916*35238bceSAndroid Build Coastguard Worker " }\n"
917*35238bceSAndroid Build Coastguard Worker " gl_Position = a_input + 0.05 * vec4(fract(position.xyz / 1.0e${LOOP_NORM_FRACT_EXP}), 1.0);\n"
918*35238bceSAndroid Build Coastguard Worker "}\n",
919*35238bceSAndroid Build Coastguard Worker args)));
920*35238bceSAndroid Build Coastguard Worker }
921*35238bceSAndroid Build Coastguard Worker }
922*35238bceSAndroid Build Coastguard Worker }
923*35238bceSAndroid Build Coastguard Worker
924*35238bceSAndroid Build Coastguard Worker } // namespace Functional
925*35238bceSAndroid Build Coastguard Worker } // namespace gles3
926*35238bceSAndroid Build Coastguard Worker } // namespace deqp
927