Home | History | Annotate | Download | only in translator
      1 //
      2 // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 //
      8 // Create symbols that declare built-in definitions, add built-ins that
      9 // cannot be expressed in the files, and establish mappings between
     10 // built-in functions and operators.
     11 //
     12 
     13 #include "compiler/translator/Initialize.h"
     14 
     15 #include "compiler/translator/IntermNode.h"
     16 #include "angle_gl.h"
     17 
     18 void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInResources &resources, TSymbolTable &symbolTable)
     19 {
     20     TType *float1 = new TType(EbtFloat);
     21     TType *float2 = new TType(EbtFloat, 2);
     22     TType *float3 = new TType(EbtFloat, 3);
     23     TType *float4 = new TType(EbtFloat, 4);
     24 
     25     TType *int1 = new TType(EbtInt);
     26     TType *int2 = new TType(EbtInt, 2);
     27     TType *int3 = new TType(EbtInt, 3);
     28     TType *int4 = new TType(EbtInt, 4);
     29 
     30     //
     31     // Angle and Trigonometric Functions.
     32     //
     33     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "radians", float1);
     34     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "radians", float2);
     35     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "radians", float3);
     36     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "radians", float4);
     37 
     38     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "degrees", float1);
     39     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "degrees", float2);
     40     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "degrees", float3);
     41     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "degrees", float4);
     42 
     43     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sin", float1);
     44     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sin", float2);
     45     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sin", float3);
     46     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sin", float4);
     47 
     48     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "cos", float1);
     49     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "cos", float2);
     50     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cos", float3);
     51     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "cos", float4);
     52 
     53     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "tan", float1);
     54     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "tan", float2);
     55     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "tan", float3);
     56     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "tan", float4);
     57 
     58     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "asin", float1);
     59     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "asin", float2);
     60     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "asin", float3);
     61     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "asin", float4);
     62 
     63     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "acos", float1);
     64     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "acos", float2);
     65     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "acos", float3);
     66     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "acos", float4);
     67 
     68     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1, float1);
     69     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2, float2);
     70     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3, float3);
     71     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4, float4);
     72 
     73     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1);
     74     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2);
     75     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3);
     76     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4);
     77 
     78     //
     79     // Exponential Functions.
     80     //
     81     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "pow", float1, float1);
     82     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "pow", float2, float2);
     83     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "pow", float3, float3);
     84     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "pow", float4, float4);
     85 
     86     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp", float1);
     87     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp", float2);
     88     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp", float3);
     89     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp", float4);
     90 
     91     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log", float1);
     92     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log", float2);
     93     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log", float3);
     94     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log", float4);
     95 
     96     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp2", float1);
     97     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp2", float2);
     98     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp2", float3);
     99     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp2", float4);
    100 
    101     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log2", float1);
    102     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log2", float2);
    103     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log2", float3);
    104     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log2", float4);
    105 
    106     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sqrt", float1);
    107     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sqrt", float2);
    108     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sqrt", float3);
    109     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sqrt", float4);
    110 
    111     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "inversesqrt", float1);
    112     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "inversesqrt", float2);
    113     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "inversesqrt", float3);
    114     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "inversesqrt", float4);
    115 
    116     //
    117     // Common Functions.
    118     //
    119     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "abs", float1);
    120     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "abs", float2);
    121     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "abs", float3);
    122     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "abs", float4);
    123 
    124     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sign", float1);
    125     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sign", float2);
    126     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sign", float3);
    127     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sign", float4);
    128 
    129     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "floor", float1);
    130     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "floor", float2);
    131     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "floor", float3);
    132     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "floor", float4);
    133 
    134     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "ceil", float1);
    135     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "ceil", float2);
    136     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "ceil", float3);
    137     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "ceil", float4);
    138 
    139     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "fract", float1);
    140     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "fract", float2);
    141     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "fract", float3);
    142     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "fract", float4);
    143 
    144     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mod", float1, float1);
    145     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float1);
    146     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float1);
    147     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float1);
    148     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float2);
    149     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float3);
    150     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float4);
    151 
    152     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "min", float1, float1);
    153     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float1);
    154     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float1);
    155     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float1);
    156     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float2);
    157     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float3);
    158     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float4);
    159 
    160     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "max", float1, float1);
    161     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float1);
    162     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float1);
    163     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float1);
    164     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float2);
    165     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float3);
    166     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float4);
    167 
    168     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "clamp", float1, float1, float1);
    169     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float1, float1);
    170     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float1, float1);
    171     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float1, float1);
    172     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float2, float2);
    173     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float3, float3);
    174     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float4, float4);
    175 
    176     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mix", float1, float1, float1);
    177     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float1);
    178     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float1);
    179     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float1);
    180     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float2);
    181     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float3);
    182     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float4);
    183 
    184     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "step", float1, float1);
    185     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float2, float2);
    186     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float3, float3);
    187     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float4, float4);
    188     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float1, float2);
    189     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float1, float3);
    190     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float1, float4);
    191 
    192     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "smoothstep", float1, float1, float1);
    193     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float2, float2, float2);
    194     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float3, float3, float3);
    195     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float4, float4, float4);
    196     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float1, float1, float2);
    197     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float1, float1, float3);
    198     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float1, float1, float4);
    199 
    200     //
    201     // Geometric Functions.
    202     //
    203     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float1);
    204     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float2);
    205     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float3);
    206     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float4);
    207 
    208     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float1, float1);
    209     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float2, float2);
    210     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float3, float3);
    211     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float4, float4);
    212 
    213     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float1, float1);
    214     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float2, float2);
    215     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float3, float3);
    216     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float4, float4);
    217 
    218     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cross", float3, float3);
    219     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "normalize", float1);
    220     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "normalize", float2);
    221     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "normalize", float3);
    222     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "normalize", float4);
    223 
    224     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "faceforward", float1, float1, float1);
    225     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "faceforward", float2, float2, float2);
    226     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "faceforward", float3, float3, float3);
    227     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "faceforward", float4, float4, float4);
    228 
    229     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "reflect", float1, float1);
    230     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "reflect", float2, float2);
    231     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "reflect", float3, float3);
    232     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "reflect", float4, float4);
    233 
    234     symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "refract", float1, float1, float1);
    235     symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "refract", float2, float2, float1);
    236     symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "refract", float3, float3, float1);
    237     symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "refract", float4, float4, float1);
    238 
    239     TType *mat2 = new TType(EbtFloat, 2, 2);
    240     TType *mat3 = new TType(EbtFloat, 3, 3);
    241     TType *mat4 = new TType(EbtFloat, 4, 4);
    242 
    243     //
    244     // Matrix Functions.
    245     //
    246     symbolTable.insertBuiltIn(COMMON_BUILTINS, mat2, "matrixCompMult", mat2, mat2);
    247     symbolTable.insertBuiltIn(COMMON_BUILTINS, mat3, "matrixCompMult", mat3, mat3);
    248     symbolTable.insertBuiltIn(COMMON_BUILTINS, mat4, "matrixCompMult", mat4, mat4);
    249 
    250     TType *bool1 = new TType(EbtBool);
    251     TType *bool2 = new TType(EbtBool, 2);
    252     TType *bool3 = new TType(EbtBool, 3);
    253     TType *bool4 = new TType(EbtBool, 4);
    254 
    255     //
    256     // Vector relational functions.
    257     //
    258     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", float2, float2);
    259     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", float3, float3);
    260     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", float4, float4);
    261 
    262     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", int2, int2);
    263     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", int3, int3);
    264     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", int4, int4);
    265 
    266     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", float2, float2);
    267     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", float3, float3);
    268     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", float4, float4);
    269 
    270     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", int2, int2);
    271     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", int3, int3);
    272     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", int4, int4);
    273 
    274     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", float2, float2);
    275     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", float3, float3);
    276     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", float4, float4);
    277 
    278     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", int2, int2);
    279     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", int3, int3);
    280     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", int4, int4);
    281 
    282     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", float2, float2);
    283     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", float3, float3);
    284     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", float4, float4);
    285 
    286     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", int2, int2);
    287     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", int3, int3);
    288     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", int4, int4);
    289 
    290     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", float2, float2);
    291     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", float3, float3);
    292     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", float4, float4);
    293 
    294     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", int2, int2);
    295     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", int3, int3);
    296     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", int4, int4);
    297 
    298     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", bool2, bool2);
    299     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", bool3, bool3);
    300     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", bool4, bool4);
    301 
    302     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", float2, float2);
    303     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", float3, float3);
    304     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", float4, float4);
    305 
    306     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", int2, int2);
    307     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", int3, int3);
    308     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", int4, int4);
    309 
    310     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", bool2, bool2);
    311     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", bool3, bool3);
    312     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", bool4, bool4);
    313 
    314     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool2);
    315     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool3);
    316     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool4);
    317 
    318     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool2);
    319     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool3);
    320     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool4);
    321 
    322     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "not", bool2);
    323     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "not", bool3);
    324     symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "not", bool4);
    325 
    326     TType *sampler2D = new TType(EbtSampler2D);
    327     TType *samplerCube = new TType(EbtSamplerCube);
    328 
    329     //
    330     // Texture Functions for GLSL ES 1.0
    331     //
    332     symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2);
    333     symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3);
    334     symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4);
    335     symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3);
    336 
    337     if (resources.OES_EGL_image_external)
    338     {
    339         TType *samplerExternalOES = new TType(EbtSamplerExternalOES);
    340 
    341         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", samplerExternalOES, float2);
    342         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, float3);
    343         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, float4);
    344     }
    345 
    346     if (resources.ARB_texture_rectangle)
    347     {
    348         TType *sampler2DRect = new TType(EbtSampler2DRect);
    349 
    350         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRect", sampler2DRect, float2);
    351         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float3);
    352         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float4);
    353     }
    354 
    355     if (resources.EXT_shader_texture_lod)
    356     {
    357         /* The *Grad* variants are new to both vertex and fragment shaders; the fragment
    358          * shader specific pieces are added separately below.
    359          */
    360         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DGradEXT", sampler2D, float2, float2, float2);
    361         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjGradEXT", sampler2D, float3, float2, float2);
    362         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjGradEXT", sampler2D, float4, float2, float2);
    363         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeGradEXT", samplerCube, float3, float3, float3);
    364     }
    365 
    366     if (type == GL_FRAGMENT_SHADER)
    367     {
    368         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2, float1);
    369         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3, float1);
    370         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4, float1);
    371         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3, float1);
    372 
    373         if (resources.OES_standard_derivatives)
    374         {
    375             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdx", float1);
    376             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdx", float2);
    377             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdx", float3);
    378             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdx", float4);
    379 
    380             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdy", float1);
    381             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdy", float2);
    382             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdy", float3);
    383             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdy", float4);
    384 
    385             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "fwidth", float1);
    386             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "fwidth", float2);
    387             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "fwidth", float3);
    388             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "fwidth", float4);
    389         }
    390 
    391         if (resources.EXT_shader_texture_lod)
    392         {
    393             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLodEXT", sampler2D, float2, float1);
    394             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLodEXT", sampler2D, float3, float1);
    395             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLodEXT", sampler2D, float4, float1);
    396             symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLodEXT", samplerCube, float3, float1);
    397         }
    398     }
    399 
    400     if(type == GL_VERTEX_SHADER)
    401     {
    402         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLod", sampler2D, float2, float1);
    403         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float3, float1);
    404         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float4, float1);
    405         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLod", samplerCube, float3, float1);
    406     }
    407 
    408     TType *gvec4 = new TType(EbtGVec4);
    409 
    410     TType *gsampler2D = new TType(EbtGSampler2D);
    411     TType *gsamplerCube = new TType(EbtGSamplerCube);
    412     TType *gsampler3D = new TType(EbtGSampler3D);
    413     TType *gsampler2DArray = new TType(EbtGSampler2DArray);
    414 
    415     //
    416     // Texture Functions for GLSL ES 3.0
    417     //
    418     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2);
    419     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3);
    420     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3);
    421     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3);
    422     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3);
    423     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4);
    424     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4);
    425     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2D, float2, float1);
    426     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler3D, float3, float1);
    427     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsamplerCube, float3, float1);
    428     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2DArray, float3, float1);
    429 
    430     if (type == GL_FRAGMENT_SHADER)
    431     {
    432         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2, float1);
    433         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3, float1);
    434         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3, float1);
    435         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3, float1);
    436         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3, float1);
    437         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4, float1);
    438         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4, float1);
    439     }
    440 
    441     TType *sampler2DShadow = new TType(EbtSampler2DShadow);
    442     TType *samplerCubeShadow = new TType(EbtSamplerCubeShadow);
    443     TType *sampler2DArrayShadow = new TType(EbtSampler2DArrayShadow);
    444 
    445     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3);
    446     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4);
    447     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DArrayShadow, float4);
    448     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4);
    449     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLod", sampler2DShadow, float3, float1);
    450 
    451     if (type == GL_FRAGMENT_SHADER)
    452     {
    453         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3, float1);
    454         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4, float1);
    455         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4, float1);
    456     }
    457 
    458     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsampler2D, int1);
    459     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler3D, int1);
    460     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsamplerCube, int1);
    461     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler2DArray, int1);
    462     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", sampler2DShadow, int1);
    463     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerCubeShadow, int1);
    464     symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", sampler2DArrayShadow, int1);
    465 
    466     if(type == GL_FRAGMENT_SHADER)
    467     {
    468         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "dFdx", float1);
    469         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "dFdx", float2);
    470         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "dFdx", float3);
    471         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "dFdx", float4);
    472 
    473         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "dFdy", float1);
    474         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "dFdy", float2);
    475         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "dFdy", float3);
    476         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "dFdy", float4);
    477 
    478         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "fwidth", float1);
    479         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "fwidth", float2);
    480         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "fwidth", float3);
    481         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "fwidth", float4);
    482     }
    483 
    484     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2);
    485     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3);
    486     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, int2);
    487     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, int2);
    488 
    489     if(type == GL_FRAGMENT_SHADER)
    490     {
    491         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2, float1);
    492         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3, float1);
    493         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, int2, float1);
    494         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, int2, float1);
    495     }
    496 
    497     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, int2);
    498     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, int2);
    499     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, int3);
    500     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, float4, int2);
    501 
    502     if(type == GL_FRAGMENT_SHADER)
    503     {
    504         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, int2, float1);
    505         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, int2, float1);
    506         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, int3, float1);
    507         symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, float4, int2, float1);
    508     }
    509 
    510     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2D, float2, float1, int2);
    511     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler3D, float3, float1, int3);
    512     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLodOffset", sampler2DShadow, float3, float1, int2);
    513     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2DArray, float3, float1, int2);
    514 
    515     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float3, float1);
    516     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float4, float1);
    517     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler3D, float4, float1);
    518     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLod", sampler2DShadow, float4, float1);
    519 
    520     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float3, float1, int2);
    521     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float4, float1, int2);
    522     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler3D, float4, float1, int3);
    523     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLodOffset", sampler2DShadow, float4, float1, int2);
    524 
    525     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2D, int2, int1);
    526     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler3D, int3, int1);
    527     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2DArray, int3, int1);
    528 
    529     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2D, int2, int1, int2);
    530     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler3D, int3, int1, int3);
    531     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2DArray, int3, int1, int2);
    532 
    533     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2D, float2, float2, float2);
    534     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler3D, float3, float3, float3);
    535     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsamplerCube, float3, float3, float3);
    536     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DShadow, float3, float2, float2);
    537     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", samplerCubeShadow, float4, float3, float3);
    538     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2DArray, float3, float2, float2);
    539     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DArrayShadow, float4, float2, float2);
    540 
    541     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2D, float2, float2, float2, int2);
    542     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler3D, float3, float3, float3, int3);
    543     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DShadow, float3, float2, float2, int2);
    544     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2DArray, float3, float2, float2, int2);
    545     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DArrayShadow, float4, float2, float2, int2);
    546 
    547     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float3, float2, float2);
    548     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float4, float2, float2);
    549     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler3D, float4, float3, float3);
    550     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGrad", sampler2DShadow, float4, float2, float2);
    551 
    552     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float3, float2, float2, int2);
    553     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float4, float2, float2, int2);
    554     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler3D, float4, float3, float3, int3);
    555     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGradOffset", sampler2DShadow, float4, float2, float2, int2);
    556 
    557     //
    558     // Depth range in window coordinates
    559     //
    560     TFieldList *fields = NewPoolTFieldList();
    561     TSourceLoc zeroSourceLoc = {0, 0, 0, 0};
    562     TField *near = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("near"), zeroSourceLoc);
    563     TField *far = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("far"), zeroSourceLoc);
    564     TField *diff = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("diff"), zeroSourceLoc);
    565     fields->push_back(near);
    566     fields->push_back(far);
    567     fields->push_back(diff);
    568     TStructure *depthRangeStruct = new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields);
    569     TVariable *depthRangeParameters = new TVariable(&depthRangeStruct->name(), depthRangeStruct, true);
    570     symbolTable.insert(COMMON_BUILTINS, depthRangeParameters);
    571     TVariable *depthRange = new TVariable(NewPoolTString("gl_DepthRange"), TType(depthRangeStruct));
    572     depthRange->setQualifier(EvqUniform);
    573     symbolTable.insert(COMMON_BUILTINS, depthRange);
    574 
    575     //
    576     // Implementation dependent built-in constants.
    577     //
    578     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs", resources.MaxVertexAttribs);
    579     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors", resources.MaxVertexUniformVectors);
    580     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits", resources.MaxVertexTextureImageUnits);
    581     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits", resources.MaxCombinedTextureImageUnits);
    582     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits", resources.MaxTextureImageUnits);
    583     symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors);
    584 
    585     symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors);
    586 
    587     if (spec != SH_CSS_SHADERS_SPEC)
    588     {
    589         symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers);
    590     }
    591 
    592     symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors", resources.MaxVertexOutputVectors);
    593     symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors", resources.MaxFragmentInputVectors);
    594     symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset", resources.MinProgramTexelOffset);
    595     symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset", resources.MaxProgramTexelOffset);
    596 }
    597 
    598 void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec,
    599                       const ShBuiltInResources &resources,
    600                       TSymbolTable &symbolTable)
    601 {
    602     //
    603     // First, insert some special built-in variables that are not in
    604     // the built-in header files.
    605     //
    606     switch(type) {
    607     case GL_FRAGMENT_SHADER:
    608         symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord,   4)));
    609         symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool,  EbpUndefined, EvqFrontFacing, 1)));
    610         symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord,  2)));
    611 
    612         //
    613         // In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are not available.
    614         // Instead, css_MixColor and css_ColorMatrix are available.
    615         //
    616         if (spec != SH_CSS_SHADERS_SPEC) {
    617             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor,   4)));
    618             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData,    4)));
    619             if (resources.EXT_frag_depth) {
    620                 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragDepthEXT"), TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1)));
    621                 symbolTable.relateToExtension(ESSL1_BUILTINS, "gl_FragDepthEXT", "GL_EXT_frag_depth");
    622             }
    623         } else {
    624             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("css_MixColor"), TType(EbtFloat, EbpMedium, EvqGlobal,      4)));
    625             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("css_ColorMatrix"), TType(EbtFloat, EbpMedium, EvqGlobal,      4, 4)));
    626         }
    627 
    628         break;
    629 
    630     case GL_VERTEX_SHADER:
    631         symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition,    4)));
    632         symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize,   1)));
    633         break;
    634 
    635     default: assert(false && "Language not supported");
    636     }
    637 
    638     //
    639     // Next, identify which built-ins from the already loaded headers have
    640     // a mapping to an operator.  Those that are not identified as such are
    641     // expected to be resolved through a library of functions, versus as
    642     // operations.
    643     //
    644     symbolTable.relateToOperator(COMMON_BUILTINS, "matrixCompMult",   EOpMul);
    645 
    646     symbolTable.relateToOperator(COMMON_BUILTINS, "equal",            EOpVectorEqual);
    647     symbolTable.relateToOperator(COMMON_BUILTINS, "notEqual",         EOpVectorNotEqual);
    648     symbolTable.relateToOperator(COMMON_BUILTINS, "lessThan",         EOpLessThan);
    649     symbolTable.relateToOperator(COMMON_BUILTINS, "greaterThan",      EOpGreaterThan);
    650     symbolTable.relateToOperator(COMMON_BUILTINS, "lessThanEqual",    EOpLessThanEqual);
    651     symbolTable.relateToOperator(COMMON_BUILTINS, "greaterThanEqual", EOpGreaterThanEqual);
    652 
    653     symbolTable.relateToOperator(COMMON_BUILTINS, "radians",      EOpRadians);
    654     symbolTable.relateToOperator(COMMON_BUILTINS, "degrees",      EOpDegrees);
    655     symbolTable.relateToOperator(COMMON_BUILTINS, "sin",          EOpSin);
    656     symbolTable.relateToOperator(COMMON_BUILTINS, "cos",          EOpCos);
    657     symbolTable.relateToOperator(COMMON_BUILTINS, "tan",          EOpTan);
    658     symbolTable.relateToOperator(COMMON_BUILTINS, "asin",         EOpAsin);
    659     symbolTable.relateToOperator(COMMON_BUILTINS, "acos",         EOpAcos);
    660     symbolTable.relateToOperator(COMMON_BUILTINS, "atan",         EOpAtan);
    661 
    662     symbolTable.relateToOperator(COMMON_BUILTINS, "pow",          EOpPow);
    663     symbolTable.relateToOperator(COMMON_BUILTINS, "exp2",         EOpExp2);
    664     symbolTable.relateToOperator(COMMON_BUILTINS, "log",          EOpLog);
    665     symbolTable.relateToOperator(COMMON_BUILTINS, "exp",          EOpExp);
    666     symbolTable.relateToOperator(COMMON_BUILTINS, "log2",         EOpLog2);
    667     symbolTable.relateToOperator(COMMON_BUILTINS, "sqrt",         EOpSqrt);
    668     symbolTable.relateToOperator(COMMON_BUILTINS, "inversesqrt",  EOpInverseSqrt);
    669 
    670     symbolTable.relateToOperator(COMMON_BUILTINS, "abs",          EOpAbs);
    671     symbolTable.relateToOperator(COMMON_BUILTINS, "sign",         EOpSign);
    672     symbolTable.relateToOperator(COMMON_BUILTINS, "floor",        EOpFloor);
    673     symbolTable.relateToOperator(COMMON_BUILTINS, "ceil",         EOpCeil);
    674     symbolTable.relateToOperator(COMMON_BUILTINS, "fract",        EOpFract);
    675     symbolTable.relateToOperator(COMMON_BUILTINS, "mod",          EOpMod);
    676     symbolTable.relateToOperator(COMMON_BUILTINS, "min",          EOpMin);
    677     symbolTable.relateToOperator(COMMON_BUILTINS, "max",          EOpMax);
    678     symbolTable.relateToOperator(COMMON_BUILTINS, "clamp",        EOpClamp);
    679     symbolTable.relateToOperator(COMMON_BUILTINS, "mix",          EOpMix);
    680     symbolTable.relateToOperator(COMMON_BUILTINS, "step",         EOpStep);
    681     symbolTable.relateToOperator(COMMON_BUILTINS, "smoothstep",   EOpSmoothStep);
    682 
    683     symbolTable.relateToOperator(COMMON_BUILTINS, "length",       EOpLength);
    684     symbolTable.relateToOperator(COMMON_BUILTINS, "distance",     EOpDistance);
    685     symbolTable.relateToOperator(COMMON_BUILTINS, "dot",          EOpDot);
    686     symbolTable.relateToOperator(COMMON_BUILTINS, "cross",        EOpCross);
    687     symbolTable.relateToOperator(COMMON_BUILTINS, "normalize",    EOpNormalize);
    688     symbolTable.relateToOperator(COMMON_BUILTINS, "faceforward",  EOpFaceForward);
    689     symbolTable.relateToOperator(COMMON_BUILTINS, "reflect",      EOpReflect);
    690     symbolTable.relateToOperator(COMMON_BUILTINS, "refract",      EOpRefract);
    691 
    692     symbolTable.relateToOperator(COMMON_BUILTINS, "any",          EOpAny);
    693     symbolTable.relateToOperator(COMMON_BUILTINS, "all",          EOpAll);
    694     symbolTable.relateToOperator(COMMON_BUILTINS, "not",          EOpVectorLogicalNot);
    695 
    696     // Map language-specific operators.
    697     switch(type) {
    698     case GL_VERTEX_SHADER:
    699         break;
    700     case GL_FRAGMENT_SHADER:
    701         if (resources.OES_standard_derivatives)
    702         {
    703             symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdx",   EOpDFdx);
    704             symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdy",   EOpDFdy);
    705             symbolTable.relateToOperator(ESSL1_BUILTINS, "fwidth", EOpFwidth);
    706 
    707             symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdx", "GL_OES_standard_derivatives");
    708             symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdy", "GL_OES_standard_derivatives");
    709             symbolTable.relateToExtension(ESSL1_BUILTINS, "fwidth", "GL_OES_standard_derivatives");
    710         }
    711         if (resources.EXT_shader_texture_lod)
    712         {
    713             symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DLodEXT", "GL_EXT_shader_texture_lod");
    714             symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DProjLodEXT", "GL_EXT_shader_texture_lod");
    715             symbolTable.relateToExtension(ESSL1_BUILTINS, "textureCubeLodEXT", "GL_EXT_shader_texture_lod");
    716         }
    717         break;
    718     default: break;
    719     }
    720 
    721     symbolTable.relateToOperator(ESSL3_BUILTINS, "dFdx",   EOpDFdx);
    722     symbolTable.relateToOperator(ESSL3_BUILTINS, "dFdy",   EOpDFdy);
    723     symbolTable.relateToOperator(ESSL3_BUILTINS, "fwidth", EOpFwidth);
    724 
    725     if (resources.EXT_shader_texture_lod)
    726     {
    727         symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DGradEXT", "GL_EXT_shader_texture_lod");
    728         symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DProjGradEXT", "GL_EXT_shader_texture_lod");
    729         symbolTable.relateToExtension(ESSL1_BUILTINS, "textureCubeGradEXT", "GL_EXT_shader_texture_lod");
    730     }
    731 
    732     // Finally add resource-specific variables.
    733     switch(type) {
    734     case GL_FRAGMENT_SHADER:
    735         if (spec != SH_CSS_SHADERS_SPEC) {
    736             // Set up gl_FragData.  The array size.
    737             TType fragData(EbtFloat, EbpMedium, EvqFragData, 4, 1, true);
    738             fragData.setArraySize(resources.MaxDrawBuffers);
    739             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData"), fragData));
    740         }
    741         break;
    742     default: break;
    743     }
    744 }
    745 
    746 void InitExtensionBehavior(const ShBuiltInResources& resources,
    747                            TExtensionBehavior& extBehavior)
    748 {
    749     if (resources.OES_standard_derivatives)
    750         extBehavior["GL_OES_standard_derivatives"] = EBhUndefined;
    751     if (resources.OES_EGL_image_external)
    752         extBehavior["GL_OES_EGL_image_external"] = EBhUndefined;
    753     if (resources.ARB_texture_rectangle)
    754         extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined;
    755     if (resources.EXT_draw_buffers)
    756         extBehavior["GL_EXT_draw_buffers"] = EBhUndefined;
    757     if (resources.EXT_frag_depth)
    758         extBehavior["GL_EXT_frag_depth"] = EBhUndefined;
    759     if (resources.EXT_shader_texture_lod)
    760         extBehavior["GL_EXT_shader_texture_lod"] = EBhUndefined;
    761 }
    762