xref: /aosp_15_r20/external/deqp/modules/glshared/glsLongStressTestUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL (ES) 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 Utilities for tests with gls::LongStressCase.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "glsLongStressTestUtil.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker 
28*35238bceSAndroid Build Coastguard Worker #include "glw.h"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker using de::toString;
31*35238bceSAndroid Build Coastguard Worker using std::map;
32*35238bceSAndroid Build Coastguard Worker using std::string;
33*35238bceSAndroid Build Coastguard Worker using tcu::Mat2;
34*35238bceSAndroid Build Coastguard Worker using tcu::Mat3;
35*35238bceSAndroid Build Coastguard Worker using tcu::Mat4;
36*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
37*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
38*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker namespace deqp
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace gls
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace LongStressTestUtil
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker template <int Size>
translationMat(const float v)48*35238bceSAndroid Build Coastguard Worker static tcu::Matrix<float, Size, Size> translationMat(const float v)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker     tcu::Matrix<float, Size, Size> res(1.0f);
51*35238bceSAndroid Build Coastguard Worker     tcu::Vector<float, Size> col(v);
52*35238bceSAndroid Build Coastguard Worker     col[Size - 1] = 1.0f;
53*35238bceSAndroid Build Coastguard Worker     res.setColumn(Size - 1, col);
54*35238bceSAndroid Build Coastguard Worker     return res;
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker // Specializes certain template patterns in templ for GLSL version m_glslVersion; params in additionalParams (optional) are also included in the substitution.
substitute(const string & templ,const map<string,string> & additionalParams) const58*35238bceSAndroid Build Coastguard Worker string ProgramLibrary::substitute(const string &templ, const map<string, string> &additionalParams) const
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker     const bool isGLSL3 = m_glslVersion == glu::GLSL_VERSION_300_ES;
61*35238bceSAndroid Build Coastguard Worker     map<string, string> params;
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker     params["FRAG_HEADER"] = isGLSL3 ? "#version 300 es\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n" : "";
64*35238bceSAndroid Build Coastguard Worker     params["VTX_HEADER"]  = isGLSL3 ? "#version 300 es\n" : "";
65*35238bceSAndroid Build Coastguard Worker     params["VTX_IN"]      = isGLSL3 ? "in" : "attribute";
66*35238bceSAndroid Build Coastguard Worker     params["VTX_OUT"]     = isGLSL3 ? "out" : "varying";
67*35238bceSAndroid Build Coastguard Worker     params["FRAG_IN"]     = isGLSL3 ? "in" : "varying";
68*35238bceSAndroid Build Coastguard Worker     params["FRAG_COLOR"]  = isGLSL3 ? "dEQP_FragColor" : "gl_FragColor";
69*35238bceSAndroid Build Coastguard Worker     params["TEXTURE_2D_FUNC"] = isGLSL3 ? "texture" : "texture2D";
70*35238bceSAndroid Build Coastguard Worker     params["NS"]              = "${NS}"; // \note Keep these as-is, they're handled by StressCase.
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker     params.insert(additionalParams.begin(), additionalParams.end());
73*35238bceSAndroid Build Coastguard Worker 
74*35238bceSAndroid Build Coastguard Worker     return tcu::StringTemplate(templ.c_str()).specialize(params);
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker 
substitute(const std::string & templ) const77*35238bceSAndroid Build Coastguard Worker string ProgramLibrary::substitute(const std::string &templ) const
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker     return substitute(templ, map<string, string>());
80*35238bceSAndroid Build Coastguard Worker }
81*35238bceSAndroid Build Coastguard Worker 
ProgramLibrary(const glu::GLSLVersion glslVersion)82*35238bceSAndroid Build Coastguard Worker ProgramLibrary::ProgramLibrary(const glu::GLSLVersion glslVersion) : m_glslVersion(glslVersion)
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(glslVersion == glu::GLSL_VERSION_100_ES || glslVersion == glu::GLSL_VERSION_300_ES);
85*35238bceSAndroid Build Coastguard Worker }
86*35238bceSAndroid Build Coastguard Worker 
generateBufferContext(const int numUnusedAttributes) const87*35238bceSAndroid Build Coastguard Worker gls::ProgramContext ProgramLibrary::generateBufferContext(const int numUnusedAttributes) const
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker     static const char *const vertexTemplate = "${VTX_HEADER}"
90*35238bceSAndroid Build Coastguard Worker                                               "${VTX_IN} highp vec3 a_position;\n"
91*35238bceSAndroid Build Coastguard Worker                                               "${VTX_UNUSED_INPUTS}"
92*35238bceSAndroid Build Coastguard Worker                                               "${VTX_OUT} mediump vec4 v_color;\n"
93*35238bceSAndroid Build Coastguard Worker                                               "\n"
94*35238bceSAndroid Build Coastguard Worker                                               "void main (void)\n"
95*35238bceSAndroid Build Coastguard Worker                                               "{\n"
96*35238bceSAndroid Build Coastguard Worker                                               "    gl_Position = vec4(a_position, 1.0);\n"
97*35238bceSAndroid Build Coastguard Worker                                               "    v_color = ${VTX_COLOR_EXPRESSION};\n"
98*35238bceSAndroid Build Coastguard Worker                                               "}\n";
99*35238bceSAndroid Build Coastguard Worker 
100*35238bceSAndroid Build Coastguard Worker     static const char *const fragmentTemplate = "${FRAG_HEADER}"
101*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_IN} mediump vec4 v_color;\n"
102*35238bceSAndroid Build Coastguard Worker                                                 "\n"
103*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
104*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
105*35238bceSAndroid Build Coastguard Worker                                                 "    ${FRAG_COLOR} = v_color;\n"
106*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     map<string, string> firstLevelParams;
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker     {
111*35238bceSAndroid Build Coastguard Worker         string vtxUnusedInputs;
112*35238bceSAndroid Build Coastguard Worker         string vtxColorExpr;
113*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numUnusedAttributes; i++)
114*35238bceSAndroid Build Coastguard Worker         {
115*35238bceSAndroid Build Coastguard Worker             vtxUnusedInputs += "${VTX_IN} mediump vec4 a_in" + toString(i) + ";\n";
116*35238bceSAndroid Build Coastguard Worker             vtxColorExpr += string() + (i > 0 ? " + " : "") + "a_in" + toString(i);
117*35238bceSAndroid Build Coastguard Worker         }
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker         firstLevelParams["VTX_UNUSED_INPUTS"]    = substitute(vtxUnusedInputs);
120*35238bceSAndroid Build Coastguard Worker         firstLevelParams["VTX_COLOR_EXPRESSION"] = vtxColorExpr;
121*35238bceSAndroid Build Coastguard Worker     }
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker     gls::ProgramContext context(substitute(vertexTemplate, firstLevelParams).c_str(),
124*35238bceSAndroid Build Coastguard Worker                                 substitute(fragmentTemplate).c_str(), "a_position");
125*35238bceSAndroid Build Coastguard Worker 
126*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_position", Vec3(-0.1f), Vec3(0.1f)));
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numUnusedAttributes; i++)
129*35238bceSAndroid Build Coastguard Worker         context.attributes.push_back(
130*35238bceSAndroid Build Coastguard Worker             gls::VarSpec("a_in" + de::toString(i), Vec4(0.0f), Vec4(1.0f / (float)numUnusedAttributes)));
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker     return context;
133*35238bceSAndroid Build Coastguard Worker }
134*35238bceSAndroid Build Coastguard Worker 
generateTextureContext(const int numTextures,const int texWid,const int texHei,const float positionFactor) const135*35238bceSAndroid Build Coastguard Worker gls::ProgramContext ProgramLibrary::generateTextureContext(const int numTextures, const int texWid, const int texHei,
136*35238bceSAndroid Build Coastguard Worker                                                            const float positionFactor) const
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker     static const char *const vertexTemplate = "${VTX_HEADER}"
139*35238bceSAndroid Build Coastguard Worker                                               "${VTX_IN} highp vec3 a_position;\n"
140*35238bceSAndroid Build Coastguard Worker                                               "${VTX_IN} mediump vec2 a_texCoord;\n"
141*35238bceSAndroid Build Coastguard Worker                                               "${VTX_OUT} mediump vec2 v_texCoord;\n"
142*35238bceSAndroid Build Coastguard Worker                                               "uniform mediump mat4 u_posTrans;\n"
143*35238bceSAndroid Build Coastguard Worker                                               "\n"
144*35238bceSAndroid Build Coastguard Worker                                               "void main (void)\n"
145*35238bceSAndroid Build Coastguard Worker                                               "{\n"
146*35238bceSAndroid Build Coastguard Worker                                               "    gl_Position = u_posTrans * vec4(a_position, 1.0);\n"
147*35238bceSAndroid Build Coastguard Worker                                               "    v_texCoord = a_texCoord;\n"
148*35238bceSAndroid Build Coastguard Worker                                               "}\n";
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     static const char *const fragmentTemplate = "${FRAG_HEADER}"
151*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_IN} mediump vec2 v_texCoord;\n"
152*35238bceSAndroid Build Coastguard Worker                                                 "uniform mediump sampler2D u_sampler;\n"
153*35238bceSAndroid Build Coastguard Worker                                                 "\n"
154*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
155*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
156*35238bceSAndroid Build Coastguard Worker                                                 "    ${FRAG_COLOR} = ${TEXTURE_2D_FUNC}(u_sampler, v_texCoord);\n"
157*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     gls::ProgramContext context(substitute(vertexTemplate).c_str(), substitute(fragmentTemplate).c_str(), "a_position");
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_position", Vec3(-positionFactor), Vec3(positionFactor)));
162*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_texCoord", Vec2(0.0f), Vec2(1.0f)));
163*35238bceSAndroid Build Coastguard Worker 
164*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_sampler", 0));
165*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(
166*35238bceSAndroid Build Coastguard Worker         gls::VarSpec("u_posTrans", translationMat<4>(positionFactor - 1.0f), translationMat<4>(1.0f - positionFactor)));
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numTextures; i++)
169*35238bceSAndroid Build Coastguard Worker         context.textureSpecs.push_back(gls::TextureSpec(
170*35238bceSAndroid Build Coastguard Worker             glu::TextureTestUtil::TEXTURETYPE_2D, 0, texWid, texHei, GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, true,
171*35238bceSAndroid Build Coastguard Worker             GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, Vec4(0.0f), Vec4(1.0f)));
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker     return context;
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker 
generateBufferAndTextureContext(const int numTextures,const int texWid,const int texHei) const176*35238bceSAndroid Build Coastguard Worker gls::ProgramContext ProgramLibrary::generateBufferAndTextureContext(const int numTextures, const int texWid,
177*35238bceSAndroid Build Coastguard Worker                                                                     const int texHei) const
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker     static const char *const vertexTemplate = "${VTX_HEADER}"
180*35238bceSAndroid Build Coastguard Worker                                               "${VTX_IN} highp vec3 a_position;\n"
181*35238bceSAndroid Build Coastguard Worker                                               "${VTX_TEX_COORD_INPUTS}"
182*35238bceSAndroid Build Coastguard Worker                                               "${VTX_TEX_COORD_OUTPUTS}"
183*35238bceSAndroid Build Coastguard Worker                                               "\n"
184*35238bceSAndroid Build Coastguard Worker                                               "void main (void)\n"
185*35238bceSAndroid Build Coastguard Worker                                               "{\n"
186*35238bceSAndroid Build Coastguard Worker                                               "    gl_Position = vec4(a_position, 1.0);\n"
187*35238bceSAndroid Build Coastguard Worker                                               "${VTX_TEX_COORD_WRITES}"
188*35238bceSAndroid Build Coastguard Worker                                               "}\n";
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker     static const char *const fragmentTemplate = "${FRAG_HEADER}"
191*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_TEX_COORD_INPUTS}"
192*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_SAMPLERS}"
193*35238bceSAndroid Build Coastguard Worker                                                 "\n"
194*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
195*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
196*35238bceSAndroid Build Coastguard Worker                                                 "    ${FRAG_COLOR} =${FRAG_COLOR_EXPRESSION};\n"
197*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker     map<string, string> firstLevelParams;
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     {
202*35238bceSAndroid Build Coastguard Worker         string vtxTexCoordInputs;
203*35238bceSAndroid Build Coastguard Worker         string vtxTexCoordOutputs;
204*35238bceSAndroid Build Coastguard Worker         string vtxTexCoordWrites;
205*35238bceSAndroid Build Coastguard Worker         string fragTexCoordInputs;
206*35238bceSAndroid Build Coastguard Worker         string fragSamplers;
207*35238bceSAndroid Build Coastguard Worker         string fragColorExpression;
208*35238bceSAndroid Build Coastguard Worker 
209*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numTextures; i++)
210*35238bceSAndroid Build Coastguard Worker         {
211*35238bceSAndroid Build Coastguard Worker             vtxTexCoordInputs += "${VTX_IN} mediump vec2 a_texCoord" + toString(i) + ";\n";
212*35238bceSAndroid Build Coastguard Worker             vtxTexCoordOutputs += "${VTX_OUT} mediump vec2 v_texCoord" + toString(i) + ";\n";
213*35238bceSAndroid Build Coastguard Worker             vtxTexCoordWrites += "\tv_texCoord" + toString(i) + " = " + "a_texCoord" + toString(i) + ";\n";
214*35238bceSAndroid Build Coastguard Worker             fragTexCoordInputs += "${FRAG_IN} mediump vec2 v_texCoord" + toString(i) + ";\n";
215*35238bceSAndroid Build Coastguard Worker             fragSamplers += "uniform mediump sampler2D u_sampler" + toString(i) + ";\n";
216*35238bceSAndroid Build Coastguard Worker             fragColorExpression += string() + (i > 0 ? " +" : "") + "\n\t\t${TEXTURE_2D_FUNC}(u_sampler" + toString(i) +
217*35238bceSAndroid Build Coastguard Worker                                    ", v_texCoord" + toString(i) + ")";
218*35238bceSAndroid Build Coastguard Worker         }
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker         firstLevelParams["VTX_TEX_COORD_INPUTS"]  = substitute(vtxTexCoordInputs);
221*35238bceSAndroid Build Coastguard Worker         firstLevelParams["VTX_TEX_COORD_OUTPUTS"] = substitute(vtxTexCoordOutputs);
222*35238bceSAndroid Build Coastguard Worker         firstLevelParams["VTX_TEX_COORD_WRITES"]  = vtxTexCoordWrites;
223*35238bceSAndroid Build Coastguard Worker         firstLevelParams["FRAG_TEX_COORD_INPUTS"] = substitute(fragTexCoordInputs);
224*35238bceSAndroid Build Coastguard Worker         firstLevelParams["FRAG_SAMPLERS"]         = fragSamplers;
225*35238bceSAndroid Build Coastguard Worker         firstLevelParams["FRAG_COLOR_EXPRESSION"] = substitute(fragColorExpression);
226*35238bceSAndroid Build Coastguard Worker     }
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker     gls::ProgramContext context(substitute(vertexTemplate, firstLevelParams).c_str(),
229*35238bceSAndroid Build Coastguard Worker                                 substitute(fragmentTemplate, firstLevelParams).c_str(), "a_position");
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_position", Vec3(-0.1f), Vec3(0.1f)));
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numTextures; i++)
234*35238bceSAndroid Build Coastguard Worker     {
235*35238bceSAndroid Build Coastguard Worker         context.attributes.push_back(gls::VarSpec("a_texCoord" + de::toString(i), Vec2(0.0f), Vec2(1.0f)));
236*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_sampler" + de::toString(i), i));
237*35238bceSAndroid Build Coastguard Worker         context.textureSpecs.push_back(gls::TextureSpec(
238*35238bceSAndroid Build Coastguard Worker             glu::TextureTestUtil::TEXTURETYPE_2D, i, texWid, texHei, GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, true,
239*35238bceSAndroid Build Coastguard Worker             GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, Vec4(0.0f), Vec4(1.0f / (float)numTextures)));
240*35238bceSAndroid Build Coastguard Worker     }
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker     return context;
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker 
generateFragmentPointLightContext(const int texWid,const int texHei) const245*35238bceSAndroid Build Coastguard Worker gls::ProgramContext ProgramLibrary::generateFragmentPointLightContext(const int texWid, const int texHei) const
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker     static const char *const vertexTemplate =
248*35238bceSAndroid Build Coastguard Worker         "${VTX_HEADER}"
249*35238bceSAndroid Build Coastguard Worker         "struct Material\n"
250*35238bceSAndroid Build Coastguard Worker         "{\n"
251*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    ambientColor;\n"
252*35238bceSAndroid Build Coastguard Worker         "    mediump vec4    diffuseColor;\n"
253*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    emissiveColor;\n"
254*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    specularColor;\n"
255*35238bceSAndroid Build Coastguard Worker         "    mediump float    shininess;\n"
256*35238bceSAndroid Build Coastguard Worker         "};\n"
257*35238bceSAndroid Build Coastguard Worker         "\n"
258*35238bceSAndroid Build Coastguard Worker         "struct Light\n"
259*35238bceSAndroid Build Coastguard Worker         "{\n"
260*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    color;\n"
261*35238bceSAndroid Build Coastguard Worker         "    mediump vec4    position;\n"
262*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    direction;\n"
263*35238bceSAndroid Build Coastguard Worker         "    mediump float    constantAttenuation;\n"
264*35238bceSAndroid Build Coastguard Worker         "    mediump float    linearAttenuation;\n"
265*35238bceSAndroid Build Coastguard Worker         "    mediump float    quadraticAttenuation;\n"
266*35238bceSAndroid Build Coastguard Worker         "};\n"
267*35238bceSAndroid Build Coastguard Worker         "\n"
268*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} highp vec4    a_position${NS};\n"
269*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} mediump vec3    a_normal${NS};\n"
270*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} mediump vec3    a_color${NS};\n"
271*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} mediump vec4    a_texCoord0${NS};\n"
272*35238bceSAndroid Build Coastguard Worker         "\n"
273*35238bceSAndroid Build Coastguard Worker         "uniform Material        u_material${NS};\n"
274*35238bceSAndroid Build Coastguard Worker         "uniform Light            u_light${NS}[1];\n"
275*35238bceSAndroid Build Coastguard Worker         "uniform highp mat4        u_mvpMatrix${NS};\n"
276*35238bceSAndroid Build Coastguard Worker         "uniform mediump mat4    u_modelViewMatrix${NS};\n"
277*35238bceSAndroid Build Coastguard Worker         "uniform mediump mat3    u_normalMatrix${NS};\n"
278*35238bceSAndroid Build Coastguard Worker         "uniform mediump mat4    u_texCoordMatrix0${NS};\n"
279*35238bceSAndroid Build Coastguard Worker         "\n"
280*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec4    v_baseColor${NS};\n"
281*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec2    v_texCoord0${NS};\n"
282*35238bceSAndroid Build Coastguard Worker         "\n"
283*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec3    v_eyeNormal${NS};\n"
284*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec3    v_directionToLight${NS}[1];\n"
285*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump float    v_distanceToLight${NS}[1];\n"
286*35238bceSAndroid Build Coastguard Worker         "\n"
287*35238bceSAndroid Build Coastguard Worker         "vec3 direction (vec4 from, vec4 to)\n"
288*35238bceSAndroid Build Coastguard Worker         "{\n"
289*35238bceSAndroid Build Coastguard Worker         "    return vec3(to.xyz * from.w - from.xyz * to.w);\n"
290*35238bceSAndroid Build Coastguard Worker         "}\n"
291*35238bceSAndroid Build Coastguard Worker         "\n"
292*35238bceSAndroid Build Coastguard Worker         "void main (void)\n"
293*35238bceSAndroid Build Coastguard Worker         "{\n"
294*35238bceSAndroid Build Coastguard Worker         "    gl_Position = u_mvpMatrix${NS} * a_position${NS};\n"
295*35238bceSAndroid Build Coastguard Worker         "    v_texCoord0${NS} = (u_texCoordMatrix0${NS} * a_texCoord0${NS}).xy;\n"
296*35238bceSAndroid Build Coastguard Worker         "\n"
297*35238bceSAndroid Build Coastguard Worker         "    mediump vec4 eyePosition = u_modelViewMatrix${NS} * a_position${NS};\n"
298*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 eyeNormal = normalize(u_normalMatrix${NS} * a_normal${NS});\n"
299*35238bceSAndroid Build Coastguard Worker         "\n"
300*35238bceSAndroid Build Coastguard Worker         "    vec4 color     = vec4(0.0, 0.0, 0.0, 1.0);\n"
301*35238bceSAndroid Build Coastguard Worker         "    color.rgb    += u_material${NS}.emissiveColor;\n"
302*35238bceSAndroid Build Coastguard Worker         "\n"
303*35238bceSAndroid Build Coastguard Worker         "    color.a        *= u_material${NS}.diffuseColor.a;\n"
304*35238bceSAndroid Build Coastguard Worker         "\n"
305*35238bceSAndroid Build Coastguard Worker         "    v_baseColor${NS} = color;\n"
306*35238bceSAndroid Build Coastguard Worker         "\n"
307*35238bceSAndroid Build Coastguard Worker         "    v_distanceToLight${NS}[0] = distance(eyePosition, u_light${NS}[0].position);\n"
308*35238bceSAndroid Build Coastguard Worker         "    v_directionToLight${NS}[0] = normalize(direction(eyePosition, u_light${NS}[0].position));\n"
309*35238bceSAndroid Build Coastguard Worker         "\n"
310*35238bceSAndroid Build Coastguard Worker         "    v_eyeNormal${NS} = eyeNormal;\n"
311*35238bceSAndroid Build Coastguard Worker         "}\n";
312*35238bceSAndroid Build Coastguard Worker 
313*35238bceSAndroid Build Coastguard Worker     static const char *const fragmentTemplate =
314*35238bceSAndroid Build Coastguard Worker         "${FRAG_HEADER}"
315*35238bceSAndroid Build Coastguard Worker         "struct Light\n"
316*35238bceSAndroid Build Coastguard Worker         "{\n"
317*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    color;\n"
318*35238bceSAndroid Build Coastguard Worker         "    mediump vec4    position;\n"
319*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    direction;\n"
320*35238bceSAndroid Build Coastguard Worker         "    mediump float    constantAttenuation;\n"
321*35238bceSAndroid Build Coastguard Worker         "    mediump float    linearAttenuation;\n"
322*35238bceSAndroid Build Coastguard Worker         "    mediump float    quadraticAttenuation;\n"
323*35238bceSAndroid Build Coastguard Worker         "};\n"
324*35238bceSAndroid Build Coastguard Worker         "\n"
325*35238bceSAndroid Build Coastguard Worker         "struct Material\n"
326*35238bceSAndroid Build Coastguard Worker         "{\n"
327*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    ambientColor;\n"
328*35238bceSAndroid Build Coastguard Worker         "    mediump vec4    diffuseColor;\n"
329*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    emissiveColor;\n"
330*35238bceSAndroid Build Coastguard Worker         "    mediump vec3    specularColor;\n"
331*35238bceSAndroid Build Coastguard Worker         "    mediump float    shininess;\n"
332*35238bceSAndroid Build Coastguard Worker         "};\n"
333*35238bceSAndroid Build Coastguard Worker         "\n"
334*35238bceSAndroid Build Coastguard Worker         "uniform sampler2D        u_sampler0${NS};\n"
335*35238bceSAndroid Build Coastguard Worker         "uniform Light            u_light${NS}[1];\n"
336*35238bceSAndroid Build Coastguard Worker         "uniform Material        u_material${NS};\n"
337*35238bceSAndroid Build Coastguard Worker         "\n"
338*35238bceSAndroid Build Coastguard Worker         "${FRAG_IN} mediump vec4    v_baseColor${NS};\n"
339*35238bceSAndroid Build Coastguard Worker         "${FRAG_IN} mediump vec2    v_texCoord0${NS};\n"
340*35238bceSAndroid Build Coastguard Worker         "\n"
341*35238bceSAndroid Build Coastguard Worker         "${FRAG_IN} mediump vec3    v_eyeNormal${NS};\n"
342*35238bceSAndroid Build Coastguard Worker         "${FRAG_IN} mediump vec3    v_directionToLight${NS}[1];\n"
343*35238bceSAndroid Build Coastguard Worker         "${FRAG_IN} mediump float    v_distanceToLight${NS}[1];\n"
344*35238bceSAndroid Build Coastguard Worker         "\n"
345*35238bceSAndroid Build Coastguard Worker         "mediump vec3 computeLighting (Light light, mediump vec3 directionToLight, mediump vec3 vertexEyeNormal)\n"
346*35238bceSAndroid Build Coastguard Worker         "{\n"
347*35238bceSAndroid Build Coastguard Worker         "    mediump float    normalDotDirection = max(dot(vertexEyeNormal, directionToLight), 0.0);\n"
348*35238bceSAndroid Build Coastguard Worker         "    mediump    vec3    color = normalDotDirection * u_material${NS}.diffuseColor.rgb * "
349*35238bceSAndroid Build Coastguard Worker         "light.color;\n"
350*35238bceSAndroid Build Coastguard Worker         "\n"
351*35238bceSAndroid Build Coastguard Worker         "    if (normalDotDirection != 0.0)\n"
352*35238bceSAndroid Build Coastguard Worker         "    {\n"
353*35238bceSAndroid Build Coastguard Worker         "        mediump vec3 h = normalize(directionToLight + vec3(0.0, 0.0, 1.0));\n"
354*35238bceSAndroid Build Coastguard Worker         "        color.rgb += pow(max(dot(vertexEyeNormal, h), 0.0), u_material${NS}.shininess) * "
355*35238bceSAndroid Build Coastguard Worker         "u_material${NS}.specularColor * light.color;\n"
356*35238bceSAndroid Build Coastguard Worker         "    }\n"
357*35238bceSAndroid Build Coastguard Worker         "\n"
358*35238bceSAndroid Build Coastguard Worker         "    return color;\n"
359*35238bceSAndroid Build Coastguard Worker         "}\n"
360*35238bceSAndroid Build Coastguard Worker         "\n"
361*35238bceSAndroid Build Coastguard Worker         "mediump float computePointLightAttenuation (Light light, mediump float distanceToLight)\n"
362*35238bceSAndroid Build Coastguard Worker         "{\n"
363*35238bceSAndroid Build Coastguard Worker         "    mediump float    constantAttenuation = light.constantAttenuation;\n"
364*35238bceSAndroid Build Coastguard Worker         "    mediump float    linearAttenuation = light.linearAttenuation * distanceToLight;\n"
365*35238bceSAndroid Build Coastguard Worker         "    mediump float    quadraticAttenuation = light.quadraticAttenuation * distanceToLight * distanceToLight;\n"
366*35238bceSAndroid Build Coastguard Worker         "\n"
367*35238bceSAndroid Build Coastguard Worker         "    return 1.0 / (constantAttenuation + linearAttenuation + quadraticAttenuation);\n"
368*35238bceSAndroid Build Coastguard Worker         "}\n"
369*35238bceSAndroid Build Coastguard Worker         "\n"
370*35238bceSAndroid Build Coastguard Worker         "void main (void)\n"
371*35238bceSAndroid Build Coastguard Worker         "{\n"
372*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 eyeNormal = normalize(v_eyeNormal${NS});\n"
373*35238bceSAndroid Build Coastguard Worker         "    mediump vec4 color = v_baseColor${NS};\n"
374*35238bceSAndroid Build Coastguard Worker         "\n"
375*35238bceSAndroid Build Coastguard Worker         "    color.rgb += computePointLightAttenuation(u_light${NS}[0], v_distanceToLight${NS}[0]) * "
376*35238bceSAndroid Build Coastguard Worker         "computeLighting(u_light${NS}[0], normalize(v_directionToLight${NS}[0]), eyeNormal);\n"
377*35238bceSAndroid Build Coastguard Worker         "\n"
378*35238bceSAndroid Build Coastguard Worker         "    color *= ${TEXTURE_2D_FUNC}(u_sampler0${NS}, v_texCoord0${NS});\n"
379*35238bceSAndroid Build Coastguard Worker         "\n"
380*35238bceSAndroid Build Coastguard Worker         "    ${FRAG_COLOR} = color;\n"
381*35238bceSAndroid Build Coastguard Worker         "}\n";
382*35238bceSAndroid Build Coastguard Worker 
383*35238bceSAndroid Build Coastguard Worker     gls::ProgramContext context(substitute(vertexTemplate).c_str(), substitute(fragmentTemplate).c_str(),
384*35238bceSAndroid Build Coastguard Worker                                 "a_position${NS}");
385*35238bceSAndroid Build Coastguard Worker 
386*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_position${NS}", Vec4(-1.0f), Vec4(1.0f)));
387*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_normal${NS}", Vec3(-1.0f), Vec3(1.0f)));
388*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_texCoord0${NS}", Vec4(-1.0f), Vec4(1.0f)));
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.ambientColor", Vec3(0.0f), Vec3(1.0f)));
391*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.diffuseColor", Vec4(0.0f), Vec4(1.0f)));
392*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.emissiveColor", Vec3(0.0f), Vec3(1.0f)));
393*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.specularColor", Vec3(0.0f), Vec3(1.0f)));
394*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.shininess", 0.0f, 1.0f));
395*35238bceSAndroid Build Coastguard Worker 
396*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].color", Vec3(0.0f), Vec3(1.0f)));
397*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].position", Vec4(-1.0f), Vec4(1.0f)));
398*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].direction", Vec3(-1.0f), Vec3(1.0f)));
399*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].constantAttenuation", 0.1f, 1.0f));
400*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].linearAttenuation", 0.1f, 1.0f));
401*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_light${NS}[0].quadraticAttenuation", 0.1f, 1.0f));
402*35238bceSAndroid Build Coastguard Worker 
403*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_mvpMatrix${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
404*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(
405*35238bceSAndroid Build Coastguard Worker         gls::VarSpec("u_modelViewMatrix${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
406*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_normalMatrix${NS}", translationMat<3>(-0.2f), translationMat<3>(0.2f)));
407*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(
408*35238bceSAndroid Build Coastguard Worker         gls::VarSpec("u_texCoordMatrix0${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_sampler0${NS}", 0));
411*35238bceSAndroid Build Coastguard Worker 
412*35238bceSAndroid Build Coastguard Worker     context.textureSpecs.push_back(gls::TextureSpec(glu::TextureTestUtil::TEXTURETYPE_2D, 0, texWid, texHei, GL_RGBA,
413*35238bceSAndroid Build Coastguard Worker                                                     GL_UNSIGNED_BYTE, GL_RGBA, true, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR,
414*35238bceSAndroid Build Coastguard Worker                                                     GL_REPEAT, GL_REPEAT, Vec4(0.0f), Vec4(1.0f)));
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker     return context;
417*35238bceSAndroid Build Coastguard Worker }
418*35238bceSAndroid Build Coastguard Worker 
generateVertexUniformLoopLightContext(const int texWid,const int texHei) const419*35238bceSAndroid Build Coastguard Worker gls::ProgramContext ProgramLibrary::generateVertexUniformLoopLightContext(const int texWid, const int texHei) const
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker     static const char *const vertexTemplate =
422*35238bceSAndroid Build Coastguard Worker         "${VTX_HEADER}"
423*35238bceSAndroid Build Coastguard Worker         "struct Material {\n"
424*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 ambientColor;\n"
425*35238bceSAndroid Build Coastguard Worker         "    mediump vec4 diffuseColor;\n"
426*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 emissiveColor;\n"
427*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 specularColor;\n"
428*35238bceSAndroid Build Coastguard Worker         "    mediump float shininess;\n"
429*35238bceSAndroid Build Coastguard Worker         "};\n"
430*35238bceSAndroid Build Coastguard Worker         "struct Light {\n"
431*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 color;\n"
432*35238bceSAndroid Build Coastguard Worker         "    mediump vec4 position;\n"
433*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 direction;\n"
434*35238bceSAndroid Build Coastguard Worker         "    mediump float constantAttenuation;\n"
435*35238bceSAndroid Build Coastguard Worker         "    mediump float linearAttenuation;\n"
436*35238bceSAndroid Build Coastguard Worker         "    mediump float quadraticAttenuation;\n"
437*35238bceSAndroid Build Coastguard Worker         "    mediump float spotExponent;\n"
438*35238bceSAndroid Build Coastguard Worker         "    mediump float spotCutoff;\n"
439*35238bceSAndroid Build Coastguard Worker         "};\n"
440*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} highp vec4 a_position${NS};\n"
441*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} mediump vec3 a_normal${NS};\n"
442*35238bceSAndroid Build Coastguard Worker         "${VTX_IN} mediump vec4 a_texCoord0${NS};\n"
443*35238bceSAndroid Build Coastguard Worker         "uniform Material u_material${NS};\n"
444*35238bceSAndroid Build Coastguard Worker         "uniform Light u_directionalLight${NS}[1];\n"
445*35238bceSAndroid Build Coastguard Worker         "uniform mediump int u_directionalLightCount${NS};\n"
446*35238bceSAndroid Build Coastguard Worker         "uniform Light u_spotLight${NS}[4];\n"
447*35238bceSAndroid Build Coastguard Worker         "uniform mediump int u_spotLightCount${NS};\n"
448*35238bceSAndroid Build Coastguard Worker         "uniform highp mat4 u_mvpMatrix${NS};\n"
449*35238bceSAndroid Build Coastguard Worker         "uniform highp mat4 u_modelViewMatrix${NS};\n"
450*35238bceSAndroid Build Coastguard Worker         "uniform mediump mat3 u_normalMatrix${NS};\n"
451*35238bceSAndroid Build Coastguard Worker         "uniform mediump mat4 u_texCoordMatrix0${NS};\n"
452*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec4 v_color${NS};\n"
453*35238bceSAndroid Build Coastguard Worker         "${VTX_OUT} mediump vec2 v_texCoord0${NS};\n"
454*35238bceSAndroid Build Coastguard Worker         "mediump vec3 direction (mediump vec4 from, mediump vec4 to)\n"
455*35238bceSAndroid Build Coastguard Worker         "{\n"
456*35238bceSAndroid Build Coastguard Worker         "    return vec3(to.xyz * from.w - from.xyz * to.w);\n"
457*35238bceSAndroid Build Coastguard Worker         "}\n"
458*35238bceSAndroid Build Coastguard Worker         "\n"
459*35238bceSAndroid Build Coastguard Worker         "mediump vec3 computeLighting (\n"
460*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 directionToLight,\n"
461*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 halfVector,\n"
462*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 normal,\n"
463*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 lightColor,\n"
464*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 diffuseColor,\n"
465*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 specularColor,\n"
466*35238bceSAndroid Build Coastguard Worker         "    mediump float shininess)\n"
467*35238bceSAndroid Build Coastguard Worker         "{\n"
468*35238bceSAndroid Build Coastguard Worker         "    mediump float normalDotDirection  = max(dot(normal, directionToLight), 0.0);\n"
469*35238bceSAndroid Build Coastguard Worker         "    mediump vec3  color               = normalDotDirection * diffuseColor * lightColor;\n"
470*35238bceSAndroid Build Coastguard Worker         "\n"
471*35238bceSAndroid Build Coastguard Worker         "    if (normalDotDirection != 0.0)\n"
472*35238bceSAndroid Build Coastguard Worker         "        color += pow(max(dot(normal, halfVector), 0.0), shininess) * specularColor * lightColor;\n"
473*35238bceSAndroid Build Coastguard Worker         "\n"
474*35238bceSAndroid Build Coastguard Worker         "    return color;\n"
475*35238bceSAndroid Build Coastguard Worker         "}\n"
476*35238bceSAndroid Build Coastguard Worker         "\n"
477*35238bceSAndroid Build Coastguard Worker         "mediump float computeDistanceAttenuation (mediump float distToLight, mediump float constAtt, mediump float "
478*35238bceSAndroid Build Coastguard Worker         "linearAtt, mediump float quadraticAtt)\n"
479*35238bceSAndroid Build Coastguard Worker         "{\n"
480*35238bceSAndroid Build Coastguard Worker         "    return 1.0 / (constAtt + linearAtt * distToLight + quadraticAtt * distToLight * distToLight);\n"
481*35238bceSAndroid Build Coastguard Worker         "}\n"
482*35238bceSAndroid Build Coastguard Worker         "\n"
483*35238bceSAndroid Build Coastguard Worker         "mediump float computeSpotAttenuation (\n"
484*35238bceSAndroid Build Coastguard Worker         "    mediump vec3  directionToLight,\n"
485*35238bceSAndroid Build Coastguard Worker         "    mediump vec3  lightDir,\n"
486*35238bceSAndroid Build Coastguard Worker         "    mediump float spotExponent,\n"
487*35238bceSAndroid Build Coastguard Worker         "    mediump float spotCutoff)\n"
488*35238bceSAndroid Build Coastguard Worker         "{\n"
489*35238bceSAndroid Build Coastguard Worker         "    mediump float spotEffect = dot(lightDir, normalize(-directionToLight));\n"
490*35238bceSAndroid Build Coastguard Worker         "\n"
491*35238bceSAndroid Build Coastguard Worker         "    if (spotEffect < spotCutoff)\n"
492*35238bceSAndroid Build Coastguard Worker         "        spotEffect = 0.0;\n"
493*35238bceSAndroid Build Coastguard Worker         "\n"
494*35238bceSAndroid Build Coastguard Worker         "    spotEffect = pow(spotEffect, spotExponent);\n"
495*35238bceSAndroid Build Coastguard Worker         "    return spotEffect;\n"
496*35238bceSAndroid Build Coastguard Worker         "}\n"
497*35238bceSAndroid Build Coastguard Worker         "\n"
498*35238bceSAndroid Build Coastguard Worker         "void main (void)\n"
499*35238bceSAndroid Build Coastguard Worker         "{\n"
500*35238bceSAndroid Build Coastguard Worker         "    highp vec4 position = a_position${NS};\n"
501*35238bceSAndroid Build Coastguard Worker         "    highp vec3 normal = a_normal${NS};\n"
502*35238bceSAndroid Build Coastguard Worker         "    gl_Position = u_mvpMatrix${NS} * position;\n"
503*35238bceSAndroid Build Coastguard Worker         "    v_texCoord0${NS} = (u_texCoordMatrix0${NS} * a_texCoord0${NS}).xy;\n"
504*35238bceSAndroid Build Coastguard Worker         "    mediump vec4 color = vec4(u_material${NS}.emissiveColor, u_material${NS}.diffuseColor.a);\n"
505*35238bceSAndroid Build Coastguard Worker         "\n"
506*35238bceSAndroid Build Coastguard Worker         "    highp vec4 eyePosition = u_modelViewMatrix${NS} * position;\n"
507*35238bceSAndroid Build Coastguard Worker         "    mediump vec3 eyeNormal = normalize(u_normalMatrix${NS} * normal);\n"
508*35238bceSAndroid Build Coastguard Worker         "    for (int i = 0; i < u_directionalLightCount${NS}; i++)\n"
509*35238bceSAndroid Build Coastguard Worker         "    {\n"
510*35238bceSAndroid Build Coastguard Worker         "        mediump vec3 directionToLight = -u_directionalLight${NS}[i].direction;\n"
511*35238bceSAndroid Build Coastguard Worker         "        mediump vec3 halfVector = normalize(directionToLight + vec3(0.0, 0.0, 1.0));\n"
512*35238bceSAndroid Build Coastguard Worker         "        color.rgb += computeLighting(directionToLight, halfVector, eyeNormal, "
513*35238bceSAndroid Build Coastguard Worker         "u_directionalLight${NS}[i].color, u_material${NS}.diffuseColor.rgb, u_material${NS}.specularColor, "
514*35238bceSAndroid Build Coastguard Worker         "u_material${NS}.shininess);\n"
515*35238bceSAndroid Build Coastguard Worker         "    }\n"
516*35238bceSAndroid Build Coastguard Worker         "\n"
517*35238bceSAndroid Build Coastguard Worker         "    for (int i = 0; i < u_spotLightCount${NS}; i++)\n"
518*35238bceSAndroid Build Coastguard Worker         "    {\n"
519*35238bceSAndroid Build Coastguard Worker         "        mediump float distanceToLight = distance(eyePosition, u_spotLight${NS}[i].position);\n"
520*35238bceSAndroid Build Coastguard Worker         "        mediump vec3 directionToLight = normalize(direction(eyePosition, u_spotLight${NS}[i].position));\n"
521*35238bceSAndroid Build Coastguard Worker         "        mediump vec3 halfVector = normalize(directionToLight + vec3(0.0, 0.0, 1.0));\n"
522*35238bceSAndroid Build Coastguard Worker         "        color.rgb += computeLighting(directionToLight, halfVector, eyeNormal, u_spotLight${NS}[i].color, "
523*35238bceSAndroid Build Coastguard Worker         "u_material${NS}.diffuseColor.rgb, u_material${NS}.specularColor, u_material${NS}.shininess) * "
524*35238bceSAndroid Build Coastguard Worker         "computeDistanceAttenuation(distanceToLight, u_spotLight${NS}[i].constantAttenuation, "
525*35238bceSAndroid Build Coastguard Worker         "u_spotLight${NS}[i].linearAttenuation, u_spotLight${NS}[i].quadraticAttenuation) * "
526*35238bceSAndroid Build Coastguard Worker         "computeSpotAttenuation(directionToLight, u_spotLight${NS}[i].direction, u_spotLight${NS}[i].spotExponent, "
527*35238bceSAndroid Build Coastguard Worker         "u_spotLight${NS}[i].spotCutoff);\n"
528*35238bceSAndroid Build Coastguard Worker         "    }\n"
529*35238bceSAndroid Build Coastguard Worker         "\n"
530*35238bceSAndroid Build Coastguard Worker         "\n"
531*35238bceSAndroid Build Coastguard Worker         "    v_color${NS} = color;\n"
532*35238bceSAndroid Build Coastguard Worker         "}\n";
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker     static const char *const fragmentTemplate = "${FRAG_HEADER}"
535*35238bceSAndroid Build Coastguard Worker                                                 "uniform sampler2D u_sampler0${NS};\n"
536*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_IN} mediump vec4 v_color${NS};\n"
537*35238bceSAndroid Build Coastguard Worker                                                 "${FRAG_IN} mediump vec2 v_texCoord0${NS};\n"
538*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
539*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
540*35238bceSAndroid Build Coastguard Worker                                                 "    mediump vec2 texCoord0 = v_texCoord0${NS};\n"
541*35238bceSAndroid Build Coastguard Worker                                                 "    mediump vec4 color = v_color${NS};\n"
542*35238bceSAndroid Build Coastguard Worker                                                 "    color *= ${TEXTURE_2D_FUNC}(u_sampler0${NS}, texCoord0);\n"
543*35238bceSAndroid Build Coastguard Worker                                                 "    ${FRAG_COLOR} = color;\n"
544*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
545*35238bceSAndroid Build Coastguard Worker 
546*35238bceSAndroid Build Coastguard Worker     gls::ProgramContext context(substitute(vertexTemplate).c_str(), substitute(fragmentTemplate).c_str(),
547*35238bceSAndroid Build Coastguard Worker                                 "a_position${NS}");
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_position${NS}", Vec4(-1.0f), Vec4(1.0f)));
550*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_normal${NS}", Vec3(-1.0f), Vec3(1.0f)));
551*35238bceSAndroid Build Coastguard Worker     context.attributes.push_back(gls::VarSpec("a_texCoord0${NS}", Vec4(-1.0f), Vec4(1.0f)));
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.ambientColor", Vec3(0.0f), Vec3(1.0f)));
554*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.diffuseColor", Vec4(0.0f), Vec4(1.0f)));
555*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.emissiveColor", Vec3(0.0f), Vec3(1.0f)));
556*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.specularColor", Vec3(0.0f), Vec3(1.0f)));
557*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_material${NS}.shininess", 0.0f, 1.0f));
558*35238bceSAndroid Build Coastguard Worker 
559*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].color", Vec3(0.0f), Vec3(1.0f)));
560*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].position", Vec4(-1.0f), Vec4(1.0f)));
561*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].direction", Vec3(-1.0f), Vec3(1.0f)));
562*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].constantAttenuation", 0.1f, 1.0f));
563*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].linearAttenuation", 0.1f, 1.0f));
564*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].quadraticAttenuation", 0.1f, 1.0f));
565*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].spotExponent", 0.1f, 1.0f));
566*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLight${NS}[0].spotCutoff", 0.1f, 1.0f));
567*35238bceSAndroid Build Coastguard Worker 
568*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_directionalLightCount${NS}", 1));
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < 4; i++)
571*35238bceSAndroid Build Coastguard Worker     {
572*35238bceSAndroid Build Coastguard Worker         const std::string ndxStr = de::toString(i);
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].color", Vec3(0.0f), Vec3(1.0f)));
575*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].position", Vec4(-1.0f), Vec4(1.0f)));
576*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].direction", Vec3(-1.0f), Vec3(1.0f)));
577*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].constantAttenuation", 0.1f, 1.0f));
578*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].linearAttenuation", 0.1f, 1.0f));
579*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].quadraticAttenuation", 0.1f, 1.0f));
580*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].spotExponent", 0.1f, 1.0f));
581*35238bceSAndroid Build Coastguard Worker         context.uniforms.push_back(gls::VarSpec("u_spotLight${NS}[" + ndxStr + "].spotCutoff", 0.1f, 1.0f));
582*35238bceSAndroid Build Coastguard Worker     }
583*35238bceSAndroid Build Coastguard Worker 
584*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_spotLightCount${NS}", 4));
585*35238bceSAndroid Build Coastguard Worker 
586*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_mvpMatrix${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
587*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(
588*35238bceSAndroid Build Coastguard Worker         gls::VarSpec("u_modelViewMatrix${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
589*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_normalMatrix${NS}", translationMat<3>(-0.2f), translationMat<3>(0.2f)));
590*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(
591*35238bceSAndroid Build Coastguard Worker         gls::VarSpec("u_texCoordMatrix0${NS}", translationMat<4>(-0.2f), translationMat<4>(0.2f)));
592*35238bceSAndroid Build Coastguard Worker 
593*35238bceSAndroid Build Coastguard Worker     context.uniforms.push_back(gls::VarSpec("u_sampler0${NS}", 0));
594*35238bceSAndroid Build Coastguard Worker 
595*35238bceSAndroid Build Coastguard Worker     context.textureSpecs.push_back(gls::TextureSpec(glu::TextureTestUtil::TEXTURETYPE_2D, 0, texWid, texHei, GL_RGBA,
596*35238bceSAndroid Build Coastguard Worker                                                     GL_UNSIGNED_BYTE, GL_RGBA, true, GL_LINEAR, GL_LINEAR, GL_REPEAT,
597*35238bceSAndroid Build Coastguard Worker                                                     GL_REPEAT, Vec4(0.0f), Vec4(1.0f)));
598*35238bceSAndroid Build Coastguard Worker 
599*35238bceSAndroid Build Coastguard Worker     return context;
600*35238bceSAndroid Build Coastguard Worker }
601*35238bceSAndroid Build Coastguard Worker 
602*35238bceSAndroid Build Coastguard Worker } // namespace LongStressTestUtil
603*35238bceSAndroid Build Coastguard Worker } // namespace gls
604*35238bceSAndroid Build Coastguard Worker } // namespace deqp
605