xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fShaderStructTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Shader struct tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fShaderStructTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker using tcu::StringTemplate;
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
36*35238bceSAndroid Build Coastguard Worker using std::string;
37*35238bceSAndroid Build Coastguard Worker using std::vector;
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker using namespace glu;
40*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker namespace deqp
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace gles3
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace Functional
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker enum
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker     TEXTURE_BRICK = 0 //!< Unit index for brick texture
52*35238bceSAndroid Build Coastguard Worker };
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker typedef void (*SetupUniformsFunc)(const glw::Functions &gl, uint32_t programID, const tcu::Vec4 &constCoords);
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker class ShaderStructCase : public ShaderRenderCase
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker public:
59*35238bceSAndroid Build Coastguard Worker     ShaderStructCase(Context &context, const char *name, const char *description, bool isVertexCase, bool usesTextures,
60*35238bceSAndroid Build Coastguard Worker                      ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char *vertShaderSource,
61*35238bceSAndroid Build Coastguard Worker                      const char *fragShaderSource);
62*35238bceSAndroid Build Coastguard Worker     ~ShaderStructCase(void);
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker     void init(void);
65*35238bceSAndroid Build Coastguard Worker     void deinit(void);
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     virtual void setupUniforms(int programID, const tcu::Vec4 &constCoords);
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker private:
70*35238bceSAndroid Build Coastguard Worker     ShaderStructCase(const ShaderStructCase &);
71*35238bceSAndroid Build Coastguard Worker     ShaderStructCase &operator=(const ShaderStructCase &);
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker     SetupUniformsFunc m_setupUniforms;
74*35238bceSAndroid Build Coastguard Worker     bool m_usesTexture;
75*35238bceSAndroid Build Coastguard Worker 
76*35238bceSAndroid Build Coastguard Worker     glu::Texture2D *m_brickTexture;
77*35238bceSAndroid Build Coastguard Worker };
78*35238bceSAndroid Build Coastguard Worker 
ShaderStructCase(Context & context,const char * name,const char * description,bool isVertexCase,bool usesTextures,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniformsFunc,const char * vertShaderSource,const char * fragShaderSource)79*35238bceSAndroid Build Coastguard Worker ShaderStructCase::ShaderStructCase(Context &context, const char *name, const char *description, bool isVertexCase,
80*35238bceSAndroid Build Coastguard Worker                                    bool usesTextures, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc,
81*35238bceSAndroid Build Coastguard Worker                                    const char *vertShaderSource, const char *fragShaderSource)
82*35238bceSAndroid Build Coastguard Worker     : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
83*35238bceSAndroid Build Coastguard Worker                        description, isVertexCase, evalFunc)
84*35238bceSAndroid Build Coastguard Worker     , m_setupUniforms(setupUniformsFunc)
85*35238bceSAndroid Build Coastguard Worker     , m_usesTexture(usesTextures)
86*35238bceSAndroid Build Coastguard Worker     , m_brickTexture(DE_NULL)
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = vertShaderSource;
89*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = fragShaderSource;
90*35238bceSAndroid Build Coastguard Worker }
91*35238bceSAndroid Build Coastguard Worker 
~ShaderStructCase(void)92*35238bceSAndroid Build Coastguard Worker ShaderStructCase::~ShaderStructCase(void)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker     delete m_brickTexture;
95*35238bceSAndroid Build Coastguard Worker }
96*35238bceSAndroid Build Coastguard Worker 
init(void)97*35238bceSAndroid Build Coastguard Worker void ShaderStructCase::init(void)
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker     if (m_usesTexture)
100*35238bceSAndroid Build Coastguard Worker     {
101*35238bceSAndroid Build Coastguard Worker         m_brickTexture = glu::Texture2D::create(m_renderCtx, m_ctxInfo, m_testCtx.getArchive(), "data/brick.png");
102*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(TextureBinding(
103*35238bceSAndroid Build Coastguard Worker             m_brickTexture, tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE,
104*35238bceSAndroid Build Coastguard Worker                                          tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::LINEAR, tcu::Sampler::LINEAR)));
105*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_textures.size() == 1);
106*35238bceSAndroid Build Coastguard Worker     }
107*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::init();
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker 
deinit(void)110*35238bceSAndroid Build Coastguard Worker void ShaderStructCase::deinit(void)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::deinit();
113*35238bceSAndroid Build Coastguard Worker     delete m_brickTexture;
114*35238bceSAndroid Build Coastguard Worker     m_brickTexture = DE_NULL;
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker 
setupUniforms(int programID,const tcu::Vec4 & constCoords)117*35238bceSAndroid Build Coastguard Worker void ShaderStructCase::setupUniforms(int programID, const tcu::Vec4 &constCoords)
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker     ShaderRenderCase::setupUniforms(programID, constCoords);
120*35238bceSAndroid Build Coastguard Worker     if (m_setupUniforms)
121*35238bceSAndroid Build Coastguard Worker         m_setupUniforms(m_renderCtx.getFunctions(), programID, constCoords);
122*35238bceSAndroid Build Coastguard Worker }
123*35238bceSAndroid Build Coastguard Worker 
createStructCase(Context & context,const char * name,const char * description,bool isVertexCase,bool usesTextures,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniforms,const LineStream & shaderSrc,const std::map<std::string,std::string> * additionalParams)124*35238bceSAndroid Build Coastguard Worker static ShaderStructCase *createStructCase(Context &context, const char *name, const char *description,
125*35238bceSAndroid Build Coastguard Worker                                           bool isVertexCase, bool usesTextures, ShaderEvalFunc evalFunc,
126*35238bceSAndroid Build Coastguard Worker                                           SetupUniformsFunc setupUniforms, const LineStream &shaderSrc,
127*35238bceSAndroid Build Coastguard Worker                                           const std::map<std::string, std::string> *additionalParams)
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker     static const char *defaultVertSrc = "#version 300 es\n"
130*35238bceSAndroid Build Coastguard Worker                                         "in highp vec4 a_position;\n"
131*35238bceSAndroid Build Coastguard Worker                                         "in highp vec4 a_coords;\n"
132*35238bceSAndroid Build Coastguard Worker                                         "out mediump vec4 v_coords;\n\n"
133*35238bceSAndroid Build Coastguard Worker                                         "void main (void)\n"
134*35238bceSAndroid Build Coastguard Worker                                         "{\n"
135*35238bceSAndroid Build Coastguard Worker                                         "    v_coords = a_coords;\n"
136*35238bceSAndroid Build Coastguard Worker                                         "    gl_Position = a_position;\n"
137*35238bceSAndroid Build Coastguard Worker                                         "}\n";
138*35238bceSAndroid Build Coastguard Worker     static const char *defaultFragSrc = "#version 300 es\n"
139*35238bceSAndroid Build Coastguard Worker                                         "in mediump vec4 v_color;\n"
140*35238bceSAndroid Build Coastguard Worker                                         "layout(location = 0) out mediump vec4 o_color;\n\n"
141*35238bceSAndroid Build Coastguard Worker                                         "void main (void)\n"
142*35238bceSAndroid Build Coastguard Worker                                         "{\n"
143*35238bceSAndroid Build Coastguard Worker                                         "    o_color = v_color;\n"
144*35238bceSAndroid Build Coastguard Worker                                         "}\n";
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     // Fill in specialization parameters.
147*35238bceSAndroid Build Coastguard Worker     std::map<std::string, std::string> spParams;
148*35238bceSAndroid Build Coastguard Worker     if (isVertexCase)
149*35238bceSAndroid Build Coastguard Worker     {
150*35238bceSAndroid Build Coastguard Worker         spParams["HEADER"]     = "#version 300 es\n"
151*35238bceSAndroid Build Coastguard Worker                                  "in highp vec4 a_position;\n"
152*35238bceSAndroid Build Coastguard Worker                                  "in highp vec4 a_coords;\n"
153*35238bceSAndroid Build Coastguard Worker                                  "out mediump vec4 v_color;";
154*35238bceSAndroid Build Coastguard Worker         spParams["COORDS"]     = "a_coords";
155*35238bceSAndroid Build Coastguard Worker         spParams["DST"]        = "v_color";
156*35238bceSAndroid Build Coastguard Worker         spParams["ASSIGN_POS"] = "gl_Position = a_position;";
157*35238bceSAndroid Build Coastguard Worker     }
158*35238bceSAndroid Build Coastguard Worker     else
159*35238bceSAndroid Build Coastguard Worker     {
160*35238bceSAndroid Build Coastguard Worker         spParams["HEADER"]     = "#version 300 es\n"
161*35238bceSAndroid Build Coastguard Worker                                  "in mediump vec4 v_coords;\n"
162*35238bceSAndroid Build Coastguard Worker                                  "layout(location = 0) out mediump vec4 o_color;";
163*35238bceSAndroid Build Coastguard Worker         spParams["COORDS"]     = "v_coords";
164*35238bceSAndroid Build Coastguard Worker         spParams["DST"]        = "o_color";
165*35238bceSAndroid Build Coastguard Worker         spParams["ASSIGN_POS"] = "";
166*35238bceSAndroid Build Coastguard Worker     }
167*35238bceSAndroid Build Coastguard Worker     if (additionalParams)
168*35238bceSAndroid Build Coastguard Worker         spParams.insert(additionalParams->begin(), additionalParams->end());
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker     if (isVertexCase)
171*35238bceSAndroid Build Coastguard Worker         return new ShaderStructCase(context, name, description, isVertexCase, usesTextures, evalFunc, setupUniforms,
172*35238bceSAndroid Build Coastguard Worker                                     StringTemplate(shaderSrc.str()).specialize(spParams).c_str(), defaultFragSrc);
173*35238bceSAndroid Build Coastguard Worker     else
174*35238bceSAndroid Build Coastguard Worker         return new ShaderStructCase(context, name, description, isVertexCase, usesTextures, evalFunc, setupUniforms,
175*35238bceSAndroid Build Coastguard Worker                                     defaultVertSrc, StringTemplate(shaderSrc.str()).specialize(spParams).c_str());
176*35238bceSAndroid Build Coastguard Worker }
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker class LocalStructTests : public TestCaseGroup
179*35238bceSAndroid Build Coastguard Worker {
180*35238bceSAndroid Build Coastguard Worker public:
LocalStructTests(Context & context)181*35238bceSAndroid Build Coastguard Worker     LocalStructTests(Context &context) : TestCaseGroup(context, "local", "Local structs")
182*35238bceSAndroid Build Coastguard Worker     {
183*35238bceSAndroid Build Coastguard Worker     }
184*35238bceSAndroid Build Coastguard Worker 
~LocalStructTests(void)185*35238bceSAndroid Build Coastguard Worker     ~LocalStructTests(void)
186*35238bceSAndroid Build Coastguard Worker     {
187*35238bceSAndroid Build Coastguard Worker     }
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
190*35238bceSAndroid Build Coastguard Worker };
191*35238bceSAndroid Build Coastguard Worker 
init(void)192*35238bceSAndroid Build Coastguard Worker void LocalStructTests::init(void)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker #define LOCAL_STRUCT_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, PARAMS)                       \
195*35238bceSAndroid Build Coastguard Worker     do                                                                                                               \
196*35238bceSAndroid Build Coastguard Worker     {                                                                                                                \
197*35238bceSAndroid Build Coastguard Worker         struct Eval_##NAME                                                                                           \
198*35238bceSAndroid Build Coastguard Worker         {                                                                                                            \
199*35238bceSAndroid Build Coastguard Worker             static void eval(ShaderEvalContext &c) EVAL_FUNC_BODY                                                    \
200*35238bceSAndroid Build Coastguard Worker         }; /* NOLINT(EVAL_FUNC_BODY) */                                                                              \
201*35238bceSAndroid Build Coastguard Worker         addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, false, &Eval_##NAME::eval, DE_NULL, \
202*35238bceSAndroid Build Coastguard Worker                                   SHADER_SRC, PARAMS));                                                              \
203*35238bceSAndroid Build Coastguard Worker         addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, false, &Eval_##NAME::eval,       \
204*35238bceSAndroid Build Coastguard Worker                                   DE_NULL, SHADER_SRC, PARAMS));                                                     \
205*35238bceSAndroid Build Coastguard Worker     } while (false)
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker #define LOCAL_STRUCT_CASE(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY) \
208*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, DE_NULL)
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(basic, "Basic struct usage",
211*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
212*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
213*35238bceSAndroid Build Coastguard Worker                                    << ""
214*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
215*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
216*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
217*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
218*35238bceSAndroid Build Coastguard Worker                                    << "};"
219*35238bceSAndroid Build Coastguard Worker                                    << ""
220*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
221*35238bceSAndroid Build Coastguard Worker                                    << "{"
222*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, vec3(0.0), ui_one);"
223*35238bceSAndroid Build Coastguard Worker                                    << "    s.b = ${COORDS}.yzw;"
224*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
225*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
226*35238bceSAndroid Build Coastguard Worker                                    << "}",
227*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(nested, "Nested struct",
230*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
231*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
232*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
233*35238bceSAndroid Build Coastguard Worker                                    << ""
234*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
235*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
236*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
237*35238bceSAndroid Build Coastguard Worker                                    << "};"
238*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
239*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
240*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
241*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
242*35238bceSAndroid Build Coastguard Worker                                    << "};"
243*35238bceSAndroid Build Coastguard Worker                                    << ""
244*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
245*35238bceSAndroid Build Coastguard Worker                                    << "{"
246*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
247*35238bceSAndroid Build Coastguard Worker                                    << "    s.b = T(ui_zero, ${COORDS}.yz);"
248*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
249*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
250*35238bceSAndroid Build Coastguard Worker                                    << "}",
251*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
252*35238bceSAndroid Build Coastguard Worker 
253*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(array_member, "Struct with array member",
254*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
255*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
256*35238bceSAndroid Build Coastguard Worker                                    << ""
257*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
258*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
259*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    b[3];"
260*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
261*35238bceSAndroid Build Coastguard Worker                                    << "};"
262*35238bceSAndroid Build Coastguard Worker                                    << ""
263*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
264*35238bceSAndroid Build Coastguard Worker                                    << "{"
265*35238bceSAndroid Build Coastguard Worker                                    << "    S s;"
266*35238bceSAndroid Build Coastguard Worker                                    << "    s.a = ${COORDS}.w;"
267*35238bceSAndroid Build Coastguard Worker                                    << "    s.c = ui_one;"
268*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[0] = ${COORDS}.z;"
269*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[1] = ${COORDS}.y;"
270*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[2] = ${COORDS}.x;"
271*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
272*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
273*35238bceSAndroid Build Coastguard Worker                                    << "}",
274*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(3, 2, 1); });
275*35238bceSAndroid Build Coastguard Worker 
276*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing",
277*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
278*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
279*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
280*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
281*35238bceSAndroid Build Coastguard Worker                                    << ""
282*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
283*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
284*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    b[3];"
285*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
286*35238bceSAndroid Build Coastguard Worker                                    << "};"
287*35238bceSAndroid Build Coastguard Worker                                    << ""
288*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
289*35238bceSAndroid Build Coastguard Worker                                    << "{"
290*35238bceSAndroid Build Coastguard Worker                                    << "    S s;"
291*35238bceSAndroid Build Coastguard Worker                                    << "    s.a = ${COORDS}.w;"
292*35238bceSAndroid Build Coastguard Worker                                    << "    s.c = ui_one;"
293*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[0] = ${COORDS}.z;"
294*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[1] = ${COORDS}.y;"
295*35238bceSAndroid Build Coastguard Worker                                    << "    s.b[2] = ${COORDS}.x;"
296*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
297*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
298*35238bceSAndroid Build Coastguard Worker                                    << "}",
299*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(1, 2, 0); });
300*35238bceSAndroid Build Coastguard Worker 
301*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(struct_array, "Struct array",
302*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
303*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
304*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
305*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
306*35238bceSAndroid Build Coastguard Worker                                    << ""
307*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
308*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
309*35238bceSAndroid Build Coastguard Worker                                    << "    mediump int        b;"
310*35238bceSAndroid Build Coastguard Worker                                    << "};"
311*35238bceSAndroid Build Coastguard Worker                                    << ""
312*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
313*35238bceSAndroid Build Coastguard Worker                                    << "{"
314*35238bceSAndroid Build Coastguard Worker                                    << "    S s[3];"
315*35238bceSAndroid Build Coastguard Worker                                    << "    s[0] = S(${COORDS}.x, ui_zero);"
316*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].a = ${COORDS}.y;"
317*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b = ui_one;"
318*35238bceSAndroid Build Coastguard Worker                                    << "    s[2] = S(${COORDS}.z, ui_two);"
319*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
320*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
321*35238bceSAndroid Build Coastguard Worker                                    << "}",
322*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(2, 1, 0); });
323*35238bceSAndroid Build Coastguard Worker 
324*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(
325*35238bceSAndroid Build Coastguard Worker         struct_array_dynamic_index, "Struct array with dynamic indexing",
326*35238bceSAndroid Build Coastguard Worker         LineStream()
327*35238bceSAndroid Build Coastguard Worker             << "${HEADER}"
328*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_zero;"
329*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_one;"
330*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_two;"
331*35238bceSAndroid Build Coastguard Worker             << ""
332*35238bceSAndroid Build Coastguard Worker             << "struct S {"
333*35238bceSAndroid Build Coastguard Worker             << "    mediump float    a;"
334*35238bceSAndroid Build Coastguard Worker             << "    mediump int        b;"
335*35238bceSAndroid Build Coastguard Worker             << "};"
336*35238bceSAndroid Build Coastguard Worker             << ""
337*35238bceSAndroid Build Coastguard Worker             << "void main (void)"
338*35238bceSAndroid Build Coastguard Worker             << "{"
339*35238bceSAndroid Build Coastguard Worker             << "    S s[3];"
340*35238bceSAndroid Build Coastguard Worker             << "    s[0] = S(${COORDS}.x, ui_zero);"
341*35238bceSAndroid Build Coastguard Worker             << "    s[1].a = ${COORDS}.y;"
342*35238bceSAndroid Build Coastguard Worker             << "    s[1].b = ui_one;"
343*35238bceSAndroid Build Coastguard Worker             << "    s[2] = S(${COORDS}.z, ui_two);"
344*35238bceSAndroid Build Coastguard Worker             << "    ${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);"
345*35238bceSAndroid Build Coastguard Worker             << "    ${ASSIGN_POS}"
346*35238bceSAndroid Build Coastguard Worker             << "}",
347*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.coords.swizzle(2, 1, 0); });
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(
350*35238bceSAndroid Build Coastguard Worker         nested_struct_array, "Nested struct array",
351*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
352*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
353*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
354*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
355*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_two;"
356*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_three;"
357*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_four;"
358*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_half;"
359*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_third;"
360*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_fourth;"
361*35238bceSAndroid Build Coastguard Worker                      << ""
362*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
363*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
364*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
365*35238bceSAndroid Build Coastguard Worker                      << "};"
366*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
367*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
368*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
369*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
370*35238bceSAndroid Build Coastguard Worker                      << "};"
371*35238bceSAndroid Build Coastguard Worker                      << ""
372*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
373*35238bceSAndroid Build Coastguard Worker                      << "{"
374*35238bceSAndroid Build Coastguard Worker                      << "    S s[2];"
375*35238bceSAndroid Build Coastguard Worker                      << ""
376*35238bceSAndroid Build Coastguard Worker                      << "    // S[0]"
377*35238bceSAndroid Build Coastguard Worker                      << "    s[0].a         = ${COORDS}.x;"
378*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].a    = uf_half;"
379*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].b[0] = ${COORDS}.xy;"
380*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].b[1] = ${COORDS}.zw;"
381*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].a    = uf_third;"
382*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].b[0] = ${COORDS}.zw;"
383*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].b[1] = ${COORDS}.xy;"
384*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].a    = uf_fourth;"
385*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].b[0] = ${COORDS}.xz;"
386*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].b[1] = ${COORDS}.yw;"
387*35238bceSAndroid Build Coastguard Worker                      << "    s[0].c         = ui_zero;"
388*35238bceSAndroid Build Coastguard Worker                      << ""
389*35238bceSAndroid Build Coastguard Worker                      << "    // S[1]"
390*35238bceSAndroid Build Coastguard Worker                      << "    s[1].a         = ${COORDS}.w;"
391*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].a    = uf_two;"
392*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].b[0] = ${COORDS}.xx;"
393*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].b[1] = ${COORDS}.yy;"
394*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].a    = uf_three;"
395*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].b[0] = ${COORDS}.zz;"
396*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].b[1] = ${COORDS}.ww;"
397*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].a    = uf_four;"
398*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].b[0] = ${COORDS}.yx;"
399*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].b[1] = ${COORDS}.wz;"
400*35238bceSAndroid Build Coastguard Worker                      << "    s[1].c         = ui_one;"
401*35238bceSAndroid Build Coastguard Worker                      << ""
402*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5"
403*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
404*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w "
405*35238bceSAndroid Build Coastguard Worker                         "+ w) * 0.333"
406*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
407*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r, g, b, a);"
408*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
409*35238bceSAndroid Build Coastguard Worker                      << "}",
410*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.coords.swizzle(2, 0, 3); });
411*35238bceSAndroid Build Coastguard Worker 
412*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(
413*35238bceSAndroid Build Coastguard Worker         nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing",
414*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
415*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
416*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
417*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
418*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_two;"
419*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_three;"
420*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_four;"
421*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_half;"
422*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_third;"
423*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_fourth;"
424*35238bceSAndroid Build Coastguard Worker                      << ""
425*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
426*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
427*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
428*35238bceSAndroid Build Coastguard Worker                      << "};"
429*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
430*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
431*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
432*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
433*35238bceSAndroid Build Coastguard Worker                      << "};"
434*35238bceSAndroid Build Coastguard Worker                      << ""
435*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
436*35238bceSAndroid Build Coastguard Worker                      << "{"
437*35238bceSAndroid Build Coastguard Worker                      << "    S s[2];"
438*35238bceSAndroid Build Coastguard Worker                      << ""
439*35238bceSAndroid Build Coastguard Worker                      << "    // S[0]"
440*35238bceSAndroid Build Coastguard Worker                      << "    s[0].a         = ${COORDS}.x;"
441*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].a    = uf_half;"
442*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].b[0] = ${COORDS}.xy;"
443*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[0].b[1] = ${COORDS}.zw;"
444*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].a    = uf_third;"
445*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].b[0] = ${COORDS}.zw;"
446*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[1].b[1] = ${COORDS}.xy;"
447*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].a    = uf_fourth;"
448*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].b[0] = ${COORDS}.xz;"
449*35238bceSAndroid Build Coastguard Worker                      << "    s[0].b[2].b[1] = ${COORDS}.yw;"
450*35238bceSAndroid Build Coastguard Worker                      << "    s[0].c         = ui_zero;"
451*35238bceSAndroid Build Coastguard Worker                      << ""
452*35238bceSAndroid Build Coastguard Worker                      << "    // S[1]"
453*35238bceSAndroid Build Coastguard Worker                      << "    s[1].a         = ${COORDS}.w;"
454*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].a    = uf_two;"
455*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].b[0] = ${COORDS}.xx;"
456*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[0].b[1] = ${COORDS}.yy;"
457*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].a    = uf_three;"
458*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].b[0] = ${COORDS}.zz;"
459*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[1].b[1] = ${COORDS}.ww;"
460*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].a    = uf_four;"
461*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].b[0] = ${COORDS}.yx;"
462*35238bceSAndroid Build Coastguard Worker                      << "    s[1].b[2].b[1] = ${COORDS}.wz;"
463*35238bceSAndroid Build Coastguard Worker                      << "    s[1].c         = ui_one;"
464*35238bceSAndroid Build Coastguard Worker                      << ""
465*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * "
466*35238bceSAndroid Build Coastguard Worker                         "s[0].b[0].a; // (z + z) * 0.5"
467*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * "
468*35238bceSAndroid Build Coastguard Worker                         "s[ui_one].b[2].a; // x * 0.25 * 4"
469*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + "
470*35238bceSAndroid Build Coastguard Worker                         "s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333"
471*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - "
472*35238bceSAndroid Build Coastguard Worker                         "s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0"
473*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r, g, b, a);"
474*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
475*35238bceSAndroid Build Coastguard Worker                      << "}",
476*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.coords.swizzle(2, 0, 3); });
477*35238bceSAndroid Build Coastguard Worker 
478*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(parameter, "Struct as a function parameter",
479*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
480*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
481*35238bceSAndroid Build Coastguard Worker                                    << ""
482*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
483*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
484*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
485*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
486*35238bceSAndroid Build Coastguard Worker                                    << "};"
487*35238bceSAndroid Build Coastguard Worker                                    << ""
488*35238bceSAndroid Build Coastguard Worker                                    << "mediump vec4 myFunc (S s)"
489*35238bceSAndroid Build Coastguard Worker                                    << "{"
490*35238bceSAndroid Build Coastguard Worker                                    << "    return vec4(s.a, s.b.x, s.b.y, s.c);"
491*35238bceSAndroid Build Coastguard Worker                                    << "}"
492*35238bceSAndroid Build Coastguard Worker                                    << ""
493*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
494*35238bceSAndroid Build Coastguard Worker                                    << "{"
495*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, vec3(0.0), ui_one);"
496*35238bceSAndroid Build Coastguard Worker                                    << "    s.b = ${COORDS}.yzw;"
497*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = myFunc(s);"
498*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
499*35238bceSAndroid Build Coastguard Worker                                    << "}",
500*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
501*35238bceSAndroid Build Coastguard Worker 
502*35238bceSAndroid Build Coastguard Worker     LineStream inoutSrc;
503*35238bceSAndroid Build Coastguard Worker     inoutSrc << "${HEADER}"
504*35238bceSAndroid Build Coastguard Worker              << ""
505*35238bceSAndroid Build Coastguard Worker              << "struct S {"
506*35238bceSAndroid Build Coastguard Worker              << "    ${PRECISION} vec3 red;"
507*35238bceSAndroid Build Coastguard Worker              << "    ${PRECISION} vec3 blue;"
508*35238bceSAndroid Build Coastguard Worker              << "};"
509*35238bceSAndroid Build Coastguard Worker              << ""
510*35238bceSAndroid Build Coastguard Worker              << "void modify (inout S s)"
511*35238bceSAndroid Build Coastguard Worker              << "{"
512*35238bceSAndroid Build Coastguard Worker              << "    s.red += vec3(0.5, 0.0, 0.0);"
513*35238bceSAndroid Build Coastguard Worker              << "    s.blue += vec3(0.0, 0.0, 0.5);"
514*35238bceSAndroid Build Coastguard Worker              << "}"
515*35238bceSAndroid Build Coastguard Worker              << ""
516*35238bceSAndroid Build Coastguard Worker              << "void main (void)"
517*35238bceSAndroid Build Coastguard Worker              << "{"
518*35238bceSAndroid Build Coastguard Worker              << "    S s;"
519*35238bceSAndroid Build Coastguard Worker              << "    s.red = vec3(0.5, 0.0, 0.0);"
520*35238bceSAndroid Build Coastguard Worker              << "    s.blue = vec3(0.0, 0.0, 0.5);"
521*35238bceSAndroid Build Coastguard Worker              << "    modify(s);"
522*35238bceSAndroid Build Coastguard Worker              << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
523*35238bceSAndroid Build Coastguard Worker              << "    if (s.red == vec3(1.0, 0.0, 0.0) && s.blue == vec3(0.0, 0.0, 1.0))"
524*35238bceSAndroid Build Coastguard Worker              << "        ${DST} = vec4(1.0, 1.0, 1.0, 1.0);"
525*35238bceSAndroid Build Coastguard Worker              << "    ${ASSIGN_POS}"
526*35238bceSAndroid Build Coastguard Worker              << "}";
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker     std::map<std::string, std::string> precisionParams;
529*35238bceSAndroid Build Coastguard Worker 
530*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "lowp";
531*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
532*35238bceSAndroid Build Coastguard Worker         parameter_inout_lowp, "Struct with lowp members as an inout function parameter", inoutSrc,
533*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
534*35238bceSAndroid Build Coastguard Worker 
535*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "mediump";
536*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
537*35238bceSAndroid Build Coastguard Worker         parameter_inout_mediump, "Struct with mediump members as an inout function parameter", inoutSrc,
538*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
539*35238bceSAndroid Build Coastguard Worker 
540*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "highp";
541*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
542*35238bceSAndroid Build Coastguard Worker         parameter_inout_highp, "Struct with highp members as an inout function parameter", inoutSrc,
543*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
544*35238bceSAndroid Build Coastguard Worker 
545*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(parameter_nested, "Nested struct as a function parameter",
546*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
547*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
548*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
549*35238bceSAndroid Build Coastguard Worker                                    << ""
550*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
551*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
552*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
553*35238bceSAndroid Build Coastguard Worker                                    << "};"
554*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
555*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
556*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
557*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
558*35238bceSAndroid Build Coastguard Worker                                    << "};"
559*35238bceSAndroid Build Coastguard Worker                                    << ""
560*35238bceSAndroid Build Coastguard Worker                                    << "mediump vec4 myFunc (S s)"
561*35238bceSAndroid Build Coastguard Worker                                    << "{"
562*35238bceSAndroid Build Coastguard Worker                                    << "    return vec4(s.a, s.b.b, s.b.a + s.c);"
563*35238bceSAndroid Build Coastguard Worker                                    << "}"
564*35238bceSAndroid Build Coastguard Worker                                    << ""
565*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
566*35238bceSAndroid Build Coastguard Worker                                    << "{"
567*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
568*35238bceSAndroid Build Coastguard Worker                                    << "    s.b = T(ui_zero, ${COORDS}.yz);"
569*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = myFunc(s);"
570*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
571*35238bceSAndroid Build Coastguard Worker                                    << "}",
572*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker     LineStream outSrc;
575*35238bceSAndroid Build Coastguard Worker     outSrc << "${HEADER}"
576*35238bceSAndroid Build Coastguard Worker            << ""
577*35238bceSAndroid Build Coastguard Worker            << "struct S {"
578*35238bceSAndroid Build Coastguard Worker            << "    ${PRECISION} vec3 red;"
579*35238bceSAndroid Build Coastguard Worker            << "    ${PRECISION} vec3 blue;"
580*35238bceSAndroid Build Coastguard Worker            << "};"
581*35238bceSAndroid Build Coastguard Worker            << ""
582*35238bceSAndroid Build Coastguard Worker            << "void modify (out S s)"
583*35238bceSAndroid Build Coastguard Worker            << "{"
584*35238bceSAndroid Build Coastguard Worker            << "    s.red = vec3(1.0, 0.0, 0.0);"
585*35238bceSAndroid Build Coastguard Worker            << "    s.blue = vec3(0.0, 0.0, 1.0);"
586*35238bceSAndroid Build Coastguard Worker            << "}"
587*35238bceSAndroid Build Coastguard Worker            << ""
588*35238bceSAndroid Build Coastguard Worker            << "void main (void)"
589*35238bceSAndroid Build Coastguard Worker            << "{"
590*35238bceSAndroid Build Coastguard Worker            << "    S s;"
591*35238bceSAndroid Build Coastguard Worker            << "    modify(s);"
592*35238bceSAndroid Build Coastguard Worker            << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
593*35238bceSAndroid Build Coastguard Worker            << "    if (s.red == vec3(1.0, 0.0, 0.0) && s.blue == vec3(0.0, 0.0, 1.0))"
594*35238bceSAndroid Build Coastguard Worker            << "        ${DST} = vec4(1.0, 1.0, 1.0, 1.0);"
595*35238bceSAndroid Build Coastguard Worker            << "    ${ASSIGN_POS}"
596*35238bceSAndroid Build Coastguard Worker            << "}";
597*35238bceSAndroid Build Coastguard Worker 
598*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "lowp";
599*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
600*35238bceSAndroid Build Coastguard Worker         parameter_out_lowp, "Struct with lowp members as an out function parameter", outSrc,
601*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
602*35238bceSAndroid Build Coastguard Worker 
603*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "mediump";
604*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
605*35238bceSAndroid Build Coastguard Worker         parameter_out_mediump, "Struct with mediump members as an out function parameter", outSrc,
606*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
607*35238bceSAndroid Build Coastguard Worker 
608*35238bceSAndroid Build Coastguard Worker     precisionParams["PRECISION"] = "highp";
609*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE_PARAMETERIZED(
610*35238bceSAndroid Build Coastguard Worker         parameter_out_highp, "Struct with highp members as an out function parameter", outSrc,
611*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = tcu::Vec3(1.0, 1.0, 1.0); }, &precisionParams);
612*35238bceSAndroid Build Coastguard Worker 
613*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(return, "Struct as a return value",
614*35238bceSAndroid Build Coastguard Worker                             LineStream() << "${HEADER}"
615*35238bceSAndroid Build Coastguard Worker                                          << "uniform int ui_one;"
616*35238bceSAndroid Build Coastguard Worker                                          << ""
617*35238bceSAndroid Build Coastguard Worker                                          << "struct S {"
618*35238bceSAndroid Build Coastguard Worker                                          << "    mediump float    a;"
619*35238bceSAndroid Build Coastguard Worker                                          << "    mediump vec3    b;"
620*35238bceSAndroid Build Coastguard Worker                                          << "    int                c;"
621*35238bceSAndroid Build Coastguard Worker                                          << "};"
622*35238bceSAndroid Build Coastguard Worker                                          << ""
623*35238bceSAndroid Build Coastguard Worker                                          << "S myFunc (void)"
624*35238bceSAndroid Build Coastguard Worker                                          << "{"
625*35238bceSAndroid Build Coastguard Worker                                          << "    S s = S(${COORDS}.x, vec3(0.0), ui_one);"
626*35238bceSAndroid Build Coastguard Worker                                          << "    s.b = ${COORDS}.yzw;"
627*35238bceSAndroid Build Coastguard Worker                                          << "    return s;"
628*35238bceSAndroid Build Coastguard Worker                                          << "}"
629*35238bceSAndroid Build Coastguard Worker                                          << ""
630*35238bceSAndroid Build Coastguard Worker                                          << "void main (void)"
631*35238bceSAndroid Build Coastguard Worker                                          << "{"
632*35238bceSAndroid Build Coastguard Worker                                          << "    S s = myFunc();"
633*35238bceSAndroid Build Coastguard Worker                                          << "    ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
634*35238bceSAndroid Build Coastguard Worker                                          << "    ${ASSIGN_POS}"
635*35238bceSAndroid Build Coastguard Worker                                          << "}",
636*35238bceSAndroid Build Coastguard Worker                             { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(return_nested, "Nested struct",
639*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
640*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
641*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
642*35238bceSAndroid Build Coastguard Worker                                    << ""
643*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
644*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
645*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
646*35238bceSAndroid Build Coastguard Worker                                    << "};"
647*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
648*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
649*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
650*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
651*35238bceSAndroid Build Coastguard Worker                                    << "};"
652*35238bceSAndroid Build Coastguard Worker                                    << ""
653*35238bceSAndroid Build Coastguard Worker                                    << "S myFunc (void)"
654*35238bceSAndroid Build Coastguard Worker                                    << "{"
655*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
656*35238bceSAndroid Build Coastguard Worker                                    << "    s.b = T(ui_zero, ${COORDS}.yz);"
657*35238bceSAndroid Build Coastguard Worker                                    << "    return s;"
658*35238bceSAndroid Build Coastguard Worker                                    << "}"
659*35238bceSAndroid Build Coastguard Worker                                    << ""
660*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
661*35238bceSAndroid Build Coastguard Worker                                    << "{"
662*35238bceSAndroid Build Coastguard Worker                                    << "    S s = myFunc();"
663*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
664*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
665*35238bceSAndroid Build Coastguard Worker                                    << "}",
666*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 1, 2); });
667*35238bceSAndroid Build Coastguard Worker 
668*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(conditional_assignment, "Conditional struct assignment",
669*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
670*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
671*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
672*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_one;"
673*35238bceSAndroid Build Coastguard Worker                                    << ""
674*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
675*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
676*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
677*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
678*35238bceSAndroid Build Coastguard Worker                                    << "};"
679*35238bceSAndroid Build Coastguard Worker                                    << ""
680*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
681*35238bceSAndroid Build Coastguard Worker                                    << "{"
682*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
683*35238bceSAndroid Build Coastguard Worker                                    << "    if (uf_one > 0.0)"
684*35238bceSAndroid Build Coastguard Worker                                    << "        s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
685*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.xy, s.c);"
686*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
687*35238bceSAndroid Build Coastguard Worker                                    << "}",
688*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(3, 2, 1); });
689*35238bceSAndroid Build Coastguard Worker 
690*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(loop_assignment, "Struct assignment in loop",
691*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
692*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
693*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
694*35238bceSAndroid Build Coastguard Worker                                    << ""
695*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
696*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
697*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
698*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
699*35238bceSAndroid Build Coastguard Worker                                    << "};"
700*35238bceSAndroid Build Coastguard Worker                                    << ""
701*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
702*35238bceSAndroid Build Coastguard Worker                                    << "{"
703*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
704*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < 3; i++)"
705*35238bceSAndroid Build Coastguard Worker                                    << "    {"
706*35238bceSAndroid Build Coastguard Worker                                    << "        if (i == 1)"
707*35238bceSAndroid Build Coastguard Worker                                    << "            s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
708*35238bceSAndroid Build Coastguard Worker                                    << "    }"
709*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.xy, s.c);"
710*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
711*35238bceSAndroid Build Coastguard Worker                                    << "}",
712*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(3, 2, 1); });
713*35238bceSAndroid Build Coastguard Worker 
714*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(dynamic_loop_assignment, "Struct assignment in loop",
715*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
716*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
717*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
718*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_three;"
719*35238bceSAndroid Build Coastguard Worker                                    << ""
720*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
721*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
722*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
723*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
724*35238bceSAndroid Build Coastguard Worker                                    << "};"
725*35238bceSAndroid Build Coastguard Worker                                    << ""
726*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
727*35238bceSAndroid Build Coastguard Worker                                    << "{"
728*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
729*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < ui_three; i++)"
730*35238bceSAndroid Build Coastguard Worker                                    << "    {"
731*35238bceSAndroid Build Coastguard Worker                                    << "        if (i == ui_one)"
732*35238bceSAndroid Build Coastguard Worker                                    << "            s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
733*35238bceSAndroid Build Coastguard Worker                                    << "    }"
734*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.xy, s.c);"
735*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
736*35238bceSAndroid Build Coastguard Worker                                    << "}",
737*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(3, 2, 1); });
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(nested_conditional_assignment, "Conditional assignment of nested struct",
740*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
741*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
742*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
743*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_one;"
744*35238bceSAndroid Build Coastguard Worker                                    << ""
745*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
746*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
747*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
748*35238bceSAndroid Build Coastguard Worker                                    << "};"
749*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
750*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
751*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
752*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
753*35238bceSAndroid Build Coastguard Worker                                    << "};"
754*35238bceSAndroid Build Coastguard Worker                                    << ""
755*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
756*35238bceSAndroid Build Coastguard Worker                                    << "{"
757*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
758*35238bceSAndroid Build Coastguard Worker                                    << "    if (uf_one > 0.0)"
759*35238bceSAndroid Build Coastguard Worker                                    << "        s.b = T(ui_zero, ${COORDS}.zw);"
760*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
761*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
762*35238bceSAndroid Build Coastguard Worker                                    << "}",
763*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 2, 3); });
764*35238bceSAndroid Build Coastguard Worker 
765*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(nested_loop_assignment, "Nested struct assignment in loop",
766*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
767*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
768*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
769*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_one;"
770*35238bceSAndroid Build Coastguard Worker                                    << ""
771*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
772*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
773*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
774*35238bceSAndroid Build Coastguard Worker                                    << "};"
775*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
776*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
777*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
778*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
779*35238bceSAndroid Build Coastguard Worker                                    << "};"
780*35238bceSAndroid Build Coastguard Worker                                    << ""
781*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
782*35238bceSAndroid Build Coastguard Worker                                    << "{"
783*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
784*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < 3; i++)"
785*35238bceSAndroid Build Coastguard Worker                                    << "    {"
786*35238bceSAndroid Build Coastguard Worker                                    << "        if (i == 1)"
787*35238bceSAndroid Build Coastguard Worker                                    << "            s.b = T(ui_zero, ${COORDS}.zw);"
788*35238bceSAndroid Build Coastguard Worker                                    << "    }"
789*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
790*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
791*35238bceSAndroid Build Coastguard Worker                                    << "}",
792*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 2, 3); });
793*35238bceSAndroid Build Coastguard Worker 
794*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(nested_dynamic_loop_assignment, "Nested struct assignment in dynamic loop",
795*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
796*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
797*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
798*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_three;"
799*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_one;"
800*35238bceSAndroid Build Coastguard Worker                                    << ""
801*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
802*35238bceSAndroid Build Coastguard Worker                                    << "    int                a;"
803*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b;"
804*35238bceSAndroid Build Coastguard Worker                                    << "};"
805*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
806*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
807*35238bceSAndroid Build Coastguard Worker                                    << "    T                b;"
808*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
809*35238bceSAndroid Build Coastguard Worker                                    << "};"
810*35238bceSAndroid Build Coastguard Worker                                    << ""
811*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
812*35238bceSAndroid Build Coastguard Worker                                    << "{"
813*35238bceSAndroid Build Coastguard Worker                                    << "    S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
814*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < ui_three; i++)"
815*35238bceSAndroid Build Coastguard Worker                                    << "    {"
816*35238bceSAndroid Build Coastguard Worker                                    << "        if (i == ui_one)"
817*35238bceSAndroid Build Coastguard Worker                                    << "            s.b = T(ui_zero, ${COORDS}.zw);"
818*35238bceSAndroid Build Coastguard Worker                                    << "    }"
819*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
820*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
821*35238bceSAndroid Build Coastguard Worker                                    << "}",
822*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(0, 2, 3); });
823*35238bceSAndroid Build Coastguard Worker 
824*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(loop_struct_array, "Struct array usage in loop",
825*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
826*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
827*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
828*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
829*35238bceSAndroid Build Coastguard Worker                                    << ""
830*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
831*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
832*35238bceSAndroid Build Coastguard Worker                                    << "    mediump int        b;"
833*35238bceSAndroid Build Coastguard Worker                                    << "};"
834*35238bceSAndroid Build Coastguard Worker                                    << ""
835*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
836*35238bceSAndroid Build Coastguard Worker                                    << "{"
837*35238bceSAndroid Build Coastguard Worker                                    << "    S s[3];"
838*35238bceSAndroid Build Coastguard Worker                                    << "    s[0] = S(${COORDS}.x, ui_zero);"
839*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].a = ${COORDS}.y;"
840*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b = -ui_one;"
841*35238bceSAndroid Build Coastguard Worker                                    << "    s[2] = S(${COORDS}.z, ui_two);"
842*35238bceSAndroid Build Coastguard Worker                                    << ""
843*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float rgb[3];"
844*35238bceSAndroid Build Coastguard Worker                                    << "    int alpha = 0;"
845*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < 3; i++)"
846*35238bceSAndroid Build Coastguard Worker                                    << "    {"
847*35238bceSAndroid Build Coastguard Worker                                    << "        rgb[i] = s[2-i].a;"
848*35238bceSAndroid Build Coastguard Worker                                    << "        alpha += s[i].b;"
849*35238bceSAndroid Build Coastguard Worker                                    << "    }"
850*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
851*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
852*35238bceSAndroid Build Coastguard Worker                                    << "}",
853*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(2, 1, 0); });
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop",
856*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
857*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
858*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
859*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
860*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_two;"
861*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_three;"
862*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_four;"
863*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_half;"
864*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_third;"
865*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_fourth;"
866*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_sixth;"
867*35238bceSAndroid Build Coastguard Worker                                    << ""
868*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
869*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
870*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b[2];"
871*35238bceSAndroid Build Coastguard Worker                                    << "};"
872*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
873*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
874*35238bceSAndroid Build Coastguard Worker                                    << "    T                b[3];"
875*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
876*35238bceSAndroid Build Coastguard Worker                                    << "};"
877*35238bceSAndroid Build Coastguard Worker                                    << ""
878*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
879*35238bceSAndroid Build Coastguard Worker                                    << "{"
880*35238bceSAndroid Build Coastguard Worker                                    << "    S s[2];"
881*35238bceSAndroid Build Coastguard Worker                                    << ""
882*35238bceSAndroid Build Coastguard Worker                                    << "    // S[0]"
883*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].a         = ${COORDS}.x;"
884*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].a    = uf_half;"
885*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].b[0] = ${COORDS}.yx;"
886*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].b[1] = ${COORDS}.zx;"
887*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].a    = uf_third;"
888*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].b[0] = ${COORDS}.yy;"
889*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].b[1] = ${COORDS}.wy;"
890*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].a    = uf_fourth;"
891*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].b[0] = ${COORDS}.zx;"
892*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].b[1] = ${COORDS}.zy;"
893*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].c         = ui_zero;"
894*35238bceSAndroid Build Coastguard Worker                                    << ""
895*35238bceSAndroid Build Coastguard Worker                                    << "    // S[1]"
896*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].a         = ${COORDS}.w;"
897*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].a    = uf_two;"
898*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].b[0] = ${COORDS}.zx;"
899*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].b[1] = ${COORDS}.zy;"
900*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].a    = uf_three;"
901*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].b[0] = ${COORDS}.zz;"
902*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].b[1] = ${COORDS}.ww;"
903*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].a    = uf_four;"
904*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].b[0] = ${COORDS}.yx;"
905*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].b[1] = ${COORDS}.wz;"
906*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].c         = ui_one;"
907*35238bceSAndroid Build Coastguard Worker                                    << ""
908*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float r = 0.0; // (x*3 + y*3) / 6.0"
909*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float g = 0.0; // (y*3 + z*3) / 6.0"
910*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float b = 0.0; // (z*3 + w*3) / 6.0"
911*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float a = 1.0;"
912*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < 2; i++)"
913*35238bceSAndroid Build Coastguard Worker                                    << "    {"
914*35238bceSAndroid Build Coastguard Worker                                    << "        for (int j = 0; j < 3; j++)"
915*35238bceSAndroid Build Coastguard Worker                                    << "        {"
916*35238bceSAndroid Build Coastguard Worker                                    << "            r += s[0].b[j].b[i].y;"
917*35238bceSAndroid Build Coastguard Worker                                    << "            g += s[i].b[j].b[0].x;"
918*35238bceSAndroid Build Coastguard Worker                                    << "            b += s[i].b[j].b[1].x;"
919*35238bceSAndroid Build Coastguard Worker                                    << "            a *= s[i].b[j].a;"
920*35238bceSAndroid Build Coastguard Worker                                    << "        }"
921*35238bceSAndroid Build Coastguard Worker                                    << "    }"
922*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
923*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
924*35238bceSAndroid Build Coastguard Worker                                    << "}",
925*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f; });
926*35238bceSAndroid Build Coastguard Worker 
927*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop",
928*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
929*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
930*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
931*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
932*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_three;"
933*35238bceSAndroid Build Coastguard Worker                                    << ""
934*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
935*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
936*35238bceSAndroid Build Coastguard Worker                                    << "    mediump int        b;"
937*35238bceSAndroid Build Coastguard Worker                                    << "};"
938*35238bceSAndroid Build Coastguard Worker                                    << ""
939*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
940*35238bceSAndroid Build Coastguard Worker                                    << "{"
941*35238bceSAndroid Build Coastguard Worker                                    << "    S s[3];"
942*35238bceSAndroid Build Coastguard Worker                                    << "    s[0] = S(${COORDS}.x, ui_zero);"
943*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].a = ${COORDS}.y;"
944*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b = -ui_one;"
945*35238bceSAndroid Build Coastguard Worker                                    << "    s[2] = S(${COORDS}.z, ui_two);"
946*35238bceSAndroid Build Coastguard Worker                                    << ""
947*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float rgb[3];"
948*35238bceSAndroid Build Coastguard Worker                                    << "    int alpha = 0;"
949*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < ui_three; i++)"
950*35238bceSAndroid Build Coastguard Worker                                    << "    {"
951*35238bceSAndroid Build Coastguard Worker                                    << "        rgb[i] = s[2-i].a;"
952*35238bceSAndroid Build Coastguard Worker                                    << "        alpha += s[i].b;"
953*35238bceSAndroid Build Coastguard Worker                                    << "    }"
954*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
955*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
956*35238bceSAndroid Build Coastguard Worker                                    << "}",
957*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = c.coords.swizzle(2, 1, 0); });
958*35238bceSAndroid Build Coastguard Worker 
959*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop",
960*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
961*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_zero;"
962*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
963*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
964*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_three;"
965*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_two;"
966*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_three;"
967*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_four;"
968*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_half;"
969*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_third;"
970*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_fourth;"
971*35238bceSAndroid Build Coastguard Worker                                    << "uniform mediump float uf_sixth;"
972*35238bceSAndroid Build Coastguard Worker                                    << ""
973*35238bceSAndroid Build Coastguard Worker                                    << "struct T {"
974*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
975*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec2    b[2];"
976*35238bceSAndroid Build Coastguard Worker                                    << "};"
977*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
978*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
979*35238bceSAndroid Build Coastguard Worker                                    << "    T                b[3];"
980*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
981*35238bceSAndroid Build Coastguard Worker                                    << "};"
982*35238bceSAndroid Build Coastguard Worker                                    << ""
983*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
984*35238bceSAndroid Build Coastguard Worker                                    << "{"
985*35238bceSAndroid Build Coastguard Worker                                    << "    S s[2];"
986*35238bceSAndroid Build Coastguard Worker                                    << ""
987*35238bceSAndroid Build Coastguard Worker                                    << "    // S[0]"
988*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].a         = ${COORDS}.x;"
989*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].a    = uf_half;"
990*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].b[0] = ${COORDS}.yx;"
991*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[0].b[1] = ${COORDS}.zx;"
992*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].a    = uf_third;"
993*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].b[0] = ${COORDS}.yy;"
994*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[1].b[1] = ${COORDS}.wy;"
995*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].a    = uf_fourth;"
996*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].b[0] = ${COORDS}.zx;"
997*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].b[2].b[1] = ${COORDS}.zy;"
998*35238bceSAndroid Build Coastguard Worker                                    << "    s[0].c         = ui_zero;"
999*35238bceSAndroid Build Coastguard Worker                                    << ""
1000*35238bceSAndroid Build Coastguard Worker                                    << "    // S[1]"
1001*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].a         = ${COORDS}.w;"
1002*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].a    = uf_two;"
1003*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].b[0] = ${COORDS}.zx;"
1004*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[0].b[1] = ${COORDS}.zy;"
1005*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].a    = uf_three;"
1006*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].b[0] = ${COORDS}.zz;"
1007*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[1].b[1] = ${COORDS}.ww;"
1008*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].a    = uf_four;"
1009*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].b[0] = ${COORDS}.yx;"
1010*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].b[2].b[1] = ${COORDS}.wz;"
1011*35238bceSAndroid Build Coastguard Worker                                    << "    s[1].c         = ui_one;"
1012*35238bceSAndroid Build Coastguard Worker                                    << ""
1013*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1014*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1015*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1016*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float a = 1.0;"
1017*35238bceSAndroid Build Coastguard Worker                                    << "    for (int i = 0; i < ui_two; i++)"
1018*35238bceSAndroid Build Coastguard Worker                                    << "    {"
1019*35238bceSAndroid Build Coastguard Worker                                    << "        for (int j = 0; j < ui_three; j++)"
1020*35238bceSAndroid Build Coastguard Worker                                    << "        {"
1021*35238bceSAndroid Build Coastguard Worker                                    << "            r += s[0].b[j].b[i].y;"
1022*35238bceSAndroid Build Coastguard Worker                                    << "            g += s[i].b[j].b[0].x;"
1023*35238bceSAndroid Build Coastguard Worker                                    << "            b += s[i].b[j].b[1].x;"
1024*35238bceSAndroid Build Coastguard Worker                                    << "            a *= s[i].b[j].a;"
1025*35238bceSAndroid Build Coastguard Worker                                    << "        }"
1026*35238bceSAndroid Build Coastguard Worker                                    << "    }"
1027*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1028*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
1029*35238bceSAndroid Build Coastguard Worker                                    << "}",
1030*35238bceSAndroid Build Coastguard Worker                       { c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f; });
1031*35238bceSAndroid Build Coastguard Worker 
1032*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(basic_equal, "Basic struct equality",
1033*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
1034*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
1035*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
1036*35238bceSAndroid Build Coastguard Worker                                    << ""
1037*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
1038*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
1039*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
1040*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
1041*35238bceSAndroid Build Coastguard Worker                                    << "};"
1042*35238bceSAndroid Build Coastguard Worker                                    << ""
1043*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
1044*35238bceSAndroid Build Coastguard Worker                                    << "{"
1045*35238bceSAndroid Build Coastguard Worker                                    << "    S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1046*35238bceSAndroid Build Coastguard Worker                                    << "    S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1047*35238bceSAndroid Build Coastguard Worker                                    << "    S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
1048*35238bceSAndroid Build Coastguard Worker                                    << "    S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
1049*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1050*35238bceSAndroid Build Coastguard Worker                                    << "    if (a == b) ${DST}.x = 1.0;"
1051*35238bceSAndroid Build Coastguard Worker                                    << "    if (a == c) ${DST}.y = 1.0;"
1052*35238bceSAndroid Build Coastguard Worker                                    << "    if (a == d) ${DST}.z = 1.0;"
1053*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
1054*35238bceSAndroid Build Coastguard Worker                                    << "}",
1055*35238bceSAndroid Build Coastguard Worker                       {
1056*35238bceSAndroid Build Coastguard Worker                           if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f))
1057*35238bceSAndroid Build Coastguard Worker                               c.color.x() = 1.0f;
1058*35238bceSAndroid Build Coastguard Worker                           if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f))
1059*35238bceSAndroid Build Coastguard Worker                               c.color.y() = 1.0f;
1060*35238bceSAndroid Build Coastguard Worker                       });
1061*35238bceSAndroid Build Coastguard Worker 
1062*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(basic_not_equal, "Basic struct equality",
1063*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
1064*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_one;"
1065*35238bceSAndroid Build Coastguard Worker                                    << "uniform int ui_two;"
1066*35238bceSAndroid Build Coastguard Worker                                    << ""
1067*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
1068*35238bceSAndroid Build Coastguard Worker                                    << "    mediump float    a;"
1069*35238bceSAndroid Build Coastguard Worker                                    << "    mediump vec3    b;"
1070*35238bceSAndroid Build Coastguard Worker                                    << "    int                c;"
1071*35238bceSAndroid Build Coastguard Worker                                    << "};"
1072*35238bceSAndroid Build Coastguard Worker                                    << ""
1073*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
1074*35238bceSAndroid Build Coastguard Worker                                    << "{"
1075*35238bceSAndroid Build Coastguard Worker                                    << "    S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1076*35238bceSAndroid Build Coastguard Worker                                    << "    S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1077*35238bceSAndroid Build Coastguard Worker                                    << "    S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
1078*35238bceSAndroid Build Coastguard Worker                                    << "    S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
1079*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1080*35238bceSAndroid Build Coastguard Worker                                    << "    if (a != b) ${DST}.x = 1.0;"
1081*35238bceSAndroid Build Coastguard Worker                                    << "    if (a != c) ${DST}.y = 1.0;"
1082*35238bceSAndroid Build Coastguard Worker                                    << "    if (a != d) ${DST}.z = 1.0;"
1083*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
1084*35238bceSAndroid Build Coastguard Worker                                    << "}",
1085*35238bceSAndroid Build Coastguard Worker                       {
1086*35238bceSAndroid Build Coastguard Worker                           if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f))
1087*35238bceSAndroid Build Coastguard Worker                               c.color.x() = 1.0f;
1088*35238bceSAndroid Build Coastguard Worker                           if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f))
1089*35238bceSAndroid Build Coastguard Worker                               c.color.y() = 1.0f;
1090*35238bceSAndroid Build Coastguard Worker                           c.color.z() = 1.0f;
1091*35238bceSAndroid Build Coastguard Worker                       });
1092*35238bceSAndroid Build Coastguard Worker 
1093*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(
1094*35238bceSAndroid Build Coastguard Worker         nested_equal, "Nested struct struct equality",
1095*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1096*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1097*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1098*35238bceSAndroid Build Coastguard Worker                      << ""
1099*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1100*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    a;"
1101*35238bceSAndroid Build Coastguard Worker                      << "    int                b;"
1102*35238bceSAndroid Build Coastguard Worker                      << "};"
1103*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1104*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1105*35238bceSAndroid Build Coastguard Worker                      << "    T                b;"
1106*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1107*35238bceSAndroid Build Coastguard Worker                      << "};"
1108*35238bceSAndroid Build Coastguard Worker                      << ""
1109*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1110*35238bceSAndroid Build Coastguard Worker                      << "{"
1111*35238bceSAndroid Build Coastguard Worker                      << "    S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1112*35238bceSAndroid Build Coastguard Worker                      << "    S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1113*35238bceSAndroid Build Coastguard Worker                      << "    S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
1114*35238bceSAndroid Build Coastguard Worker                      << "    S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
1115*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1116*35238bceSAndroid Build Coastguard Worker                      << "    if (a == b) ${DST}.x = 1.0;"
1117*35238bceSAndroid Build Coastguard Worker                      << "    if (a == c) ${DST}.y = 1.0;"
1118*35238bceSAndroid Build Coastguard Worker                      << "    if (a == d) ${DST}.z = 1.0;"
1119*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1120*35238bceSAndroid Build Coastguard Worker                      << "}",
1121*35238bceSAndroid Build Coastguard Worker         {
1122*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f))
1123*35238bceSAndroid Build Coastguard Worker                 c.color.x() = 1.0f;
1124*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f))
1125*35238bceSAndroid Build Coastguard Worker                 c.color.y() = 1.0f;
1126*35238bceSAndroid Build Coastguard Worker         });
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(
1129*35238bceSAndroid Build Coastguard Worker         nested_not_equal, "Nested struct struct equality",
1130*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1131*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1132*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1133*35238bceSAndroid Build Coastguard Worker                      << ""
1134*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1135*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    a;"
1136*35238bceSAndroid Build Coastguard Worker                      << "    int                b;"
1137*35238bceSAndroid Build Coastguard Worker                      << "};"
1138*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1139*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1140*35238bceSAndroid Build Coastguard Worker                      << "    T                b;"
1141*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1142*35238bceSAndroid Build Coastguard Worker                      << "};"
1143*35238bceSAndroid Build Coastguard Worker                      << ""
1144*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1145*35238bceSAndroid Build Coastguard Worker                      << "{"
1146*35238bceSAndroid Build Coastguard Worker                      << "    S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1147*35238bceSAndroid Build Coastguard Worker                      << "    S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1148*35238bceSAndroid Build Coastguard Worker                      << "    S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
1149*35238bceSAndroid Build Coastguard Worker                      << "    S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
1150*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1151*35238bceSAndroid Build Coastguard Worker                      << "    if (a != b) ${DST}.x = 1.0;"
1152*35238bceSAndroid Build Coastguard Worker                      << "    if (a != c) ${DST}.y = 1.0;"
1153*35238bceSAndroid Build Coastguard Worker                      << "    if (a != d) ${DST}.z = 1.0;"
1154*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1155*35238bceSAndroid Build Coastguard Worker                      << "}",
1156*35238bceSAndroid Build Coastguard Worker         {
1157*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f))
1158*35238bceSAndroid Build Coastguard Worker                 c.color.x() = 1.0f;
1159*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f))
1160*35238bceSAndroid Build Coastguard Worker                 c.color.y() = 1.0f;
1161*35238bceSAndroid Build Coastguard Worker             c.color.z() = 1.0f;
1162*35238bceSAndroid Build Coastguard Worker         });
1163*35238bceSAndroid Build Coastguard Worker 
1164*35238bceSAndroid Build Coastguard Worker     LOCAL_STRUCT_CASE(array_member_equality, "Struct with array members equality",
1165*35238bceSAndroid Build Coastguard Worker                       LineStream() << "${HEADER}"
1166*35238bceSAndroid Build Coastguard Worker                                    << ""
1167*35238bceSAndroid Build Coastguard Worker                                    << "struct S {"
1168*35238bceSAndroid Build Coastguard Worker                                    << "    bool    m[2];"
1169*35238bceSAndroid Build Coastguard Worker                                    << "};"
1170*35238bceSAndroid Build Coastguard Worker                                    << ""
1171*35238bceSAndroid Build Coastguard Worker                                    << "void main (void)"
1172*35238bceSAndroid Build Coastguard Worker                                    << "{"
1173*35238bceSAndroid Build Coastguard Worker                                    << "    S a;"
1174*35238bceSAndroid Build Coastguard Worker                                    << "    a.m[0] = true;"
1175*35238bceSAndroid Build Coastguard Worker                                    << "    a.m[1] = false;"
1176*35238bceSAndroid Build Coastguard Worker                                    << ""
1177*35238bceSAndroid Build Coastguard Worker                                    << "    S b;"
1178*35238bceSAndroid Build Coastguard Worker                                    << "    b.m[0] = true;"
1179*35238bceSAndroid Build Coastguard Worker                                    << "    b.m[1] = false;"
1180*35238bceSAndroid Build Coastguard Worker                                    << ""
1181*35238bceSAndroid Build Coastguard Worker                                    << "    S c;"
1182*35238bceSAndroid Build Coastguard Worker                                    << "    c.m[0] = true;"
1183*35238bceSAndroid Build Coastguard Worker                                    << "    c.m[1] = true;"
1184*35238bceSAndroid Build Coastguard Worker                                    << ""
1185*35238bceSAndroid Build Coastguard Worker                                    << "    ${DST} = vec4(0.0, 0.0, 1.0, 1.0);"
1186*35238bceSAndroid Build Coastguard Worker                                    << "    if (a == b) ${DST}.x = 1.0;"
1187*35238bceSAndroid Build Coastguard Worker                                    << "    if (a != c) ${DST}.y = 1.0;"
1188*35238bceSAndroid Build Coastguard Worker                                    << "    ${ASSIGN_POS}"
1189*35238bceSAndroid Build Coastguard Worker                                    << "}",
1190*35238bceSAndroid Build Coastguard Worker                       {
1191*35238bceSAndroid Build Coastguard Worker                           c.color.x() = 1.0f;
1192*35238bceSAndroid Build Coastguard Worker                           c.color.y() = 1.0f;
1193*35238bceSAndroid Build Coastguard Worker                           c.color.z() = 1.0f;
1194*35238bceSAndroid Build Coastguard Worker                       });
1195*35238bceSAndroid Build Coastguard Worker }
1196*35238bceSAndroid Build Coastguard Worker 
1197*35238bceSAndroid Build Coastguard Worker class UniformStructTests : public TestCaseGroup
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker public:
UniformStructTests(Context & context)1200*35238bceSAndroid Build Coastguard Worker     UniformStructTests(Context &context) : TestCaseGroup(context, "uniform", "Uniform structs")
1201*35238bceSAndroid Build Coastguard Worker     {
1202*35238bceSAndroid Build Coastguard Worker     }
1203*35238bceSAndroid Build Coastguard Worker 
~UniformStructTests(void)1204*35238bceSAndroid Build Coastguard Worker     ~UniformStructTests(void)
1205*35238bceSAndroid Build Coastguard Worker     {
1206*35238bceSAndroid Build Coastguard Worker     }
1207*35238bceSAndroid Build Coastguard Worker 
1208*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
1209*35238bceSAndroid Build Coastguard Worker };
1210*35238bceSAndroid Build Coastguard Worker 
1211*35238bceSAndroid Build Coastguard Worker namespace
1212*35238bceSAndroid Build Coastguard Worker {
1213*35238bceSAndroid Build Coastguard Worker 
1214*35238bceSAndroid Build Coastguard Worker #define CHECK_SET_UNIFORM(NAME) GLU_EXPECT_NO_ERROR(gl.getError(), (string("Failed to set ") + (NAME)).c_str())
1215*35238bceSAndroid Build Coastguard Worker 
1216*35238bceSAndroid Build Coastguard Worker #define MAKE_SET_VEC_UNIFORM(VECTYPE, SETUNIFORM)                                                            \
1217*35238bceSAndroid Build Coastguard Worker     void setUniform(const glw::Functions &gl, uint32_t programID, const char *name, const tcu::VECTYPE &vec) \
1218*35238bceSAndroid Build Coastguard Worker     {                                                                                                        \
1219*35238bceSAndroid Build Coastguard Worker         int loc = gl.getUniformLocation(programID, name);                                                    \
1220*35238bceSAndroid Build Coastguard Worker         SETUNIFORM(loc, 1, vec.getPtr());                                                                    \
1221*35238bceSAndroid Build Coastguard Worker         CHECK_SET_UNIFORM(name);                                                                             \
1222*35238bceSAndroid Build Coastguard Worker     }                                                                                                        \
1223*35238bceSAndroid Build Coastguard Worker     struct SetUniform##VECTYPE##Unused_s                                                                     \
1224*35238bceSAndroid Build Coastguard Worker     {                                                                                                        \
1225*35238bceSAndroid Build Coastguard Worker         int unused;                                                                                          \
1226*35238bceSAndroid Build Coastguard Worker     }
1227*35238bceSAndroid Build Coastguard Worker 
1228*35238bceSAndroid Build Coastguard Worker #define MAKE_SET_VEC_UNIFORM_PTR(VECTYPE, SETUNIFORM)                                                        \
1229*35238bceSAndroid Build Coastguard Worker     void setUniform(const glw::Functions &gl, uint32_t programID, const char *name, const tcu::VECTYPE *vec, \
1230*35238bceSAndroid Build Coastguard Worker                     int arraySize)                                                                           \
1231*35238bceSAndroid Build Coastguard Worker     {                                                                                                        \
1232*35238bceSAndroid Build Coastguard Worker         int loc = gl.getUniformLocation(programID, name);                                                    \
1233*35238bceSAndroid Build Coastguard Worker         SETUNIFORM(loc, arraySize, vec->getPtr());                                                           \
1234*35238bceSAndroid Build Coastguard Worker         CHECK_SET_UNIFORM(name);                                                                             \
1235*35238bceSAndroid Build Coastguard Worker     }                                                                                                        \
1236*35238bceSAndroid Build Coastguard Worker     struct SetUniformPtr##VECTYPE##Unused_s                                                                  \
1237*35238bceSAndroid Build Coastguard Worker     {                                                                                                        \
1238*35238bceSAndroid Build Coastguard Worker         int unused;                                                                                          \
1239*35238bceSAndroid Build Coastguard Worker     }
1240*35238bceSAndroid Build Coastguard Worker 
1241*35238bceSAndroid Build Coastguard Worker MAKE_SET_VEC_UNIFORM(Vec2, gl.uniform2fv);
1242*35238bceSAndroid Build Coastguard Worker MAKE_SET_VEC_UNIFORM(Vec3, gl.uniform3fv);
1243*35238bceSAndroid Build Coastguard Worker MAKE_SET_VEC_UNIFORM_PTR(Vec2, gl.uniform2fv);
1244*35238bceSAndroid Build Coastguard Worker 
setUniform(const glw::Functions & gl,uint32_t programID,const char * name,float value)1245*35238bceSAndroid Build Coastguard Worker void setUniform(const glw::Functions &gl, uint32_t programID, const char *name, float value)
1246*35238bceSAndroid Build Coastguard Worker {
1247*35238bceSAndroid Build Coastguard Worker     int loc = gl.getUniformLocation(programID, name);
1248*35238bceSAndroid Build Coastguard Worker     gl.uniform1f(loc, value);
1249*35238bceSAndroid Build Coastguard Worker     CHECK_SET_UNIFORM(name);
1250*35238bceSAndroid Build Coastguard Worker }
1251*35238bceSAndroid Build Coastguard Worker 
setUniform(const glw::Functions & gl,uint32_t programID,const char * name,int value)1252*35238bceSAndroid Build Coastguard Worker void setUniform(const glw::Functions &gl, uint32_t programID, const char *name, int value)
1253*35238bceSAndroid Build Coastguard Worker {
1254*35238bceSAndroid Build Coastguard Worker     int loc = gl.getUniformLocation(programID, name);
1255*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(loc, value);
1256*35238bceSAndroid Build Coastguard Worker     CHECK_SET_UNIFORM(name);
1257*35238bceSAndroid Build Coastguard Worker }
1258*35238bceSAndroid Build Coastguard Worker 
setUniform(const glw::Functions & gl,uint32_t programID,const char * name,const float * value,int arraySize)1259*35238bceSAndroid Build Coastguard Worker void setUniform(const glw::Functions &gl, uint32_t programID, const char *name, const float *value, int arraySize)
1260*35238bceSAndroid Build Coastguard Worker {
1261*35238bceSAndroid Build Coastguard Worker     int loc = gl.getUniformLocation(programID, name);
1262*35238bceSAndroid Build Coastguard Worker     gl.uniform1fv(loc, arraySize, value);
1263*35238bceSAndroid Build Coastguard Worker     CHECK_SET_UNIFORM(name);
1264*35238bceSAndroid Build Coastguard Worker }
1265*35238bceSAndroid Build Coastguard Worker 
1266*35238bceSAndroid Build Coastguard Worker } // namespace
1267*35238bceSAndroid Build Coastguard Worker 
init(void)1268*35238bceSAndroid Build Coastguard Worker void UniformStructTests::init(void)
1269*35238bceSAndroid Build Coastguard Worker {
1270*35238bceSAndroid Build Coastguard Worker #define UNIFORM_STRUCT_CASE(NAME, DESCRIPTION, TEXTURES, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY)             \
1271*35238bceSAndroid Build Coastguard Worker     do                                                                                                              \
1272*35238bceSAndroid Build Coastguard Worker     {                                                                                                               \
1273*35238bceSAndroid Build Coastguard Worker         struct SetUniforms_##NAME                                                                                   \
1274*35238bceSAndroid Build Coastguard Worker         {                                                                                                           \
1275*35238bceSAndroid Build Coastguard Worker             static void setUniforms(const glw::Functions &gl, uint32_t programID,                                   \
1276*35238bceSAndroid Build Coastguard Worker                                     const tcu::Vec4 &constCoords) SET_UNIFORMS_BODY /* NOLINT(SET_UNIFORMS_BODY) */ \
1277*35238bceSAndroid Build Coastguard Worker         };                                                                                                          \
1278*35238bceSAndroid Build Coastguard Worker         struct Eval_##NAME                                                                                          \
1279*35238bceSAndroid Build Coastguard Worker         {                                                                                                           \
1280*35238bceSAndroid Build Coastguard Worker             static void eval(ShaderEvalContext &c) EVAL_FUNC_BODY                                                   \
1281*35238bceSAndroid Build Coastguard Worker         }; /* NOLINT(EVAL_FUNC_BODY) */                                                                             \
1282*35238bceSAndroid Build Coastguard Worker         addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, TEXTURES, Eval_##NAME::eval,       \
1283*35238bceSAndroid Build Coastguard Worker                                   SetUniforms_##NAME::setUniforms, SHADER_SRC, DE_NULL));                           \
1284*35238bceSAndroid Build Coastguard Worker         addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, TEXTURES, Eval_##NAME::eval,    \
1285*35238bceSAndroid Build Coastguard Worker                                   SetUniforms_##NAME::setUniforms, SHADER_SRC, DE_NULL));                           \
1286*35238bceSAndroid Build Coastguard Worker     } while (false)
1287*35238bceSAndroid Build Coastguard Worker 
1288*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1289*35238bceSAndroid Build Coastguard Worker         basic, "Basic struct usage", false,
1290*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1291*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1292*35238bceSAndroid Build Coastguard Worker                      << ""
1293*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1294*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1295*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    b;"
1296*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1297*35238bceSAndroid Build Coastguard Worker                      << "};"
1298*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1299*35238bceSAndroid Build Coastguard Worker                      << ""
1300*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1301*35238bceSAndroid Build Coastguard Worker                      << "{"
1302*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
1303*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1304*35238bceSAndroid Build Coastguard Worker                      << "}",
1305*35238bceSAndroid Build Coastguard Worker         {
1306*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", constCoords.x());
1307*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b", constCoords.swizzle(1, 2, 3));
1308*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 1);
1309*35238bceSAndroid Build Coastguard Worker         },
1310*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(0, 1, 2); });
1311*35238bceSAndroid Build Coastguard Worker 
1312*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1313*35238bceSAndroid Build Coastguard Worker         nested, "Nested struct", false,
1314*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1315*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1316*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1317*35238bceSAndroid Build Coastguard Worker                      << ""
1318*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1319*35238bceSAndroid Build Coastguard Worker                      << "    int                a;"
1320*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b;"
1321*35238bceSAndroid Build Coastguard Worker                      << "};"
1322*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1323*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1324*35238bceSAndroid Build Coastguard Worker                      << "    T                b;"
1325*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1326*35238bceSAndroid Build Coastguard Worker                      << "};"
1327*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1328*35238bceSAndroid Build Coastguard Worker                      << ""
1329*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1330*35238bceSAndroid Build Coastguard Worker                      << "{"
1331*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
1332*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1333*35238bceSAndroid Build Coastguard Worker                      << "}",
1334*35238bceSAndroid Build Coastguard Worker         {
1335*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", constCoords.x());
1336*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b.a", 0);
1337*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b.b", constCoords.swizzle(1, 2));
1338*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 1);
1339*35238bceSAndroid Build Coastguard Worker         },
1340*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(0, 1, 2); });
1341*35238bceSAndroid Build Coastguard Worker 
1342*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1343*35238bceSAndroid Build Coastguard Worker         array_member, "Struct with array member", false,
1344*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1345*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1346*35238bceSAndroid Build Coastguard Worker                      << ""
1347*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1348*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1349*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    b[3];"
1350*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1351*35238bceSAndroid Build Coastguard Worker                      << "};"
1352*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1353*35238bceSAndroid Build Coastguard Worker                      << ""
1354*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1355*35238bceSAndroid Build Coastguard Worker                      << "{"
1356*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
1357*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1358*35238bceSAndroid Build Coastguard Worker                      << "}",
1359*35238bceSAndroid Build Coastguard Worker         {
1360*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", constCoords.w());
1361*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 1);
1362*35238bceSAndroid Build Coastguard Worker 
1363*35238bceSAndroid Build Coastguard Worker             float b[3];
1364*35238bceSAndroid Build Coastguard Worker             b[0] = constCoords.z();
1365*35238bceSAndroid Build Coastguard Worker             b[1] = constCoords.y();
1366*35238bceSAndroid Build Coastguard Worker             b[2] = constCoords.x();
1367*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b));
1368*35238bceSAndroid Build Coastguard Worker         },
1369*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(3, 2, 1); });
1370*35238bceSAndroid Build Coastguard Worker 
1371*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1372*35238bceSAndroid Build Coastguard Worker         array_member_dynamic_index, "Struct with array member, dynamic indexing", false,
1373*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1374*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1375*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1376*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1377*35238bceSAndroid Build Coastguard Worker                      << ""
1378*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1379*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1380*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    b[3];"
1381*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1382*35238bceSAndroid Build Coastguard Worker                      << "};"
1383*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1384*35238bceSAndroid Build Coastguard Worker                      << ""
1385*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1386*35238bceSAndroid Build Coastguard Worker                      << "{"
1387*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
1388*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1389*35238bceSAndroid Build Coastguard Worker                      << "}",
1390*35238bceSAndroid Build Coastguard Worker         {
1391*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", constCoords.w());
1392*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 1);
1393*35238bceSAndroid Build Coastguard Worker 
1394*35238bceSAndroid Build Coastguard Worker             float b[3];
1395*35238bceSAndroid Build Coastguard Worker             b[0] = constCoords.z();
1396*35238bceSAndroid Build Coastguard Worker             b[1] = constCoords.y();
1397*35238bceSAndroid Build Coastguard Worker             b[2] = constCoords.x();
1398*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b));
1399*35238bceSAndroid Build Coastguard Worker         },
1400*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(1, 2, 0); });
1401*35238bceSAndroid Build Coastguard Worker 
1402*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1403*35238bceSAndroid Build Coastguard Worker         struct_array, "Struct array", false,
1404*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1405*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1406*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1407*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1408*35238bceSAndroid Build Coastguard Worker                      << ""
1409*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1410*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1411*35238bceSAndroid Build Coastguard Worker                      << "    mediump int        b;"
1412*35238bceSAndroid Build Coastguard Worker                      << "};"
1413*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[3];"
1414*35238bceSAndroid Build Coastguard Worker                      << ""
1415*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1416*35238bceSAndroid Build Coastguard Worker                      << "{"
1417*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
1418*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1419*35238bceSAndroid Build Coastguard Worker                      << "}",
1420*35238bceSAndroid Build Coastguard Worker         {
1421*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1422*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b", 0);
1423*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.y());
1424*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b", 1);
1425*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].a", constCoords.z());
1426*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].b", 2);
1427*35238bceSAndroid Build Coastguard Worker         },
1428*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 1, 0); });
1429*35238bceSAndroid Build Coastguard Worker 
1430*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1431*35238bceSAndroid Build Coastguard Worker         struct_array_dynamic_index, "Struct array with dynamic indexing", false,
1432*35238bceSAndroid Build Coastguard Worker         LineStream()
1433*35238bceSAndroid Build Coastguard Worker             << "${HEADER}"
1434*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_zero;"
1435*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_one;"
1436*35238bceSAndroid Build Coastguard Worker             << "uniform int ui_two;"
1437*35238bceSAndroid Build Coastguard Worker             << ""
1438*35238bceSAndroid Build Coastguard Worker             << "struct S {"
1439*35238bceSAndroid Build Coastguard Worker             << "    mediump float    a;"
1440*35238bceSAndroid Build Coastguard Worker             << "    mediump int        b;"
1441*35238bceSAndroid Build Coastguard Worker             << "};"
1442*35238bceSAndroid Build Coastguard Worker             << "uniform S s[3];"
1443*35238bceSAndroid Build Coastguard Worker             << ""
1444*35238bceSAndroid Build Coastguard Worker             << "void main (void)"
1445*35238bceSAndroid Build Coastguard Worker             << "{"
1446*35238bceSAndroid Build Coastguard Worker             << "    ${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);"
1447*35238bceSAndroid Build Coastguard Worker             << "    ${ASSIGN_POS}"
1448*35238bceSAndroid Build Coastguard Worker             << "}",
1449*35238bceSAndroid Build Coastguard Worker         {
1450*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1451*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b", 0);
1452*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.y());
1453*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b", 1);
1454*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].a", constCoords.z());
1455*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].b", 2);
1456*35238bceSAndroid Build Coastguard Worker         },
1457*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 1, 0); });
1458*35238bceSAndroid Build Coastguard Worker 
1459*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1460*35238bceSAndroid Build Coastguard Worker         nested_struct_array, "Nested struct array", false,
1461*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1462*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1463*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1464*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
1465*35238bceSAndroid Build Coastguard Worker                      << "};"
1466*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1467*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1468*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
1469*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1470*35238bceSAndroid Build Coastguard Worker                      << "};"
1471*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[2];"
1472*35238bceSAndroid Build Coastguard Worker                      << ""
1473*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1474*35238bceSAndroid Build Coastguard Worker                      << "{"
1475*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5"
1476*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
1477*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w "
1478*35238bceSAndroid Build Coastguard Worker                         "+ w) * 0.333"
1479*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
1480*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r, g, b, a);"
1481*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1482*35238bceSAndroid Build Coastguard Worker                      << "}",
1483*35238bceSAndroid Build Coastguard Worker         {
1484*35238bceSAndroid Build Coastguard Worker             tcu::Vec2 arr[2];
1485*35238bceSAndroid Build Coastguard Worker 
1486*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1487*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 1);
1488*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 3);
1489*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].a", 0.5f);
1490*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1491*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 3);
1492*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(0, 1);
1493*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].a", 1.0f / 3.0f);
1494*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1495*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 2);
1496*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(1, 3);
1497*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].a", 1.0f / 4.0f);
1498*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1499*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].c", 0);
1500*35238bceSAndroid Build Coastguard Worker 
1501*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.w());
1502*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 0);
1503*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(1, 1);
1504*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].a", 2.0f);
1505*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1506*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 2);
1507*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 3);
1508*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].a", 3.0f);
1509*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1510*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1511*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 2);
1512*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].a", 4.0f);
1513*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1514*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].c", 1);
1515*35238bceSAndroid Build Coastguard Worker         },
1516*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 0, 3); });
1517*35238bceSAndroid Build Coastguard Worker 
1518*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1519*35238bceSAndroid Build Coastguard Worker         nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", false,
1520*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1521*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1522*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1523*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1524*35238bceSAndroid Build Coastguard Worker                      << ""
1525*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1526*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1527*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
1528*35238bceSAndroid Build Coastguard Worker                      << "};"
1529*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1530*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1531*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
1532*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1533*35238bceSAndroid Build Coastguard Worker                      << "};"
1534*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[2];"
1535*35238bceSAndroid Build Coastguard Worker                      << ""
1536*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1537*35238bceSAndroid Build Coastguard Worker                      << "{"
1538*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * "
1539*35238bceSAndroid Build Coastguard Worker                         "s[0].b[0].a; // (z + z) * 0.5"
1540*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * "
1541*35238bceSAndroid Build Coastguard Worker                         "s[ui_one].b[2].a; // x * 0.25 * 4"
1542*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + "
1543*35238bceSAndroid Build Coastguard Worker                         "s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333"
1544*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - "
1545*35238bceSAndroid Build Coastguard Worker                         "s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0"
1546*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r, g, b, a);"
1547*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1548*35238bceSAndroid Build Coastguard Worker                      << "}",
1549*35238bceSAndroid Build Coastguard Worker         {
1550*35238bceSAndroid Build Coastguard Worker             tcu::Vec2 arr[2];
1551*35238bceSAndroid Build Coastguard Worker 
1552*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1553*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 1);
1554*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 3);
1555*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].a", 0.5f);
1556*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1557*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 3);
1558*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(0, 1);
1559*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].a", 1.0f / 3.0f);
1560*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1561*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 2);
1562*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(1, 3);
1563*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].a", 1.0f / 4.0f);
1564*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1565*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].c", 0);
1566*35238bceSAndroid Build Coastguard Worker 
1567*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.w());
1568*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(0, 0);
1569*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(1, 1);
1570*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].a", 2.0f);
1571*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1572*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 2);
1573*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 3);
1574*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].a", 3.0f);
1575*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1576*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1577*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 2);
1578*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].a", 4.0f);
1579*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1580*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].c", 1);
1581*35238bceSAndroid Build Coastguard Worker         },
1582*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 0, 3); });
1583*35238bceSAndroid Build Coastguard Worker 
1584*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1585*35238bceSAndroid Build Coastguard Worker         loop_struct_array, "Struct array usage in loop", false,
1586*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1587*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1588*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1589*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1590*35238bceSAndroid Build Coastguard Worker                      << ""
1591*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1592*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1593*35238bceSAndroid Build Coastguard Worker                      << "    mediump int        b;"
1594*35238bceSAndroid Build Coastguard Worker                      << "};"
1595*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[3];"
1596*35238bceSAndroid Build Coastguard Worker                      << ""
1597*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1598*35238bceSAndroid Build Coastguard Worker                      << "{"
1599*35238bceSAndroid Build Coastguard Worker                      << "    mediump float rgb[3];"
1600*35238bceSAndroid Build Coastguard Worker                      << "    int alpha = 0;"
1601*35238bceSAndroid Build Coastguard Worker                      << "    for (int i = 0; i < 3; i++)"
1602*35238bceSAndroid Build Coastguard Worker                      << "    {"
1603*35238bceSAndroid Build Coastguard Worker                      << "        rgb[i] = s[2-i].a;"
1604*35238bceSAndroid Build Coastguard Worker                      << "        alpha += s[i].b;"
1605*35238bceSAndroid Build Coastguard Worker                      << "    }"
1606*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
1607*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1608*35238bceSAndroid Build Coastguard Worker                      << "}",
1609*35238bceSAndroid Build Coastguard Worker         {
1610*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1611*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b", 0);
1612*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.y());
1613*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b", -1);
1614*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].a", constCoords.z());
1615*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].b", 2);
1616*35238bceSAndroid Build Coastguard Worker         },
1617*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 1, 0); });
1618*35238bceSAndroid Build Coastguard Worker 
1619*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1620*35238bceSAndroid Build Coastguard Worker         loop_nested_struct_array, "Nested struct array usage in loop", false,
1621*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1622*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1623*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1624*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1625*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_two;"
1626*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_three;"
1627*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_four;"
1628*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_half;"
1629*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_third;"
1630*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_fourth;"
1631*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_sixth;"
1632*35238bceSAndroid Build Coastguard Worker                      << ""
1633*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1634*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1635*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
1636*35238bceSAndroid Build Coastguard Worker                      << "};"
1637*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1638*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1639*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
1640*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1641*35238bceSAndroid Build Coastguard Worker                      << "};"
1642*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[2];"
1643*35238bceSAndroid Build Coastguard Worker                      << ""
1644*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1645*35238bceSAndroid Build Coastguard Worker                      << "{"
1646*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1647*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1648*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1649*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = 1.0;"
1650*35238bceSAndroid Build Coastguard Worker                      << "    for (int i = 0; i < 2; i++)"
1651*35238bceSAndroid Build Coastguard Worker                      << "    {"
1652*35238bceSAndroid Build Coastguard Worker                      << "        for (int j = 0; j < 3; j++)"
1653*35238bceSAndroid Build Coastguard Worker                      << "        {"
1654*35238bceSAndroid Build Coastguard Worker                      << "            r += s[0].b[j].b[i].y;"
1655*35238bceSAndroid Build Coastguard Worker                      << "            g += s[i].b[j].b[0].x;"
1656*35238bceSAndroid Build Coastguard Worker                      << "            b += s[i].b[j].b[1].x;"
1657*35238bceSAndroid Build Coastguard Worker                      << "            a *= s[i].b[j].a;"
1658*35238bceSAndroid Build Coastguard Worker                      << "        }"
1659*35238bceSAndroid Build Coastguard Worker                      << "    }"
1660*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1661*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1662*35238bceSAndroid Build Coastguard Worker                      << "}",
1663*35238bceSAndroid Build Coastguard Worker         {
1664*35238bceSAndroid Build Coastguard Worker             tcu::Vec2 arr[2];
1665*35238bceSAndroid Build Coastguard Worker 
1666*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1667*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1668*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 0);
1669*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].a", 0.5f);
1670*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1671*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 1);
1672*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 1);
1673*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].a", 1.0f / 3.0f);
1674*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1675*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 1);
1676*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 1);
1677*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].a", 1.0f / 4.0f);
1678*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1679*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].c", 0);
1680*35238bceSAndroid Build Coastguard Worker 
1681*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.w());
1682*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 0);
1683*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 1);
1684*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].a", 2.0f);
1685*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1686*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 2);
1687*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 3);
1688*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].a", 3.0f);
1689*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1690*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1691*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 2);
1692*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].a", 4.0f);
1693*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1694*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].c", 1);
1695*35238bceSAndroid Build Coastguard Worker         },
1696*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f; });
1697*35238bceSAndroid Build Coastguard Worker 
1698*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1699*35238bceSAndroid Build Coastguard Worker         dynamic_loop_struct_array, "Struct array usage in dynamic loop", false,
1700*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1701*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1702*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1703*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1704*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_three;"
1705*35238bceSAndroid Build Coastguard Worker                      << ""
1706*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1707*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1708*35238bceSAndroid Build Coastguard Worker                      << "    mediump int        b;"
1709*35238bceSAndroid Build Coastguard Worker                      << "};"
1710*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[3];"
1711*35238bceSAndroid Build Coastguard Worker                      << ""
1712*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1713*35238bceSAndroid Build Coastguard Worker                      << "{"
1714*35238bceSAndroid Build Coastguard Worker                      << "    mediump float rgb[3];"
1715*35238bceSAndroid Build Coastguard Worker                      << "    int alpha = 0;"
1716*35238bceSAndroid Build Coastguard Worker                      << "    for (int i = 0; i < ui_three; i++)"
1717*35238bceSAndroid Build Coastguard Worker                      << "    {"
1718*35238bceSAndroid Build Coastguard Worker                      << "        rgb[i] = s[2-i].a;"
1719*35238bceSAndroid Build Coastguard Worker                      << "        alpha += s[i].b;"
1720*35238bceSAndroid Build Coastguard Worker                      << "    }"
1721*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
1722*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1723*35238bceSAndroid Build Coastguard Worker                      << "}",
1724*35238bceSAndroid Build Coastguard Worker         {
1725*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1726*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b", 0);
1727*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.y());
1728*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b", -1);
1729*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].a", constCoords.z());
1730*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[2].b", 2);
1731*35238bceSAndroid Build Coastguard Worker         },
1732*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.constCoords.swizzle(2, 1, 0); });
1733*35238bceSAndroid Build Coastguard Worker 
1734*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1735*35238bceSAndroid Build Coastguard Worker         dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", false,
1736*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1737*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1738*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1739*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1740*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_three;"
1741*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_two;"
1742*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_three;"
1743*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_four;"
1744*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_half;"
1745*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_third;"
1746*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_fourth;"
1747*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_sixth;"
1748*35238bceSAndroid Build Coastguard Worker                      << ""
1749*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1750*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1751*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b[2];"
1752*35238bceSAndroid Build Coastguard Worker                      << "};"
1753*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1754*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1755*35238bceSAndroid Build Coastguard Worker                      << "    T                b[3];"
1756*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1757*35238bceSAndroid Build Coastguard Worker                      << "};"
1758*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[2];"
1759*35238bceSAndroid Build Coastguard Worker                      << ""
1760*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1761*35238bceSAndroid Build Coastguard Worker                      << "{"
1762*35238bceSAndroid Build Coastguard Worker                      << "    mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1763*35238bceSAndroid Build Coastguard Worker                      << "    mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1764*35238bceSAndroid Build Coastguard Worker                      << "    mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1765*35238bceSAndroid Build Coastguard Worker                      << "    mediump float a = 1.0;"
1766*35238bceSAndroid Build Coastguard Worker                      << "    for (int i = 0; i < ui_two; i++)"
1767*35238bceSAndroid Build Coastguard Worker                      << "    {"
1768*35238bceSAndroid Build Coastguard Worker                      << "        for (int j = 0; j < ui_three; j++)"
1769*35238bceSAndroid Build Coastguard Worker                      << "        {"
1770*35238bceSAndroid Build Coastguard Worker                      << "            r += s[0].b[j].b[i].y;"
1771*35238bceSAndroid Build Coastguard Worker                      << "            g += s[i].b[j].b[0].x;"
1772*35238bceSAndroid Build Coastguard Worker                      << "            b += s[i].b[j].b[1].x;"
1773*35238bceSAndroid Build Coastguard Worker                      << "            a *= s[i].b[j].a;"
1774*35238bceSAndroid Build Coastguard Worker                      << "        }"
1775*35238bceSAndroid Build Coastguard Worker                      << "    }"
1776*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1777*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1778*35238bceSAndroid Build Coastguard Worker                      << "}",
1779*35238bceSAndroid Build Coastguard Worker         {
1780*35238bceSAndroid Build Coastguard Worker             tcu::Vec2 arr[2];
1781*35238bceSAndroid Build Coastguard Worker 
1782*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", constCoords.x());
1783*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1784*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 0);
1785*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].a", 0.5f);
1786*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1787*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 1);
1788*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 1);
1789*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].a", 1.0f / 3.0f);
1790*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1791*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 1);
1792*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 1);
1793*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].a", 1.0f / 4.0f);
1794*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1795*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].c", 0);
1796*35238bceSAndroid Build Coastguard Worker 
1797*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", constCoords.w());
1798*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 0);
1799*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(2, 1);
1800*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].a", 2.0f);
1801*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[0].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1802*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(2, 2);
1803*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 3);
1804*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].a", 3.0f);
1805*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[1].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1806*35238bceSAndroid Build Coastguard Worker             arr[0] = constCoords.swizzle(1, 0);
1807*35238bceSAndroid Build Coastguard Worker             arr[1] = constCoords.swizzle(3, 2);
1808*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].a", 4.0f);
1809*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b[2].b", &arr[0], DE_LENGTH_OF_ARRAY(arr));
1810*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].c", 1);
1811*35238bceSAndroid Build Coastguard Worker         },
1812*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f; });
1813*35238bceSAndroid Build Coastguard Worker 
1814*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1815*35238bceSAndroid Build Coastguard Worker         sampler, "Sampler in struct", true,
1816*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1817*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1818*35238bceSAndroid Build Coastguard Worker                      << ""
1819*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1820*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1821*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    b;"
1822*35238bceSAndroid Build Coastguard Worker                      << "    sampler2D        c;"
1823*35238bceSAndroid Build Coastguard Worker                      << "};"
1824*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1825*35238bceSAndroid Build Coastguard Worker                      << ""
1826*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1827*35238bceSAndroid Build Coastguard Worker                      << "{"
1828*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(texture(s.c, ${COORDS}.xy * s.b.xy + s.b.z).rgb, s.a);"
1829*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1830*35238bceSAndroid Build Coastguard Worker                      << "}",
1831*35238bceSAndroid Build Coastguard Worker         {
1832*35238bceSAndroid Build Coastguard Worker             DE_UNREF(constCoords);
1833*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", 1.0f);
1834*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b", tcu::Vec3(0.25f, 0.25f, 0.5f));
1835*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 0);
1836*35238bceSAndroid Build Coastguard Worker         },
1837*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0, 1) * 0.25f + 0.5f).swizzle(0, 1, 2); });
1838*35238bceSAndroid Build Coastguard Worker 
1839*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1840*35238bceSAndroid Build Coastguard Worker         sampler_nested, "Sampler in nested struct", true,
1841*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1842*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_zero;"
1843*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1844*35238bceSAndroid Build Coastguard Worker                      << ""
1845*35238bceSAndroid Build Coastguard Worker                      << "struct T {"
1846*35238bceSAndroid Build Coastguard Worker                      << "    sampler2D        a;"
1847*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec2    b;"
1848*35238bceSAndroid Build Coastguard Worker                      << "};"
1849*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1850*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1851*35238bceSAndroid Build Coastguard Worker                      << "    T                b;"
1852*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1853*35238bceSAndroid Build Coastguard Worker                      << "};"
1854*35238bceSAndroid Build Coastguard Worker                      << "uniform S s;"
1855*35238bceSAndroid Build Coastguard Worker                      << ""
1856*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1857*35238bceSAndroid Build Coastguard Worker                      << "{"
1858*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(texture(s.b.a, ${COORDS}.xy * s.b.b + s.a).rgb, s.c);"
1859*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1860*35238bceSAndroid Build Coastguard Worker                      << "}",
1861*35238bceSAndroid Build Coastguard Worker         {
1862*35238bceSAndroid Build Coastguard Worker             DE_UNREF(constCoords);
1863*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.a", 0.5f);
1864*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b.a", 0);
1865*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.b.b", tcu::Vec2(0.25f, 0.25f));
1866*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s.c", 1);
1867*35238bceSAndroid Build Coastguard Worker         },
1868*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0, 1) * 0.25f + 0.5f).swizzle(0, 1, 2); });
1869*35238bceSAndroid Build Coastguard Worker 
1870*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1871*35238bceSAndroid Build Coastguard Worker         sampler_array, "Sampler in struct array", true,
1872*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1873*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_one;"
1874*35238bceSAndroid Build Coastguard Worker                      << ""
1875*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1876*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1877*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    b;"
1878*35238bceSAndroid Build Coastguard Worker                      << "    sampler2D        c;"
1879*35238bceSAndroid Build Coastguard Worker                      << "};"
1880*35238bceSAndroid Build Coastguard Worker                      << "uniform S s[2];"
1881*35238bceSAndroid Build Coastguard Worker                      << ""
1882*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1883*35238bceSAndroid Build Coastguard Worker                      << "{"
1884*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(texture(s[1].c, ${COORDS}.xy * s[0].b.xy + s[1].b.z).rgb, s[0].a);"
1885*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1886*35238bceSAndroid Build Coastguard Worker                      << "}",
1887*35238bceSAndroid Build Coastguard Worker         {
1888*35238bceSAndroid Build Coastguard Worker             DE_UNREF(constCoords);
1889*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].a", 1.0f);
1890*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].b", tcu::Vec3(0.25f, 0.25f, 0.25f));
1891*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[0].c", 1);
1892*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].a", 0.0f);
1893*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].b", tcu::Vec3(0.5f, 0.5f, 0.5f));
1894*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "s[1].c", 0);
1895*35238bceSAndroid Build Coastguard Worker         },
1896*35238bceSAndroid Build Coastguard Worker         { c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0, 1) * 0.25f + 0.5f).swizzle(0, 1, 2); });
1897*35238bceSAndroid Build Coastguard Worker 
1898*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1899*35238bceSAndroid Build Coastguard Worker         equal, "Struct equality", false,
1900*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1901*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_one;"
1902*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1903*35238bceSAndroid Build Coastguard Worker                      << ""
1904*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1905*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1906*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    b;"
1907*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1908*35238bceSAndroid Build Coastguard Worker                      << "};"
1909*35238bceSAndroid Build Coastguard Worker                      << "uniform S a;"
1910*35238bceSAndroid Build Coastguard Worker                      << "uniform S b;"
1911*35238bceSAndroid Build Coastguard Worker                      << "uniform S c;"
1912*35238bceSAndroid Build Coastguard Worker                      << ""
1913*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1914*35238bceSAndroid Build Coastguard Worker                      << "{"
1915*35238bceSAndroid Build Coastguard Worker                      << "    S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
1916*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1917*35238bceSAndroid Build Coastguard Worker                      << "    if (a == b) ${DST}.x = 1.0;"
1918*35238bceSAndroid Build Coastguard Worker                      << "    if (a == c) ${DST}.y = 1.0;"
1919*35238bceSAndroid Build Coastguard Worker                      << "    if (a == d) ${DST}.z = 1.0;"
1920*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1921*35238bceSAndroid Build Coastguard Worker                      << "}",
1922*35238bceSAndroid Build Coastguard Worker         {
1923*35238bceSAndroid Build Coastguard Worker             DE_UNREF(constCoords);
1924*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.a", 1.0f);
1925*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
1926*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.c", 2);
1927*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.a", 1.0f);
1928*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
1929*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.c", 2);
1930*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.a", 1.0f);
1931*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f));
1932*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.c", 2);
1933*35238bceSAndroid Build Coastguard Worker         },
1934*35238bceSAndroid Build Coastguard Worker         {
1935*35238bceSAndroid Build Coastguard Worker             c.color.xy() = tcu::Vec2(1.0f, 0.0f);
1936*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[1] + 1.0f) == deFloatFloor(1.1f))
1937*35238bceSAndroid Build Coastguard Worker                 c.color.z() = 1.0f;
1938*35238bceSAndroid Build Coastguard Worker         });
1939*35238bceSAndroid Build Coastguard Worker 
1940*35238bceSAndroid Build Coastguard Worker     UNIFORM_STRUCT_CASE(
1941*35238bceSAndroid Build Coastguard Worker         not_equal, "Struct equality", false,
1942*35238bceSAndroid Build Coastguard Worker         LineStream() << "${HEADER}"
1943*35238bceSAndroid Build Coastguard Worker                      << "uniform mediump float uf_one;"
1944*35238bceSAndroid Build Coastguard Worker                      << "uniform int ui_two;"
1945*35238bceSAndroid Build Coastguard Worker                      << ""
1946*35238bceSAndroid Build Coastguard Worker                      << "struct S {"
1947*35238bceSAndroid Build Coastguard Worker                      << "    mediump float    a;"
1948*35238bceSAndroid Build Coastguard Worker                      << "    mediump vec3    b;"
1949*35238bceSAndroid Build Coastguard Worker                      << "    int                c;"
1950*35238bceSAndroid Build Coastguard Worker                      << "};"
1951*35238bceSAndroid Build Coastguard Worker                      << "uniform S a;"
1952*35238bceSAndroid Build Coastguard Worker                      << "uniform S b;"
1953*35238bceSAndroid Build Coastguard Worker                      << "uniform S c;"
1954*35238bceSAndroid Build Coastguard Worker                      << ""
1955*35238bceSAndroid Build Coastguard Worker                      << "void main (void)"
1956*35238bceSAndroid Build Coastguard Worker                      << "{"
1957*35238bceSAndroid Build Coastguard Worker                      << "    S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
1958*35238bceSAndroid Build Coastguard Worker                      << "    ${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1959*35238bceSAndroid Build Coastguard Worker                      << "    if (a != b) ${DST}.x = 1.0;"
1960*35238bceSAndroid Build Coastguard Worker                      << "    if (a != c) ${DST}.y = 1.0;"
1961*35238bceSAndroid Build Coastguard Worker                      << "    if (a != d) ${DST}.z = 1.0;"
1962*35238bceSAndroid Build Coastguard Worker                      << "    ${ASSIGN_POS}"
1963*35238bceSAndroid Build Coastguard Worker                      << "}",
1964*35238bceSAndroid Build Coastguard Worker         {
1965*35238bceSAndroid Build Coastguard Worker             DE_UNREF(constCoords);
1966*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.a", 1.0f);
1967*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
1968*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "a.c", 2);
1969*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.a", 1.0f);
1970*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
1971*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "b.c", 2);
1972*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.a", 1.0f);
1973*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f));
1974*35238bceSAndroid Build Coastguard Worker             setUniform(gl, programID, "c.c", 2);
1975*35238bceSAndroid Build Coastguard Worker         },
1976*35238bceSAndroid Build Coastguard Worker         {
1977*35238bceSAndroid Build Coastguard Worker             c.color.xy() = tcu::Vec2(0.0f, 1.0f);
1978*35238bceSAndroid Build Coastguard Worker             if (deFloatFloor(c.coords[1] + 1.0f) != deFloatFloor(1.1f))
1979*35238bceSAndroid Build Coastguard Worker                 c.color.z() = 1.0f;
1980*35238bceSAndroid Build Coastguard Worker         });
1981*35238bceSAndroid Build Coastguard Worker }
1982*35238bceSAndroid Build Coastguard Worker 
ShaderStructTests(Context & context)1983*35238bceSAndroid Build Coastguard Worker ShaderStructTests::ShaderStructTests(Context &context) : TestCaseGroup(context, "struct", "Struct Tests")
1984*35238bceSAndroid Build Coastguard Worker {
1985*35238bceSAndroid Build Coastguard Worker }
1986*35238bceSAndroid Build Coastguard Worker 
~ShaderStructTests(void)1987*35238bceSAndroid Build Coastguard Worker ShaderStructTests::~ShaderStructTests(void)
1988*35238bceSAndroid Build Coastguard Worker {
1989*35238bceSAndroid Build Coastguard Worker }
1990*35238bceSAndroid Build Coastguard Worker 
init(void)1991*35238bceSAndroid Build Coastguard Worker void ShaderStructTests::init(void)
1992*35238bceSAndroid Build Coastguard Worker {
1993*35238bceSAndroid Build Coastguard Worker     addChild(new LocalStructTests(m_context));
1994*35238bceSAndroid Build Coastguard Worker     addChild(new UniformStructTests(m_context));
1995*35238bceSAndroid Build Coastguard Worker }
1996*35238bceSAndroid Build Coastguard Worker 
1997*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1998*35238bceSAndroid Build Coastguard Worker } // namespace gles3
1999*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2000