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
18void 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
598void 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
746void 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