1 //
2 // Copyright (c) 2002-2013 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
InsertBuiltInFunctions(ShShaderType type,ShShaderSpec spec,const ShBuiltInResources & resources,TSymbolTable & symbolTable)17 void InsertBuiltInFunctions(ShShaderType type, ShShaderSpec spec, const ShBuiltInResources &resources, TSymbolTable &symbolTable)
18 {
19 TType *float1 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 1);
20 TType *float2 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 2);
21 TType *float3 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 3);
22 TType *float4 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 4);
23
24 TType *int2 = new TType(EbtInt, EbpUndefined, EvqGlobal, 2);
25 TType *int3 = new TType(EbtInt, EbpUndefined, EvqGlobal, 3);
26 TType *int4 = new TType(EbtInt, EbpUndefined, EvqGlobal, 4);
27
28 //
29 // Angle and Trigonometric Functions.
30 //
31 symbolTable.insertBuiltIn(float1, "radians", float1);
32 symbolTable.insertBuiltIn(float2, "radians", float2);
33 symbolTable.insertBuiltIn(float3, "radians", float3);
34 symbolTable.insertBuiltIn(float4, "radians", float4);
35
36 symbolTable.insertBuiltIn(float1, "degrees", float1);
37 symbolTable.insertBuiltIn(float2, "degrees", float2);
38 symbolTable.insertBuiltIn(float3, "degrees", float3);
39 symbolTable.insertBuiltIn(float4, "degrees", float4);
40
41 symbolTable.insertBuiltIn(float1, "sin", float1);
42 symbolTable.insertBuiltIn(float2, "sin", float2);
43 symbolTable.insertBuiltIn(float3, "sin", float3);
44 symbolTable.insertBuiltIn(float4, "sin", float4);
45
46 symbolTable.insertBuiltIn(float1, "cos", float1);
47 symbolTable.insertBuiltIn(float2, "cos", float2);
48 symbolTable.insertBuiltIn(float3, "cos", float3);
49 symbolTable.insertBuiltIn(float4, "cos", float4);
50
51 symbolTable.insertBuiltIn(float1, "tan", float1);
52 symbolTable.insertBuiltIn(float2, "tan", float2);
53 symbolTable.insertBuiltIn(float3, "tan", float3);
54 symbolTable.insertBuiltIn(float4, "tan", float4);
55
56 symbolTable.insertBuiltIn(float1, "asin", float1);
57 symbolTable.insertBuiltIn(float2, "asin", float2);
58 symbolTable.insertBuiltIn(float3, "asin", float3);
59 symbolTable.insertBuiltIn(float4, "asin", float4);
60
61 symbolTable.insertBuiltIn(float1, "acos", float1);
62 symbolTable.insertBuiltIn(float2, "acos", float2);
63 symbolTable.insertBuiltIn(float3, "acos", float3);
64 symbolTable.insertBuiltIn(float4, "acos", float4);
65
66 symbolTable.insertBuiltIn(float1, "atan", float1, float1);
67 symbolTable.insertBuiltIn(float2, "atan", float2, float2);
68 symbolTable.insertBuiltIn(float3, "atan", float3, float3);
69 symbolTable.insertBuiltIn(float4, "atan", float4, float4);
70
71 symbolTable.insertBuiltIn(float1, "atan", float1);
72 symbolTable.insertBuiltIn(float2, "atan", float2);
73 symbolTable.insertBuiltIn(float3, "atan", float3);
74 symbolTable.insertBuiltIn(float4, "atan", float4);
75
76 //
77 // Exponential Functions.
78 //
79 symbolTable.insertBuiltIn(float1, "pow", float1, float1);
80 symbolTable.insertBuiltIn(float2, "pow", float2, float2);
81 symbolTable.insertBuiltIn(float3, "pow", float3, float3);
82 symbolTable.insertBuiltIn(float4, "pow", float4, float4);
83
84 symbolTable.insertBuiltIn(float1, "exp", float1);
85 symbolTable.insertBuiltIn(float2, "exp", float2);
86 symbolTable.insertBuiltIn(float3, "exp", float3);
87 symbolTable.insertBuiltIn(float4, "exp", float4);
88
89 symbolTable.insertBuiltIn(float1, "log", float1);
90 symbolTable.insertBuiltIn(float2, "log", float2);
91 symbolTable.insertBuiltIn(float3, "log", float3);
92 symbolTable.insertBuiltIn(float4, "log", float4);
93
94 symbolTable.insertBuiltIn(float1, "exp2", float1);
95 symbolTable.insertBuiltIn(float2, "exp2", float2);
96 symbolTable.insertBuiltIn(float3, "exp2", float3);
97 symbolTable.insertBuiltIn(float4, "exp2", float4);
98
99 symbolTable.insertBuiltIn(float1, "log2", float1);
100 symbolTable.insertBuiltIn(float2, "log2", float2);
101 symbolTable.insertBuiltIn(float3, "log2", float3);
102 symbolTable.insertBuiltIn(float4, "log2", float4);
103
104 symbolTable.insertBuiltIn(float1, "sqrt", float1);
105 symbolTable.insertBuiltIn(float2, "sqrt", float2);
106 symbolTable.insertBuiltIn(float3, "sqrt", float3);
107 symbolTable.insertBuiltIn(float4, "sqrt", float4);
108
109 symbolTable.insertBuiltIn(float1, "inversesqrt", float1);
110 symbolTable.insertBuiltIn(float2, "inversesqrt", float2);
111 symbolTable.insertBuiltIn(float3, "inversesqrt", float3);
112 symbolTable.insertBuiltIn(float4, "inversesqrt", float4);
113
114 //
115 // Common Functions.
116 //
117 symbolTable.insertBuiltIn(float1, "abs", float1);
118 symbolTable.insertBuiltIn(float2, "abs", float2);
119 symbolTable.insertBuiltIn(float3, "abs", float3);
120 symbolTable.insertBuiltIn(float4, "abs", float4);
121
122 symbolTable.insertBuiltIn(float1, "sign", float1);
123 symbolTable.insertBuiltIn(float2, "sign", float2);
124 symbolTable.insertBuiltIn(float3, "sign", float3);
125 symbolTable.insertBuiltIn(float4, "sign", float4);
126
127 symbolTable.insertBuiltIn(float1, "floor", float1);
128 symbolTable.insertBuiltIn(float2, "floor", float2);
129 symbolTable.insertBuiltIn(float3, "floor", float3);
130 symbolTable.insertBuiltIn(float4, "floor", float4);
131
132 symbolTable.insertBuiltIn(float1, "ceil", float1);
133 symbolTable.insertBuiltIn(float2, "ceil", float2);
134 symbolTable.insertBuiltIn(float3, "ceil", float3);
135 symbolTable.insertBuiltIn(float4, "ceil", float4);
136
137 symbolTable.insertBuiltIn(float1, "fract", float1);
138 symbolTable.insertBuiltIn(float2, "fract", float2);
139 symbolTable.insertBuiltIn(float3, "fract", float3);
140 symbolTable.insertBuiltIn(float4, "fract", float4);
141
142 symbolTable.insertBuiltIn(float1, "mod", float1, float1);
143 symbolTable.insertBuiltIn(float2, "mod", float2, float1);
144 symbolTable.insertBuiltIn(float3, "mod", float3, float1);
145 symbolTable.insertBuiltIn(float4, "mod", float4, float1);
146 symbolTable.insertBuiltIn(float2, "mod", float2, float2);
147 symbolTable.insertBuiltIn(float3, "mod", float3, float3);
148 symbolTable.insertBuiltIn(float4, "mod", float4, float4);
149
150 symbolTable.insertBuiltIn(float1, "min", float1, float1);
151 symbolTable.insertBuiltIn(float2, "min", float2, float1);
152 symbolTable.insertBuiltIn(float3, "min", float3, float1);
153 symbolTable.insertBuiltIn(float4, "min", float4, float1);
154 symbolTable.insertBuiltIn(float2, "min", float2, float2);
155 symbolTable.insertBuiltIn(float3, "min", float3, float3);
156 symbolTable.insertBuiltIn(float4, "min", float4, float4);
157
158 symbolTable.insertBuiltIn(float1, "max", float1, float1);
159 symbolTable.insertBuiltIn(float2, "max", float2, float1);
160 symbolTable.insertBuiltIn(float3, "max", float3, float1);
161 symbolTable.insertBuiltIn(float4, "max", float4, float1);
162 symbolTable.insertBuiltIn(float2, "max", float2, float2);
163 symbolTable.insertBuiltIn(float3, "max", float3, float3);
164 symbolTable.insertBuiltIn(float4, "max", float4, float4);
165
166 symbolTable.insertBuiltIn(float1, "clamp", float1, float1, float1);
167 symbolTable.insertBuiltIn(float2, "clamp", float2, float1, float1);
168 symbolTable.insertBuiltIn(float3, "clamp", float3, float1, float1);
169 symbolTable.insertBuiltIn(float4, "clamp", float4, float1, float1);
170 symbolTable.insertBuiltIn(float2, "clamp", float2, float2, float2);
171 symbolTable.insertBuiltIn(float3, "clamp", float3, float3, float3);
172 symbolTable.insertBuiltIn(float4, "clamp", float4, float4, float4);
173
174 symbolTable.insertBuiltIn(float1, "mix", float1, float1, float1);
175 symbolTable.insertBuiltIn(float2, "mix", float2, float2, float1);
176 symbolTable.insertBuiltIn(float3, "mix", float3, float3, float1);
177 symbolTable.insertBuiltIn(float4, "mix", float4, float4, float1);
178 symbolTable.insertBuiltIn(float2, "mix", float2, float2, float2);
179 symbolTable.insertBuiltIn(float3, "mix", float3, float3, float3);
180 symbolTable.insertBuiltIn(float4, "mix", float4, float4, float4);
181
182 symbolTable.insertBuiltIn(float1, "step", float1, float1);
183 symbolTable.insertBuiltIn(float2, "step", float2, float2);
184 symbolTable.insertBuiltIn(float3, "step", float3, float3);
185 symbolTable.insertBuiltIn(float4, "step", float4, float4);
186 symbolTable.insertBuiltIn(float2, "step", float1, float2);
187 symbolTable.insertBuiltIn(float3, "step", float1, float3);
188 symbolTable.insertBuiltIn(float4, "step", float1, float4);
189
190 symbolTable.insertBuiltIn(float1, "smoothstep", float1, float1, float1);
191 symbolTable.insertBuiltIn(float2, "smoothstep", float2, float2, float2);
192 symbolTable.insertBuiltIn(float3, "smoothstep", float3, float3, float3);
193 symbolTable.insertBuiltIn(float4, "smoothstep", float4, float4, float4);
194 symbolTable.insertBuiltIn(float2, "smoothstep", float1, float1, float2);
195 symbolTable.insertBuiltIn(float3, "smoothstep", float1, float1, float3);
196 symbolTable.insertBuiltIn(float4, "smoothstep", float1, float1, float4);
197
198 //
199 // Geometric Functions.
200 //
201 symbolTable.insertBuiltIn(float1, "length", float1);
202 symbolTable.insertBuiltIn(float1, "length", float2);
203 symbolTable.insertBuiltIn(float1, "length", float3);
204 symbolTable.insertBuiltIn(float1, "length", float4);
205
206 symbolTable.insertBuiltIn(float1, "distance", float1, float1);
207 symbolTable.insertBuiltIn(float1, "distance", float2, float2);
208 symbolTable.insertBuiltIn(float1, "distance", float3, float3);
209 symbolTable.insertBuiltIn(float1, "distance", float4, float4);
210
211 symbolTable.insertBuiltIn(float1, "dot", float1, float1);
212 symbolTable.insertBuiltIn(float1, "dot", float2, float2);
213 symbolTable.insertBuiltIn(float1, "dot", float3, float3);
214 symbolTable.insertBuiltIn(float1, "dot", float4, float4);
215
216 symbolTable.insertBuiltIn(float3, "cross", float3, float3);
217 symbolTable.insertBuiltIn(float1, "normalize", float1);
218 symbolTable.insertBuiltIn(float2, "normalize", float2);
219 symbolTable.insertBuiltIn(float3, "normalize", float3);
220 symbolTable.insertBuiltIn(float4, "normalize", float4);
221
222 symbolTable.insertBuiltIn(float1, "faceforward", float1, float1, float1);
223 symbolTable.insertBuiltIn(float2, "faceforward", float2, float2, float2);
224 symbolTable.insertBuiltIn(float3, "faceforward", float3, float3, float3);
225 symbolTable.insertBuiltIn(float4, "faceforward", float4, float4, float4);
226
227 symbolTable.insertBuiltIn(float1, "reflect", float1, float1);
228 symbolTable.insertBuiltIn(float2, "reflect", float2, float2);
229 symbolTable.insertBuiltIn(float3, "reflect", float3, float3);
230 symbolTable.insertBuiltIn(float4, "reflect", float4, float4);
231
232 symbolTable.insertBuiltIn(float1, "refract", float1, float1, float1);
233 symbolTable.insertBuiltIn(float2, "refract", float2, float2, float1);
234 symbolTable.insertBuiltIn(float3, "refract", float3, float3, float1);
235 symbolTable.insertBuiltIn(float4, "refract", float4, float4, float1);
236
237 TType *mat2 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 2, true);
238 TType *mat3 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 3, true);
239 TType *mat4 = new TType(EbtFloat, EbpUndefined, EvqGlobal, 4, true);
240
241 //
242 // Matrix Functions.
243 //
244 symbolTable.insertBuiltIn(mat2, "matrixCompMult", mat2, mat2);
245 symbolTable.insertBuiltIn(mat3, "matrixCompMult", mat3, mat3);
246 symbolTable.insertBuiltIn(mat4, "matrixCompMult", mat4, mat4);
247
248 TType *bool1 = new TType(EbtBool, EbpUndefined, EvqGlobal, 1);
249 TType *bool2 = new TType(EbtBool, EbpUndefined, EvqGlobal, 2);
250 TType *bool3 = new TType(EbtBool, EbpUndefined, EvqGlobal, 3);
251 TType *bool4 = new TType(EbtBool, EbpUndefined, EvqGlobal, 4);
252
253 //
254 // Vector relational functions.
255 //
256 symbolTable.insertBuiltIn(bool2, "lessThan", float2, float2);
257 symbolTable.insertBuiltIn(bool3, "lessThan", float3, float3);
258 symbolTable.insertBuiltIn(bool4, "lessThan", float4, float4);
259
260 symbolTable.insertBuiltIn(bool2, "lessThan", int2, int2);
261 symbolTable.insertBuiltIn(bool3, "lessThan", int3, int3);
262 symbolTable.insertBuiltIn(bool4, "lessThan", int4, int4);
263
264 symbolTable.insertBuiltIn(bool2, "lessThanEqual", float2, float2);
265 symbolTable.insertBuiltIn(bool3, "lessThanEqual", float3, float3);
266 symbolTable.insertBuiltIn(bool4, "lessThanEqual", float4, float4);
267
268 symbolTable.insertBuiltIn(bool2, "lessThanEqual", int2, int2);
269 symbolTable.insertBuiltIn(bool3, "lessThanEqual", int3, int3);
270 symbolTable.insertBuiltIn(bool4, "lessThanEqual", int4, int4);
271
272 symbolTable.insertBuiltIn(bool2, "greaterThan", float2, float2);
273 symbolTable.insertBuiltIn(bool3, "greaterThan", float3, float3);
274 symbolTable.insertBuiltIn(bool4, "greaterThan", float4, float4);
275
276 symbolTable.insertBuiltIn(bool2, "greaterThan", int2, int2);
277 symbolTable.insertBuiltIn(bool3, "greaterThan", int3, int3);
278 symbolTable.insertBuiltIn(bool4, "greaterThan", int4, int4);
279
280 symbolTable.insertBuiltIn(bool2, "greaterThanEqual", float2, float2);
281 symbolTable.insertBuiltIn(bool3, "greaterThanEqual", float3, float3);
282 symbolTable.insertBuiltIn(bool4, "greaterThanEqual", float4, float4);
283
284 symbolTable.insertBuiltIn(bool2, "greaterThanEqual", int2, int2);
285 symbolTable.insertBuiltIn(bool3, "greaterThanEqual", int3, int3);
286 symbolTable.insertBuiltIn(bool4, "greaterThanEqual", int4, int4);
287
288 symbolTable.insertBuiltIn(bool2, "equal", float2, float2);
289 symbolTable.insertBuiltIn(bool3, "equal", float3, float3);
290 symbolTable.insertBuiltIn(bool4, "equal", float4, float4);
291
292 symbolTable.insertBuiltIn(bool2, "equal", int2, int2);
293 symbolTable.insertBuiltIn(bool3, "equal", int3, int3);
294 symbolTable.insertBuiltIn(bool4, "equal", int4, int4);
295
296 symbolTable.insertBuiltIn(bool2, "equal", bool2, bool2);
297 symbolTable.insertBuiltIn(bool3, "equal", bool3, bool3);
298 symbolTable.insertBuiltIn(bool4, "equal", bool4, bool4);
299
300 symbolTable.insertBuiltIn(bool2, "notEqual", float2, float2);
301 symbolTable.insertBuiltIn(bool3, "notEqual", float3, float3);
302 symbolTable.insertBuiltIn(bool4, "notEqual", float4, float4);
303
304 symbolTable.insertBuiltIn(bool2, "notEqual", int2, int2);
305 symbolTable.insertBuiltIn(bool3, "notEqual", int3, int3);
306 symbolTable.insertBuiltIn(bool4, "notEqual", int4, int4);
307
308 symbolTable.insertBuiltIn(bool2, "notEqual", bool2, bool2);
309 symbolTable.insertBuiltIn(bool3, "notEqual", bool3, bool3);
310 symbolTable.insertBuiltIn(bool4, "notEqual", bool4, bool4);
311
312 symbolTable.insertBuiltIn(bool1, "any", bool2);
313 symbolTable.insertBuiltIn(bool1, "any", bool3);
314 symbolTable.insertBuiltIn(bool1, "any", bool4);
315
316 symbolTable.insertBuiltIn(bool1, "all", bool2);
317 symbolTable.insertBuiltIn(bool1, "all", bool3);
318 symbolTable.insertBuiltIn(bool1, "all", bool4);
319
320 symbolTable.insertBuiltIn(bool2, "not", bool2);
321 symbolTable.insertBuiltIn(bool3, "not", bool3);
322 symbolTable.insertBuiltIn(bool4, "not", bool4);
323
324 TType *sampler2D = new TType(EbtSampler2D, EbpUndefined, EvqGlobal, 1);
325 TType *samplerCube = new TType(EbtSamplerCube, EbpUndefined, EvqGlobal, 1);
326
327 //
328 // Texture Functions for GLSL ES 1.0
329 //
330 symbolTable.insertBuiltIn(float4, "texture2D", sampler2D, float2);
331 symbolTable.insertBuiltIn(float4, "texture2DProj", sampler2D, float3);
332 symbolTable.insertBuiltIn(float4, "texture2DProj", sampler2D, float4);
333 symbolTable.insertBuiltIn(float4, "textureCube", samplerCube, float3);
334
335 if (resources.OES_EGL_image_external)
336 {
337 TType *samplerExternalOES = new TType(EbtSamplerExternalOES, EbpUndefined, EvqGlobal, 1);
338
339 symbolTable.insertBuiltIn(float4, "texture2D", samplerExternalOES, float2);
340 symbolTable.insertBuiltIn(float4, "texture2DProj", samplerExternalOES, float3);
341 symbolTable.insertBuiltIn(float4, "texture2DProj", samplerExternalOES, float4);
342 }
343
344 if (resources.ARB_texture_rectangle)
345 {
346 TType *sampler2DRect = new TType(EbtSampler2DRect, EbpUndefined, EvqGlobal, 1);
347
348 symbolTable.insertBuiltIn(float4, "texture2DRect", sampler2DRect, float2);
349 symbolTable.insertBuiltIn(float4, "texture2DRectProj", sampler2DRect, float3);
350 symbolTable.insertBuiltIn(float4, "texture2DRectProj", sampler2DRect, float4);
351 }
352
353 if (type == SH_FRAGMENT_SHADER)
354 {
355 symbolTable.insertBuiltIn(float4, "texture2D", sampler2D, float2, float1);
356 symbolTable.insertBuiltIn(float4, "texture2DProj", sampler2D, float3, float1);
357 symbolTable.insertBuiltIn(float4, "texture2DProj", sampler2D, float4, float1);
358 symbolTable.insertBuiltIn(float4, "textureCube", samplerCube, float3, float1);
359
360 if (resources.OES_standard_derivatives)
361 {
362 symbolTable.insertBuiltIn(float1, "dFdx", float1);
363 symbolTable.insertBuiltIn(float2, "dFdx", float2);
364 symbolTable.insertBuiltIn(float3, "dFdx", float3);
365 symbolTable.insertBuiltIn(float4, "dFdx", float4);
366
367 symbolTable.insertBuiltIn(float1, "dFdy", float1);
368 symbolTable.insertBuiltIn(float2, "dFdy", float2);
369 symbolTable.insertBuiltIn(float3, "dFdy", float3);
370 symbolTable.insertBuiltIn(float4, "dFdy", float4);
371
372 symbolTable.insertBuiltIn(float1, "fwidth", float1);
373 symbolTable.insertBuiltIn(float2, "fwidth", float2);
374 symbolTable.insertBuiltIn(float3, "fwidth", float3);
375 symbolTable.insertBuiltIn(float4, "fwidth", float4);
376 }
377 }
378
379 if(type == SH_VERTEX_SHADER)
380 {
381 symbolTable.insertBuiltIn(float4, "texture2DLod", sampler2D, float2, float1);
382 symbolTable.insertBuiltIn(float4, "texture2DProjLod", sampler2D, float3, float1);
383 symbolTable.insertBuiltIn(float4, "texture2DProjLod", sampler2D, float4, float1);
384 symbolTable.insertBuiltIn(float4, "textureCubeLod", samplerCube, float3, float1);
385 }
386
387 //
388 // Depth range in window coordinates
389 //
390 TFieldList *fields = NewPoolTFieldList();
391 TField *near = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("near"));
392 TField *far = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("far"));
393 TField *diff = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("diff"));
394 fields->push_back(near);
395 fields->push_back(far);
396 fields->push_back(diff);
397 TStructure *depthRangeStruct = new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields);
398 TVariable *depthRangeParameters = new TVariable(&depthRangeStruct->name(), depthRangeStruct, true);
399 symbolTable.insert(*depthRangeParameters);
400 TVariable *depthRange = new TVariable(NewPoolTString("gl_DepthRange"), TType(depthRangeStruct));
401 depthRange->setQualifier(EvqUniform);
402 symbolTable.insert(*depthRange);
403
404 //
405 // Implementation dependent built-in constants.
406 //
407 symbolTable.insertConstInt("gl_MaxVertexAttribs", resources.MaxVertexAttribs);
408 symbolTable.insertConstInt("gl_MaxVertexUniformVectors", resources.MaxVertexUniformVectors);
409 symbolTable.insertConstInt("gl_MaxVaryingVectors", resources.MaxVaryingVectors);
410 symbolTable.insertConstInt("gl_MaxVertexTextureImageUnits", resources.MaxVertexTextureImageUnits);
411 symbolTable.insertConstInt("gl_MaxCombinedTextureImageUnits", resources.MaxCombinedTextureImageUnits);
412 symbolTable.insertConstInt("gl_MaxTextureImageUnits", resources.MaxTextureImageUnits);
413 symbolTable.insertConstInt("gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors);
414
415 if (spec != SH_CSS_SHADERS_SPEC)
416 {
417 symbolTable.insertConstInt("gl_MaxDrawBuffers", resources.MaxDrawBuffers);
418 }
419 }
420
IdentifyBuiltIns(ShShaderType type,ShShaderSpec spec,const ShBuiltInResources & resources,TSymbolTable & symbolTable)421 void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
422 const ShBuiltInResources &resources,
423 TSymbolTable &symbolTable)
424 {
425 //
426 // First, insert some special built-in variables that are not in
427 // the built-in header files.
428 //
429 switch(type) {
430 case SH_FRAGMENT_SHADER:
431 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord, 4)));
432 symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1)));
433 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord, 2)));
434
435 //
436 // In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are not available.
437 // Instead, css_MixColor and css_ColorMatrix are available.
438 //
439 if (spec != SH_CSS_SHADERS_SPEC) {
440 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor, 4)));
441 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4)));
442 if (resources.EXT_frag_depth) {
443 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepthEXT"), TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1)));
444 symbolTable.relateToExtension("gl_FragDepthEXT", "GL_EXT_frag_depth");
445 }
446 } else {
447 symbolTable.insert(*new TVariable(NewPoolTString("css_MixColor"), TType(EbtFloat, EbpMedium, EvqGlobal, 4)));
448 symbolTable.insert(*new TVariable(NewPoolTString("css_ColorMatrix"), TType(EbtFloat, EbpMedium, EvqGlobal, 4, true)));
449 }
450
451 break;
452
453 case SH_VERTEX_SHADER:
454 symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4)));
455 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1)));
456 break;
457
458 default: assert(false && "Language not supported");
459 }
460
461 //
462 // Next, identify which built-ins from the already loaded headers have
463 // a mapping to an operator. Those that are not identified as such are
464 // expected to be resolved through a library of functions, versus as
465 // operations.
466 //
467 symbolTable.relateToOperator("matrixCompMult", EOpMul);
468
469 symbolTable.relateToOperator("equal", EOpVectorEqual);
470 symbolTable.relateToOperator("notEqual", EOpVectorNotEqual);
471 symbolTable.relateToOperator("lessThan", EOpLessThan);
472 symbolTable.relateToOperator("greaterThan", EOpGreaterThan);
473 symbolTable.relateToOperator("lessThanEqual", EOpLessThanEqual);
474 symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
475
476 symbolTable.relateToOperator("radians", EOpRadians);
477 symbolTable.relateToOperator("degrees", EOpDegrees);
478 symbolTable.relateToOperator("sin", EOpSin);
479 symbolTable.relateToOperator("cos", EOpCos);
480 symbolTable.relateToOperator("tan", EOpTan);
481 symbolTable.relateToOperator("asin", EOpAsin);
482 symbolTable.relateToOperator("acos", EOpAcos);
483 symbolTable.relateToOperator("atan", EOpAtan);
484
485 symbolTable.relateToOperator("pow", EOpPow);
486 symbolTable.relateToOperator("exp2", EOpExp2);
487 symbolTable.relateToOperator("log", EOpLog);
488 symbolTable.relateToOperator("exp", EOpExp);
489 symbolTable.relateToOperator("log2", EOpLog2);
490 symbolTable.relateToOperator("sqrt", EOpSqrt);
491 symbolTable.relateToOperator("inversesqrt", EOpInverseSqrt);
492
493 symbolTable.relateToOperator("abs", EOpAbs);
494 symbolTable.relateToOperator("sign", EOpSign);
495 symbolTable.relateToOperator("floor", EOpFloor);
496 symbolTable.relateToOperator("ceil", EOpCeil);
497 symbolTable.relateToOperator("fract", EOpFract);
498 symbolTable.relateToOperator("mod", EOpMod);
499 symbolTable.relateToOperator("min", EOpMin);
500 symbolTable.relateToOperator("max", EOpMax);
501 symbolTable.relateToOperator("clamp", EOpClamp);
502 symbolTable.relateToOperator("mix", EOpMix);
503 symbolTable.relateToOperator("step", EOpStep);
504 symbolTable.relateToOperator("smoothstep", EOpSmoothStep);
505
506 symbolTable.relateToOperator("length", EOpLength);
507 symbolTable.relateToOperator("distance", EOpDistance);
508 symbolTable.relateToOperator("dot", EOpDot);
509 symbolTable.relateToOperator("cross", EOpCross);
510 symbolTable.relateToOperator("normalize", EOpNormalize);
511 symbolTable.relateToOperator("faceforward", EOpFaceForward);
512 symbolTable.relateToOperator("reflect", EOpReflect);
513 symbolTable.relateToOperator("refract", EOpRefract);
514
515 symbolTable.relateToOperator("any", EOpAny);
516 symbolTable.relateToOperator("all", EOpAll);
517 symbolTable.relateToOperator("not", EOpVectorLogicalNot);
518
519 // Map language-specific operators.
520 switch(type) {
521 case SH_VERTEX_SHADER:
522 break;
523 case SH_FRAGMENT_SHADER:
524 if (resources.OES_standard_derivatives) {
525 symbolTable.relateToOperator("dFdx", EOpDFdx);
526 symbolTable.relateToOperator("dFdy", EOpDFdy);
527 symbolTable.relateToOperator("fwidth", EOpFwidth);
528
529 symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives");
530 symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives");
531 symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives");
532 }
533 break;
534 default: break;
535 }
536
537 // Finally add resource-specific variables.
538 switch(type) {
539 case SH_FRAGMENT_SHADER:
540 if (spec != SH_CSS_SHADERS_SPEC) {
541 // Set up gl_FragData. The array size.
542 TType fragData(EbtFloat, EbpMedium, EvqFragData, 4, false, true);
543 fragData.setArraySize(resources.MaxDrawBuffers);
544 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
545 }
546 break;
547 default: break;
548 }
549 }
550
InitExtensionBehavior(const ShBuiltInResources & resources,TExtensionBehavior & extBehavior)551 void InitExtensionBehavior(const ShBuiltInResources& resources,
552 TExtensionBehavior& extBehavior)
553 {
554 if (resources.OES_standard_derivatives)
555 extBehavior["GL_OES_standard_derivatives"] = EBhUndefined;
556 if (resources.OES_EGL_image_external)
557 extBehavior["GL_OES_EGL_image_external"] = EBhUndefined;
558 if (resources.ARB_texture_rectangle)
559 extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined;
560 if (resources.EXT_draw_buffers)
561 extBehavior["GL_EXT_draw_buffers"] = EBhUndefined;
562 if (resources.EXT_frag_depth)
563 extBehavior["GL_EXT_frag_depth"] = EBhUndefined;
564 }
565