1 | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | // |
16 | // Create strings that declare built-in definitions, add built-ins that |
17 | // cannot be expressed in the files, and establish mappings between |
18 | // built-in functions and operators. |
19 | // |
20 | |
21 | #include "Initialize.h" |
22 | |
23 | #include "intermediate.h" |
24 | |
25 | void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TSymbolTable &symbolTable) |
26 | { |
27 | TType *float1 = new TType(EbtFloat); |
28 | TType *float2 = new TType(EbtFloat, 2); |
29 | TType *float3 = new TType(EbtFloat, 3); |
30 | TType *float4 = new TType(EbtFloat, 4); |
31 | TType *genType = new TType(EbtGenType); |
32 | |
33 | TType *int1 = new TType(EbtInt); |
34 | TType *int2 = new TType(EbtInt, 2); |
35 | TType *int3 = new TType(EbtInt, 3); |
36 | TType *uint1 = new TType(EbtUInt); |
37 | TType *genIType = new TType(EbtGenIType); |
38 | TType *genUType = new TType(EbtGenUType); |
39 | TType *genBType = new TType(EbtGenBType); |
40 | |
41 | // |
42 | // Angle and Trigonometric Functions. |
43 | // |
44 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpRadians, genType, "radians" , genType); |
45 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpDegrees, genType, "degrees" , genType); |
46 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSin, genType, "sin" , genType); |
47 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpCos, genType, "cos" , genType); |
48 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpTan, genType, "tan" , genType); |
49 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAsin, genType, "asin" , genType); |
50 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAcos, genType, "acos" , genType); |
51 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAtan, genType, "atan" , genType, genType); |
52 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAtan, genType, "atan" , genType); |
53 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpSinh, genType, "sinh" , genType); |
54 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpCosh, genType, "cosh" , genType); |
55 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTanh, genType, "tanh" , genType); |
56 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpAsinh, genType, "asinh" , genType); |
57 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpAcosh, genType, "acosh" , genType); |
58 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpAtanh, genType, "atanh" , genType); |
59 | |
60 | // |
61 | // Exponential Functions. |
62 | // |
63 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpPow, genType, "pow" , genType, genType); |
64 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpExp, genType, "exp" , genType); |
65 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLog, genType, "log" , genType); |
66 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpExp2, genType, "exp2" , genType); |
67 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLog2, genType, "log2" , genType); |
68 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSqrt, genType, "sqrt" , genType); |
69 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpInverseSqrt, genType, "inversesqrt" , genType); |
70 | |
71 | // |
72 | // Common Functions. |
73 | // |
74 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAbs, genType, "abs" , genType); |
75 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpAbs, genIType, "abs" , genIType); |
76 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSign, genType, "sign" , genType); |
77 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpSign, genIType, "sign" , genIType); |
78 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFloor, genType, "floor" , genType); |
79 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTrunc, genType, "trunc" , genType); |
80 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpRound, genType, "round" , genType); |
81 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpRoundEven, genType, "roundEven" , genType); |
82 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpCeil, genType, "ceil" , genType); |
83 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFract, genType, "fract" , genType); |
84 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMod, genType, "mod" , genType, float1); |
85 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMod, genType, "mod" , genType, genType); |
86 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMin, genType, "min" , genType, float1); |
87 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMin, genType, "min" , genType, genType); |
88 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMin, genIType, "min" , genIType, genIType); |
89 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMin, genIType, "min" , genIType, int1); |
90 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMin, genUType, "min" , genUType, genUType); |
91 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMin, genUType, "min" , genUType, uint1); |
92 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMax, genType, "max" , genType, float1); |
93 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMax, genType, "max" , genType, genType); |
94 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMax, genIType, "max" , genIType, genIType); |
95 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMax, genIType, "max" , genIType, int1); |
96 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMax, genUType, "max" , genUType, genUType); |
97 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMax, genUType, "max" , genUType, uint1); |
98 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpClamp, genType, "clamp" , genType, float1, float1); |
99 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpClamp, genType, "clamp" , genType, genType, genType); |
100 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpClamp, genIType, "clamp" , genIType, int1, int1); |
101 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpClamp, genIType, "clamp" , genIType, genIType, genIType); |
102 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpClamp, genUType, "clamp" , genUType, uint1, uint1); |
103 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpClamp, genUType, "clamp" , genUType, genUType, genUType); |
104 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMix, genType, "mix" , genType, genType, float1); |
105 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMix, genType, "mix" , genType, genType, genType); |
106 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMix, genType, "mix" , genType, genType, genBType); |
107 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpStep, genType, "step" , genType, genType); |
108 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpStep, genType, "step" , float1, genType); |
109 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep" , genType, genType, genType); |
110 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep" , float1, float1, genType); |
111 | |
112 | TType *outFloat1 = new TType(EbtFloat, EbpUndefined, EvqOut); |
113 | TType *outFloat2 = new TType(EbtFloat, EbpUndefined, EvqOut, 2); |
114 | TType *outFloat3 = new TType(EbtFloat, EbpUndefined, EvqOut, 3); |
115 | TType *outFloat4 = new TType(EbtFloat, EbpUndefined, EvqOut, 4); |
116 | |
117 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float1, "modf" , float1, outFloat1); |
118 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float2, "modf" , float2, outFloat2); |
119 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float3, "modf" , float3, outFloat3); |
120 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float4, "modf" , float4, outFloat4); |
121 | |
122 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsNan, genBType, "isnan" , genType); |
123 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsInf, genBType, "isinf" , genType); |
124 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpFloatBitsToInt, genIType, "floatBitsToInt" , genType); |
125 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpFloatBitsToUint, genUType, "floatBitsToUint" , genType); |
126 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIntBitsToFloat, genType, "intBitsToFloat" , genIType); |
127 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpUintBitsToFloat, genType, "uintBitsToFloat" , genUType); |
128 | |
129 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpPackSnorm2x16, uint1, "packSnorm2x16" , float2); |
130 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpPackUnorm2x16, uint1, "packUnorm2x16" , float2); |
131 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpPackHalf2x16, uint1, "packHalf2x16" , float2); |
132 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpUnpackSnorm2x16, float2, "unpackSnorm2x16" , uint1); |
133 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpUnpackUnorm2x16, float2, "unpackUnorm2x16" , uint1); |
134 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpUnpackHalf2x16, float2, "unpackHalf2x16" , uint1); |
135 | |
136 | // |
137 | // Geometric Functions. |
138 | // |
139 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLength, float1, "length" , genType); |
140 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpDistance, float1, "distance" , genType, genType); |
141 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpDot, float1, "dot" , genType, genType); |
142 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpCross, float3, "cross" , float3, float3); |
143 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpNormalize, genType, "normalize" , genType); |
144 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFaceForward, genType, "faceforward" , genType, genType, genType); |
145 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpReflect, genType, "reflect" , genType, genType); |
146 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpRefract, genType, "refract" , genType, genType, float1); |
147 | |
148 | TType *mat2 = new TType(EbtFloat, 2, 2); |
149 | TType *mat2x3 = new TType(EbtFloat, 2, 3); |
150 | TType *mat2x4 = new TType(EbtFloat, 2, 4); |
151 | TType *mat3x2 = new TType(EbtFloat, 3, 2); |
152 | TType *mat3 = new TType(EbtFloat, 3, 3); |
153 | TType *mat3x4 = new TType(EbtFloat, 3, 4); |
154 | TType *mat4x2 = new TType(EbtFloat, 4, 2); |
155 | TType *mat4x3 = new TType(EbtFloat, 4, 3); |
156 | TType *mat4 = new TType(EbtFloat, 4, 4); |
157 | |
158 | // |
159 | // Matrix Functions. |
160 | // |
161 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMul, mat2, "matrixCompMult" , mat2, mat2); |
162 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMul, mat3, "matrixCompMult" , mat3, mat3); |
163 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMul, mat4, "matrixCompMult" , mat4, mat4); |
164 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat2x3, "matrixCompMult" , mat2x3, mat2x3); |
165 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat3x2, "matrixCompMult" , mat3x2, mat3x2); |
166 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat2x4, "matrixCompMult" , mat2x4, mat2x4); |
167 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat4x2, "matrixCompMult" , mat4x2, mat4x2); |
168 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat3x4, "matrixCompMult" , mat3x4, mat3x4); |
169 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMul, mat4x3, "matrixCompMult" , mat4x3, mat4x3); |
170 | |
171 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat2, "outerProduct" , float2, float2); |
172 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat3, "outerProduct" , float3, float3); |
173 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat4, "outerProduct" , float4, float4); |
174 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat2x3, "outerProduct" , float3, float2); |
175 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat3x2, "outerProduct" , float2, float3); |
176 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat2x4, "outerProduct" , float4, float2); |
177 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat4x2, "outerProduct" , float2, float4); |
178 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat3x4, "outerProduct" , float4, float3); |
179 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpOuterProduct, mat4x3, "outerProduct" , float3, float4); |
180 | |
181 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat2, "transpose" , mat2); |
182 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat3, "transpose" , mat3); |
183 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat4, "transpose" , mat4); |
184 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat2x3, "transpose" , mat3x2); |
185 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat3x2, "transpose" , mat2x3); |
186 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat2x4, "transpose" , mat4x2); |
187 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat4x2, "transpose" , mat2x4); |
188 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat3x4, "transpose" , mat4x3); |
189 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTranspose, mat4x3, "transpose" , mat3x4); |
190 | |
191 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpDeterminant, float1, "determinant" , mat2); |
192 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpDeterminant, float1, "determinant" , mat3); |
193 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpDeterminant, float1, "determinant" , mat4); |
194 | |
195 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpInverse, mat2, "inverse" , mat2); |
196 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpInverse, mat3, "inverse" , mat3); |
197 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpInverse, mat4, "inverse" , mat4); |
198 | |
199 | |
200 | TType *bool1 = new TType(EbtBool); |
201 | TType *vec = new TType(EbtVec); |
202 | TType *ivec = new TType(EbtIVec); |
203 | TType *uvec = new TType(EbtUVec); |
204 | TType *bvec = new TType(EbtBVec); |
205 | |
206 | // |
207 | // Vector relational functions. |
208 | // |
209 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLessThan, bvec, "lessThan" , vec, vec); |
210 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLessThan, bvec, "lessThan" , ivec, ivec); |
211 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpLessThan, bvec, "lessThan" , uvec, uvec); |
212 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLessThanEqual, bvec, "lessThanEqual" , vec, vec); |
213 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLessThanEqual, bvec, "lessThanEqual" , ivec, ivec); |
214 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpLessThanEqual, bvec, "lessThanEqual" , uvec, uvec); |
215 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpGreaterThan, bvec, "greaterThan" , vec, vec); |
216 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpGreaterThan, bvec, "greaterThan" , ivec, ivec); |
217 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpGreaterThan, bvec, "greaterThan" , uvec, uvec); |
218 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpGreaterThanEqual, bvec, "greaterThanEqual" , vec, vec); |
219 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpGreaterThanEqual, bvec, "greaterThanEqual" , ivec, ivec); |
220 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpGreaterThanEqual, bvec, "greaterThanEqual" , uvec, uvec); |
221 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorEqual, bvec, "equal" , vec, vec); |
222 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorEqual, bvec, "equal" , ivec, ivec); |
223 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpVectorEqual, bvec, "equal" , uvec, uvec); |
224 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorEqual, bvec, "equal" , bvec, bvec); |
225 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorNotEqual, bvec, "notEqual" , vec, vec); |
226 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorNotEqual, bvec, "notEqual" , ivec, ivec); |
227 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpVectorNotEqual, bvec, "notEqual" , uvec, uvec); |
228 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorNotEqual, bvec, "notEqual" , bvec, bvec); |
229 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAny, bool1, "any" , bvec); |
230 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAll, bool1, "all" , bvec); |
231 | symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorLogicalNot, bvec, "not" , bvec); |
232 | |
233 | TType *sampler2D = new TType(EbtSampler2D); |
234 | TType *samplerCube = new TType(EbtSamplerCube); |
235 | TType *sampler3D = new TType(EbtSampler3D); |
236 | |
237 | // |
238 | // Texture Functions for GLSL ES 1.0 |
239 | // |
240 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D" , sampler2D, float2); |
241 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , sampler2D, float3); |
242 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , sampler2D, float4); |
243 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube" , samplerCube, float3); |
244 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture3D" , sampler3D, float3); |
245 | |
246 | if(resources.ARB_texture_rectangle) |
247 | { |
248 | TType *sampler2DRect = new TType(EbtSampler2DRect); |
249 | |
250 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRect" , sampler2DRect, float2); |
251 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj" , sampler2DRect, float3); |
252 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj" , sampler2DRect, float4); |
253 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texture" , sampler2DRect, float2); |
254 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj" , sampler2DRect, float3); |
255 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj" , sampler2DRect, float4); |
256 | } |
257 | |
258 | if(resources.OES_EGL_image_external) |
259 | { |
260 | TType *samplerExternalOES = new TType(EbtSamplerExternalOES); |
261 | |
262 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D" , samplerExternalOES, float2); |
263 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , samplerExternalOES, float3); |
264 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , samplerExternalOES, float4); |
265 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture3D" , samplerExternalOES, float3); |
266 | } |
267 | |
268 | if(resources.OES_EGL_image_external_essl3) |
269 | { |
270 | TType *samplerExternalOES = new TType(EbtSamplerExternalOES); |
271 | |
272 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texture" , samplerExternalOES, float2); |
273 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj" , samplerExternalOES, float3); |
274 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj" , samplerExternalOES, float4); |
275 | |
276 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize" , samplerExternalOES, int1); |
277 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texelFetch" , samplerExternalOES, int2, int1); |
278 | } |
279 | |
280 | if(type == GL_FRAGMENT_SHADER) |
281 | { |
282 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D" , sampler2D, float2, float1); |
283 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , sampler2D, float3, float1); |
284 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj" , sampler2D, float4, float1); |
285 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube" , samplerCube, float3, float1); |
286 | |
287 | if(resources.OES_standard_derivatives) |
288 | { |
289 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, EOpDFdx, "GL_OES_standard_derivatives" , genType, "dFdx" , genType); |
290 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, EOpDFdy, "GL_OES_standard_derivatives" , genType, "dFdy" , genType); |
291 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, EOpFwidth,"GL_OES_standard_derivatives" , genType, "fwidth" , genType); |
292 | } |
293 | } |
294 | |
295 | if(type == GL_VERTEX_SHADER) |
296 | { |
297 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLod" , sampler2D, float2, float1); |
298 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod" , sampler2D, float3, float1); |
299 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod" , sampler2D, float4, float1); |
300 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLod" , samplerCube, float3, float1); |
301 | symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture3DLod" , sampler3D, float3, float1); |
302 | } |
303 | |
304 | TType *gvec4 = new TType(EbtGVec4); |
305 | |
306 | TType *gsampler2D = new TType(EbtGSampler2D); |
307 | TType *gsamplerCube = new TType(EbtGSamplerCube); |
308 | TType *gsampler3D = new TType(EbtGSampler3D); |
309 | TType *gsampler2DArray = new TType(EbtGSampler2DArray); |
310 | |
311 | // |
312 | // Texture Functions for GLSL ES 3.0 |
313 | // |
314 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler2D, float2); |
315 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler3D, float3); |
316 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsamplerCube, float3); |
317 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler2DArray, float3); |
318 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler2D, float3); |
319 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler2D, float4); |
320 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler3D, float4); |
321 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod" , gsampler2D, float2, float1); |
322 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod" , gsampler3D, float3, float1); |
323 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod" , gsamplerCube, float3, float1); |
324 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod" , gsampler2DArray, float3, float1); |
325 | |
326 | if(type == GL_FRAGMENT_SHADER) |
327 | { |
328 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler2D, float2, float1); |
329 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler3D, float3, float1); |
330 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsamplerCube, float3, float1); |
331 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture" , gsampler2DArray, float3, float1); |
332 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler2D, float3, float1); |
333 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler2D, float4, float1); |
334 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj" , gsampler3D, float4, float1); |
335 | } |
336 | |
337 | TType *sampler2DShadow = new TType(EbtSampler2DShadow); |
338 | TType *samplerCubeShadow = new TType(EbtSamplerCubeShadow); |
339 | TType *sampler2DArrayShadow = new TType(EbtSampler2DArrayShadow); |
340 | |
341 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture" , sampler2DShadow, float3); |
342 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture" , samplerCubeShadow, float4); |
343 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture" , sampler2DArrayShadow, float4); |
344 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj" , sampler2DShadow, float4); |
345 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLod" , sampler2DShadow, float3, float1); |
346 | |
347 | if(type == GL_FRAGMENT_SHADER) |
348 | { |
349 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture" , sampler2DShadow, float3, float1); |
350 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture" , samplerCubeShadow, float4, float1); |
351 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj" , sampler2DShadow, float4, float1); |
352 | } |
353 | |
354 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize" , gsampler2D, int1); |
355 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize" , gsampler3D, int1); |
356 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize" , gsamplerCube, int1); |
357 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize" , gsampler2DArray, int1); |
358 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize" , sampler2DShadow, int1); |
359 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize" , samplerCubeShadow, int1); |
360 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize" , sampler2DArrayShadow, int1); |
361 | |
362 | if(type == GL_FRAGMENT_SHADER) |
363 | { |
364 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpDFdx, genType, "dFdx" , genType); |
365 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpDFdy, genType, "dFdy" , genType); |
366 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpFwidth, genType, "fwidth" , genType); |
367 | } |
368 | |
369 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler2D, float2, int2); |
370 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler3D, float3, int3); |
371 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset" , sampler2DShadow, float3, int2); |
372 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler2DArray, float3, int2); |
373 | |
374 | if(type == GL_FRAGMENT_SHADER) |
375 | { |
376 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler2D, float2, int2, float1); |
377 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler3D, float3, int3, float1); |
378 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset" , sampler2DShadow, float3, int2, float1); |
379 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset" , gsampler2DArray, float3, int2, float1); |
380 | } |
381 | |
382 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler2D, float3, int2); |
383 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler2D, float4, int2); |
384 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler3D, float4, int3); |
385 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset" , sampler2DShadow, float4, int2); |
386 | |
387 | if(type == GL_FRAGMENT_SHADER) |
388 | { |
389 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler2D, float3, int2, float1); |
390 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler2D, float4, int2, float1); |
391 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset" , gsampler3D, float4, int3, float1); |
392 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset" , sampler2DShadow, float4, int2, float1); |
393 | } |
394 | |
395 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset" , gsampler2D, float2, float1, int2); |
396 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset" , gsampler3D, float3, float1, int3); |
397 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLodOffset" , sampler2DShadow, float3, float1, int2); |
398 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset" , gsampler2DArray, float3, float1, int2); |
399 | |
400 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod" , gsampler2D, float3, float1); |
401 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod" , gsampler2D, float4, float1); |
402 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod" , gsampler3D, float4, float1); |
403 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLod" , sampler2DShadow, float4, float1); |
404 | |
405 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset" , gsampler2D, float3, float1, int2); |
406 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset" , gsampler2D, float4, float1, int2); |
407 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset" , gsampler3D, float4, float1, int3); |
408 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLodOffset" , sampler2DShadow, float4, float1, int2); |
409 | |
410 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch" , gsampler2D, int2, int1); |
411 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch" , gsampler3D, int3, int1); |
412 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch" , gsampler2DArray, int3, int1); |
413 | |
414 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset" , gsampler2D, int2, int1, int2); |
415 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset" , gsampler3D, int3, int1, int3); |
416 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset" , gsampler2DArray, int3, int1, int2); |
417 | |
418 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad" , gsampler2D, float2, float2, float2); |
419 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad" , gsampler3D, float3, float3, float3); |
420 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad" , gsamplerCube, float3, float3, float3); |
421 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad" , sampler2DShadow, float3, float2, float2); |
422 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad" , samplerCubeShadow, float4, float3, float3); |
423 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad" , gsampler2DArray, float3, float2, float2); |
424 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad" , sampler2DArrayShadow, float4, float2, float2); |
425 | |
426 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset" , gsampler2D, float2, float2, float2, int2); |
427 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset" , gsampler3D, float3, float3, float3, int3); |
428 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset" , sampler2DShadow, float3, float2, float2, int2); |
429 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset" , gsampler2DArray, float3, float2, float2, int2); |
430 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset" , sampler2DArrayShadow, float4, float2, float2, int2); |
431 | |
432 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad" , gsampler2D, float3, float2, float2); |
433 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad" , gsampler2D, float4, float2, float2); |
434 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad" , gsampler3D, float4, float3, float3); |
435 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGrad" , sampler2DShadow, float4, float2, float2); |
436 | |
437 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset" , gsampler2D, float3, float2, float2, int2); |
438 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset" , gsampler2D, float4, float2, float2, int2); |
439 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset" , gsampler3D, float4, float3, float3, int3); |
440 | symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGradOffset" , sampler2DShadow, float4, float2, float2, int2); |
441 | |
442 | // |
443 | // Depth range in window coordinates |
444 | // |
445 | TFieldList *fields = NewPoolTFieldList(); |
446 | TSourceLoc zeroSourceLoc = { 0, 0, 0, 0 }; |
447 | TField *near = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("near" ), zeroSourceLoc); |
448 | TField *far = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("far" ), zeroSourceLoc); |
449 | TField *diff = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("diff" ), zeroSourceLoc); |
450 | fields->push_back(near); |
451 | fields->push_back(far); |
452 | fields->push_back(diff); |
453 | TStructure *depthRangeStruct = new TStructure(NewPoolTString("gl_DepthRangeParameters" ), fields); |
454 | TVariable *depthRangeParameters = new TVariable(&depthRangeStruct->name(), depthRangeStruct, true); |
455 | symbolTable.insert(COMMON_BUILTINS, depthRangeParameters); |
456 | TVariable *depthRange = new TVariable(NewPoolTString("gl_DepthRange" ), TType(depthRangeStruct)); |
457 | depthRange->setQualifier(EvqUniform); |
458 | symbolTable.insert(COMMON_BUILTINS, depthRange); |
459 | |
460 | // |
461 | // Implementation dependent built-in constants. |
462 | // |
463 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs" , resources.MaxVertexAttribs); |
464 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors" , resources.MaxVertexUniformVectors); |
465 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits" , resources.MaxVertexTextureImageUnits); |
466 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits" , resources.MaxCombinedTextureImageUnits); |
467 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits" , resources.MaxTextureImageUnits); |
468 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors" , resources.MaxFragmentUniformVectors); |
469 | symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers" , resources.MaxDrawBuffers); |
470 | symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors" , resources.MaxVaryingVectors); |
471 | symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors" , resources.MaxVertexOutputVectors); |
472 | symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors" , resources.MaxFragmentInputVectors); |
473 | symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset" , resources.MinProgramTexelOffset); |
474 | symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset" , resources.MaxProgramTexelOffset); |
475 | } |
476 | |
477 | void IdentifyBuiltIns(GLenum shaderType, |
478 | const ShBuiltInResources &resources, |
479 | TSymbolTable &symbolTable) |
480 | { |
481 | // |
482 | // First, insert some special built-in variables that are not in |
483 | // the built-in header files. |
484 | // |
485 | switch(shaderType) |
486 | { |
487 | case GL_FRAGMENT_SHADER: |
488 | symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FragCoord" ), TType(EbtFloat, EbpMedium, EvqFragCoord, 4))); |
489 | symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FrontFacing" ), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); |
490 | symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointCoord" ), TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); |
491 | symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragColor" ), TType(EbtFloat, EbpMedium, EvqFragColor, 4))); |
492 | symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]" ), TType(EbtFloat, EbpMedium, EvqFragData, 4))); |
493 | symbolTable.insert(ESSL3_BUILTINS, new TVariable(NewPoolTString("gl_FragDepth" ), TType(EbtFloat, EbpHigh, EvqFragDepth, 1))); |
494 | break; |
495 | case GL_VERTEX_SHADER: |
496 | symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_Position" ), TType(EbtFloat, EbpHigh, EvqPosition, 4))); |
497 | symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointSize" ), TType(EbtFloat, EbpMedium, EvqPointSize, 1))); |
498 | symbolTable.insert(ESSL3_BUILTINS, new TVariable(NewPoolTString("gl_InstanceID" ), TType(EbtInt, EbpHigh, EvqInstanceID, 1))); |
499 | symbolTable.insert(ESSL3_BUILTINS, new TVariable(NewPoolTString("gl_VertexID" ), TType(EbtInt, EbpHigh, EvqVertexID, 1))); |
500 | break; |
501 | default: assert(false && "Language not supported" ); |
502 | } |
503 | |
504 | // Finally add resource-specific variables. |
505 | switch(shaderType) |
506 | { |
507 | case GL_FRAGMENT_SHADER: |
508 | { |
509 | // Set up gl_FragData. The array size. |
510 | TType fragData(EbtFloat, EbpMedium, EvqFragData, 4, 1, true); |
511 | fragData.setArraySize(resources.MaxDrawBuffers); |
512 | symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData" ), fragData)); |
513 | } |
514 | break; |
515 | default: break; |
516 | } |
517 | } |
518 | |
519 | void InitExtensionBehavior(const ShBuiltInResources& resources, |
520 | TExtensionBehavior& extBehavior) |
521 | { |
522 | if(resources.OES_standard_derivatives) |
523 | extBehavior["GL_OES_standard_derivatives" ] = EBhUndefined; |
524 | if(resources.OES_fragment_precision_high) |
525 | extBehavior["GL_FRAGMENT_PRECISION_HIGH" ] = EBhUndefined; |
526 | if(resources.OES_EGL_image_external) |
527 | extBehavior["GL_OES_EGL_image_external" ] = EBhUndefined; |
528 | if(resources.OES_EGL_image_external_essl3) |
529 | extBehavior["GL_OES_EGL_image_external_essl3" ] = EBhUndefined; |
530 | if(resources.EXT_draw_buffers) |
531 | extBehavior["GL_EXT_draw_buffers" ] = EBhUndefined; |
532 | if(resources.ARB_texture_rectangle) |
533 | extBehavior["GL_ARB_texture_rectangle" ] = EBhUndefined; |
534 | } |
535 | |