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