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