initial import
[vuplus_webkit] / Source / ThirdParty / ANGLE / src / compiler / Initialize.cpp
1 //
2 // Copyright (c) 2002-2010 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 strings 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/Initialize.h"
14
15 #include "compiler/intermediate.h"
16
17 //============================================================================
18 //
19 // Prototypes for built-in functions seen by both vertex and fragment shaders.
20 //
21 //============================================================================
22 static TString BuiltInFunctionsCommon()
23 {
24     TString s;
25
26     //
27     // Angle and Trigonometric Functions.
28     //
29     s.append(TString("float radians(float degrees);"));
30     s.append(TString("vec2  radians(vec2  degrees);"));
31     s.append(TString("vec3  radians(vec3  degrees);"));
32     s.append(TString("vec4  radians(vec4  degrees);"));
33
34     s.append(TString("float degrees(float radians);"));
35     s.append(TString("vec2  degrees(vec2  radians);"));
36     s.append(TString("vec3  degrees(vec3  radians);"));
37     s.append(TString("vec4  degrees(vec4  radians);"));
38
39     s.append(TString("float sin(float angle);"));
40     s.append(TString("vec2  sin(vec2  angle);"));
41     s.append(TString("vec3  sin(vec3  angle);"));
42     s.append(TString("vec4  sin(vec4  angle);"));
43
44     s.append(TString("float cos(float angle);"));
45     s.append(TString("vec2  cos(vec2  angle);"));
46     s.append(TString("vec3  cos(vec3  angle);"));
47     s.append(TString("vec4  cos(vec4  angle);"));
48
49     s.append(TString("float tan(float angle);"));
50     s.append(TString("vec2  tan(vec2  angle);"));
51     s.append(TString("vec3  tan(vec3  angle);"));
52     s.append(TString("vec4  tan(vec4  angle);"));
53
54     s.append(TString("float asin(float x);"));
55     s.append(TString("vec2  asin(vec2  x);"));
56     s.append(TString("vec3  asin(vec3  x);"));
57     s.append(TString("vec4  asin(vec4  x);"));
58
59     s.append(TString("float acos(float x);"));
60     s.append(TString("vec2  acos(vec2  x);"));
61     s.append(TString("vec3  acos(vec3  x);"));
62     s.append(TString("vec4  acos(vec4  x);"));
63
64     s.append(TString("float atan(float y, float x);"));
65     s.append(TString("vec2  atan(vec2  y, vec2  x);"));
66     s.append(TString("vec3  atan(vec3  y, vec3  x);"));
67     s.append(TString("vec4  atan(vec4  y, vec4  x);"));
68
69     s.append(TString("float atan(float y_over_x);"));
70     s.append(TString("vec2  atan(vec2  y_over_x);"));
71     s.append(TString("vec3  atan(vec3  y_over_x);"));
72     s.append(TString("vec4  atan(vec4  y_over_x);"));
73
74     //
75     // Exponential Functions.
76     //
77     s.append(TString("float pow(float x, float y);"));
78     s.append(TString("vec2  pow(vec2  x, vec2  y);"));
79     s.append(TString("vec3  pow(vec3  x, vec3  y);"));
80     s.append(TString("vec4  pow(vec4  x, vec4  y);"));
81
82     s.append(TString("float exp(float x);"));
83     s.append(TString("vec2  exp(vec2  x);"));
84     s.append(TString("vec3  exp(vec3  x);"));
85     s.append(TString("vec4  exp(vec4  x);"));
86
87     s.append(TString("float log(float x);"));
88     s.append(TString("vec2  log(vec2  x);"));
89     s.append(TString("vec3  log(vec3  x);"));
90     s.append(TString("vec4  log(vec4  x);"));
91
92     s.append(TString("float exp2(float x);"));
93     s.append(TString("vec2  exp2(vec2  x);"));
94     s.append(TString("vec3  exp2(vec3  x);"));
95     s.append(TString("vec4  exp2(vec4  x);"));
96
97     s.append(TString("float log2(float x);"));
98     s.append(TString("vec2  log2(vec2  x);"));
99     s.append(TString("vec3  log2(vec3  x);"));
100     s.append(TString("vec4  log2(vec4  x);"));
101
102     s.append(TString("float sqrt(float x);"));
103     s.append(TString("vec2  sqrt(vec2  x);"));
104     s.append(TString("vec3  sqrt(vec3  x);"));
105     s.append(TString("vec4  sqrt(vec4  x);"));
106
107     s.append(TString("float inversesqrt(float x);"));
108     s.append(TString("vec2  inversesqrt(vec2  x);"));
109     s.append(TString("vec3  inversesqrt(vec3  x);"));
110     s.append(TString("vec4  inversesqrt(vec4  x);"));
111
112     //
113     // Common Functions.
114     //
115     s.append(TString("float abs(float x);"));
116     s.append(TString("vec2  abs(vec2  x);"));
117     s.append(TString("vec3  abs(vec3  x);"));
118     s.append(TString("vec4  abs(vec4  x);"));
119
120     s.append(TString("float sign(float x);"));
121     s.append(TString("vec2  sign(vec2  x);"));
122     s.append(TString("vec3  sign(vec3  x);"));
123     s.append(TString("vec4  sign(vec4  x);"));
124
125     s.append(TString("float floor(float x);"));
126     s.append(TString("vec2  floor(vec2  x);"));
127     s.append(TString("vec3  floor(vec3  x);"));
128     s.append(TString("vec4  floor(vec4  x);"));
129
130     s.append(TString("float ceil(float x);"));
131     s.append(TString("vec2  ceil(vec2  x);"));
132     s.append(TString("vec3  ceil(vec3  x);"));
133     s.append(TString("vec4  ceil(vec4  x);"));
134
135     s.append(TString("float fract(float x);"));
136     s.append(TString("vec2  fract(vec2  x);"));
137     s.append(TString("vec3  fract(vec3  x);"));
138     s.append(TString("vec4  fract(vec4  x);"));
139
140     s.append(TString("float mod(float x, float y);"));
141     s.append(TString("vec2  mod(vec2  x, float y);"));
142     s.append(TString("vec3  mod(vec3  x, float y);"));
143     s.append(TString("vec4  mod(vec4  x, float y);"));
144     s.append(TString("vec2  mod(vec2  x, vec2  y);"));
145     s.append(TString("vec3  mod(vec3  x, vec3  y);"));
146     s.append(TString("vec4  mod(vec4  x, vec4  y);"));
147
148     s.append(TString("float min(float x, float y);"));
149     s.append(TString("vec2  min(vec2  x, float y);"));
150     s.append(TString("vec3  min(vec3  x, float y);"));
151     s.append(TString("vec4  min(vec4  x, float y);"));
152     s.append(TString("vec2  min(vec2  x, vec2  y);"));
153     s.append(TString("vec3  min(vec3  x, vec3  y);"));
154     s.append(TString("vec4  min(vec4  x, vec4  y);"));
155
156     s.append(TString("float max(float x, float y);"));
157     s.append(TString("vec2  max(vec2  x, float y);"));
158     s.append(TString("vec3  max(vec3  x, float y);"));
159     s.append(TString("vec4  max(vec4  x, float y);"));
160     s.append(TString("vec2  max(vec2  x, vec2  y);"));
161     s.append(TString("vec3  max(vec3  x, vec3  y);"));
162     s.append(TString("vec4  max(vec4  x, vec4  y);"));
163
164     s.append(TString("float clamp(float x, float minVal, float maxVal);"));
165     s.append(TString("vec2  clamp(vec2  x, float minVal, float maxVal);"));
166     s.append(TString("vec3  clamp(vec3  x, float minVal, float maxVal);"));
167     s.append(TString("vec4  clamp(vec4  x, float minVal, float maxVal);"));
168     s.append(TString("vec2  clamp(vec2  x, vec2  minVal, vec2  maxVal);"));
169     s.append(TString("vec3  clamp(vec3  x, vec3  minVal, vec3  maxVal);"));
170     s.append(TString("vec4  clamp(vec4  x, vec4  minVal, vec4  maxVal);"));
171
172     s.append(TString("float mix(float x, float y, float a);"));
173     s.append(TString("vec2  mix(vec2  x, vec2  y, float a);"));
174     s.append(TString("vec3  mix(vec3  x, vec3  y, float a);"));
175     s.append(TString("vec4  mix(vec4  x, vec4  y, float a);"));
176     s.append(TString("vec2  mix(vec2  x, vec2  y, vec2  a);"));
177     s.append(TString("vec3  mix(vec3  x, vec3  y, vec3  a);"));
178     s.append(TString("vec4  mix(vec4  x, vec4  y, vec4  a);"));
179
180     s.append(TString("float step(float edge, float x);"));
181     s.append(TString("vec2  step(vec2  edge, vec2  x);"));
182     s.append(TString("vec3  step(vec3  edge, vec3  x);"));
183     s.append(TString("vec4  step(vec4  edge, vec4  x);"));
184     s.append(TString("vec2  step(float edge, vec2  x);"));
185     s.append(TString("vec3  step(float edge, vec3  x);"));
186     s.append(TString("vec4  step(float edge, vec4  x);"));
187
188     s.append(TString("float smoothstep(float edge0, float edge1, float x);"));
189     s.append(TString("vec2  smoothstep(vec2  edge0, vec2  edge1, vec2  x);"));
190     s.append(TString("vec3  smoothstep(vec3  edge0, vec3  edge1, vec3  x);"));
191     s.append(TString("vec4  smoothstep(vec4  edge0, vec4  edge1, vec4  x);"));
192     s.append(TString("vec2  smoothstep(float edge0, float edge1, vec2  x);"));
193     s.append(TString("vec3  smoothstep(float edge0, float edge1, vec3  x);"));
194     s.append(TString("vec4  smoothstep(float edge0, float edge1, vec4  x);"));
195
196     //
197     // Geometric Functions.
198     //
199     s.append(TString("float length(float x);"));
200     s.append(TString("float length(vec2  x);"));
201     s.append(TString("float length(vec3  x);"));
202     s.append(TString("float length(vec4  x);"));
203
204     s.append(TString("float distance(float p0, float p1);"));
205     s.append(TString("float distance(vec2  p0, vec2  p1);"));
206     s.append(TString("float distance(vec3  p0, vec3  p1);"));
207     s.append(TString("float distance(vec4  p0, vec4  p1);"));
208
209     s.append(TString("float dot(float x, float y);"));
210     s.append(TString("float dot(vec2  x, vec2  y);"));
211     s.append(TString("float dot(vec3  x, vec3  y);"));
212     s.append(TString("float dot(vec4  x, vec4  y);"));
213
214     s.append(TString("vec3 cross(vec3 x, vec3 y);"));
215     s.append(TString("float normalize(float x);"));
216     s.append(TString("vec2  normalize(vec2  x);"));
217     s.append(TString("vec3  normalize(vec3  x);"));
218     s.append(TString("vec4  normalize(vec4  x);"));
219
220     s.append(TString("float faceforward(float N, float I, float Nref);"));
221     s.append(TString("vec2  faceforward(vec2  N, vec2  I, vec2  Nref);"));
222     s.append(TString("vec3  faceforward(vec3  N, vec3  I, vec3  Nref);"));
223     s.append(TString("vec4  faceforward(vec4  N, vec4  I, vec4  Nref);"));
224
225     s.append(TString("float reflect(float I, float N);"));
226     s.append(TString("vec2  reflect(vec2  I, vec2  N);"));
227     s.append(TString("vec3  reflect(vec3  I, vec3  N);"));
228     s.append(TString("vec4  reflect(vec4  I, vec4  N);"));
229
230     s.append(TString("float refract(float I, float N, float eta);"));
231     s.append(TString("vec2  refract(vec2  I, vec2  N, float eta);"));
232     s.append(TString("vec3  refract(vec3  I, vec3  N, float eta);"));
233     s.append(TString("vec4  refract(vec4  I, vec4  N, float eta);"));
234
235     //
236     // Matrix Functions.
237     //
238     s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);"));
239     s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);"));
240     s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);"));
241
242     //
243     // Vector relational functions.
244     //
245     s.append(TString("bvec2 lessThan(vec2 x, vec2 y);"));
246     s.append(TString("bvec3 lessThan(vec3 x, vec3 y);"));
247     s.append(TString("bvec4 lessThan(vec4 x, vec4 y);"));
248
249     s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);"));
250     s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);"));
251     s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);"));
252
253     s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);"));
254     s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);"));
255     s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);"));
256
257     s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);"));
258     s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);"));
259     s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);"));
260
261     s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);"));
262     s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);"));
263     s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);"));
264
265     s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);"));
266     s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);"));
267     s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);"));
268
269     s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);"));
270     s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);"));
271     s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);"));
272
273     s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);"));
274     s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);"));
275     s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);"));
276
277     s.append(TString("bvec2 equal(vec2 x, vec2 y);"));
278     s.append(TString("bvec3 equal(vec3 x, vec3 y);"));
279     s.append(TString("bvec4 equal(vec4 x, vec4 y);"));
280
281     s.append(TString("bvec2 equal(ivec2 x, ivec2 y);"));
282     s.append(TString("bvec3 equal(ivec3 x, ivec3 y);"));
283     s.append(TString("bvec4 equal(ivec4 x, ivec4 y);"));
284
285     s.append(TString("bvec2 equal(bvec2 x, bvec2 y);"));
286     s.append(TString("bvec3 equal(bvec3 x, bvec3 y);"));
287     s.append(TString("bvec4 equal(bvec4 x, bvec4 y);"));
288
289     s.append(TString("bvec2 notEqual(vec2 x, vec2 y);"));
290     s.append(TString("bvec3 notEqual(vec3 x, vec3 y);"));
291     s.append(TString("bvec4 notEqual(vec4 x, vec4 y);"));
292
293     s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);"));
294     s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);"));
295     s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);"));
296
297     s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);"));
298     s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);"));
299     s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);"));
300
301     s.append(TString("bool any(bvec2 x);"));
302     s.append(TString("bool any(bvec3 x);"));
303     s.append(TString("bool any(bvec4 x);"));
304
305     s.append(TString("bool all(bvec2 x);"));
306     s.append(TString("bool all(bvec3 x);"));
307     s.append(TString("bool all(bvec4 x);"));
308
309     s.append(TString("bvec2 not(bvec2 x);"));
310     s.append(TString("bvec3 not(bvec3 x);"));
311     s.append(TString("bvec4 not(bvec4 x);"));
312
313     //
314     // Noise functions.
315     //
316     //s.append(TString("float noise1(float x);"));
317     //s.append(TString("float noise1(vec2  x);"));
318     //s.append(TString("float noise1(vec3  x);"));
319     //s.append(TString("float noise1(vec4  x);"));
320
321     //s.append(TString("vec2 noise2(float x);"));
322     //s.append(TString("vec2 noise2(vec2  x);"));
323     //s.append(TString("vec2 noise2(vec3  x);"));
324     //s.append(TString("vec2 noise2(vec4  x);"));
325
326     //s.append(TString("vec3 noise3(float x);"));
327     //s.append(TString("vec3 noise3(vec2  x);"));
328     //s.append(TString("vec3 noise3(vec3  x);"));
329     //s.append(TString("vec3 noise3(vec4  x);"));
330
331     //s.append(TString("vec4 noise4(float x);"));
332     //s.append(TString("vec4 noise4(vec2  x);"));
333     //s.append(TString("vec4 noise4(vec3  x);"));
334     //s.append(TString("vec4 noise4(vec4  x);"));
335
336     return s;
337 }
338
339 //============================================================================
340 //
341 // Prototypes for built-in functions seen by vertex shaders only.
342 //
343 //============================================================================
344 static TString BuiltInFunctionsVertex(const ShBuiltInResources& resources)
345 {
346     TString s;
347
348     //
349     // Geometric Functions.
350     //
351     //s.append(TString("vec4 ftransform();"));
352
353     //
354     // Texture Functions.
355     //
356     s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
357     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
358     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
359     s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
360
361     s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);"));
362     s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);"));
363     s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);"));
364     s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);"));
365
366     return s;
367 }
368
369 //============================================================================
370 //
371 // Prototypes for built-in functions seen by fragment shaders only.
372 //
373 //============================================================================
374 static TString BuiltInFunctionsFragment(const ShBuiltInResources& resources)
375 {
376     TString s;
377
378     //
379     // Texture Functions.
380     //
381     s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
382     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
383     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
384     s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
385
386     s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);"));
387     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);"));
388     s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);"));
389     s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);"));
390
391     if (resources.OES_standard_derivatives) {
392         s.append(TString("float dFdx(float p);"));
393         s.append(TString("vec2  dFdx(vec2  p);"));
394         s.append(TString("vec3  dFdx(vec3  p);"));
395         s.append(TString("vec4  dFdx(vec4  p);"));
396
397         s.append(TString("float dFdy(float p);"));
398         s.append(TString("vec2  dFdy(vec2  p);"));
399         s.append(TString("vec3  dFdy(vec3  p);"));
400         s.append(TString("vec4  dFdy(vec4  p);"));
401
402         s.append(TString("float fwidth(float p);"));
403         s.append(TString("vec2  fwidth(vec2  p);"));
404         s.append(TString("vec3  fwidth(vec3  p);"));
405         s.append(TString("vec4  fwidth(vec4  p);"));
406     }
407
408     return s;
409 }
410
411 //============================================================================
412 //
413 // Standard uniforms.
414 //
415 //============================================================================
416 static TString StandardUniforms()
417 {
418     TString s;
419
420     //
421     // Depth range in window coordinates
422     //
423     s.append(TString("struct gl_DepthRangeParameters {"));
424     s.append(TString("    highp float near;"));        // n
425     s.append(TString("    highp float far;"));         // f
426     s.append(TString("    highp float diff;"));        // f - n
427     s.append(TString("};"));
428     s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;"));
429
430     return s;
431 }
432
433 //============================================================================
434 //
435 // Default precision for vertex shaders.
436 //
437 //============================================================================
438 static TString DefaultPrecisionVertex()
439 {
440     TString s;
441
442     s.append(TString("precision highp int;"));
443     s.append(TString("precision highp float;"));
444
445     return s;
446 }
447
448 //============================================================================
449 //
450 // Default precision for fragment shaders.
451 //
452 //============================================================================
453 static TString DefaultPrecisionFragment()
454 {
455     TString s;
456
457     s.append(TString("precision mediump int;"));
458     // No default precision for float in fragment shaders
459
460     return s;
461 }
462
463 //============================================================================
464 //
465 // Implementation dependent built-in constants.
466 //
467 //============================================================================
468 static TString BuiltInConstants(const ShBuiltInResources &resources)
469 {
470     TStringStream s;
471
472     s << "const int gl_MaxVertexAttribs = " << resources.MaxVertexAttribs << ";";
473     s << "const int gl_MaxVertexUniformVectors = " << resources.MaxVertexUniformVectors << ";";
474
475     s << "const int gl_MaxVaryingVectors = " << resources.MaxVaryingVectors << ";";
476     s << "const int gl_MaxVertexTextureImageUnits = " << resources.MaxVertexTextureImageUnits << ";";
477     s << "const int gl_MaxCombinedTextureImageUnits = " << resources.MaxCombinedTextureImageUnits << ";";
478     s << "const int gl_MaxTextureImageUnits = " << resources.MaxTextureImageUnits << ";";
479     s << "const int gl_MaxFragmentUniformVectors = " << resources.MaxFragmentUniformVectors << ";";
480     s << "const int gl_MaxDrawBuffers = " << resources.MaxDrawBuffers << ";";
481
482     return s.str();
483 }
484
485 void TBuiltIns::initialize(ShShaderType type, ShShaderSpec spec,
486                            const ShBuiltInResources& resources)
487 {
488     switch (type) {
489     case SH_FRAGMENT_SHADER:
490         builtInStrings.push_back(DefaultPrecisionFragment());
491         builtInStrings.push_back(BuiltInFunctionsCommon());
492         builtInStrings.push_back(BuiltInFunctionsFragment(resources));
493         builtInStrings.push_back(StandardUniforms());
494         break;
495
496     case SH_VERTEX_SHADER:
497         builtInStrings.push_back(DefaultPrecisionVertex());
498         builtInStrings.push_back(BuiltInFunctionsCommon());
499         builtInStrings.push_back(BuiltInFunctionsVertex(resources));
500         builtInStrings.push_back(StandardUniforms());
501         break;
502
503     default: assert(false && "Language not supported");
504     }
505
506     builtInStrings.push_back(BuiltInConstants(resources));
507 }
508
509 void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
510                       const ShBuiltInResources& resources,
511                       TSymbolTable& symbolTable)
512 {
513     //
514     // First, insert some special built-in variables that are not in 
515     // the built-in header files.
516     //
517     switch(type) {
518     case SH_FRAGMENT_SHADER:
519         symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"),                   TType(EbtFloat, EbpMedium, EvqFragCoord,   4)));
520         symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"),                 TType(EbtBool,  EbpUndefined, EvqFrontFacing, 1)));
521         symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),                   TType(EbtFloat, EbpMedium, EvqFragColor,   4)));
522         symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData,    4)));
523         symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"),                  TType(EbtFloat, EbpMedium, EvqPointCoord,  2)));
524         break;
525
526     case SH_VERTEX_SHADER:
527         symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"),    TType(EbtFloat, EbpHigh, EvqPosition,    4)));
528         symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"),   TType(EbtFloat, EbpMedium, EvqPointSize,   1)));
529         break;
530
531     default: assert(false && "Language not supported");
532     }
533
534     //
535     // Next, identify which built-ins from the already loaded headers have
536     // a mapping to an operator.  Those that are not identified as such are
537     // expected to be resolved through a library of functions, versus as
538     // operations.
539     //
540     symbolTable.relateToOperator("not",              EOpVectorLogicalNot);
541
542     symbolTable.relateToOperator("matrixCompMult",   EOpMul);
543
544     symbolTable.relateToOperator("equal",            EOpVectorEqual);
545     symbolTable.relateToOperator("notEqual",         EOpVectorNotEqual);
546     symbolTable.relateToOperator("lessThan",         EOpLessThan);
547     symbolTable.relateToOperator("greaterThan",      EOpGreaterThan);
548     symbolTable.relateToOperator("lessThanEqual",    EOpLessThanEqual);
549     symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
550     
551     symbolTable.relateToOperator("radians",      EOpRadians);
552     symbolTable.relateToOperator("degrees",      EOpDegrees);
553     symbolTable.relateToOperator("sin",          EOpSin);
554     symbolTable.relateToOperator("cos",          EOpCos);
555     symbolTable.relateToOperator("tan",          EOpTan);
556     symbolTable.relateToOperator("asin",         EOpAsin);
557     symbolTable.relateToOperator("acos",         EOpAcos);
558     symbolTable.relateToOperator("atan",         EOpAtan);
559
560     symbolTable.relateToOperator("pow",          EOpPow);
561     symbolTable.relateToOperator("exp2",         EOpExp2);
562     symbolTable.relateToOperator("log",          EOpLog);
563     symbolTable.relateToOperator("exp",          EOpExp);
564     symbolTable.relateToOperator("log2",         EOpLog2);
565     symbolTable.relateToOperator("sqrt",         EOpSqrt);
566     symbolTable.relateToOperator("inversesqrt",  EOpInverseSqrt);
567
568     symbolTable.relateToOperator("abs",          EOpAbs);
569     symbolTable.relateToOperator("sign",         EOpSign);
570     symbolTable.relateToOperator("floor",        EOpFloor);
571     symbolTable.relateToOperator("ceil",         EOpCeil);
572     symbolTable.relateToOperator("fract",        EOpFract);
573     symbolTable.relateToOperator("mod",          EOpMod);
574     symbolTable.relateToOperator("min",          EOpMin);
575     symbolTable.relateToOperator("max",          EOpMax);
576     symbolTable.relateToOperator("clamp",        EOpClamp);
577     symbolTable.relateToOperator("mix",          EOpMix);
578     symbolTable.relateToOperator("step",         EOpStep);
579     symbolTable.relateToOperator("smoothstep",   EOpSmoothStep);
580
581     symbolTable.relateToOperator("length",       EOpLength);
582     symbolTable.relateToOperator("distance",     EOpDistance);
583     symbolTable.relateToOperator("dot",          EOpDot);
584     symbolTable.relateToOperator("cross",        EOpCross);
585     symbolTable.relateToOperator("normalize",    EOpNormalize);
586     symbolTable.relateToOperator("faceforward",  EOpFaceForward);
587     symbolTable.relateToOperator("reflect",      EOpReflect);
588     symbolTable.relateToOperator("refract",      EOpRefract);
589     
590     symbolTable.relateToOperator("any",          EOpAny);
591     symbolTable.relateToOperator("all",          EOpAll);
592
593     // Map language-specific operators.
594     switch(type) {
595     case SH_VERTEX_SHADER:
596         break;
597     case SH_FRAGMENT_SHADER:
598         if (resources.OES_standard_derivatives) {
599             symbolTable.relateToOperator("dFdx",   EOpDFdx);
600             symbolTable.relateToOperator("dFdy",   EOpDFdy);
601             symbolTable.relateToOperator("fwidth", EOpFwidth);
602
603             symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives");
604             symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives");
605             symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives");
606         }
607         break;
608     default: break;
609     }
610
611     // Finally add resource-specific variables.
612     switch(type) {
613     case SH_FRAGMENT_SHADER: {
614             // Set up gl_FragData.  The array size.
615             TType fragData(EbtFloat, EbpMedium, EvqFragColor,   4, false, true);
616             fragData.setArraySize(resources.MaxDrawBuffers);
617             symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"),    fragData));
618         }
619         break;
620     default: break;
621     }
622 }
623
624 void InitExtensionBehavior(const ShBuiltInResources& resources,
625                            TExtensionBehavior& extBehavior)
626 {
627     if (resources.OES_standard_derivatives)
628         extBehavior["GL_OES_standard_derivatives"] = EBhDisable;
629 }