xref: /aosp_15_r20/external/angle/src/libANGLE/GLES1Shaders.inc (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker//
2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2018 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker//
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker// GLES1Shaders.inc: Defines GLES1 emulation shader.
8*8975f5c5SAndroid Build Coastguard Worker//
9*8975f5c5SAndroid Build Coastguard Worker// According to the GLES1 specification:
10*8975f5c5SAndroid Build Coastguard Worker//
11*8975f5c5SAndroid Build Coastguard Worker// We require simply that numbers' floating point parts contain enough bits and that their exponent
12*8975f5c5SAndroid Build Coastguard Worker// fields are large enough so that individual results of floating-point operations are accurate to
13*8975f5c5SAndroid Build Coastguard Worker// about 1 part in 10^5.  The maximum representable magnitude of a floating-point number used to
14*8975f5c5SAndroid Build Coastguard Worker// represent positional or normal coordinates must be at least 2^32; the maximum representable
15*8975f5c5SAndroid Build Coastguard Worker// magnitude for colors or texture coordinates must be at least 2^10.  The maximum representable
16*8975f5c5SAndroid Build Coastguard Worker// magnitude for all other floating-point values must be at least 2^32 .
17*8975f5c5SAndroid Build Coastguard Worker//
18*8975f5c5SAndroid Build Coastguard Worker// Internal computations can use either fixed-point or floating-point arithmetic.  Fixed-point
19*8975f5c5SAndroid Build Coastguard Worker// computations must be accurate to within ±2^-15.  The maximum representable magnitude for a
20*8975f5c5SAndroid Build Coastguard Worker// fixed-point number used to represent positional or normal coordinates must be at least 2^15; the
21*8975f5c5SAndroid Build Coastguard Worker// maximum representable magnitude for colors or texture coordinates must be at least 2^10.  The
22*8975f5c5SAndroid Build Coastguard Worker// maximum representable magnitude for all other fixed-point values must be at least 2^15
23*8975f5c5SAndroid Build Coastguard Worker//
24*8975f5c5SAndroid Build Coastguard Worker// Accordingly, ANGLE uses highp floats for position and normal data, mediump for color and texture
25*8975f5c5SAndroid Build Coastguard Worker// coordinates, and highp for everything else.
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker// The following variables are added in GLES1Renderer::initializeRendererProgram
28*8975f5c5SAndroid Build Coastguard Worker// #define kTexUnits
29*8975f5c5SAndroid Build Coastguard Worker// bool clip_plane_enables
30*8975f5c5SAndroid Build Coastguard Worker// bool enable_alpha_test
31*8975f5c5SAndroid Build Coastguard Worker// bool enable_clip_planes
32*8975f5c5SAndroid Build Coastguard Worker// bool enable_color_material
33*8975f5c5SAndroid Build Coastguard Worker// bool enable_draw_texture
34*8975f5c5SAndroid Build Coastguard Worker// bool enable_fog
35*8975f5c5SAndroid Build Coastguard Worker// bool enable_lighting
36*8975f5c5SAndroid Build Coastguard Worker// bool enable_normalize
37*8975f5c5SAndroid Build Coastguard Worker// bool enable_rescale_normal
38*8975f5c5SAndroid Build Coastguard Worker// bool enable_texture_2d[kMaxTexUnits]
39*8975f5c5SAndroid Build Coastguard Worker// bool enable_texture_cube_map[kMaxTexUnits]
40*8975f5c5SAndroid Build Coastguard Worker// bool light_enables[kMaxLights]
41*8975f5c5SAndroid Build Coastguard Worker// bool light_model_two_sided
42*8975f5c5SAndroid Build Coastguard Worker// bool point_rasterization
43*8975f5c5SAndroid Build Coastguard Worker// bool point_sprite_coord_replace
44*8975f5c5SAndroid Build Coastguard Worker// bool point_sprite_enabled
45*8975f5c5SAndroid Build Coastguard Worker// bool shade_model_flat
46*8975f5c5SAndroid Build Coastguard Worker// uint texture_format[kMaxTexUnits];
47*8975f5c5SAndroid Build Coastguard Worker// uint texture_env_mode[kMaxTexUnits];
48*8975f5c5SAndroid Build Coastguard Worker// uint combine_rgb[kMaxTexUnits];
49*8975f5c5SAndroid Build Coastguard Worker// uint combine_alpha[kMaxTexUnits];
50*8975f5c5SAndroid Build Coastguard Worker// uint src0_rgb[kMaxTexUnits];
51*8975f5c5SAndroid Build Coastguard Worker// uint src0_alpha[kMaxTexUnits];
52*8975f5c5SAndroid Build Coastguard Worker// uint src1_rgb[kMaxTexUnits];
53*8975f5c5SAndroid Build Coastguard Worker// uint src1_alpha[kMaxTexUnits];
54*8975f5c5SAndroid Build Coastguard Worker// uint src2_rgb[kMaxTexUnits];
55*8975f5c5SAndroid Build Coastguard Worker// uint src2_alpha[kMaxTexUnits];
56*8975f5c5SAndroid Build Coastguard Worker// uint op0_rgb[kMaxTexUnits];
57*8975f5c5SAndroid Build Coastguard Worker// uint op0_alpha[kMaxTexUnits];
58*8975f5c5SAndroid Build Coastguard Worker// uint op1_rgb[kMaxTexUnits];
59*8975f5c5SAndroid Build Coastguard Worker// uint op1_alpha[kMaxTexUnits];
60*8975f5c5SAndroid Build Coastguard Worker// uint op2_rgb[kMaxTexUnits];
61*8975f5c5SAndroid Build Coastguard Worker// uint op2_alpha[kMaxTexUnits];
62*8975f5c5SAndroid Build Coastguard Worker// uint alpha_func;
63*8975f5c5SAndroid Build Coastguard Worker// uint fog_mode;
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1TexUnitsDefine[] = R"(#define kTexUnits )";
66*8975f5c5SAndroid Build Coastguard Worker
67*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawVShaderHeader[] = R"(#version 300 es
68*8975f5c5SAndroid Build Coastguard Workerprecision highp float;
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker#define kMaxTexUnits 4u
71*8975f5c5SAndroid Build Coastguard Worker#define kMaxLights   8u
72*8975f5c5SAndroid Build Coastguard Worker)";
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawVShader[] = R"(
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Workerin vec4 pos;
77*8975f5c5SAndroid Build Coastguard Workerin vec3 normal;
78*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 color;
79*8975f5c5SAndroid Build Coastguard Workerin float pointsize;
80*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
81*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 texcoord0;
82*8975f5c5SAndroid Build Coastguard Worker#endif
83*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
84*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 texcoord1;
85*8975f5c5SAndroid Build Coastguard Worker#endif
86*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
87*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 texcoord2;
88*8975f5c5SAndroid Build Coastguard Worker#endif
89*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
90*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 texcoord3;
91*8975f5c5SAndroid Build Coastguard Worker#endif
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Workeruniform mat4 projection;
94*8975f5c5SAndroid Build Coastguard Workeruniform mat4 modelview;
95*8975f5c5SAndroid Build Coastguard Workeruniform mat4 modelview_invtr;
96*8975f5c5SAndroid Build Coastguard Workeruniform mat4 texture_matrix[kMaxTexUnits];
97*8975f5c5SAndroid Build Coastguard Worker
98*8975f5c5SAndroid Build Coastguard Worker// Point rasterization//////////////////////////////////////////////////////////
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Workeruniform float point_size_min;
101*8975f5c5SAndroid Build Coastguard Workeruniform float point_size_max;
102*8975f5c5SAndroid Build Coastguard Workeruniform vec3 point_distance_attenuation;
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker// Shading: flat shading, lighting, and materials///////////////////////////////
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 material_ambient;
107*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 material_diffuse;
108*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 material_specular;
109*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 material_emissive;
110*8975f5c5SAndroid Build Coastguard Workeruniform float material_specular_exponent;
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 light_model_scene_ambient;
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 light_ambients[kMaxLights];
115*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 light_diffuses[kMaxLights];
116*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 light_speculars[kMaxLights];
117*8975f5c5SAndroid Build Coastguard Workeruniform vec4 light_positions[kMaxLights];
118*8975f5c5SAndroid Build Coastguard Workeruniform vec3 light_directions[kMaxLights];
119*8975f5c5SAndroid Build Coastguard Workeruniform float light_spotlight_exponents[kMaxLights];
120*8975f5c5SAndroid Build Coastguard Workeruniform float light_spotlight_cutoff_angles[kMaxLights];
121*8975f5c5SAndroid Build Coastguard Workeruniform float light_attenuation_consts[kMaxLights];
122*8975f5c5SAndroid Build Coastguard Workeruniform float light_attenuation_linears[kMaxLights];
123*8975f5c5SAndroid Build Coastguard Workeruniform float light_attenuation_quadratics[kMaxLights];
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker// GL_OES_draw_texture uniforms/////////////////////////////////////////////////
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Workeruniform vec4 draw_texture_coords;
128*8975f5c5SAndroid Build Coastguard Workeruniform vec2 draw_texture_dims;
129*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 draw_texture_normalized_crop_rect[kMaxTexUnits];
130*8975f5c5SAndroid Build Coastguard Worker
131*8975f5c5SAndroid Build Coastguard Worker// Varyings/////////////////////////////////////////////////////////////////////
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Workerout vec4 pos_varying;
134*8975f5c5SAndroid Build Coastguard Workerout vec3 normal_varying;
135*8975f5c5SAndroid Build Coastguard Workerout mediump vec4 color_varying;
136*8975f5c5SAndroid Build Coastguard Workerflat out mediump vec4 color_varying_flat;
137*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
138*8975f5c5SAndroid Build Coastguard Workerout mediump vec3 texcoord0_varying;
139*8975f5c5SAndroid Build Coastguard Worker#endif
140*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
141*8975f5c5SAndroid Build Coastguard Workerout mediump vec3 texcoord1_varying;
142*8975f5c5SAndroid Build Coastguard Worker#endif
143*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
144*8975f5c5SAndroid Build Coastguard Workerout mediump vec3 texcoord2_varying;
145*8975f5c5SAndroid Build Coastguard Worker#endif
146*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
147*8975f5c5SAndroid Build Coastguard Workerout mediump vec3 texcoord3_varying;
148*8975f5c5SAndroid Build Coastguard Worker#endif
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Workerfloat posDot(vec3 a, vec3 b)
151*8975f5c5SAndroid Build Coastguard Worker{
152*8975f5c5SAndroid Build Coastguard Worker    return max(dot(a, b), 0.0);
153*8975f5c5SAndroid Build Coastguard Worker}
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Workermediump vec4 doLighting(mediump vec4 vertexColor)
156*8975f5c5SAndroid Build Coastguard Worker{
157*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 materialAmbientActual = material_ambient;
158*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 materialDiffuseActual = material_diffuse;
159*8975f5c5SAndroid Build Coastguard Worker
160*8975f5c5SAndroid Build Coastguard Worker    if (enable_color_material)
161*8975f5c5SAndroid Build Coastguard Worker    {
162*8975f5c5SAndroid Build Coastguard Worker        materialAmbientActual = vertexColor;
163*8975f5c5SAndroid Build Coastguard Worker        materialDiffuseActual = vertexColor;
164*8975f5c5SAndroid Build Coastguard Worker    }
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 lightingResult = material_emissive + materialAmbientActual * light_model_scene_ambient;
167*8975f5c5SAndroid Build Coastguard Worker
168*8975f5c5SAndroid Build Coastguard Worker    for (uint i = 0u; i < kMaxLights; i++)
169*8975f5c5SAndroid Build Coastguard Worker    {
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker        if (!light_enables[i])
172*8975f5c5SAndroid Build Coastguard Worker            continue;
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 lightAmbient  = light_ambients[i];
175*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 lightDiffuse  = light_diffuses[i];
176*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 lightSpecular = light_speculars[i];
177*8975f5c5SAndroid Build Coastguard Worker        vec4 lightPos      = light_positions[i];
178*8975f5c5SAndroid Build Coastguard Worker        vec3 lightDir      = light_directions[i];
179*8975f5c5SAndroid Build Coastguard Worker        float attConst     = light_attenuation_consts[i];
180*8975f5c5SAndroid Build Coastguard Worker        float attLinear    = light_attenuation_linears[i];
181*8975f5c5SAndroid Build Coastguard Worker        float attQuadratic = light_attenuation_quadratics[i];
182*8975f5c5SAndroid Build Coastguard Worker        float spotAngle    = light_spotlight_cutoff_angles[i];
183*8975f5c5SAndroid Build Coastguard Worker        float spotExponent = light_spotlight_exponents[i];
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker        vec3 toLight;
186*8975f5c5SAndroid Build Coastguard Worker        if (lightPos.w == 0.0)
187*8975f5c5SAndroid Build Coastguard Worker        {
188*8975f5c5SAndroid Build Coastguard Worker            toLight = lightPos.xyz;
189*8975f5c5SAndroid Build Coastguard Worker        }
190*8975f5c5SAndroid Build Coastguard Worker        else
191*8975f5c5SAndroid Build Coastguard Worker        {
192*8975f5c5SAndroid Build Coastguard Worker            toLight = (lightPos.xyz / lightPos.w - pos_varying.xyz);
193*8975f5c5SAndroid Build Coastguard Worker        }
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker        float lightDist = length(toLight);
196*8975f5c5SAndroid Build Coastguard Worker        vec3 toLightNormalized = normalize(toLight);
197*8975f5c5SAndroid Build Coastguard Worker        vec3 h                 = toLightNormalized + vec3(0.0, 0.0, 1.0);
198*8975f5c5SAndroid Build Coastguard Worker        float ndotL            = posDot(normal_varying, toLightNormalized);
199*8975f5c5SAndroid Build Coastguard Worker        float ndoth            = posDot(normal_varying, normalize(h));
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard Worker        float specAtt;
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker        if (ndotL != 0.0)
204*8975f5c5SAndroid Build Coastguard Worker        {
205*8975f5c5SAndroid Build Coastguard Worker            specAtt = 1.0;
206*8975f5c5SAndroid Build Coastguard Worker        }
207*8975f5c5SAndroid Build Coastguard Worker        else
208*8975f5c5SAndroid Build Coastguard Worker        {
209*8975f5c5SAndroid Build Coastguard Worker            specAtt = 0.0;
210*8975f5c5SAndroid Build Coastguard Worker        }
211*8975f5c5SAndroid Build Coastguard Worker
212*8975f5c5SAndroid Build Coastguard Worker        float att;
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker        if (lightPos.w != 0.0)
215*8975f5c5SAndroid Build Coastguard Worker        {
216*8975f5c5SAndroid Build Coastguard Worker            float attDenom =
217*8975f5c5SAndroid Build Coastguard Worker                (attConst + attLinear * lightDist + attQuadratic * lightDist * lightDist);
218*8975f5c5SAndroid Build Coastguard Worker            att = 1.0 / attDenom;
219*8975f5c5SAndroid Build Coastguard Worker        }
220*8975f5c5SAndroid Build Coastguard Worker        else
221*8975f5c5SAndroid Build Coastguard Worker        {
222*8975f5c5SAndroid Build Coastguard Worker            att = 1.0;
223*8975f5c5SAndroid Build Coastguard Worker        }
224*8975f5c5SAndroid Build Coastguard Worker
225*8975f5c5SAndroid Build Coastguard Worker        mediump float spot;
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker        mediump float spotAngleCos = cos(radians(spotAngle));
228*8975f5c5SAndroid Build Coastguard Worker        vec3 toSurfaceDir  = -toLightNormalized;
229*8975f5c5SAndroid Build Coastguard Worker        mediump float spotDot      = posDot(toSurfaceDir, normalize(lightDir));
230*8975f5c5SAndroid Build Coastguard Worker
231*8975f5c5SAndroid Build Coastguard Worker        if (spotAngle == 180.0 || lightPos.w == 0.0)
232*8975f5c5SAndroid Build Coastguard Worker        {
233*8975f5c5SAndroid Build Coastguard Worker            spot = 1.0;
234*8975f5c5SAndroid Build Coastguard Worker        }
235*8975f5c5SAndroid Build Coastguard Worker        else
236*8975f5c5SAndroid Build Coastguard Worker        {
237*8975f5c5SAndroid Build Coastguard Worker            if (spotDot < spotAngleCos)
238*8975f5c5SAndroid Build Coastguard Worker            {
239*8975f5c5SAndroid Build Coastguard Worker                spot = 0.0;
240*8975f5c5SAndroid Build Coastguard Worker            }
241*8975f5c5SAndroid Build Coastguard Worker            else
242*8975f5c5SAndroid Build Coastguard Worker            {
243*8975f5c5SAndroid Build Coastguard Worker                spot = pow(spotDot, spotExponent);
244*8975f5c5SAndroid Build Coastguard Worker            }
245*8975f5c5SAndroid Build Coastguard Worker        }
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 contrib = materialAmbientActual * lightAmbient;
248*8975f5c5SAndroid Build Coastguard Worker        contrib += ndotL * materialDiffuseActual * lightDiffuse;
249*8975f5c5SAndroid Build Coastguard Worker        if (ndoth > 0.0 && material_specular_exponent > 0.0)
250*8975f5c5SAndroid Build Coastguard Worker        {
251*8975f5c5SAndroid Build Coastguard Worker            contrib += specAtt * pow(ndoth, material_specular_exponent) * material_specular *
252*8975f5c5SAndroid Build Coastguard Worker                       lightSpecular;
253*8975f5c5SAndroid Build Coastguard Worker        }
254*8975f5c5SAndroid Build Coastguard Worker        else
255*8975f5c5SAndroid Build Coastguard Worker        {
256*8975f5c5SAndroid Build Coastguard Worker            if (ndoth > 0.0)
257*8975f5c5SAndroid Build Coastguard Worker            {
258*8975f5c5SAndroid Build Coastguard Worker                contrib += specAtt * material_specular * lightSpecular;
259*8975f5c5SAndroid Build Coastguard Worker            }
260*8975f5c5SAndroid Build Coastguard Worker        }
261*8975f5c5SAndroid Build Coastguard Worker        contrib *= att * spot;
262*8975f5c5SAndroid Build Coastguard Worker        lightingResult += contrib;
263*8975f5c5SAndroid Build Coastguard Worker    }
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker    return lightingResult;
266*8975f5c5SAndroid Build Coastguard Worker}
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Workerconst mediump vec4 drawTextureVertices[6] = vec4[](
269*8975f5c5SAndroid Build Coastguard Worker    vec4(0.0, 0.0, 0.0, 1.0),
270*8975f5c5SAndroid Build Coastguard Worker    vec4(1.0, 0.0, 0.0, 1.0),
271*8975f5c5SAndroid Build Coastguard Worker    vec4(1.0, 1.0, 0.0, 1.0),
272*8975f5c5SAndroid Build Coastguard Worker    vec4(0.0, 0.0, 0.0, 1.0),
273*8975f5c5SAndroid Build Coastguard Worker    vec4(1.0, 1.0, 0.0, 1.0),
274*8975f5c5SAndroid Build Coastguard Worker    vec4(0.0, 1.0, 0.0, 1.0));
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Workermediump vec4 drawTexturePosition(int vertexId)
277*8975f5c5SAndroid Build Coastguard Worker{
278*8975f5c5SAndroid Build Coastguard Worker    // The texture is drawn in the XY plane, so Z is constant.
279*8975f5c5SAndroid Build Coastguard Worker    vec2 positionXY = draw_texture_coords.xy + drawTextureVertices[vertexId].xy * draw_texture_dims;
280*8975f5c5SAndroid Build Coastguard Worker    return vec4(positionXY, draw_texture_coords.z, 1.0);
281*8975f5c5SAndroid Build Coastguard Worker}
282*8975f5c5SAndroid Build Coastguard Worker
283*8975f5c5SAndroid Build Coastguard Workermediump vec3 drawTextureTexCoord(int vertexId, uint textureUnit)
284*8975f5c5SAndroid Build Coastguard Worker{
285*8975f5c5SAndroid Build Coastguard Worker    // The texture is drawn in the XY plane, so Z is 0.
286*8975f5c5SAndroid Build Coastguard Worker    mediump vec2 texCropPos = draw_texture_normalized_crop_rect[textureUnit].xy;
287*8975f5c5SAndroid Build Coastguard Worker    mediump vec2 texCropDim = draw_texture_normalized_crop_rect[textureUnit].zw;
288*8975f5c5SAndroid Build Coastguard Worker    mediump vec2 texCoords  = texCropPos + drawTextureVertices[vertexId].xy * texCropDim;
289*8975f5c5SAndroid Build Coastguard Worker
290*8975f5c5SAndroid Build Coastguard Worker    return vec3(texCoords, 0.0);
291*8975f5c5SAndroid Build Coastguard Worker}
292*8975f5c5SAndroid Build Coastguard Worker
293*8975f5c5SAndroid Build Coastguard Workervec4 calcWorldPosition(vec4 posInput)
294*8975f5c5SAndroid Build Coastguard Worker{
295*8975f5c5SAndroid Build Coastguard Worker    return modelview * posInput;
296*8975f5c5SAndroid Build Coastguard Worker}
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Workervec4 calcNdcFromWorldPosition(vec4 worldPos)
299*8975f5c5SAndroid Build Coastguard Worker{
300*8975f5c5SAndroid Build Coastguard Worker    return projection * worldPos;
301*8975f5c5SAndroid Build Coastguard Worker}
302*8975f5c5SAndroid Build Coastguard Worker
303*8975f5c5SAndroid Build Coastguard Workerfloat calcPointSize(vec4 ndcPos)
304*8975f5c5SAndroid Build Coastguard Worker{
305*8975f5c5SAndroid Build Coastguard Worker    float dist         = length(ndcPos.z);
306*8975f5c5SAndroid Build Coastguard Worker    float attConst     = point_distance_attenuation[0];
307*8975f5c5SAndroid Build Coastguard Worker    float attLinear    = point_distance_attenuation[1];
308*8975f5c5SAndroid Build Coastguard Worker    float attQuad      = point_distance_attenuation[2];
309*8975f5c5SAndroid Build Coastguard Worker    float attPart      = attConst + attLinear * dist + attQuad * dist * dist;
310*8975f5c5SAndroid Build Coastguard Worker    float attPointSize = pointsize / pow(attPart, 0.5);
311*8975f5c5SAndroid Build Coastguard Worker
312*8975f5c5SAndroid Build Coastguard Worker    return clamp(attPointSize, point_size_min, point_size_max);
313*8975f5c5SAndroid Build Coastguard Worker}
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Workervec3 calcNormal(vec3 normalInput)
316*8975f5c5SAndroid Build Coastguard Worker{
317*8975f5c5SAndroid Build Coastguard Worker    mat3 mvInvTr3 = mat3(modelview_invtr);
318*8975f5c5SAndroid Build Coastguard Worker    vec3 result   = mvInvTr3 * normalInput;
319*8975f5c5SAndroid Build Coastguard Worker
320*8975f5c5SAndroid Build Coastguard Worker    if (enable_rescale_normal)
321*8975f5c5SAndroid Build Coastguard Worker    {
322*8975f5c5SAndroid Build Coastguard Worker        float rescale   = 1.0;
323*8975f5c5SAndroid Build Coastguard Worker        vec3 rescaleVec = vec3(mvInvTr3[2]);
324*8975f5c5SAndroid Build Coastguard Worker        float len       = length(rescaleVec);
325*8975f5c5SAndroid Build Coastguard Worker        if (len > 0.0)
326*8975f5c5SAndroid Build Coastguard Worker        {
327*8975f5c5SAndroid Build Coastguard Worker            rescale = 1.0 / len;
328*8975f5c5SAndroid Build Coastguard Worker        }
329*8975f5c5SAndroid Build Coastguard Worker        result *= rescale;
330*8975f5c5SAndroid Build Coastguard Worker    }
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker    if (enable_normalize)
333*8975f5c5SAndroid Build Coastguard Worker    {
334*8975f5c5SAndroid Build Coastguard Worker        result = normalize(result);
335*8975f5c5SAndroid Build Coastguard Worker    }
336*8975f5c5SAndroid Build Coastguard Worker
337*8975f5c5SAndroid Build Coastguard Worker    return result;
338*8975f5c5SAndroid Build Coastguard Worker}
339*8975f5c5SAndroid Build Coastguard Worker
340*8975f5c5SAndroid Build Coastguard Workervoid main()
341*8975f5c5SAndroid Build Coastguard Worker{
342*8975f5c5SAndroid Build Coastguard Worker    if (enable_draw_texture)
343*8975f5c5SAndroid Build Coastguard Worker    {
344*8975f5c5SAndroid Build Coastguard Worker        int vertexId        = gl_VertexID;
345*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 posDrawTexture = drawTexturePosition(vertexId);
346*8975f5c5SAndroid Build Coastguard Worker
347*8975f5c5SAndroid Build Coastguard Worker        gl_Position = posDrawTexture;
348*8975f5c5SAndroid Build Coastguard Worker        pos_varying = posDrawTexture;
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker        normal_varying = normal;
351*8975f5c5SAndroid Build Coastguard Worker
352*8975f5c5SAndroid Build Coastguard Worker        gl_PointSize = pointsize;
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
355*8975f5c5SAndroid Build Coastguard Worker        texcoord0_varying = drawTextureTexCoord(vertexId, 0u);
356*8975f5c5SAndroid Build Coastguard Worker#endif
357*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
358*8975f5c5SAndroid Build Coastguard Worker        texcoord1_varying = drawTextureTexCoord(vertexId, 1u);
359*8975f5c5SAndroid Build Coastguard Worker#endif
360*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
361*8975f5c5SAndroid Build Coastguard Worker        texcoord2_varying = drawTextureTexCoord(vertexId, 2u);
362*8975f5c5SAndroid Build Coastguard Worker#endif
363*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
364*8975f5c5SAndroid Build Coastguard Worker        texcoord3_varying = drawTextureTexCoord(vertexId, 3u);
365*8975f5c5SAndroid Build Coastguard Worker#endif
366*8975f5c5SAndroid Build Coastguard Worker    }
367*8975f5c5SAndroid Build Coastguard Worker    else
368*8975f5c5SAndroid Build Coastguard Worker    {
369*8975f5c5SAndroid Build Coastguard Worker        vec4 worldPos = calcWorldPosition(pos);
370*8975f5c5SAndroid Build Coastguard Worker        vec4 ndcPos   = calcNdcFromWorldPosition(worldPos);
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Worker        gl_Position = ndcPos;
373*8975f5c5SAndroid Build Coastguard Worker        pos_varying = worldPos;
374*8975f5c5SAndroid Build Coastguard Worker
375*8975f5c5SAndroid Build Coastguard Worker        normal_varying = calcNormal(normal);
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker        // Avoid calculating point size stuff
378*8975f5c5SAndroid Build Coastguard Worker        // if we are not rendering points.
379*8975f5c5SAndroid Build Coastguard Worker        if (point_rasterization)
380*8975f5c5SAndroid Build Coastguard Worker        {
381*8975f5c5SAndroid Build Coastguard Worker            gl_PointSize = calcPointSize(ndcPos);
382*8975f5c5SAndroid Build Coastguard Worker        }
383*8975f5c5SAndroid Build Coastguard Worker        else
384*8975f5c5SAndroid Build Coastguard Worker        {
385*8975f5c5SAndroid Build Coastguard Worker            gl_PointSize = pointsize;
386*8975f5c5SAndroid Build Coastguard Worker        }
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
389*8975f5c5SAndroid Build Coastguard Worker        texcoord0_varying = (texture_matrix[0] * texcoord0).xyz;
390*8975f5c5SAndroid Build Coastguard Worker#endif
391*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
392*8975f5c5SAndroid Build Coastguard Worker        texcoord1_varying = (texture_matrix[1] * texcoord1).xyz;
393*8975f5c5SAndroid Build Coastguard Worker#endif
394*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
395*8975f5c5SAndroid Build Coastguard Worker        texcoord2_varying = (texture_matrix[2] * texcoord2).xyz;
396*8975f5c5SAndroid Build Coastguard Worker#endif
397*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
398*8975f5c5SAndroid Build Coastguard Worker        texcoord3_varying = (texture_matrix[3] * texcoord3).xyz;
399*8975f5c5SAndroid Build Coastguard Worker#endif
400*8975f5c5SAndroid Build Coastguard Worker    }
401*8975f5c5SAndroid Build Coastguard Worker
402*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 vertex_color = color;
403*8975f5c5SAndroid Build Coastguard Worker
404*8975f5c5SAndroid Build Coastguard Worker    if (enable_lighting)
405*8975f5c5SAndroid Build Coastguard Worker    {
406*8975f5c5SAndroid Build Coastguard Worker        vertex_color = doLighting(color);
407*8975f5c5SAndroid Build Coastguard Worker    }
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker    vertex_color = clamp(vertex_color, vec4(0), vec4(1));
410*8975f5c5SAndroid Build Coastguard Worker
411*8975f5c5SAndroid Build Coastguard Worker    color_varying      = vertex_color;
412*8975f5c5SAndroid Build Coastguard Worker    color_varying_flat = vertex_color;
413*8975f5c5SAndroid Build Coastguard Worker}
414*8975f5c5SAndroid Build Coastguard Worker)";
415*8975f5c5SAndroid Build Coastguard Worker
416*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderVersion[] = R"(#version 300 es
417*8975f5c5SAndroid Build Coastguard Worker)";
418*8975f5c5SAndroid Build Coastguard Worker
419*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderHeader[] = R"(precision highp float;
420*8975f5c5SAndroid Build Coastguard Worker
421*8975f5c5SAndroid Build Coastguard Worker// Defines for GL constants
422*8975f5c5SAndroid Build Coastguard Worker#define kMaxTexUnits                         4u
423*8975f5c5SAndroid Build Coastguard Worker#define kMaxClipPlanes                       6u
424*8975f5c5SAndroid Build Coastguard Worker
425*8975f5c5SAndroid Build Coastguard Worker#define kModulate                       0x2100u
426*8975f5c5SAndroid Build Coastguard Worker#define kDecal                          0x2101u
427*8975f5c5SAndroid Build Coastguard Worker#define kCombine                        0x8570u
428*8975f5c5SAndroid Build Coastguard Worker#define kReplace                        0x1E01u
429*8975f5c5SAndroid Build Coastguard Worker#define kBlend                          0x0BE2u
430*8975f5c5SAndroid Build Coastguard Worker#define kAdd                            0x0104u
431*8975f5c5SAndroid Build Coastguard Worker
432*8975f5c5SAndroid Build Coastguard Worker#define kAddSigned                      0x8574u
433*8975f5c5SAndroid Build Coastguard Worker#define kInterpolate                    0x8575u
434*8975f5c5SAndroid Build Coastguard Worker#define kSubtract                       0x84E7u
435*8975f5c5SAndroid Build Coastguard Worker#define kDot3Rgb                        0x86AEu
436*8975f5c5SAndroid Build Coastguard Worker#define kDot3Rgba                       0x86AFu
437*8975f5c5SAndroid Build Coastguard Worker
438*8975f5c5SAndroid Build Coastguard Worker#define kAlpha                          0x1906u
439*8975f5c5SAndroid Build Coastguard Worker#define kRGB                            0x1907u
440*8975f5c5SAndroid Build Coastguard Worker#define kRGBA                           0x1908u
441*8975f5c5SAndroid Build Coastguard Worker#define kLuminance                      0x1909u
442*8975f5c5SAndroid Build Coastguard Worker#define kLuminanceAlpha                 0x190Au
443*8975f5c5SAndroid Build Coastguard Worker
444*8975f5c5SAndroid Build Coastguard Worker#define kTexture                        0x1702u
445*8975f5c5SAndroid Build Coastguard Worker#define kConstant                       0x8576u
446*8975f5c5SAndroid Build Coastguard Worker#define kPrimaryColor                   0x8577u
447*8975f5c5SAndroid Build Coastguard Worker#define kPrevious                       0x8578u
448*8975f5c5SAndroid Build Coastguard Worker
449*8975f5c5SAndroid Build Coastguard Worker#define kSrcColor                       0x0300u
450*8975f5c5SAndroid Build Coastguard Worker#define kOneMinusSrcColor               0x0301u
451*8975f5c5SAndroid Build Coastguard Worker#define kSrcAlpha                       0x0302u
452*8975f5c5SAndroid Build Coastguard Worker#define kOneMinusSrcAlpha               0x0303u
453*8975f5c5SAndroid Build Coastguard Worker
454*8975f5c5SAndroid Build Coastguard Worker#define kLinear                         0x2601u
455*8975f5c5SAndroid Build Coastguard Worker#define kExp                            0x0800u
456*8975f5c5SAndroid Build Coastguard Worker#define kExp2                           0x0801u
457*8975f5c5SAndroid Build Coastguard Worker
458*8975f5c5SAndroid Build Coastguard Worker#define kNever                          0x0200u
459*8975f5c5SAndroid Build Coastguard Worker#define kLess                           0x0201u
460*8975f5c5SAndroid Build Coastguard Worker#define kEqual                          0x0202u
461*8975f5c5SAndroid Build Coastguard Worker#define kLequal                         0x0203u
462*8975f5c5SAndroid Build Coastguard Worker#define kGreater                        0x0204u
463*8975f5c5SAndroid Build Coastguard Worker#define kNotequal                       0x0205u
464*8975f5c5SAndroid Build Coastguard Worker#define kGequal                         0x0206u
465*8975f5c5SAndroid Build Coastguard Worker#define kAlways                         0x0207u
466*8975f5c5SAndroid Build Coastguard Worker#define kZero                              0x0u
467*8975f5c5SAndroid Build Coastguard Worker#define kOne                               0x1u
468*8975f5c5SAndroid Build Coastguard Worker
469*8975f5c5SAndroid Build Coastguard Worker#define kAnd                            0u
470*8975f5c5SAndroid Build Coastguard Worker#define kAndInverted                    1u
471*8975f5c5SAndroid Build Coastguard Worker#define kAndReverse                     2u
472*8975f5c5SAndroid Build Coastguard Worker#define kClear                          3u
473*8975f5c5SAndroid Build Coastguard Worker#define kCopy                           4u
474*8975f5c5SAndroid Build Coastguard Worker#define kCopyInverted                   5u
475*8975f5c5SAndroid Build Coastguard Worker#define kEquiv                          6u
476*8975f5c5SAndroid Build Coastguard Worker#define kInvert                         7u
477*8975f5c5SAndroid Build Coastguard Worker#define kNand                           8u
478*8975f5c5SAndroid Build Coastguard Worker#define kNoop                           9u
479*8975f5c5SAndroid Build Coastguard Worker#define kNor                            10u
480*8975f5c5SAndroid Build Coastguard Worker#define kOr                             11u
481*8975f5c5SAndroid Build Coastguard Worker#define kOrInverted                     12u
482*8975f5c5SAndroid Build Coastguard Worker#define kOrReverse                      13u
483*8975f5c5SAndroid Build Coastguard Worker#define kSet                            14u
484*8975f5c5SAndroid Build Coastguard Worker#define kXor                            15u
485*8975f5c5SAndroid Build Coastguard Worker)";
486*8975f5c5SAndroid Build Coastguard Worker
487*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderUniformDefs[] = R"(
488*8975f5c5SAndroid Build Coastguard Worker
489*8975f5c5SAndroid Build Coastguard Worker// Texture units ///////////////////////////////////////////////////////////////
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Worker// These are not arrays because hw support for arrays
492*8975f5c5SAndroid Build Coastguard Worker// of samplers is rather lacking.
493*8975f5c5SAndroid Build Coastguard Worker
494*8975f5c5SAndroid Build Coastguard Workeruniform mediump sampler2D tex_sampler0;
495*8975f5c5SAndroid Build Coastguard Workeruniform mediump samplerCube tex_cube_sampler0;
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Workeruniform mediump sampler2D tex_sampler1;
498*8975f5c5SAndroid Build Coastguard Workeruniform mediump samplerCube tex_cube_sampler1;
499*8975f5c5SAndroid Build Coastguard Worker
500*8975f5c5SAndroid Build Coastguard Workeruniform mediump sampler2D tex_sampler2;
501*8975f5c5SAndroid Build Coastguard Workeruniform mediump samplerCube tex_cube_sampler2;
502*8975f5c5SAndroid Build Coastguard Worker
503*8975f5c5SAndroid Build Coastguard Workeruniform mediump sampler2D tex_sampler3;
504*8975f5c5SAndroid Build Coastguard Workeruniform mediump samplerCube tex_cube_sampler3;
505*8975f5c5SAndroid Build Coastguard Worker
506*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 texture_env_color[kMaxTexUnits];
507*8975f5c5SAndroid Build Coastguard Workeruniform mediump float texture_env_rgb_scale[kMaxTexUnits];
508*8975f5c5SAndroid Build Coastguard Workeruniform mediump float texture_env_alpha_scale[kMaxTexUnits];
509*8975f5c5SAndroid Build Coastguard Worker
510*8975f5c5SAndroid Build Coastguard Worker// Vertex attributes////////////////////////////////////////////////////////////
511*8975f5c5SAndroid Build Coastguard Worker
512*8975f5c5SAndroid Build Coastguard Workerin vec4 pos_varying;
513*8975f5c5SAndroid Build Coastguard Workerin vec3 normal_varying;
514*8975f5c5SAndroid Build Coastguard Workerin mediump vec4 color_varying;
515*8975f5c5SAndroid Build Coastguard Workerflat in mediump vec4 color_varying_flat;
516*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
517*8975f5c5SAndroid Build Coastguard Workerin mediump vec3 texcoord0_varying;
518*8975f5c5SAndroid Build Coastguard Worker#endif
519*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
520*8975f5c5SAndroid Build Coastguard Workerin mediump vec3 texcoord1_varying;
521*8975f5c5SAndroid Build Coastguard Worker#endif
522*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
523*8975f5c5SAndroid Build Coastguard Workerin mediump vec3 texcoord2_varying;
524*8975f5c5SAndroid Build Coastguard Worker#endif
525*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
526*8975f5c5SAndroid Build Coastguard Workerin mediump vec3 texcoord3_varying;
527*8975f5c5SAndroid Build Coastguard Worker#endif
528*8975f5c5SAndroid Build Coastguard Worker
529*8975f5c5SAndroid Build Coastguard Worker// Alpha test///////////////////////////////////////////////////////////////////
530*8975f5c5SAndroid Build Coastguard Worker
531*8975f5c5SAndroid Build Coastguard Workeruniform mediump float alpha_test_ref;
532*8975f5c5SAndroid Build Coastguard Worker
533*8975f5c5SAndroid Build Coastguard Worker// Fog /////////////////////////////////////////////////////////////////////////
534*8975f5c5SAndroid Build Coastguard Worker
535*8975f5c5SAndroid Build Coastguard Workeruniform float fog_density;
536*8975f5c5SAndroid Build Coastguard Workeruniform float fog_start;
537*8975f5c5SAndroid Build Coastguard Workeruniform float fog_end;
538*8975f5c5SAndroid Build Coastguard Workeruniform mediump vec4 fog_color;
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker// User clip plane /////////////////////////////////////////////////////////////
541*8975f5c5SAndroid Build Coastguard Worker
542*8975f5c5SAndroid Build Coastguard Workeruniform vec4 clip_planes[kMaxClipPlanes];
543*8975f5c5SAndroid Build Coastguard Worker
544*8975f5c5SAndroid Build Coastguard Worker// Logic Op ////////////////////////////////////////////////////////////////////
545*8975f5c5SAndroid Build Coastguard Worker
546*8975f5c5SAndroid Build Coastguard Worker// Format is:
547*8975f5c5SAndroid Build Coastguard Worker// - 4x4 bits depicting the bit width of each channel of color output
548*8975f5c5SAndroid Build Coastguard Worker// - 4 bits for the op based on LogicalOperation's packing
549*8975f5c5SAndroid Build Coastguard Workeruniform highp uint logic_op;
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Worker// Point rasterization//////////////////////////////////////////////////////////
552*8975f5c5SAndroid Build Coastguard Worker
553*8975f5c5SAndroid Build Coastguard Worker// GL_OES_draw_texture//////////////////////////////////////////////////////////
554*8975f5c5SAndroid Build Coastguard Worker)";
555*8975f5c5SAndroid Build Coastguard Worker
556*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderOutputDef[] = R"(
557*8975f5c5SAndroid Build Coastguard Workerout mediump vec4 frag_color;
558*8975f5c5SAndroid Build Coastguard Worker)";
559*8975f5c5SAndroid Build Coastguard Worker
560*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderFramebufferFetchOutputDef[] = R"(
561*8975f5c5SAndroid Build Coastguard Workerinout mediump vec4 frag_color;
562*8975f5c5SAndroid Build Coastguard Worker)";
563*8975f5c5SAndroid Build Coastguard Worker
564*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderFramebufferFetchNonCoherentOutputDef[] = R"(
565*8975f5c5SAndroid Build Coastguard Workerlayout(noncoherent) inout mediump vec4 frag_color;
566*8975f5c5SAndroid Build Coastguard Worker)";
567*8975f5c5SAndroid Build Coastguard Worker
568*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderFunctions[] = R"(
569*8975f5c5SAndroid Build Coastguard Worker
570*8975f5c5SAndroid Build Coastguard Workerbool doAlphaTest(mediump vec4 currentFragment)
571*8975f5c5SAndroid Build Coastguard Worker{
572*8975f5c5SAndroid Build Coastguard Worker    bool shouldPassAlpha   = false;
573*8975f5c5SAndroid Build Coastguard Worker    mediump float incAlpha = currentFragment.a;
574*8975f5c5SAndroid Build Coastguard Worker
575*8975f5c5SAndroid Build Coastguard Worker    switch (alpha_func)
576*8975f5c5SAndroid Build Coastguard Worker    {
577*8975f5c5SAndroid Build Coastguard Worker        case kNever:
578*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = false;
579*8975f5c5SAndroid Build Coastguard Worker            break;
580*8975f5c5SAndroid Build Coastguard Worker        case kLess:
581*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha < alpha_test_ref;
582*8975f5c5SAndroid Build Coastguard Worker            break;
583*8975f5c5SAndroid Build Coastguard Worker        case kLequal:
584*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha <= alpha_test_ref;
585*8975f5c5SAndroid Build Coastguard Worker            break;
586*8975f5c5SAndroid Build Coastguard Worker        case kEqual:
587*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha == alpha_test_ref;
588*8975f5c5SAndroid Build Coastguard Worker            break;
589*8975f5c5SAndroid Build Coastguard Worker        case kGequal:
590*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha >= alpha_test_ref;
591*8975f5c5SAndroid Build Coastguard Worker            break;
592*8975f5c5SAndroid Build Coastguard Worker        case kGreater:
593*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha > alpha_test_ref;
594*8975f5c5SAndroid Build Coastguard Worker            break;
595*8975f5c5SAndroid Build Coastguard Worker        case kNotequal:
596*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = incAlpha != alpha_test_ref;
597*8975f5c5SAndroid Build Coastguard Worker            break;
598*8975f5c5SAndroid Build Coastguard Worker        case kAlways:
599*8975f5c5SAndroid Build Coastguard Worker        default:
600*8975f5c5SAndroid Build Coastguard Worker            shouldPassAlpha = true;
601*8975f5c5SAndroid Build Coastguard Worker            break;
602*8975f5c5SAndroid Build Coastguard Worker    }
603*8975f5c5SAndroid Build Coastguard Worker
604*8975f5c5SAndroid Build Coastguard Worker    return shouldPassAlpha;
605*8975f5c5SAndroid Build Coastguard Worker}
606*8975f5c5SAndroid Build Coastguard Worker
607*8975f5c5SAndroid Build Coastguard Workerbool doClipPlaneTest()
608*8975f5c5SAndroid Build Coastguard Worker{
609*8975f5c5SAndroid Build Coastguard Worker    bool res = true;
610*8975f5c5SAndroid Build Coastguard Worker
611*8975f5c5SAndroid Build Coastguard Worker    for (uint i = 0u; i < kMaxClipPlanes; i++)
612*8975f5c5SAndroid Build Coastguard Worker    {
613*8975f5c5SAndroid Build Coastguard Worker        if (clip_plane_enables[i])
614*8975f5c5SAndroid Build Coastguard Worker        {
615*8975f5c5SAndroid Build Coastguard Worker            float dist = dot(clip_planes[i].xyz, pos_varying.xyz) + clip_planes[i].w * pos_varying.w;
616*8975f5c5SAndroid Build Coastguard Worker            res        = res && (dist >= 0.0);
617*8975f5c5SAndroid Build Coastguard Worker        }
618*8975f5c5SAndroid Build Coastguard Worker    }
619*8975f5c5SAndroid Build Coastguard Worker
620*8975f5c5SAndroid Build Coastguard Worker    return res;
621*8975f5c5SAndroid Build Coastguard Worker}
622*8975f5c5SAndroid Build Coastguard Worker
623*8975f5c5SAndroid Build Coastguard Workermediump vec4 doFog(mediump vec4 currentFragment)
624*8975f5c5SAndroid Build Coastguard Worker{
625*8975f5c5SAndroid Build Coastguard Worker
626*8975f5c5SAndroid Build Coastguard Worker    float eyeDist = abs(pos_varying.z / pos_varying.w);
627*8975f5c5SAndroid Build Coastguard Worker    float f       = 1.0;
628*8975f5c5SAndroid Build Coastguard Worker    switch (fog_mode)
629*8975f5c5SAndroid Build Coastguard Worker    {
630*8975f5c5SAndroid Build Coastguard Worker        case kExp:
631*8975f5c5SAndroid Build Coastguard Worker            f = exp(-fog_density * eyeDist);
632*8975f5c5SAndroid Build Coastguard Worker            break;
633*8975f5c5SAndroid Build Coastguard Worker        case kExp2:
634*8975f5c5SAndroid Build Coastguard Worker            f = exp(-(pow(fog_density * eyeDist, 2.0)));
635*8975f5c5SAndroid Build Coastguard Worker            break;
636*8975f5c5SAndroid Build Coastguard Worker        case kLinear:
637*8975f5c5SAndroid Build Coastguard Worker            f = (fog_end - eyeDist) / (fog_end - fog_start);
638*8975f5c5SAndroid Build Coastguard Worker            break;
639*8975f5c5SAndroid Build Coastguard Worker        default:
640*8975f5c5SAndroid Build Coastguard Worker            break;
641*8975f5c5SAndroid Build Coastguard Worker    }
642*8975f5c5SAndroid Build Coastguard Worker
643*8975f5c5SAndroid Build Coastguard Worker    f = clamp(f, 0.0, 1.0);
644*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 result = vec4(f * currentFragment.rgb + (1.0 - f) * fog_color.rgb, currentFragment.a);
645*8975f5c5SAndroid Build Coastguard Worker    return result;
646*8975f5c5SAndroid Build Coastguard Worker}
647*8975f5c5SAndroid Build Coastguard Worker)";
648*8975f5c5SAndroid Build Coastguard Worker
649*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderLogicOpFramebufferFetchDisabled[] = R"(
650*8975f5c5SAndroid Build Coastguard Workermediump vec4 applyLogicOp(mediump vec4 currentFragment)
651*8975f5c5SAndroid Build Coastguard Worker{
652*8975f5c5SAndroid Build Coastguard Worker    return currentFragment;
653*8975f5c5SAndroid Build Coastguard Worker}
654*8975f5c5SAndroid Build Coastguard Worker)";
655*8975f5c5SAndroid Build Coastguard Worker
656*8975f5c5SAndroid Build Coastguard Worker// applyLogicOp takes logic-op information from a packed uniform and applies it to the color
657*8975f5c5SAndroid Build Coastguard Worker// attachment using framebuffer fetch.  See the description of logic_op above for the format of the
658*8975f5c5SAndroid Build Coastguard Worker// uniform.
659*8975f5c5SAndroid Build Coastguard Worker//
660*8975f5c5SAndroid Build Coastguard Worker// In particular, 4 bits in logic_op (at offset 16) contain the packed logical operation (of
661*8975f5c5SAndroid Build Coastguard Worker// LogicalOperation type).  Based on the selected operation, the formula specified in the spec is
662*8975f5c5SAndroid Build Coastguard Worker// applied (applied as bitwise operations on unorm values).
663*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderLogicOpFramebufferFetchEnabled[] = R"(
664*8975f5c5SAndroid Build Coastguard Workermediump vec4 applyLogicOp(mediump vec4 currentFragment)
665*8975f5c5SAndroid Build Coastguard Worker{
666*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 previousFragment = frag_color;
667*8975f5c5SAndroid Build Coastguard Worker
668*8975f5c5SAndroid Build Coastguard Worker    mediump uvec4 channelWidths = uvec4(logic_op & 0xFu,
669*8975f5c5SAndroid Build Coastguard Worker                                        logic_op >> 4u & 0xFu,
670*8975f5c5SAndroid Build Coastguard Worker                                        logic_op >> 8u & 0xFu,
671*8975f5c5SAndroid Build Coastguard Worker                                        logic_op >> 12u & 0xFu);
672*8975f5c5SAndroid Build Coastguard Worker
673*8975f5c5SAndroid Build Coastguard Worker    mediump uvec4 channelMasks = (uvec4(1) << channelWidths) - 1u;
674*8975f5c5SAndroid Build Coastguard Worker
675*8975f5c5SAndroid Build Coastguard Worker    mediump uvec4 src = uvec4(round(currentFragment * vec4(channelMasks)));
676*8975f5c5SAndroid Build Coastguard Worker    mediump uvec4 dst = uvec4(round(previousFragment * vec4(channelMasks)));
677*8975f5c5SAndroid Build Coastguard Worker    mediump uvec4 result;
678*8975f5c5SAndroid Build Coastguard Worker
679*8975f5c5SAndroid Build Coastguard Worker    switch (logic_op >> 16u & 0xFu)
680*8975f5c5SAndroid Build Coastguard Worker    {
681*8975f5c5SAndroid Build Coastguard Worker        case kAnd:
682*8975f5c5SAndroid Build Coastguard Worker            result = src & dst;
683*8975f5c5SAndroid Build Coastguard Worker            break;
684*8975f5c5SAndroid Build Coastguard Worker        case kAndInverted:
685*8975f5c5SAndroid Build Coastguard Worker            result = ~src & dst;
686*8975f5c5SAndroid Build Coastguard Worker            break;
687*8975f5c5SAndroid Build Coastguard Worker        case kAndReverse:
688*8975f5c5SAndroid Build Coastguard Worker            result = src & ~dst;
689*8975f5c5SAndroid Build Coastguard Worker            break;
690*8975f5c5SAndroid Build Coastguard Worker        case kClear:
691*8975f5c5SAndroid Build Coastguard Worker            result = uvec4(0);
692*8975f5c5SAndroid Build Coastguard Worker            break;
693*8975f5c5SAndroid Build Coastguard Worker        case kCopy:
694*8975f5c5SAndroid Build Coastguard Worker            result = src;
695*8975f5c5SAndroid Build Coastguard Worker            break;
696*8975f5c5SAndroid Build Coastguard Worker        case kCopyInverted:
697*8975f5c5SAndroid Build Coastguard Worker            result = ~src;
698*8975f5c5SAndroid Build Coastguard Worker            break;
699*8975f5c5SAndroid Build Coastguard Worker        case kEquiv:
700*8975f5c5SAndroid Build Coastguard Worker            result = ~(src ^ dst);
701*8975f5c5SAndroid Build Coastguard Worker            break;
702*8975f5c5SAndroid Build Coastguard Worker        case kInvert:
703*8975f5c5SAndroid Build Coastguard Worker            result = ~dst;
704*8975f5c5SAndroid Build Coastguard Worker            break;
705*8975f5c5SAndroid Build Coastguard Worker        case kNand:
706*8975f5c5SAndroid Build Coastguard Worker            result = ~(src & dst);
707*8975f5c5SAndroid Build Coastguard Worker            break;
708*8975f5c5SAndroid Build Coastguard Worker        case kNoop:
709*8975f5c5SAndroid Build Coastguard Worker            result = dst;
710*8975f5c5SAndroid Build Coastguard Worker            break;
711*8975f5c5SAndroid Build Coastguard Worker        case kNor:
712*8975f5c5SAndroid Build Coastguard Worker            result = ~(src | dst);
713*8975f5c5SAndroid Build Coastguard Worker            break;
714*8975f5c5SAndroid Build Coastguard Worker        case kOr:
715*8975f5c5SAndroid Build Coastguard Worker            result = src | dst;
716*8975f5c5SAndroid Build Coastguard Worker            break;
717*8975f5c5SAndroid Build Coastguard Worker        case kOrInverted:
718*8975f5c5SAndroid Build Coastguard Worker            result = ~src | dst;
719*8975f5c5SAndroid Build Coastguard Worker            break;
720*8975f5c5SAndroid Build Coastguard Worker        case kOrReverse:
721*8975f5c5SAndroid Build Coastguard Worker            result = src | ~dst;
722*8975f5c5SAndroid Build Coastguard Worker            break;
723*8975f5c5SAndroid Build Coastguard Worker        case kSet:
724*8975f5c5SAndroid Build Coastguard Worker            result = channelMasks;
725*8975f5c5SAndroid Build Coastguard Worker            break;
726*8975f5c5SAndroid Build Coastguard Worker        case kXor:
727*8975f5c5SAndroid Build Coastguard Worker            result = src ^ dst;
728*8975f5c5SAndroid Build Coastguard Worker            break;
729*8975f5c5SAndroid Build Coastguard Worker    }
730*8975f5c5SAndroid Build Coastguard Worker
731*8975f5c5SAndroid Build Coastguard Worker    result &= channelMasks;
732*8975f5c5SAndroid Build Coastguard Worker
733*8975f5c5SAndroid Build Coastguard Worker    // Avoid division by zero for formats without alpha
734*8975f5c5SAndroid Build Coastguard Worker    channelMasks.a = max(channelMasks.a, 1u);
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Worker    return vec4(result) / vec4(channelMasks);
737*8975f5c5SAndroid Build Coastguard Worker}
738*8975f5c5SAndroid Build Coastguard Worker)";
739*8975f5c5SAndroid Build Coastguard Worker
740*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderMultitexturing[] = R"(
741*8975f5c5SAndroid Build Coastguard Worker
742*8975f5c5SAndroid Build Coastguard Workerbool isTextureUnitEnabled(uint unit)
743*8975f5c5SAndroid Build Coastguard Worker{
744*8975f5c5SAndroid Build Coastguard Worker    return enable_texture_2d[unit] || enable_texture_cube_map[unit];
745*8975f5c5SAndroid Build Coastguard Worker}
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Workermediump vec4 getTextureColor(uint unit)
748*8975f5c5SAndroid Build Coastguard Worker{
749*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 res;
750*8975f5c5SAndroid Build Coastguard Worker
751*8975f5c5SAndroid Build Coastguard Worker    switch (unit)
752*8975f5c5SAndroid Build Coastguard Worker    {
753*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 1u
754*8975f5c5SAndroid Build Coastguard Worker        case 0u:
755*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[0])
756*8975f5c5SAndroid Build Coastguard Worker            {
757*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler0, texcoord0_varying.xy);
758*8975f5c5SAndroid Build Coastguard Worker            }
759*8975f5c5SAndroid Build Coastguard Worker            else if (enable_texture_cube_map[0])
760*8975f5c5SAndroid Build Coastguard Worker            {
761*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_cube_sampler0, texcoord0_varying);
762*8975f5c5SAndroid Build Coastguard Worker            }
763*8975f5c5SAndroid Build Coastguard Worker            break;
764*8975f5c5SAndroid Build Coastguard Worker#endif
765*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 2u
766*8975f5c5SAndroid Build Coastguard Worker        case 1u:
767*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[1])
768*8975f5c5SAndroid Build Coastguard Worker            {
769*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler1, texcoord1_varying.xy);
770*8975f5c5SAndroid Build Coastguard Worker            }
771*8975f5c5SAndroid Build Coastguard Worker            else if (enable_texture_cube_map[1])
772*8975f5c5SAndroid Build Coastguard Worker            {
773*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_cube_sampler1, texcoord1_varying);
774*8975f5c5SAndroid Build Coastguard Worker            }
775*8975f5c5SAndroid Build Coastguard Worker            break;
776*8975f5c5SAndroid Build Coastguard Worker#endif
777*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 3u
778*8975f5c5SAndroid Build Coastguard Worker        case 2u:
779*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[2])
780*8975f5c5SAndroid Build Coastguard Worker            {
781*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler2, texcoord2_varying.xy);
782*8975f5c5SAndroid Build Coastguard Worker            }
783*8975f5c5SAndroid Build Coastguard Worker            else if (enable_texture_cube_map[2])
784*8975f5c5SAndroid Build Coastguard Worker            {
785*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_cube_sampler2, texcoord2_varying);
786*8975f5c5SAndroid Build Coastguard Worker            }
787*8975f5c5SAndroid Build Coastguard Worker            break;
788*8975f5c5SAndroid Build Coastguard Worker#endif
789*8975f5c5SAndroid Build Coastguard Worker#if kTexUnits >= 4u
790*8975f5c5SAndroid Build Coastguard Worker        case 3u:
791*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[3])
792*8975f5c5SAndroid Build Coastguard Worker            {
793*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler3, texcoord3_varying.xy);
794*8975f5c5SAndroid Build Coastguard Worker            }
795*8975f5c5SAndroid Build Coastguard Worker            else if (enable_texture_cube_map[3])
796*8975f5c5SAndroid Build Coastguard Worker            {
797*8975f5c5SAndroid Build Coastguard Worker                // TODO: Weird stuff happens
798*8975f5c5SAndroid Build Coastguard Worker                // res = texture(tex_cube_sampler3, texcoord3_varying);
799*8975f5c5SAndroid Build Coastguard Worker            }
800*8975f5c5SAndroid Build Coastguard Worker            break;
801*8975f5c5SAndroid Build Coastguard Worker#endif
802*8975f5c5SAndroid Build Coastguard Worker        default:
803*8975f5c5SAndroid Build Coastguard Worker            break;
804*8975f5c5SAndroid Build Coastguard Worker    }
805*8975f5c5SAndroid Build Coastguard Worker
806*8975f5c5SAndroid Build Coastguard Worker    return res;
807*8975f5c5SAndroid Build Coastguard Worker}
808*8975f5c5SAndroid Build Coastguard Worker
809*8975f5c5SAndroid Build Coastguard Workermediump vec4 getPointSpriteTextureColor(uint unit)
810*8975f5c5SAndroid Build Coastguard Worker{
811*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 res;
812*8975f5c5SAndroid Build Coastguard Worker
813*8975f5c5SAndroid Build Coastguard Worker    switch (unit)
814*8975f5c5SAndroid Build Coastguard Worker    {
815*8975f5c5SAndroid Build Coastguard Worker        case 0u:
816*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[0])
817*8975f5c5SAndroid Build Coastguard Worker            {
818*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler0, gl_PointCoord.xy);
819*8975f5c5SAndroid Build Coastguard Worker            }
820*8975f5c5SAndroid Build Coastguard Worker            break;
821*8975f5c5SAndroid Build Coastguard Worker        case 1u:
822*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[1])
823*8975f5c5SAndroid Build Coastguard Worker            {
824*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler1, gl_PointCoord.xy);
825*8975f5c5SAndroid Build Coastguard Worker            }
826*8975f5c5SAndroid Build Coastguard Worker            break;
827*8975f5c5SAndroid Build Coastguard Worker        case 2u:
828*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[2])
829*8975f5c5SAndroid Build Coastguard Worker            {
830*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler2, gl_PointCoord.xy);
831*8975f5c5SAndroid Build Coastguard Worker            }
832*8975f5c5SAndroid Build Coastguard Worker            break;
833*8975f5c5SAndroid Build Coastguard Worker        case 3u:
834*8975f5c5SAndroid Build Coastguard Worker            if (enable_texture_2d[3])
835*8975f5c5SAndroid Build Coastguard Worker            {
836*8975f5c5SAndroid Build Coastguard Worker                res = texture(tex_sampler3, gl_PointCoord.xy);
837*8975f5c5SAndroid Build Coastguard Worker            }
838*8975f5c5SAndroid Build Coastguard Worker            break;
839*8975f5c5SAndroid Build Coastguard Worker        default:
840*8975f5c5SAndroid Build Coastguard Worker            break;
841*8975f5c5SAndroid Build Coastguard Worker    }
842*8975f5c5SAndroid Build Coastguard Worker
843*8975f5c5SAndroid Build Coastguard Worker    return res;
844*8975f5c5SAndroid Build Coastguard Worker}
845*8975f5c5SAndroid Build Coastguard Worker
846*8975f5c5SAndroid Build Coastguard Workermediump vec3 textureCombineSrcnOpnRgb(uint srcnRgb,
847*8975f5c5SAndroid Build Coastguard Worker                                      uint opnRgb,
848*8975f5c5SAndroid Build Coastguard Worker                                      mediump vec4 textureEnvColor,
849*8975f5c5SAndroid Build Coastguard Worker                                      mediump vec4 vertexColor,
850*8975f5c5SAndroid Build Coastguard Worker                                      mediump vec4 texturePrevColor,
851*8975f5c5SAndroid Build Coastguard Worker                                      mediump vec4 textureColor)
852*8975f5c5SAndroid Build Coastguard Worker{
853*8975f5c5SAndroid Build Coastguard Worker    mediump vec3 res;
854*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 op;
855*8975f5c5SAndroid Build Coastguard Worker
856*8975f5c5SAndroid Build Coastguard Worker    switch (srcnRgb)
857*8975f5c5SAndroid Build Coastguard Worker    {
858*8975f5c5SAndroid Build Coastguard Worker        case kTexture:
859*8975f5c5SAndroid Build Coastguard Worker            op = textureColor;
860*8975f5c5SAndroid Build Coastguard Worker            break;
861*8975f5c5SAndroid Build Coastguard Worker        case kConstant:
862*8975f5c5SAndroid Build Coastguard Worker            op = textureEnvColor;
863*8975f5c5SAndroid Build Coastguard Worker            break;
864*8975f5c5SAndroid Build Coastguard Worker        case kPrimaryColor:
865*8975f5c5SAndroid Build Coastguard Worker            op = vertexColor;
866*8975f5c5SAndroid Build Coastguard Worker            break;
867*8975f5c5SAndroid Build Coastguard Worker        case kPrevious:
868*8975f5c5SAndroid Build Coastguard Worker            op = texturePrevColor;
869*8975f5c5SAndroid Build Coastguard Worker            break;
870*8975f5c5SAndroid Build Coastguard Worker        default:
871*8975f5c5SAndroid Build Coastguard Worker            op = texturePrevColor;
872*8975f5c5SAndroid Build Coastguard Worker            break;
873*8975f5c5SAndroid Build Coastguard Worker    }
874*8975f5c5SAndroid Build Coastguard Worker
875*8975f5c5SAndroid Build Coastguard Worker    switch (opnRgb)
876*8975f5c5SAndroid Build Coastguard Worker    {
877*8975f5c5SAndroid Build Coastguard Worker        case kSrcColor:
878*8975f5c5SAndroid Build Coastguard Worker            res = op.rgb;
879*8975f5c5SAndroid Build Coastguard Worker            break;
880*8975f5c5SAndroid Build Coastguard Worker        case kOneMinusSrcColor:
881*8975f5c5SAndroid Build Coastguard Worker            res = 1.0 - op.rgb;
882*8975f5c5SAndroid Build Coastguard Worker            break;
883*8975f5c5SAndroid Build Coastguard Worker        case kSrcAlpha:
884*8975f5c5SAndroid Build Coastguard Worker            res = vec3(op.a, op.a, op.a);
885*8975f5c5SAndroid Build Coastguard Worker            break;
886*8975f5c5SAndroid Build Coastguard Worker        case kOneMinusSrcAlpha:
887*8975f5c5SAndroid Build Coastguard Worker            res = vec3(1.0 - op.a, 1.0 - op.a, 1.0 - op.a);
888*8975f5c5SAndroid Build Coastguard Worker            break;
889*8975f5c5SAndroid Build Coastguard Worker        default:
890*8975f5c5SAndroid Build Coastguard Worker            break;
891*8975f5c5SAndroid Build Coastguard Worker    }
892*8975f5c5SAndroid Build Coastguard Worker
893*8975f5c5SAndroid Build Coastguard Worker    return res;
894*8975f5c5SAndroid Build Coastguard Worker}
895*8975f5c5SAndroid Build Coastguard Worker
896*8975f5c5SAndroid Build Coastguard Workermediump float textureCombineSrcnOpnAlpha(uint srcn,
897*8975f5c5SAndroid Build Coastguard Worker                                         uint opn,
898*8975f5c5SAndroid Build Coastguard Worker                                         mediump vec4 textureEnvColor,
899*8975f5c5SAndroid Build Coastguard Worker                                         mediump vec4 vertexColor,
900*8975f5c5SAndroid Build Coastguard Worker                                         mediump vec4 texturePrevColor,
901*8975f5c5SAndroid Build Coastguard Worker                                         mediump vec4 textureColor)
902*8975f5c5SAndroid Build Coastguard Worker{
903*8975f5c5SAndroid Build Coastguard Worker    mediump float res;
904*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 op;
905*8975f5c5SAndroid Build Coastguard Worker
906*8975f5c5SAndroid Build Coastguard Worker    switch (srcn)
907*8975f5c5SAndroid Build Coastguard Worker    {
908*8975f5c5SAndroid Build Coastguard Worker        case kTexture:
909*8975f5c5SAndroid Build Coastguard Worker            op = textureColor;
910*8975f5c5SAndroid Build Coastguard Worker            break;
911*8975f5c5SAndroid Build Coastguard Worker        case kConstant:
912*8975f5c5SAndroid Build Coastguard Worker            op = textureEnvColor;
913*8975f5c5SAndroid Build Coastguard Worker            break;
914*8975f5c5SAndroid Build Coastguard Worker        case kPrimaryColor:
915*8975f5c5SAndroid Build Coastguard Worker            op = vertexColor;
916*8975f5c5SAndroid Build Coastguard Worker            break;
917*8975f5c5SAndroid Build Coastguard Worker        case kPrevious:
918*8975f5c5SAndroid Build Coastguard Worker            op = texturePrevColor;
919*8975f5c5SAndroid Build Coastguard Worker            break;
920*8975f5c5SAndroid Build Coastguard Worker        default:
921*8975f5c5SAndroid Build Coastguard Worker            op = texturePrevColor;
922*8975f5c5SAndroid Build Coastguard Worker            break;
923*8975f5c5SAndroid Build Coastguard Worker    }
924*8975f5c5SAndroid Build Coastguard Worker
925*8975f5c5SAndroid Build Coastguard Worker    switch (opn)
926*8975f5c5SAndroid Build Coastguard Worker    {
927*8975f5c5SAndroid Build Coastguard Worker        case kSrcAlpha:
928*8975f5c5SAndroid Build Coastguard Worker            res = op.a;
929*8975f5c5SAndroid Build Coastguard Worker            break;
930*8975f5c5SAndroid Build Coastguard Worker        case kOneMinusSrcAlpha:
931*8975f5c5SAndroid Build Coastguard Worker            res = 1.0 - op.a;
932*8975f5c5SAndroid Build Coastguard Worker            break;
933*8975f5c5SAndroid Build Coastguard Worker        default:
934*8975f5c5SAndroid Build Coastguard Worker            break;
935*8975f5c5SAndroid Build Coastguard Worker    }
936*8975f5c5SAndroid Build Coastguard Worker
937*8975f5c5SAndroid Build Coastguard Worker    return res;
938*8975f5c5SAndroid Build Coastguard Worker}
939*8975f5c5SAndroid Build Coastguard Worker
940*8975f5c5SAndroid Build Coastguard Workermediump vec4 textureCombine(uint combineRgb,
941*8975f5c5SAndroid Build Coastguard Worker                            uint combineAlpha,
942*8975f5c5SAndroid Build Coastguard Worker                            uint src0Rgb,
943*8975f5c5SAndroid Build Coastguard Worker                            uint src0Alpha,
944*8975f5c5SAndroid Build Coastguard Worker                            uint src1Rgb,
945*8975f5c5SAndroid Build Coastguard Worker                            uint src1Alpha,
946*8975f5c5SAndroid Build Coastguard Worker                            uint src2Rgb,
947*8975f5c5SAndroid Build Coastguard Worker                            uint src2Alpha,
948*8975f5c5SAndroid Build Coastguard Worker                            uint op0Rgb,
949*8975f5c5SAndroid Build Coastguard Worker                            uint op0Alpha,
950*8975f5c5SAndroid Build Coastguard Worker                            uint op1Rgb,
951*8975f5c5SAndroid Build Coastguard Worker                            uint op1Alpha,
952*8975f5c5SAndroid Build Coastguard Worker                            uint op2Rgb,
953*8975f5c5SAndroid Build Coastguard Worker                            uint op2Alpha,
954*8975f5c5SAndroid Build Coastguard Worker                            mediump vec4 textureEnvColor,
955*8975f5c5SAndroid Build Coastguard Worker                            mediump float rgbScale,
956*8975f5c5SAndroid Build Coastguard Worker                            mediump float alphaScale,
957*8975f5c5SAndroid Build Coastguard Worker                            mediump vec4 vertexColor,
958*8975f5c5SAndroid Build Coastguard Worker                            mediump vec4 texturePrevColor,
959*8975f5c5SAndroid Build Coastguard Worker                            mediump vec4 textureColor)
960*8975f5c5SAndroid Build Coastguard Worker{
961*8975f5c5SAndroid Build Coastguard Worker
962*8975f5c5SAndroid Build Coastguard Worker    mediump vec3 resRgb;
963*8975f5c5SAndroid Build Coastguard Worker    mediump float resAlpha;
964*8975f5c5SAndroid Build Coastguard Worker
965*8975f5c5SAndroid Build Coastguard Worker    mediump vec3 arg0Rgb;
966*8975f5c5SAndroid Build Coastguard Worker    mediump float arg0Alpha;
967*8975f5c5SAndroid Build Coastguard Worker    mediump vec3 arg1Rgb;
968*8975f5c5SAndroid Build Coastguard Worker    mediump float arg1Alpha;
969*8975f5c5SAndroid Build Coastguard Worker    mediump vec3 arg2Rgb;
970*8975f5c5SAndroid Build Coastguard Worker    mediump float arg2Alpha;
971*8975f5c5SAndroid Build Coastguard Worker    mediump float dotVal;
972*8975f5c5SAndroid Build Coastguard Worker
973*8975f5c5SAndroid Build Coastguard Worker    arg0Rgb   = textureCombineSrcnOpnRgb(src0Rgb, op0Rgb, textureEnvColor, vertexColor,
974*8975f5c5SAndroid Build Coastguard Worker                                       texturePrevColor, textureColor);
975*8975f5c5SAndroid Build Coastguard Worker    arg0Alpha = textureCombineSrcnOpnAlpha(src0Alpha, op0Alpha, textureEnvColor, vertexColor,
976*8975f5c5SAndroid Build Coastguard Worker                                           texturePrevColor, textureColor);
977*8975f5c5SAndroid Build Coastguard Worker
978*8975f5c5SAndroid Build Coastguard Worker    if (combineRgb != kReplace)
979*8975f5c5SAndroid Build Coastguard Worker    {
980*8975f5c5SAndroid Build Coastguard Worker        arg1Rgb = textureCombineSrcnOpnRgb(src1Rgb, op1Rgb, textureEnvColor, vertexColor,
981*8975f5c5SAndroid Build Coastguard Worker                                           texturePrevColor, textureColor);
982*8975f5c5SAndroid Build Coastguard Worker    }
983*8975f5c5SAndroid Build Coastguard Worker
984*8975f5c5SAndroid Build Coastguard Worker    if (combineAlpha != kReplace)
985*8975f5c5SAndroid Build Coastguard Worker    {
986*8975f5c5SAndroid Build Coastguard Worker        arg1Alpha = textureCombineSrcnOpnAlpha(src1Alpha, op1Alpha, textureEnvColor, vertexColor,
987*8975f5c5SAndroid Build Coastguard Worker                                               texturePrevColor, textureColor);
988*8975f5c5SAndroid Build Coastguard Worker    }
989*8975f5c5SAndroid Build Coastguard Worker
990*8975f5c5SAndroid Build Coastguard Worker    if (combineRgb == kInterpolate)
991*8975f5c5SAndroid Build Coastguard Worker    {
992*8975f5c5SAndroid Build Coastguard Worker        arg2Rgb = textureCombineSrcnOpnRgb(src2Rgb, op2Rgb, textureEnvColor, vertexColor,
993*8975f5c5SAndroid Build Coastguard Worker                                           texturePrevColor, textureColor);
994*8975f5c5SAndroid Build Coastguard Worker    }
995*8975f5c5SAndroid Build Coastguard Worker
996*8975f5c5SAndroid Build Coastguard Worker    if (combineAlpha == kInterpolate)
997*8975f5c5SAndroid Build Coastguard Worker    {
998*8975f5c5SAndroid Build Coastguard Worker        arg2Alpha = textureCombineSrcnOpnAlpha(src2Alpha, op2Alpha, textureEnvColor, vertexColor,
999*8975f5c5SAndroid Build Coastguard Worker                                               texturePrevColor, textureColor);
1000*8975f5c5SAndroid Build Coastguard Worker    }
1001*8975f5c5SAndroid Build Coastguard Worker
1002*8975f5c5SAndroid Build Coastguard Worker    switch (combineRgb)
1003*8975f5c5SAndroid Build Coastguard Worker    {
1004*8975f5c5SAndroid Build Coastguard Worker        case kReplace:
1005*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb;
1006*8975f5c5SAndroid Build Coastguard Worker            break;
1007*8975f5c5SAndroid Build Coastguard Worker        case kModulate:
1008*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb * arg1Rgb;
1009*8975f5c5SAndroid Build Coastguard Worker            break;
1010*8975f5c5SAndroid Build Coastguard Worker        case kAdd:
1011*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb + arg1Rgb;
1012*8975f5c5SAndroid Build Coastguard Worker            break;
1013*8975f5c5SAndroid Build Coastguard Worker        case kAddSigned:
1014*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb + arg1Rgb - 0.5;
1015*8975f5c5SAndroid Build Coastguard Worker            break;
1016*8975f5c5SAndroid Build Coastguard Worker        case kInterpolate:
1017*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb * arg2Rgb + arg1Rgb * (1.0 - arg2Rgb);
1018*8975f5c5SAndroid Build Coastguard Worker            break;
1019*8975f5c5SAndroid Build Coastguard Worker        case kSubtract:
1020*8975f5c5SAndroid Build Coastguard Worker            resRgb = arg0Rgb - arg1Rgb;
1021*8975f5c5SAndroid Build Coastguard Worker            break;
1022*8975f5c5SAndroid Build Coastguard Worker        default:
1023*8975f5c5SAndroid Build Coastguard Worker            break;
1024*8975f5c5SAndroid Build Coastguard Worker    }
1025*8975f5c5SAndroid Build Coastguard Worker
1026*8975f5c5SAndroid Build Coastguard Worker    switch (combineAlpha)
1027*8975f5c5SAndroid Build Coastguard Worker    {
1028*8975f5c5SAndroid Build Coastguard Worker        case kReplace:
1029*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha;
1030*8975f5c5SAndroid Build Coastguard Worker            break;
1031*8975f5c5SAndroid Build Coastguard Worker        case kModulate:
1032*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha * arg1Alpha;
1033*8975f5c5SAndroid Build Coastguard Worker            break;
1034*8975f5c5SAndroid Build Coastguard Worker        case kAdd:
1035*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha + arg1Alpha;
1036*8975f5c5SAndroid Build Coastguard Worker            break;
1037*8975f5c5SAndroid Build Coastguard Worker        case kAddSigned:
1038*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha + arg1Alpha - 0.5;
1039*8975f5c5SAndroid Build Coastguard Worker            break;
1040*8975f5c5SAndroid Build Coastguard Worker        case kInterpolate:
1041*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha * arg2Alpha + arg1Alpha * (1.0 - arg2Alpha);
1042*8975f5c5SAndroid Build Coastguard Worker            break;
1043*8975f5c5SAndroid Build Coastguard Worker        case kSubtract:
1044*8975f5c5SAndroid Build Coastguard Worker            resAlpha = arg0Alpha - arg1Alpha;
1045*8975f5c5SAndroid Build Coastguard Worker            break;
1046*8975f5c5SAndroid Build Coastguard Worker        default:
1047*8975f5c5SAndroid Build Coastguard Worker            break;
1048*8975f5c5SAndroid Build Coastguard Worker    }
1049*8975f5c5SAndroid Build Coastguard Worker
1050*8975f5c5SAndroid Build Coastguard Worker    if (combineRgb == kDot3Rgb || combineRgb == kDot3Rgba)
1051*8975f5c5SAndroid Build Coastguard Worker    {
1052*8975f5c5SAndroid Build Coastguard Worker        dotVal = 4.0 * dot(arg0Rgb - 0.5, arg1Rgb - 0.5);
1053*8975f5c5SAndroid Build Coastguard Worker
1054*8975f5c5SAndroid Build Coastguard Worker        if (combineRgb == kDot3Rgb)
1055*8975f5c5SAndroid Build Coastguard Worker        {
1056*8975f5c5SAndroid Build Coastguard Worker            return vec4(dotVal, dotVal, dotVal, resAlpha);
1057*8975f5c5SAndroid Build Coastguard Worker        }
1058*8975f5c5SAndroid Build Coastguard Worker        else
1059*8975f5c5SAndroid Build Coastguard Worker        {
1060*8975f5c5SAndroid Build Coastguard Worker            return vec4(dotVal, dotVal, dotVal, dotVal);
1061*8975f5c5SAndroid Build Coastguard Worker        }
1062*8975f5c5SAndroid Build Coastguard Worker    }
1063*8975f5c5SAndroid Build Coastguard Worker    else
1064*8975f5c5SAndroid Build Coastguard Worker    {
1065*8975f5c5SAndroid Build Coastguard Worker        return vec4(resRgb, resAlpha);
1066*8975f5c5SAndroid Build Coastguard Worker    }
1067*8975f5c5SAndroid Build Coastguard Worker}
1068*8975f5c5SAndroid Build Coastguard Worker
1069*8975f5c5SAndroid Build Coastguard Workermediump vec4 textureFunction(uint unit,
1070*8975f5c5SAndroid Build Coastguard Worker                             uint texFormat,
1071*8975f5c5SAndroid Build Coastguard Worker                             uint envMode,
1072*8975f5c5SAndroid Build Coastguard Worker                             uint combineRgb,
1073*8975f5c5SAndroid Build Coastguard Worker                             uint combineAlpha,
1074*8975f5c5SAndroid Build Coastguard Worker                             uint src0Rgb,
1075*8975f5c5SAndroid Build Coastguard Worker                             uint src0Alpha,
1076*8975f5c5SAndroid Build Coastguard Worker                             uint src1Rgb,
1077*8975f5c5SAndroid Build Coastguard Worker                             uint src1Alpha,
1078*8975f5c5SAndroid Build Coastguard Worker                             uint src2Rgb,
1079*8975f5c5SAndroid Build Coastguard Worker                             uint src2Alpha,
1080*8975f5c5SAndroid Build Coastguard Worker                             uint op0Rgb,
1081*8975f5c5SAndroid Build Coastguard Worker                             uint op0Alpha,
1082*8975f5c5SAndroid Build Coastguard Worker                             uint op1Rgb,
1083*8975f5c5SAndroid Build Coastguard Worker                             uint op1Alpha,
1084*8975f5c5SAndroid Build Coastguard Worker                             uint op2Rgb,
1085*8975f5c5SAndroid Build Coastguard Worker                             uint op2Alpha,
1086*8975f5c5SAndroid Build Coastguard Worker                             mediump vec4 textureEnvColor,
1087*8975f5c5SAndroid Build Coastguard Worker                             mediump float rgbScale,
1088*8975f5c5SAndroid Build Coastguard Worker                             mediump float alphaScale,
1089*8975f5c5SAndroid Build Coastguard Worker                             mediump vec4 vertexColor,
1090*8975f5c5SAndroid Build Coastguard Worker                             mediump vec4 texturePrevColor,
1091*8975f5c5SAndroid Build Coastguard Worker                             mediump vec4 textureColor)
1092*8975f5c5SAndroid Build Coastguard Worker{
1093*8975f5c5SAndroid Build Coastguard Worker
1094*8975f5c5SAndroid Build Coastguard Worker    if (!isTextureUnitEnabled(unit))
1095*8975f5c5SAndroid Build Coastguard Worker    {
1096*8975f5c5SAndroid Build Coastguard Worker        return texturePrevColor;
1097*8975f5c5SAndroid Build Coastguard Worker    }
1098*8975f5c5SAndroid Build Coastguard Worker
1099*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 res;
1100*8975f5c5SAndroid Build Coastguard Worker
1101*8975f5c5SAndroid Build Coastguard Worker    switch (envMode)
1102*8975f5c5SAndroid Build Coastguard Worker    {
1103*8975f5c5SAndroid Build Coastguard Worker        case kReplace:
1104*8975f5c5SAndroid Build Coastguard Worker            switch (texFormat)
1105*8975f5c5SAndroid Build Coastguard Worker            {
1106*8975f5c5SAndroid Build Coastguard Worker                case kAlpha:
1107*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb;
1108*8975f5c5SAndroid Build Coastguard Worker                    res.a   = textureColor.a;
1109*8975f5c5SAndroid Build Coastguard Worker                    break;
1110*8975f5c5SAndroid Build Coastguard Worker                case kRGBA:
1111*8975f5c5SAndroid Build Coastguard Worker                case kLuminanceAlpha:
1112*8975f5c5SAndroid Build Coastguard Worker                    res.rgba = textureColor.rgba;
1113*8975f5c5SAndroid Build Coastguard Worker                    break;
1114*8975f5c5SAndroid Build Coastguard Worker                case kRGB:
1115*8975f5c5SAndroid Build Coastguard Worker                case kLuminance:
1116*8975f5c5SAndroid Build Coastguard Worker                default:
1117*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = textureColor.rgb;
1118*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a;
1119*8975f5c5SAndroid Build Coastguard Worker                    break;
1120*8975f5c5SAndroid Build Coastguard Worker            }
1121*8975f5c5SAndroid Build Coastguard Worker            break;
1122*8975f5c5SAndroid Build Coastguard Worker        case kModulate:
1123*8975f5c5SAndroid Build Coastguard Worker            switch (texFormat)
1124*8975f5c5SAndroid Build Coastguard Worker            {
1125*8975f5c5SAndroid Build Coastguard Worker                case kAlpha:
1126*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb;
1127*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a * textureColor.a;
1128*8975f5c5SAndroid Build Coastguard Worker                    break;
1129*8975f5c5SAndroid Build Coastguard Worker                case kRGBA:
1130*8975f5c5SAndroid Build Coastguard Worker                case kLuminanceAlpha:
1131*8975f5c5SAndroid Build Coastguard Worker                    res.rgba = texturePrevColor.rgba * textureColor.rgba;
1132*8975f5c5SAndroid Build Coastguard Worker                    break;
1133*8975f5c5SAndroid Build Coastguard Worker                case kRGB:
1134*8975f5c5SAndroid Build Coastguard Worker                case kLuminance:
1135*8975f5c5SAndroid Build Coastguard Worker                default:
1136*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb * textureColor.rgb;
1137*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a;
1138*8975f5c5SAndroid Build Coastguard Worker                    break;
1139*8975f5c5SAndroid Build Coastguard Worker            }
1140*8975f5c5SAndroid Build Coastguard Worker            break;
1141*8975f5c5SAndroid Build Coastguard Worker        case kDecal:
1142*8975f5c5SAndroid Build Coastguard Worker            switch (texFormat)
1143*8975f5c5SAndroid Build Coastguard Worker            {
1144*8975f5c5SAndroid Build Coastguard Worker                case kRGB:
1145*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = textureColor.rgb;
1146*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a;
1147*8975f5c5SAndroid Build Coastguard Worker                    break;
1148*8975f5c5SAndroid Build Coastguard Worker                case kRGBA:
1149*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb * (1.0 - textureColor.a) +
1150*8975f5c5SAndroid Build Coastguard Worker                              textureColor.rgb * textureColor.a;
1151*8975f5c5SAndroid Build Coastguard Worker                    res.a = texturePrevColor.a;
1152*8975f5c5SAndroid Build Coastguard Worker                    break;
1153*8975f5c5SAndroid Build Coastguard Worker                case kAlpha:
1154*8975f5c5SAndroid Build Coastguard Worker                case kLuminance:
1155*8975f5c5SAndroid Build Coastguard Worker                case kLuminanceAlpha:
1156*8975f5c5SAndroid Build Coastguard Worker                default:
1157*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb * textureColor.rgb;
1158*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a;
1159*8975f5c5SAndroid Build Coastguard Worker                    break;
1160*8975f5c5SAndroid Build Coastguard Worker            }
1161*8975f5c5SAndroid Build Coastguard Worker            break;
1162*8975f5c5SAndroid Build Coastguard Worker        case kBlend:
1163*8975f5c5SAndroid Build Coastguard Worker            switch (texFormat)
1164*8975f5c5SAndroid Build Coastguard Worker            {
1165*8975f5c5SAndroid Build Coastguard Worker                case kAlpha:
1166*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb;
1167*8975f5c5SAndroid Build Coastguard Worker                    res.a   = textureColor.a * texturePrevColor.a;
1168*8975f5c5SAndroid Build Coastguard Worker                    break;
1169*8975f5c5SAndroid Build Coastguard Worker                case kLuminance:
1170*8975f5c5SAndroid Build Coastguard Worker                case kRGB:
1171*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb * (1.0 - textureColor.rgb) +
1172*8975f5c5SAndroid Build Coastguard Worker                              textureEnvColor.rgb * textureColor.rgb;
1173*8975f5c5SAndroid Build Coastguard Worker                    res.a = texturePrevColor.a;
1174*8975f5c5SAndroid Build Coastguard Worker                    break;
1175*8975f5c5SAndroid Build Coastguard Worker                case kLuminanceAlpha:
1176*8975f5c5SAndroid Build Coastguard Worker                case kRGBA:
1177*8975f5c5SAndroid Build Coastguard Worker                default:
1178*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb * (1.0 - textureColor.rgb) +
1179*8975f5c5SAndroid Build Coastguard Worker                              textureEnvColor.rgb * textureColor.rgb;
1180*8975f5c5SAndroid Build Coastguard Worker                    res.a = textureColor.a * texturePrevColor.a;
1181*8975f5c5SAndroid Build Coastguard Worker                    break;
1182*8975f5c5SAndroid Build Coastguard Worker            }
1183*8975f5c5SAndroid Build Coastguard Worker            break;
1184*8975f5c5SAndroid Build Coastguard Worker        case kAdd:
1185*8975f5c5SAndroid Build Coastguard Worker            switch (texFormat)
1186*8975f5c5SAndroid Build Coastguard Worker            {
1187*8975f5c5SAndroid Build Coastguard Worker                case kAlpha:
1188*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb;
1189*8975f5c5SAndroid Build Coastguard Worker                    res.a   = textureColor.a * texturePrevColor.a;
1190*8975f5c5SAndroid Build Coastguard Worker                    break;
1191*8975f5c5SAndroid Build Coastguard Worker                case kLuminance:
1192*8975f5c5SAndroid Build Coastguard Worker                case kRGB:
1193*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb + textureColor.rgb;
1194*8975f5c5SAndroid Build Coastguard Worker                    res.a   = texturePrevColor.a;
1195*8975f5c5SAndroid Build Coastguard Worker                    break;
1196*8975f5c5SAndroid Build Coastguard Worker                case kLuminanceAlpha:
1197*8975f5c5SAndroid Build Coastguard Worker                case kRGBA:
1198*8975f5c5SAndroid Build Coastguard Worker                default:
1199*8975f5c5SAndroid Build Coastguard Worker                    res.rgb = texturePrevColor.rgb + textureColor.rgb;
1200*8975f5c5SAndroid Build Coastguard Worker                    res.a   = textureColor.a * texturePrevColor.a;
1201*8975f5c5SAndroid Build Coastguard Worker                    break;
1202*8975f5c5SAndroid Build Coastguard Worker            }
1203*8975f5c5SAndroid Build Coastguard Worker            break;
1204*8975f5c5SAndroid Build Coastguard Worker        case kCombine:
1205*8975f5c5SAndroid Build Coastguard Worker            res = textureCombine(combineRgb, combineAlpha, src0Rgb, src0Alpha, src1Rgb, src1Alpha,
1206*8975f5c5SAndroid Build Coastguard Worker                                 src2Rgb, src2Alpha, op0Rgb, op0Alpha, op1Rgb, op1Alpha, op2Rgb,
1207*8975f5c5SAndroid Build Coastguard Worker                                 op2Alpha, textureEnvColor, rgbScale, alphaScale, vertexColor,
1208*8975f5c5SAndroid Build Coastguard Worker                                 texturePrevColor, textureColor);
1209*8975f5c5SAndroid Build Coastguard Worker            res.rgb *= rgbScale;
1210*8975f5c5SAndroid Build Coastguard Worker            res.a *= alphaScale;
1211*8975f5c5SAndroid Build Coastguard Worker            break;
1212*8975f5c5SAndroid Build Coastguard Worker        default:
1213*8975f5c5SAndroid Build Coastguard Worker            break;
1214*8975f5c5SAndroid Build Coastguard Worker    }
1215*8975f5c5SAndroid Build Coastguard Worker
1216*8975f5c5SAndroid Build Coastguard Worker    return clamp(res, 0.0, 1.0);
1217*8975f5c5SAndroid Build Coastguard Worker}
1218*8975f5c5SAndroid Build Coastguard Worker)";
1219*8975f5c5SAndroid Build Coastguard Worker
1220*8975f5c5SAndroid Build Coastguard Workerconstexpr char kGLES1DrawFShaderMain[] = R"(
1221*8975f5c5SAndroid Build Coastguard Workervoid main()
1222*8975f5c5SAndroid Build Coastguard Worker{
1223*8975f5c5SAndroid Build Coastguard Worker    if (enable_clip_planes && !enable_draw_texture)
1224*8975f5c5SAndroid Build Coastguard Worker    {
1225*8975f5c5SAndroid Build Coastguard Worker        if (!doClipPlaneTest())
1226*8975f5c5SAndroid Build Coastguard Worker        {
1227*8975f5c5SAndroid Build Coastguard Worker            discard;
1228*8975f5c5SAndroid Build Coastguard Worker        }
1229*8975f5c5SAndroid Build Coastguard Worker    }
1230*8975f5c5SAndroid Build Coastguard Worker
1231*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 vertex_color;
1232*8975f5c5SAndroid Build Coastguard Worker
1233*8975f5c5SAndroid Build Coastguard Worker    if (shade_model_flat)
1234*8975f5c5SAndroid Build Coastguard Worker    {
1235*8975f5c5SAndroid Build Coastguard Worker        vertex_color = color_varying_flat;
1236*8975f5c5SAndroid Build Coastguard Worker    }
1237*8975f5c5SAndroid Build Coastguard Worker    else
1238*8975f5c5SAndroid Build Coastguard Worker    {
1239*8975f5c5SAndroid Build Coastguard Worker        vertex_color = color_varying;
1240*8975f5c5SAndroid Build Coastguard Worker    }
1241*8975f5c5SAndroid Build Coastguard Worker
1242*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 currentFragment = vertex_color;
1243*8975f5c5SAndroid Build Coastguard Worker
1244*8975f5c5SAndroid Build Coastguard Worker    mediump vec4 texturePrevColor = currentFragment;
1245*8975f5c5SAndroid Build Coastguard Worker
1246*8975f5c5SAndroid Build Coastguard Worker    for (uint i = 0u; i < kTexUnits; i++)
1247*8975f5c5SAndroid Build Coastguard Worker    {
1248*8975f5c5SAndroid Build Coastguard Worker        mediump vec4 textureColor;
1249*8975f5c5SAndroid Build Coastguard Worker
1250*8975f5c5SAndroid Build Coastguard Worker        if (point_rasterization && point_sprite_enabled &&
1251*8975f5c5SAndroid Build Coastguard Worker            point_sprite_coord_replace[i]) {
1252*8975f5c5SAndroid Build Coastguard Worker            textureColor = getPointSpriteTextureColor(i);
1253*8975f5c5SAndroid Build Coastguard Worker        } else {
1254*8975f5c5SAndroid Build Coastguard Worker            textureColor = getTextureColor(i);
1255*8975f5c5SAndroid Build Coastguard Worker        }
1256*8975f5c5SAndroid Build Coastguard Worker
1257*8975f5c5SAndroid Build Coastguard Worker        currentFragment = textureFunction(
1258*8975f5c5SAndroid Build Coastguard Worker            i, texture_format[i], texture_env_mode[i], combine_rgb[i], combine_alpha[i],
1259*8975f5c5SAndroid Build Coastguard Worker            src0_rgb[i], src0_alpha[i], src1_rgb[i], src1_alpha[i], src2_rgb[i], src2_alpha[i],
1260*8975f5c5SAndroid Build Coastguard Worker            op0_rgb[i], op0_alpha[i], op1_rgb[i], op1_alpha[i], op2_rgb[i], op2_alpha[i],
1261*8975f5c5SAndroid Build Coastguard Worker            texture_env_color[i], texture_env_rgb_scale[i], texture_env_alpha_scale[i],
1262*8975f5c5SAndroid Build Coastguard Worker            vertex_color, texturePrevColor, textureColor);
1263*8975f5c5SAndroid Build Coastguard Worker
1264*8975f5c5SAndroid Build Coastguard Worker        texturePrevColor = currentFragment;
1265*8975f5c5SAndroid Build Coastguard Worker    }
1266*8975f5c5SAndroid Build Coastguard Worker
1267*8975f5c5SAndroid Build Coastguard Worker    if (enable_fog)
1268*8975f5c5SAndroid Build Coastguard Worker    {
1269*8975f5c5SAndroid Build Coastguard Worker        currentFragment = doFog(currentFragment);
1270*8975f5c5SAndroid Build Coastguard Worker    }
1271*8975f5c5SAndroid Build Coastguard Worker
1272*8975f5c5SAndroid Build Coastguard Worker    if (enable_alpha_test && !doAlphaTest(currentFragment))
1273*8975f5c5SAndroid Build Coastguard Worker    {
1274*8975f5c5SAndroid Build Coastguard Worker        discard;
1275*8975f5c5SAndroid Build Coastguard Worker    }
1276*8975f5c5SAndroid Build Coastguard Worker
1277*8975f5c5SAndroid Build Coastguard Worker    frag_color = applyLogicOp(currentFragment);
1278*8975f5c5SAndroid Build Coastguard Worker}
1279*8975f5c5SAndroid Build Coastguard Worker)";
1280