Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / compiler / translator / Initialize.cpp
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 }