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