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