LEFT | RIGHT |
1 // | 1 // |
2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. | 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 | 3 // Use of this source code is governed by a BSD-style license that can be |
4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
5 // | 5 // |
6 | 6 |
7 // | 7 // |
8 // Create strings that declare built-in definitions, add built-ins that | 8 // Create strings that declare built-in definitions, add built-ins that |
9 // cannot be expressed in the files, and establish mappings between· | 9 // cannot be expressed in the files, and establish mappings between· |
10 // built-in functions and operators. | 10 // built-in functions and operators. |
11 // | 11 // |
12 | 12 |
13 #include "compiler/Initialize.h" | 13 #include "compiler/Initialize.h" |
14 | 14 |
15 #include "compiler/intermediate.h" | 15 #include "compiler/intermediate.h" |
16 | |
17 //============================================================================ | |
18 // | |
19 // Prototypes for built-in functions seen by both vertex and fragment shaders. | |
20 // | |
21 //============================================================================ | |
22 void InsertBuiltInFunctionsCommon(const ShBuiltInResources& resources, TSymbolTa
ble * t) { | |
23 // | |
24 // Angle and Trigonometric Functions. | |
25 // | |
26 BUILTIN1(t, float, radians, float, degrees) | |
27 BUILTIN1(t, vec2, radians, vec2, degrees) | |
28 BUILTIN1(t, vec3, radians, vec3, degrees) | |
29 BUILTIN1(t, vec4, radians, vec4, degrees) | |
30 | |
31 BUILTIN1(t, float, degrees, float, radians) | |
32 BUILTIN1(t, vec2, degrees, vec2, radians) | |
33 BUILTIN1(t, vec3, degrees, vec3, radians) | |
34 BUILTIN1(t, vec4, degrees, vec4, radians) | |
35 | |
36 BUILTIN1(t, float, sin, float, angle) | |
37 BUILTIN1(t, vec2, sin, vec2, angle) | |
38 BUILTIN1(t, vec3, sin, vec3, angle) | |
39 BUILTIN1(t, vec4, sin, vec4, angle) | |
40 | |
41 BUILTIN1(t, float, cos, float, angle) | |
42 BUILTIN1(t, vec2, cos, vec2, angle) | |
43 BUILTIN1(t, vec3, cos, vec3, angle) | |
44 BUILTIN1(t, vec4, cos, vec4, angle) | |
45 | |
46 BUILTIN1(t, float, tan, float, angle) | |
47 BUILTIN1(t, vec2, tan, vec2, angle) | |
48 BUILTIN1(t, vec3, tan, vec3, angle) | |
49 BUILTIN1(t, vec4, tan, vec4, angle) | |
50 | |
51 BUILTIN1(t, float, asin, float, x) | |
52 BUILTIN1(t, vec2, asin, vec2, x) | |
53 BUILTIN1(t, vec3, asin, vec3, x) | |
54 BUILTIN1(t, vec4, asin, vec4, x) | |
55 | |
56 BUILTIN1(t, float, acos, float, x) | |
57 BUILTIN1(t, vec2, acos, vec2, x) | |
58 BUILTIN1(t, vec3, acos, vec3, x) | |
59 BUILTIN1(t, vec4, acos, vec4, x) | |
60 | |
61 BUILTIN2(t, float, atan, float, y, float, x) | |
62 BUILTIN2(t, vec2, atan, vec2, y, vec2, x) | |
63 BUILTIN2(t, vec3, atan, vec3, y, vec3, x) | |
64 BUILTIN2(t, vec4, atan, vec4, y, vec4, x) | |
65 | |
66 BUILTIN1(t, float, atan, float, y_over_x) | |
67 BUILTIN1(t, vec2, atan, vec2, y_over_x) | |
68 BUILTIN1(t, vec3, atan, vec3, y_over_x) | |
69 BUILTIN1(t, vec4, atan, vec4, y_over_x) | |
70 | |
71 // | |
72 // Exponential Functions. | |
73 // | |
74 BUILTIN2(t, float, pow, float, x, float, y) | |
75 BUILTIN2(t, vec2, pow, vec2, x, vec2, y) | |
76 BUILTIN2(t, vec3, pow, vec3, x, vec3, y) | |
77 BUILTIN2(t, vec4, pow, vec4, x, vec4, y) | |
78 | |
79 BUILTIN1(t, float, exp, float, x) | |
80 BUILTIN1(t, vec2, exp, vec2, x) | |
81 BUILTIN1(t, vec3, exp, vec3, x) | |
82 BUILTIN1(t, vec4, exp, vec4, x) | |
83 | |
84 BUILTIN1(t, float, log, float, x) | |
85 BUILTIN1(t, vec2, log, vec2, x) | |
86 BUILTIN1(t, vec3, log, vec3, x) | |
87 BUILTIN1(t, vec4, log, vec4, x) | |
88 | |
89 BUILTIN1(t, float, exp2, float, x) | |
90 BUILTIN1(t, vec2, exp2, vec2, x) | |
91 BUILTIN1(t, vec3, exp2, vec3, x) | |
92 BUILTIN1(t, vec4, exp2, vec4, x) | |
93 | |
94 BUILTIN1(t, float, log2, float, x) | |
95 BUILTIN1(t, vec2, log2, vec2, x) | |
96 BUILTIN1(t, vec3, log2, vec3, x) | |
97 BUILTIN1(t, vec4, log2, vec4, x) | |
98 | |
99 BUILTIN1(t, float, sqrt, float, x) | |
100 BUILTIN1(t, vec2, sqrt, vec2, x) | |
101 BUILTIN1(t, vec3, sqrt, vec3, x) | |
102 BUILTIN1(t, vec4, sqrt, vec4, x) | |
103 | |
104 BUILTIN1(t, float, inversesqrt, float, x) | |
105 BUILTIN1(t, vec2, inversesqrt, vec2, x) | |
106 BUILTIN1(t, vec3, inversesqrt, vec3, x) | |
107 BUILTIN1(t, vec4, inversesqrt, vec4, x) | |
108 | |
109 // | |
110 // Common Functions. | |
111 // | |
112 BUILTIN1(t, float, abs, float, x) | |
113 BUILTIN1(t, vec2, abs, vec2, x) | |
114 BUILTIN1(t, vec3, abs, vec3, x) | |
115 BUILTIN1(t, vec4, abs, vec4, x) | |
116 | |
117 BUILTIN1(t, float, sign, float, x) | |
118 BUILTIN1(t, vec2, sign, vec2, x) | |
119 BUILTIN1(t, vec3, sign, vec3, x) | |
120 BUILTIN1(t, vec4, sign, vec4, x) | |
121 | |
122 BUILTIN1(t, float, floor, float, x) | |
123 BUILTIN1(t, vec2, floor, vec2, x) | |
124 BUILTIN1(t, vec3, floor, vec3, x) | |
125 BUILTIN1(t, vec4, floor, vec4, x) | |
126 | |
127 BUILTIN1(t, float, ceil, float, x) | |
128 BUILTIN1(t, vec2, ceil, vec2, x) | |
129 BUILTIN1(t, vec3, ceil, vec3, x) | |
130 BUILTIN1(t, vec4, ceil, vec4, x) | |
131 | |
132 BUILTIN1(t, float, fract, float, x) | |
133 BUILTIN1(t, vec2, fract, vec2, x) | |
134 BUILTIN1(t, vec3, fract, vec3, x) | |
135 BUILTIN1(t, vec4, fract, vec4, x) | |
136 | |
137 BUILTIN2(t, float, mod, float, x, float, y) | |
138 BUILTIN2(t, vec2, mod, vec2, x, float, y) | |
139 BUILTIN2(t, vec3, mod, vec3, x, float, y) | |
140 BUILTIN2(t, vec4, mod, vec4, x, float, y) | |
141 BUILTIN2(t, vec2, mod, vec2, x, vec2, y) | |
142 BUILTIN2(t, vec3, mod, vec3, x, vec3, y) | |
143 BUILTIN2(t, vec4, mod, vec4, x, vec4, y) | |
144 | |
145 BUILTIN2(t, float, min, float, x, float, y) | |
146 BUILTIN2(t, vec2, min, vec2, x, float, y) | |
147 BUILTIN2(t, vec3, min, vec3, x, float, y) | |
148 BUILTIN2(t, vec4, min, vec4, x, float, y) | |
149 BUILTIN2(t, vec2, min, vec2, x, vec2, y) | |
150 BUILTIN2(t, vec3, min, vec3, x, vec3, y) | |
151 BUILTIN2(t, vec4, min, vec4, x, vec4, y) | |
152 | |
153 BUILTIN2(t, float, max, float, x, float, y) | |
154 BUILTIN2(t, vec2, max, vec2, x, float, y) | |
155 BUILTIN2(t, vec3, max, vec3, x, float, y) | |
156 BUILTIN2(t, vec4, max, vec4, x, float, y) | |
157 BUILTIN2(t, vec2, max, vec2, x, vec2, y) | |
158 BUILTIN2(t, vec3, max, vec3, x, vec3, y) | |
159 BUILTIN2(t, vec4, max, vec4, x, vec4, y) | |
160 | |
161 BUILTIN3(t, float, clamp, float, x, float, minVal, float, maxVal) | |
162 BUILTIN3(t, vec2, clamp, vec2, x, float, minVal, float, maxVal) | |
163 BUILTIN3(t, vec3, clamp, vec3, x, float, minVal, float, maxVal) | |
164 BUILTIN3(t, vec4, clamp, vec4, x, float, minVal, float, maxVal) | |
165 BUILTIN3(t, vec2, clamp, vec2, x, vec2, minVal, vec2, maxVal) | |
166 BUILTIN3(t, vec3, clamp, vec3, x, vec3, minVal, vec3, maxVal) | |
167 BUILTIN3(t, vec4, clamp, vec4, x, vec4, minVal, vec4, maxVal) | |
168 | |
169 BUILTIN3(t, float, mix, float, x, float, y, float, a) | |
170 BUILTIN3(t, vec2, mix, vec2, x, vec2, y, float, a) | |
171 BUILTIN3(t, vec3, mix, vec3, x, vec3, y, float, a) | |
172 BUILTIN3(t, vec4, mix, vec4, x, vec4, y, float, a) | |
173 BUILTIN3(t, vec2, mix, vec2, x, vec2, y, vec2, a) | |
174 BUILTIN3(t, vec3, mix, vec3, x, vec3, y, vec3, a) | |
175 BUILTIN3(t, vec4, mix, vec4, x, vec4, y, vec4, a) | |
176 | |
177 BUILTIN2(t, float, step, float, edge, float, x) | |
178 BUILTIN2(t, vec2, step, vec2, edge, vec2, x) | |
179 BUILTIN2(t, vec3, step, vec3, edge, vec3, x) | |
180 BUILTIN2(t, vec4, step, vec4, edge, vec4, x) | |
181 BUILTIN2(t, vec2, step, float, edge, vec2, x) | |
182 BUILTIN2(t, vec3, step, float, edge, vec3, x) | |
183 BUILTIN2(t, vec4, step, float, edge, vec4, x) | |
184 | |
185 BUILTIN3(t, float, smoothstep, float, edge0, float, edge1, float, x) | |
186 BUILTIN3(t, vec2, smoothstep, vec2, edge0, vec2, edge1, vec2, x) | |
187 BUILTIN3(t, vec3, smoothstep, vec3, edge0, vec3, edge1, vec3, x) | |
188 BUILTIN3(t, vec4, smoothstep, vec4, edge0, vec4, edge1, vec4, x) | |
189 BUILTIN3(t, vec2, smoothstep, float, edge0, float, edge1, vec2, x) | |
190 BUILTIN3(t, vec3, smoothstep, float, edge0, float, edge1, vec3, x) | |
191 BUILTIN3(t, vec4, smoothstep, float, edge0, float, edge1, vec4, x) | |
192 | |
193 // | |
194 // Geometric Functions. | |
195 // | |
196 BUILTIN1(t, float, length, float, x) | |
197 BUILTIN1(t, float, length, vec2, x) | |
198 BUILTIN1(t, float, length, vec3, x) | |
199 BUILTIN1(t, float, length, vec4, x) | |
200 | |
201 BUILTIN2(t, float, distance, float, p0, float, p1) | |
202 BUILTIN2(t, float, distance, vec2, p0, vec2, p1) | |
203 BUILTIN2(t, float, distance, vec3, p0, vec3, p1) | |
204 BUILTIN2(t, float, distance, vec4, p0, vec4, p1) | |
205 | |
206 BUILTIN2(t, float, dot, float, x, float, y) | |
207 BUILTIN2(t, float, dot, vec2, x, vec2, y) | |
208 BUILTIN2(t, float, dot, vec3, x, vec3, y) | |
209 BUILTIN2(t, float, dot, vec4, x, vec4, y) | |
210 | |
211 BUILTIN2(t, vec3, cross, vec3, x, vec3, y) | |
212 BUILTIN1(t, float, normalize, float, x) | |
213 BUILTIN1(t, vec2, normalize, vec2, x) | |
214 BUILTIN1(t, vec3, normalize, vec3, x) | |
215 BUILTIN1(t, vec4, normalize, vec4, x) | |
216 | |
217 BUILTIN3(t, float, faceforward, float, N, float, I, float, Nref) | |
218 BUILTIN3(t, vec2, faceforward, vec2, N, vec2, I, vec2, Nref) | |
219 BUILTIN3(t, vec3, faceforward, vec3, N, vec3, I, vec3, Nref) | |
220 BUILTIN3(t, vec4, faceforward, vec4, N, vec4, I, vec4, Nref) | |
221 | |
222 BUILTIN2(t, float, reflect, float, I, float, N) | |
223 BUILTIN2(t, vec2, reflect, vec2, I, vec2, N) | |
224 BUILTIN2(t, vec3, reflect, vec3, I, vec3, N) | |
225 BUILTIN2(t, vec4, reflect, vec4, I, vec4, N) | |
226 | |
227 BUILTIN3(t, float, refract, float, I, float, N, float, eta) | |
228 BUILTIN3(t, vec2, refract, vec2, I, vec2, N, float, eta) | |
229 BUILTIN3(t, vec3, refract, vec3, I, vec3, N, float, eta) | |
230 BUILTIN3(t, vec4, refract, vec4, I, vec4, N, float, eta) | |
231 | |
232 // | |
233 // Matrix Functions. | |
234 // | |
235 BUILTIN2(t, mat2, matrixCompMult, mat2, x, mat2, y) | |
236 BUILTIN2(t, mat3, matrixCompMult, mat3, x, mat3, y) | |
237 BUILTIN2(t, mat4, matrixCompMult, mat4, x, mat4, y) | |
238 | |
239 // | |
240 // Vector relational functions. | |
241 // | |
242 BUILTIN2(t, bvec2, lessThan, vec2, x, vec2, y) | |
243 BUILTIN2(t, bvec3, lessThan, vec3, x, vec3, y) | |
244 BUILTIN2(t, bvec4, lessThan, vec4, x, vec4, y) | |
245 | |
246 BUILTIN2(t, bvec2, lessThan, ivec2, x, ivec2, y) | |
247 BUILTIN2(t, bvec3, lessThan, ivec3, x, ivec3, y) | |
248 BUILTIN2(t, bvec4, lessThan, ivec4, x, ivec4, y) | |
249 | |
250 BUILTIN2(t, bvec2, lessThanEqual, vec2, x, vec2, y) | |
251 BUILTIN2(t, bvec3, lessThanEqual, vec3, x, vec3, y) | |
252 BUILTIN2(t, bvec4, lessThanEqual, vec4, x, vec4, y) | |
253 | |
254 BUILTIN2(t, bvec2, lessThanEqual, ivec2, x, ivec2, y) | |
255 BUILTIN2(t, bvec3, lessThanEqual, ivec3, x, ivec3, y) | |
256 BUILTIN2(t, bvec4, lessThanEqual, ivec4, x, ivec4, y) | |
257 | |
258 BUILTIN2(t, bvec2, greaterThan, vec2, x, vec2, y) | |
259 BUILTIN2(t, bvec3, greaterThan, vec3, x, vec3, y) | |
260 BUILTIN2(t, bvec4, greaterThan, vec4, x, vec4, y) | |
261 | |
262 BUILTIN2(t, bvec2, greaterThan, ivec2, x, ivec2, y) | |
263 BUILTIN2(t, bvec3, greaterThan, ivec3, x, ivec3, y) | |
264 BUILTIN2(t, bvec4, greaterThan, ivec4, x, ivec4, y) | |
265 | |
266 BUILTIN2(t, bvec2, greaterThanEqual, vec2, x, vec2, y) | |
267 BUILTIN2(t, bvec3, greaterThanEqual, vec3, x, vec3, y) | |
268 BUILTIN2(t, bvec4, greaterThanEqual, vec4, x, vec4, y) | |
269 | |
270 BUILTIN2(t, bvec2, greaterThanEqual, ivec2, x, ivec2, y) | |
271 BUILTIN2(t, bvec3, greaterThanEqual, ivec3, x, ivec3, y) | |
272 BUILTIN2(t, bvec4, greaterThanEqual, ivec4, x, ivec4, y) | |
273 | |
274 BUILTIN2(t, bvec2, equal, vec2, x, vec2, y) | |
275 BUILTIN2(t, bvec3, equal, vec3, x, vec3, y) | |
276 BUILTIN2(t, bvec4, equal, vec4, x, vec4, y) | |
277 | |
278 BUILTIN2(t, bvec2, equal, ivec2, x, ivec2, y) | |
279 BUILTIN2(t, bvec3, equal, ivec3, x, ivec3, y) | |
280 BUILTIN2(t, bvec4, equal, ivec4, x, ivec4, y) | |
281 | |
282 BUILTIN2(t, bvec2, equal, bvec2, x, bvec2, y) | |
283 BUILTIN2(t, bvec3, equal, bvec3, x, bvec3, y) | |
284 BUILTIN2(t, bvec4, equal, bvec4, x, bvec4, y) | |
285 | |
286 BUILTIN2(t, bvec2, notEqual, vec2, x, vec2, y) | |
287 BUILTIN2(t, bvec3, notEqual, vec3, x, vec3, y) | |
288 BUILTIN2(t, bvec4, notEqual, vec4, x, vec4, y) | |
289 | |
290 BUILTIN2(t, bvec2, notEqual, ivec2, x, ivec2, y) | |
291 BUILTIN2(t, bvec3, notEqual, ivec3, x, ivec3, y) | |
292 BUILTIN2(t, bvec4, notEqual, ivec4, x, ivec4, y) | |
293 | |
294 BUILTIN2(t, bvec2, notEqual, bvec2, x, bvec2, y) | |
295 BUILTIN2(t, bvec3, notEqual, bvec3, x, bvec3, y) | |
296 BUILTIN2(t, bvec4, notEqual, bvec4, x, bvec4, y) | |
297 | |
298 BUILTIN1(t, bool, any, bvec2, x) | |
299 BUILTIN1(t, bool, any, bvec3, x) | |
300 BUILTIN1(t, bool, any, bvec4, x) | |
301 | |
302 BUILTIN1(t, bool, all, bvec2, x) | |
303 BUILTIN1(t, bool, all, bvec3, x) | |
304 BUILTIN1(t, bool, all, bvec4, x) | |
305 | |
306 BUILTIN1(t, bvec2, not, bvec2, x) | |
307 BUILTIN1(t, bvec3, not, bvec3, x) | |
308 BUILTIN1(t, bvec4, not, bvec4, x) | |
309 | |
310 // | |
311 // Texture Functions. | |
312 // | |
313 BUILTIN2(t, vec4, texture2D, sampler2D, sampler, vec2, coord) | |
314 BUILTIN2(t, vec4, texture2DProj, sampler2D, sampler, vec3, coord) | |
315 BUILTIN2(t, vec4, texture2DProj, sampler2D, sampler, vec4, coord) | |
316 BUILTIN2(t, vec4, textureCube, samplerCube, sampler, vec3, coord) | |
317 | |
318 if (resources.OES_EGL_image_external) { | |
319 BUILTIN2(t, vec4, texture2D, samplerExternalOES, sampler, vec2, coord) | |
320 BUILTIN2(t, vec4, texture2DProj, samplerExternalOES, sampler, vec3, coor
d) | |
321 BUILTIN2(t, vec4, texture2DProj, samplerExternalOES, sampler, vec4, coor
d) | |
322 } | |
323 | |
324 if (resources.ARB_texture_rectangle) { | |
325 BUILTIN2(t, vec4, texture2DRect, sampler2DRect, sampler, vec2, coord) | |
326 BUILTIN2(t, vec4, texture2DRectProj, sampler2DRect, sampler, vec3, coord
) | |
327 BUILTIN2(t, vec4, texture2DRectProj, sampler2DRect, sampler, vec4, coord
) | |
328 } | |
329 | |
330 // | |
331 // Noise functions. | |
332 // | |
333 //BUILTIN1(t, float, noise1, float, x) | |
334 //BUILTIN1(t, float, noise1, vec2, x) | |
335 //BUILTIN1(t, float, noise1, vec3, x) | |
336 //BUILTIN1(t, float, noise1, vec4, x) | |
337 | |
338 //BUILTIN1(t, vec2, noise2, float, x) | |
339 //BUILTIN1(t, vec2, noise2, vec2, x) | |
340 //BUILTIN1(t, vec2, noise2, vec3, x) | |
341 //BUILTIN1(t, vec2, noise2, vec4, x) | |
342 | |
343 //BUILTIN1(t, vec3, noise3, float, x) | |
344 //BUILTIN1(t, vec3, noise3, vec2, x) | |
345 //BUILTIN1(t, vec3, noise3, vec3, x) | |
346 //BUILTIN1(t, vec3, noise3, vec4, x) | |
347 | |
348 //BUILTIN1(t, vec4, noise4, float, x) | |
349 //BUILTIN1(t, vec4, noise4, vec2, x) | |
350 //BUILTIN1(t, vec4, noise4, vec3, x) | |
351 //BUILTIN1(t, vec4, noise4, vec4, x) | |
352 | |
353 } | |
354 | |
355 static TString BuiltInFunctionsCommon(const ShBuiltInResources& resources) { | |
356 TString s; | |
357 | |
358 // | |
359 // Angle and Trigonometric Functions. | |
360 // | |
361 s.append(TString("float radians(float degrees);")); | |
362 s.append(TString("vec2 radians(vec2 degrees);")); | |
363 s.append(TString("vec3 radians(vec3 degrees);")); | |
364 s.append(TString("vec4 radians(vec4 degrees);")); | |
365 | |
366 s.append(TString("float degrees(float radians);")); | |
367 s.append(TString("vec2 degrees(vec2 radians);")); | |
368 s.append(TString("vec3 degrees(vec3 radians);")); | |
369 s.append(TString("vec4 degrees(vec4 radians);")); | |
370 | |
371 s.append(TString("float sin(float angle);")); | |
372 s.append(TString("vec2 sin(vec2 angle);")); | |
373 s.append(TString("vec3 sin(vec3 angle);")); | |
374 s.append(TString("vec4 sin(vec4 angle);")); | |
375 | |
376 s.append(TString("float cos(float angle);")); | |
377 s.append(TString("vec2 cos(vec2 angle);")); | |
378 s.append(TString("vec3 cos(vec3 angle);")); | |
379 s.append(TString("vec4 cos(vec4 angle);")); | |
380 | |
381 s.append(TString("float tan(float angle);")); | |
382 s.append(TString("vec2 tan(vec2 angle);")); | |
383 s.append(TString("vec3 tan(vec3 angle);")); | |
384 s.append(TString("vec4 tan(vec4 angle);")); | |
385 | |
386 s.append(TString("float asin(float x);")); | |
387 s.append(TString("vec2 asin(vec2 x);")); | |
388 s.append(TString("vec3 asin(vec3 x);")); | |
389 s.append(TString("vec4 asin(vec4 x);")); | |
390 | |
391 s.append(TString("float acos(float x);")); | |
392 s.append(TString("vec2 acos(vec2 x);")); | |
393 s.append(TString("vec3 acos(vec3 x);")); | |
394 s.append(TString("vec4 acos(vec4 x);")); | |
395 | |
396 s.append(TString("float atan(float y, float x);")); | |
397 s.append(TString("vec2 atan(vec2 y, vec2 x);")); | |
398 s.append(TString("vec3 atan(vec3 y, vec3 x);")); | |
399 s.append(TString("vec4 atan(vec4 y, vec4 x);")); | |
400 | |
401 s.append(TString("float atan(float y_over_x);")); | |
402 s.append(TString("vec2 atan(vec2 y_over_x);")); | |
403 s.append(TString("vec3 atan(vec3 y_over_x);")); | |
404 s.append(TString("vec4 atan(vec4 y_over_x);")); | |
405 | |
406 // | |
407 // Exponential Functions. | |
408 // | |
409 s.append(TString("float pow(float x, float y);")); | |
410 s.append(TString("vec2 pow(vec2 x, vec2 y);")); | |
411 s.append(TString("vec3 pow(vec3 x, vec3 y);")); | |
412 s.append(TString("vec4 pow(vec4 x, vec4 y);")); | |
413 | |
414 s.append(TString("float exp(float x);")); | |
415 s.append(TString("vec2 exp(vec2 x);")); | |
416 s.append(TString("vec3 exp(vec3 x);")); | |
417 s.append(TString("vec4 exp(vec4 x);")); | |
418 | |
419 s.append(TString("float log(float x);")); | |
420 s.append(TString("vec2 log(vec2 x);")); | |
421 s.append(TString("vec3 log(vec3 x);")); | |
422 s.append(TString("vec4 log(vec4 x);")); | |
423 | |
424 s.append(TString("float exp2(float x);")); | |
425 s.append(TString("vec2 exp2(vec2 x);")); | |
426 s.append(TString("vec3 exp2(vec3 x);")); | |
427 s.append(TString("vec4 exp2(vec4 x);")); | |
428 | |
429 s.append(TString("float log2(float x);")); | |
430 s.append(TString("vec2 log2(vec2 x);")); | |
431 s.append(TString("vec3 log2(vec3 x);")); | |
432 s.append(TString("vec4 log2(vec4 x);")); | |
433 | |
434 s.append(TString("float sqrt(float x);")); | |
435 s.append(TString("vec2 sqrt(vec2 x);")); | |
436 s.append(TString("vec3 sqrt(vec3 x);")); | |
437 s.append(TString("vec4 sqrt(vec4 x);")); | |
438 | |
439 s.append(TString("float inversesqrt(float x);")); | |
440 s.append(TString("vec2 inversesqrt(vec2 x);")); | |
441 s.append(TString("vec3 inversesqrt(vec3 x);")); | |
442 s.append(TString("vec4 inversesqrt(vec4 x);")); | |
443 | |
444 // | |
445 // Common Functions. | |
446 // | |
447 s.append(TString("float abs(float x);")); | |
448 s.append(TString("vec2 abs(vec2 x);")); | |
449 s.append(TString("vec3 abs(vec3 x);")); | |
450 s.append(TString("vec4 abs(vec4 x);")); | |
451 | |
452 s.append(TString("float sign(float x);")); | |
453 s.append(TString("vec2 sign(vec2 x);")); | |
454 s.append(TString("vec3 sign(vec3 x);")); | |
455 s.append(TString("vec4 sign(vec4 x);")); | |
456 | |
457 s.append(TString("float floor(float x);")); | |
458 s.append(TString("vec2 floor(vec2 x);")); | |
459 s.append(TString("vec3 floor(vec3 x);")); | |
460 s.append(TString("vec4 floor(vec4 x);")); | |
461 | |
462 s.append(TString("float ceil(float x);")); | |
463 s.append(TString("vec2 ceil(vec2 x);")); | |
464 s.append(TString("vec3 ceil(vec3 x);")); | |
465 s.append(TString("vec4 ceil(vec4 x);")); | |
466 | |
467 s.append(TString("float fract(float x);")); | |
468 s.append(TString("vec2 fract(vec2 x);")); | |
469 s.append(TString("vec3 fract(vec3 x);")); | |
470 s.append(TString("vec4 fract(vec4 x);")); | |
471 | |
472 s.append(TString("float mod(float x, float y);")); | |
473 s.append(TString("vec2 mod(vec2 x, float y);")); | |
474 s.append(TString("vec3 mod(vec3 x, float y);")); | |
475 s.append(TString("vec4 mod(vec4 x, float y);")); | |
476 s.append(TString("vec2 mod(vec2 x, vec2 y);")); | |
477 s.append(TString("vec3 mod(vec3 x, vec3 y);")); | |
478 s.append(TString("vec4 mod(vec4 x, vec4 y);")); | |
479 | |
480 s.append(TString("float min(float x, float y);")); | |
481 s.append(TString("vec2 min(vec2 x, float y);")); | |
482 s.append(TString("vec3 min(vec3 x, float y);")); | |
483 s.append(TString("vec4 min(vec4 x, float y);")); | |
484 s.append(TString("vec2 min(vec2 x, vec2 y);")); | |
485 s.append(TString("vec3 min(vec3 x, vec3 y);")); | |
486 s.append(TString("vec4 min(vec4 x, vec4 y);")); | |
487 | |
488 s.append(TString("float max(float x, float y);")); | |
489 s.append(TString("vec2 max(vec2 x, float y);")); | |
490 s.append(TString("vec3 max(vec3 x, float y);")); | |
491 s.append(TString("vec4 max(vec4 x, float y);")); | |
492 s.append(TString("vec2 max(vec2 x, vec2 y);")); | |
493 s.append(TString("vec3 max(vec3 x, vec3 y);")); | |
494 s.append(TString("vec4 max(vec4 x, vec4 y);")); | |
495 | |
496 s.append(TString("float clamp(float x, float minVal, float maxVal);")); | |
497 s.append(TString("vec2 clamp(vec2 x, float minVal, float maxVal);")); | |
498 s.append(TString("vec3 clamp(vec3 x, float minVal, float maxVal);")); | |
499 s.append(TString("vec4 clamp(vec4 x, float minVal, float maxVal);")); | |
500 s.append(TString("vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);")); | |
501 s.append(TString("vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);")); | |
502 s.append(TString("vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);")); | |
503 | |
504 s.append(TString("float mix(float x, float y, float a);")); | |
505 s.append(TString("vec2 mix(vec2 x, vec2 y, float a);")); | |
506 s.append(TString("vec3 mix(vec3 x, vec3 y, float a);")); | |
507 s.append(TString("vec4 mix(vec4 x, vec4 y, float a);")); | |
508 s.append(TString("vec2 mix(vec2 x, vec2 y, vec2 a);")); | |
509 s.append(TString("vec3 mix(vec3 x, vec3 y, vec3 a);")); | |
510 s.append(TString("vec4 mix(vec4 x, vec4 y, vec4 a);")); | |
511 | |
512 s.append(TString("float step(float edge, float x);")); | |
513 s.append(TString("vec2 step(vec2 edge, vec2 x);")); | |
514 s.append(TString("vec3 step(vec3 edge, vec3 x);")); | |
515 s.append(TString("vec4 step(vec4 edge, vec4 x);")); | |
516 s.append(TString("vec2 step(float edge, vec2 x);")); | |
517 s.append(TString("vec3 step(float edge, vec3 x);")); | |
518 s.append(TString("vec4 step(float edge, vec4 x);")); | |
519 | |
520 s.append(TString("float smoothstep(float edge0, float edge1, float x);")); | |
521 s.append(TString("vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);")); | |
522 s.append(TString("vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);")); | |
523 s.append(TString("vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);")); | |
524 s.append(TString("vec2 smoothstep(float edge0, float edge1, vec2 x);")); | |
525 s.append(TString("vec3 smoothstep(float edge0, float edge1, vec3 x);")); | |
526 s.append(TString("vec4 smoothstep(float edge0, float edge1, vec4 x);")); | |
527 | |
528 // | |
529 // Geometric Functions. | |
530 // | |
531 s.append(TString("float length(float x);")); | |
532 s.append(TString("float length(vec2 x);")); | |
533 s.append(TString("float length(vec3 x);")); | |
534 s.append(TString("float length(vec4 x);")); | |
535 | |
536 s.append(TString("float distance(float p0, float p1);")); | |
537 s.append(TString("float distance(vec2 p0, vec2 p1);")); | |
538 s.append(TString("float distance(vec3 p0, vec3 p1);")); | |
539 s.append(TString("float distance(vec4 p0, vec4 p1);")); | |
540 | |
541 s.append(TString("float dot(float x, float y);")); | |
542 s.append(TString("float dot(vec2 x, vec2 y);")); | |
543 s.append(TString("float dot(vec3 x, vec3 y);")); | |
544 s.append(TString("float dot(vec4 x, vec4 y);")); | |
545 | |
546 s.append(TString("vec3 cross(vec3 x, vec3 y);")); | |
547 s.append(TString("float normalize(float x);")); | |
548 s.append(TString("vec2 normalize(vec2 x);")); | |
549 s.append(TString("vec3 normalize(vec3 x);")); | |
550 s.append(TString("vec4 normalize(vec4 x);")); | |
551 | |
552 s.append(TString("float faceforward(float N, float I, float Nref);")); | |
553 s.append(TString("vec2 faceforward(vec2 N, vec2 I, vec2 Nref);")); | |
554 s.append(TString("vec3 faceforward(vec3 N, vec3 I, vec3 Nref);")); | |
555 s.append(TString("vec4 faceforward(vec4 N, vec4 I, vec4 Nref);")); | |
556 | |
557 s.append(TString("float reflect(float I, float N);")); | |
558 s.append(TString("vec2 reflect(vec2 I, vec2 N);")); | |
559 s.append(TString("vec3 reflect(vec3 I, vec3 N);")); | |
560 s.append(TString("vec4 reflect(vec4 I, vec4 N);")); | |
561 | |
562 s.append(TString("float refract(float I, float N, float eta);")); | |
563 s.append(TString("vec2 refract(vec2 I, vec2 N, float eta);")); | |
564 s.append(TString("vec3 refract(vec3 I, vec3 N, float eta);")); | |
565 s.append(TString("vec4 refract(vec4 I, vec4 N, float eta);")); | |
566 | |
567 // | |
568 // Matrix Functions. | |
569 // | |
570 s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);")); | |
571 s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);")); | |
572 s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);")); | |
573 | |
574 // | |
575 // Vector relational functions. | |
576 // | |
577 s.append(TString("bvec2 lessThan(vec2 x, vec2 y);")); | |
578 s.append(TString("bvec3 lessThan(vec3 x, vec3 y);")); | |
579 s.append(TString("bvec4 lessThan(vec4 x, vec4 y);")); | |
580 | |
581 s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);")); | |
582 s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);")); | |
583 s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);")); | |
584 | |
585 s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);")); | |
586 s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);")); | |
587 s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);")); | |
588 | |
589 s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);")); | |
590 s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);")); | |
591 s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);")); | |
592 | |
593 s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);")); | |
594 s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);")); | |
595 s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);")); | |
596 | |
597 s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);")); | |
598 s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);")); | |
599 s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);")); | |
600 | |
601 s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);")); | |
602 s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);")); | |
603 s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);")); | |
604 | |
605 s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);")); | |
606 s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);")); | |
607 s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);")); | |
608 | |
609 s.append(TString("bvec2 equal(vec2 x, vec2 y);")); | |
610 s.append(TString("bvec3 equal(vec3 x, vec3 y);")); | |
611 s.append(TString("bvec4 equal(vec4 x, vec4 y);")); | |
612 | |
613 s.append(TString("bvec2 equal(ivec2 x, ivec2 y);")); | |
614 s.append(TString("bvec3 equal(ivec3 x, ivec3 y);")); | |
615 s.append(TString("bvec4 equal(ivec4 x, ivec4 y);")); | |
616 | |
617 s.append(TString("bvec2 equal(bvec2 x, bvec2 y);")); | |
618 s.append(TString("bvec3 equal(bvec3 x, bvec3 y);")); | |
619 s.append(TString("bvec4 equal(bvec4 x, bvec4 y);")); | |
620 | |
621 s.append(TString("bvec2 notEqual(vec2 x, vec2 y);")); | |
622 s.append(TString("bvec3 notEqual(vec3 x, vec3 y);")); | |
623 s.append(TString("bvec4 notEqual(vec4 x, vec4 y);")); | |
624 | |
625 s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);")); | |
626 s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);")); | |
627 s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);")); | |
628 | |
629 s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);")); | |
630 s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);")); | |
631 s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);")); | |
632 | |
633 s.append(TString("bool any(bvec2 x);")); | |
634 s.append(TString("bool any(bvec3 x);")); | |
635 s.append(TString("bool any(bvec4 x);")); | |
636 | |
637 s.append(TString("bool all(bvec2 x);")); | |
638 s.append(TString("bool all(bvec3 x);")); | |
639 s.append(TString("bool all(bvec4 x);")); | |
640 | |
641 s.append(TString("bvec2 not(bvec2 x);")); | |
642 s.append(TString("bvec3 not(bvec3 x);")); | |
643 s.append(TString("bvec4 not(bvec4 x);")); | |
644 | |
645 // | |
646 // Texture Functions. | |
647 // | |
648 s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);")); | |
649 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);")); | |
650 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);")); | |
651 s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);")); | |
652 | |
653 if (resources.OES_EGL_image_external) { | |
654 s.append(TString("vec4 texture2D(samplerExternalOES sampler, vec2 coord)
;")); | |
655 s.append(TString("vec4 texture2DProj(samplerExternalOES sampler, vec3 co
ord);")); | |
656 s.append(TString("vec4 texture2DProj(samplerExternalOES sampler, vec4 co
ord);")); | |
657 } | |
658 | |
659 if (resources.ARB_texture_rectangle) { | |
660 s.append(TString("vec4 texture2DRect(sampler2DRect sampler, vec2 coord);
")); | |
661 s.append(TString("vec4 texture2DRectProj(sampler2DRect sampler, vec3 coo
rd);")); | |
662 s.append(TString("vec4 texture2DRectProj(sampler2DRect sampler, vec4 coo
rd);")); | |
663 } | |
664 | |
665 // | |
666 // Noise functions. | |
667 // | |
668 //s.append(TString("float noise1(float x);")); | |
669 //s.append(TString("float noise1(vec2 x);")); | |
670 //s.append(TString("float noise1(vec3 x);")); | |
671 //s.append(TString("float noise1(vec4 x);")); | |
672 | |
673 //s.append(TString("vec2 noise2(float x);")); | |
674 //s.append(TString("vec2 noise2(vec2 x);")); | |
675 //s.append(TString("vec2 noise2(vec3 x);")); | |
676 //s.append(TString("vec2 noise2(vec4 x);")); | |
677 | |
678 //s.append(TString("vec3 noise3(float x);")); | |
679 //s.append(TString("vec3 noise3(vec2 x);")); | |
680 //s.append(TString("vec3 noise3(vec3 x);")); | |
681 //s.append(TString("vec3 noise3(vec4 x);")); | |
682 | |
683 //s.append(TString("vec4 noise4(float x);")); | |
684 //s.append(TString("vec4 noise4(vec2 x);")); | |
685 //s.append(TString("vec4 noise4(vec3 x);")); | |
686 //s.append(TString("vec4 noise4(vec4 x);")); | |
687 | |
688 return s; | |
689 } | |
690 | 16 |
691 //============================================================================ | 17 //============================================================================ |
692 // | 18 // |
693 // Prototypes for built-in functions seen by vertex shaders only. | 19 // Prototypes for built-in functions seen by vertex shaders only. |
694 // | 20 // |
695 //============================================================================ | 21 //============================================================================ |
696 static TString BuiltInFunctionsVertex(const ShBuiltInResources& resources) | 22 static TString BuiltInFunctionsVertex(const ShBuiltInResources& resources) |
697 { | 23 { |
698 TString s; | 24 TString s; |
699 | 25 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 | 151 |
826 return s.str(); | 152 return s.str(); |
827 } | 153 } |
828 | 154 |
829 void TBuiltIns::initialize(ShShaderType type, ShShaderSpec spec, | 155 void TBuiltIns::initialize(ShShaderType type, ShShaderSpec spec, |
830 const ShBuiltInResources& resources) | 156 const ShBuiltInResources& resources) |
831 { | 157 { |
832 switch (type) { | 158 switch (type) { |
833 case SH_FRAGMENT_SHADER: | 159 case SH_FRAGMENT_SHADER: |
834 builtInStrings.push_back(DefaultPrecisionFragment()); | 160 builtInStrings.push_back(DefaultPrecisionFragment()); |
835 //builtInStrings.push_back(BuiltInFunctionsCommon(resources)); | |
836 builtInStrings.push_back(BuiltInFunctionsFragment(resources)); | 161 builtInStrings.push_back(BuiltInFunctionsFragment(resources)); |
837 builtInStrings.push_back(StandardUniforms()); | 162 builtInStrings.push_back(StandardUniforms()); |
838 break; | 163 break; |
839 | 164 |
840 case SH_VERTEX_SHADER: | 165 case SH_VERTEX_SHADER: |
841 builtInStrings.push_back(DefaultPrecisionVertex()); | 166 builtInStrings.push_back(DefaultPrecisionVertex()); |
842 //builtInStrings.push_back(BuiltInFunctionsCommon(resources)); | |
843 builtInStrings.push_back(BuiltInFunctionsVertex(resources)); | 167 builtInStrings.push_back(BuiltInFunctionsVertex(resources)); |
844 builtInStrings.push_back(StandardUniforms()); | 168 builtInStrings.push_back(StandardUniforms()); |
845 break; | 169 break; |
846 | 170 |
847 default: assert(false && "Language not supported"); | 171 default: assert(false && "Language not supported"); |
848 } | 172 } |
849 | 173 |
850 builtInStrings.push_back(BuiltInConstants(spec, resources)); | 174 builtInStrings.push_back(BuiltInConstants(spec, resources)); |
851 } | 175 } |
852 | 176 |
(...skipping 11 matching lines...) Expand all Loading... |
864 symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"),
TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); | 188 symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"),
TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); |
865 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"),
TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); | 189 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"),
TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); |
866 | 190 |
867 // | 191 // |
868 // In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are
not available. | 192 // In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are
not available. |
869 // Instead, css_MixColor and css_ColorMatrix are available. | 193 // Instead, css_MixColor and css_ColorMatrix are available. |
870 // | 194 // |
871 if (spec != SH_CSS_SHADERS_SPEC) { | 195 if (spec != SH_CSS_SHADERS_SPEC) { |
872 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),
TType(EbtFloat, EbpMedium, EvqFragColor, 4))); | 196 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),
TType(EbtFloat, EbpMedium, EvqFragColor, 4))); |
873 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_Max
DrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); | 197 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_Max
DrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); |
| 198 if (resources.EXT_frag_depth) { |
| 199 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepthEX
T"), TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpM
edium, EvqFragDepth, 1))); |
| 200 symbolTable.relateToExtension("gl_FragDepthEXT", "GL_EXT_frag_de
pth"); |
| 201 } |
874 } else { | 202 } else { |
875 symbolTable.insert(*new TVariable(NewPoolTString("css_MixColor"),
TType(EbtFloat, EbpMedium, EvqGlobal, 4))); | 203 symbolTable.insert(*new TVariable(NewPoolTString("css_MixColor"),
TType(EbtFloat, EbpMedium, EvqGlobal, 4))); |
876 symbolTable.insert(*new TVariable(NewPoolTString("css_ColorMatrix"),
TType(EbtFloat, EbpMedium, EvqGlobal, 4, true))); | 204 symbolTable.insert(*new TVariable(NewPoolTString("css_ColorMatrix"),
TType(EbtFloat, EbpMedium, EvqGlobal, 4, true))); |
877 } | 205 } |
878 | 206 |
879 break; | 207 break; |
880 | 208 |
881 case SH_VERTEX_SHADER: | 209 case SH_VERTEX_SHADER: |
882 symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"), TTyp
e(EbtFloat, EbpHigh, EvqPosition, 4))); | 210 symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"), TTyp
e(EbtFloat, EbpHigh, EvqPosition, 4))); |
883 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TTyp
e(EbtFloat, EbpMedium, EvqPointSize, 1))); | 211 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TTyp
e(EbtFloat, EbpMedium, EvqPointSize, 1))); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 TExtensionBehavior& extBehavior) | 309 TExtensionBehavior& extBehavior) |
982 { | 310 { |
983 if (resources.OES_standard_derivatives) | 311 if (resources.OES_standard_derivatives) |
984 extBehavior["GL_OES_standard_derivatives"] = EBhUndefined; | 312 extBehavior["GL_OES_standard_derivatives"] = EBhUndefined; |
985 if (resources.OES_EGL_image_external) | 313 if (resources.OES_EGL_image_external) |
986 extBehavior["GL_OES_EGL_image_external"] = EBhUndefined; | 314 extBehavior["GL_OES_EGL_image_external"] = EBhUndefined; |
987 if (resources.ARB_texture_rectangle) | 315 if (resources.ARB_texture_rectangle) |
988 extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined; | 316 extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined; |
989 if (resources.EXT_draw_buffers) | 317 if (resources.EXT_draw_buffers) |
990 extBehavior["GL_EXT_draw_buffers"] = EBhUndefined; | 318 extBehavior["GL_EXT_draw_buffers"] = EBhUndefined; |
991 } | 319 if (resources.EXT_frag_depth) |
| 320 extBehavior["GL_EXT_frag_depth"] = EBhUndefined; |
| 321 } |
LEFT | RIGHT |