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.
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.
13
#include "compiler/Initialize.h"
15
#include "compiler/intermediate.h"
17
//============================================================================
19
// Prototypes for built-in functions seen by both vertex and fragment shaders.
21
//============================================================================
22
static TString BuiltInFunctionsCommon(const ShBuiltInResources& resources)
27
// Angle and Trigonometric Functions.
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
75
// Exponential Functions.
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
197
// Geometric Functions.
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
243
// Vector relational functions.
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
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);"));
301
s.append(TString("bool any(bvec2 x);"));
302
s.append(TString("bool any(bvec3 x);"));
303
s.append(TString("bool any(bvec4 x);"));
305
s.append(TString("bool all(bvec2 x);"));
306
s.append(TString("bool all(bvec3 x);"));
307
s.append(TString("bool all(bvec4 x);"));
309
s.append(TString("bvec2 not(bvec2 x);"));
310
s.append(TString("bvec3 not(bvec3 x);"));
311
s.append(TString("bvec4 not(bvec4 x);"));
314
// Texture Functions.
316
s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
317
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
318
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
319
s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
321
if (resources.OES_EGL_image_external) {
322
s.append(TString("vec4 texture2D(samplerExternalOES sampler, vec2 coord);"));
323
s.append(TString("vec4 texture2DProj(samplerExternalOES sampler, vec3 coord);"));
324
s.append(TString("vec4 texture2DProj(samplerExternalOES sampler, vec4 coord);"));
327
if (resources.ARB_texture_rectangle) {
328
s.append(TString("vec4 texture2DRect(sampler2DRect sampler, vec2 coord);"));
329
s.append(TString("vec4 texture2DRectProj(sampler2DRect sampler, vec3 coord);"));
330
s.append(TString("vec4 texture2DRectProj(sampler2DRect sampler, vec4 coord);"));
336
//s.append(TString("float noise1(float x);"));
337
//s.append(TString("float noise1(vec2 x);"));
338
//s.append(TString("float noise1(vec3 x);"));
339
//s.append(TString("float noise1(vec4 x);"));
341
//s.append(TString("vec2 noise2(float x);"));
342
//s.append(TString("vec2 noise2(vec2 x);"));
343
//s.append(TString("vec2 noise2(vec3 x);"));
344
//s.append(TString("vec2 noise2(vec4 x);"));
346
//s.append(TString("vec3 noise3(float x);"));
347
//s.append(TString("vec3 noise3(vec2 x);"));
348
//s.append(TString("vec3 noise3(vec3 x);"));
349
//s.append(TString("vec3 noise3(vec4 x);"));
351
//s.append(TString("vec4 noise4(float x);"));
352
//s.append(TString("vec4 noise4(vec2 x);"));
353
//s.append(TString("vec4 noise4(vec3 x);"));
354
//s.append(TString("vec4 noise4(vec4 x);"));
359
//============================================================================
361
// Prototypes for built-in functions seen by vertex shaders only.
363
//============================================================================
364
static TString BuiltInFunctionsVertex(const ShBuiltInResources& resources)
369
// Geometric Functions.
371
//s.append(TString("vec4 ftransform();"));
374
// Texture Functions.
376
s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);"));
377
s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);"));
378
s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);"));
379
s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);"));
384
//============================================================================
386
// Prototypes for built-in functions seen by fragment shaders only.
388
//============================================================================
389
static TString BuiltInFunctionsFragment(const ShBuiltInResources& resources)
394
// Texture Functions.
396
s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);"));
397
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);"));
398
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);"));
399
s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);"));
401
if (resources.OES_standard_derivatives) {
402
s.append(TString("float dFdx(float p);"));
403
s.append(TString("vec2 dFdx(vec2 p);"));
404
s.append(TString("vec3 dFdx(vec3 p);"));
405
s.append(TString("vec4 dFdx(vec4 p);"));
407
s.append(TString("float dFdy(float p);"));
408
s.append(TString("vec2 dFdy(vec2 p);"));
409
s.append(TString("vec3 dFdy(vec3 p);"));
410
s.append(TString("vec4 dFdy(vec4 p);"));
412
s.append(TString("float fwidth(float p);"));
413
s.append(TString("vec2 fwidth(vec2 p);"));
414
s.append(TString("vec3 fwidth(vec3 p);"));
415
s.append(TString("vec4 fwidth(vec4 p);"));
421
//============================================================================
423
// Standard uniforms.
425
//============================================================================
426
static TString StandardUniforms()
431
// Depth range in window coordinates
433
s.append(TString("struct gl_DepthRangeParameters {"));
434
s.append(TString(" highp float near;")); // n
435
s.append(TString(" highp float far;")); // f
436
s.append(TString(" highp float diff;")); // f - n
437
s.append(TString("};"));
438
s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;"));
443
//============================================================================
445
// Default precision for vertex shaders.
447
//============================================================================
448
static TString DefaultPrecisionVertex()
452
s.append(TString("precision highp int;"));
453
s.append(TString("precision highp float;"));
458
//============================================================================
460
// Default precision for fragment shaders.
462
//============================================================================
463
static TString DefaultPrecisionFragment()
467
s.append(TString("precision mediump int;"));
468
// No default precision for float in fragment shaders
473
//============================================================================
475
// Implementation dependent built-in constants.
477
//============================================================================
478
static TString BuiltInConstants(ShShaderSpec spec, const ShBuiltInResources &resources)
482
s << "const int gl_MaxVertexAttribs = " << resources.MaxVertexAttribs << ";";
483
s << "const int gl_MaxVertexUniformVectors = " << resources.MaxVertexUniformVectors << ";";
485
s << "const int gl_MaxVaryingVectors = " << resources.MaxVaryingVectors << ";";
486
s << "const int gl_MaxVertexTextureImageUnits = " << resources.MaxVertexTextureImageUnits << ";";
487
s << "const int gl_MaxCombinedTextureImageUnits = " << resources.MaxCombinedTextureImageUnits << ";";
488
s << "const int gl_MaxTextureImageUnits = " << resources.MaxTextureImageUnits << ";";
489
s << "const int gl_MaxFragmentUniformVectors = " << resources.MaxFragmentUniformVectors << ";";
491
if (spec != SH_CSS_SHADERS_SPEC)
492
s << "const int gl_MaxDrawBuffers = " << resources.MaxDrawBuffers << ";";
497
void TBuiltIns::initialize(ShShaderType type, ShShaderSpec spec,
498
const ShBuiltInResources& resources)
501
case SH_FRAGMENT_SHADER:
502
builtInStrings.push_back(DefaultPrecisionFragment());
503
builtInStrings.push_back(BuiltInFunctionsCommon(resources));
504
builtInStrings.push_back(BuiltInFunctionsFragment(resources));
505
builtInStrings.push_back(StandardUniforms());
508
case SH_VERTEX_SHADER:
509
builtInStrings.push_back(DefaultPrecisionVertex());
510
builtInStrings.push_back(BuiltInFunctionsCommon(resources));
511
builtInStrings.push_back(BuiltInFunctionsVertex(resources));
512
builtInStrings.push_back(StandardUniforms());
515
default: assert(false && "Language not supported");
518
builtInStrings.push_back(BuiltInConstants(spec, resources));
521
void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
522
const ShBuiltInResources& resources,
523
TSymbolTable& symbolTable)
526
// First, insert some special built-in variables that are not in
527
// the built-in header files.
530
case SH_FRAGMENT_SHADER:
531
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord, 4)));
532
symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1)));
533
symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord, 2)));
536
// In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are not available.
537
// Instead, css_MixColor and css_ColorMatrix are available.
539
if (spec != SH_CSS_SHADERS_SPEC) {
540
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor, 4)));
541
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4)));
543
symbolTable.insert(*new TVariable(NewPoolTString("css_MixColor"), TType(EbtFloat, EbpMedium, EvqGlobal, 4)));
544
symbolTable.insert(*new TVariable(NewPoolTString("css_ColorMatrix"), TType(EbtFloat, EbpMedium, EvqGlobal, 4, true)));
549
case SH_VERTEX_SHADER:
550
symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4)));
551
symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1)));
554
default: assert(false && "Language not supported");
558
// Next, identify which built-ins from the already loaded headers have
559
// a mapping to an operator. Those that are not identified as such are
560
// expected to be resolved through a library of functions, versus as
563
symbolTable.relateToOperator("not", EOpVectorLogicalNot);
565
symbolTable.relateToOperator("matrixCompMult", EOpMul);
567
symbolTable.relateToOperator("equal", EOpVectorEqual);
568
symbolTable.relateToOperator("notEqual", EOpVectorNotEqual);
569
symbolTable.relateToOperator("lessThan", EOpLessThan);
570
symbolTable.relateToOperator("greaterThan", EOpGreaterThan);
571
symbolTable.relateToOperator("lessThanEqual", EOpLessThanEqual);
572
symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
574
symbolTable.relateToOperator("radians", EOpRadians);
575
symbolTable.relateToOperator("degrees", EOpDegrees);
576
symbolTable.relateToOperator("sin", EOpSin);
577
symbolTable.relateToOperator("cos", EOpCos);
578
symbolTable.relateToOperator("tan", EOpTan);
579
symbolTable.relateToOperator("asin", EOpAsin);
580
symbolTable.relateToOperator("acos", EOpAcos);
581
symbolTable.relateToOperator("atan", EOpAtan);
583
symbolTable.relateToOperator("pow", EOpPow);
584
symbolTable.relateToOperator("exp2", EOpExp2);
585
symbolTable.relateToOperator("log", EOpLog);
586
symbolTable.relateToOperator("exp", EOpExp);
587
symbolTable.relateToOperator("log2", EOpLog2);
588
symbolTable.relateToOperator("sqrt", EOpSqrt);
589
symbolTable.relateToOperator("inversesqrt", EOpInverseSqrt);
591
symbolTable.relateToOperator("abs", EOpAbs);
592
symbolTable.relateToOperator("sign", EOpSign);
593
symbolTable.relateToOperator("floor", EOpFloor);
594
symbolTable.relateToOperator("ceil", EOpCeil);
595
symbolTable.relateToOperator("fract", EOpFract);
596
symbolTable.relateToOperator("mod", EOpMod);
597
symbolTable.relateToOperator("min", EOpMin);
598
symbolTable.relateToOperator("max", EOpMax);
599
symbolTable.relateToOperator("clamp", EOpClamp);
600
symbolTable.relateToOperator("mix", EOpMix);
601
symbolTable.relateToOperator("step", EOpStep);
602
symbolTable.relateToOperator("smoothstep", EOpSmoothStep);
604
symbolTable.relateToOperator("length", EOpLength);
605
symbolTable.relateToOperator("distance", EOpDistance);
606
symbolTable.relateToOperator("dot", EOpDot);
607
symbolTable.relateToOperator("cross", EOpCross);
608
symbolTable.relateToOperator("normalize", EOpNormalize);
609
symbolTable.relateToOperator("faceforward", EOpFaceForward);
610
symbolTable.relateToOperator("reflect", EOpReflect);
611
symbolTable.relateToOperator("refract", EOpRefract);
613
symbolTable.relateToOperator("any", EOpAny);
614
symbolTable.relateToOperator("all", EOpAll);
616
// Map language-specific operators.
618
case SH_VERTEX_SHADER:
620
case SH_FRAGMENT_SHADER:
621
if (resources.OES_standard_derivatives) {
622
symbolTable.relateToOperator("dFdx", EOpDFdx);
623
symbolTable.relateToOperator("dFdy", EOpDFdy);
624
symbolTable.relateToOperator("fwidth", EOpFwidth);
626
symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives");
627
symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives");
628
symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives");
634
// Finally add resource-specific variables.
636
case SH_FRAGMENT_SHADER:
637
if (spec != SH_CSS_SHADERS_SPEC) {
638
// Set up gl_FragData. The array size.
639
TType fragData(EbtFloat, EbpMedium, EvqFragData, 4, false, true);
640
fragData.setArraySize(resources.MaxDrawBuffers);
641
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
648
void InitExtensionBehavior(const ShBuiltInResources& resources,
649
TExtensionBehavior& extBehavior)
651
if (resources.OES_standard_derivatives)
652
extBehavior["GL_OES_standard_derivatives"] = EBhUndefined;
653
if (resources.OES_EGL_image_external)
654
extBehavior["GL_OES_EGL_image_external"] = EBhUndefined;
655
if (resources.ARB_texture_rectangle)
656
extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined;