1 // 2 // Copyright (c) 2002-2014 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 symbols 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/translator/Initialize.h" 14 15 #include "compiler/translator/IntermNode.h" 16 #include "angle_gl.h" 17 18 void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInResources &resources, TSymbolTable &symbolTable) 19 { 20 TType *float1 = new TType(EbtFloat); 21 TType *float2 = new TType(EbtFloat, 2); 22 TType *float3 = new TType(EbtFloat, 3); 23 TType *float4 = new TType(EbtFloat, 4); 24 25 TType *int1 = new TType(EbtInt); 26 TType *int2 = new TType(EbtInt, 2); 27 TType *int3 = new TType(EbtInt, 3); 28 TType *int4 = new TType(EbtInt, 4); 29 30 // 31 // Angle and Trigonometric Functions. 32 // 33 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "radians", float1); 34 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "radians", float2); 35 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "radians", float3); 36 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "radians", float4); 37 38 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "degrees", float1); 39 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "degrees", float2); 40 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "degrees", float3); 41 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "degrees", float4); 42 43 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sin", float1); 44 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sin", float2); 45 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sin", float3); 46 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sin", float4); 47 48 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "cos", float1); 49 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "cos", float2); 50 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cos", float3); 51 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "cos", float4); 52 53 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "tan", float1); 54 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "tan", float2); 55 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "tan", float3); 56 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "tan", float4); 57 58 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "asin", float1); 59 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "asin", float2); 60 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "asin", float3); 61 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "asin", float4); 62 63 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "acos", float1); 64 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "acos", float2); 65 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "acos", float3); 66 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "acos", float4); 67 68 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1, float1); 69 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2, float2); 70 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3, float3); 71 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4, float4); 72 73 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1); 74 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2); 75 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3); 76 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4); 77 78 // 79 // Exponential Functions. 80 // 81 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "pow", float1, float1); 82 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "pow", float2, float2); 83 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "pow", float3, float3); 84 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "pow", float4, float4); 85 86 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp", float1); 87 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp", float2); 88 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp", float3); 89 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp", float4); 90 91 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log", float1); 92 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log", float2); 93 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log", float3); 94 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log", float4); 95 96 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp2", float1); 97 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp2", float2); 98 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp2", float3); 99 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp2", float4); 100 101 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log2", float1); 102 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log2", float2); 103 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log2", float3); 104 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log2", float4); 105 106 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sqrt", float1); 107 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sqrt", float2); 108 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sqrt", float3); 109 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sqrt", float4); 110 111 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "inversesqrt", float1); 112 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "inversesqrt", float2); 113 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "inversesqrt", float3); 114 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "inversesqrt", float4); 115 116 // 117 // Common Functions. 118 // 119 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "abs", float1); 120 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "abs", float2); 121 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "abs", float3); 122 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "abs", float4); 123 124 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sign", float1); 125 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sign", float2); 126 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sign", float3); 127 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sign", float4); 128 129 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "floor", float1); 130 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "floor", float2); 131 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "floor", float3); 132 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "floor", float4); 133 134 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "ceil", float1); 135 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "ceil", float2); 136 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "ceil", float3); 137 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "ceil", float4); 138 139 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "fract", float1); 140 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "fract", float2); 141 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "fract", float3); 142 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "fract", float4); 143 144 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mod", float1, float1); 145 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float1); 146 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float1); 147 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float1); 148 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float2); 149 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float3); 150 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float4); 151 152 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "min", float1, float1); 153 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float1); 154 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float1); 155 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float1); 156 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float2); 157 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float3); 158 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float4); 159 160 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "max", float1, float1); 161 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float1); 162 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float1); 163 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float1); 164 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float2); 165 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float3); 166 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float4); 167 168 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "clamp", float1, float1, float1); 169 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float1, float1); 170 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float1, float1); 171 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float1, float1); 172 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float2, float2); 173 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float3, float3); 174 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float4, float4); 175 176 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mix", float1, float1, float1); 177 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float1); 178 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float1); 179 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float1); 180 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float2); 181 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float3); 182 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float4); 183 184 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "step", float1, float1); 185 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float2, float2); 186 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float3, float3); 187 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float4, float4); 188 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float1, float2); 189 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float1, float3); 190 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float1, float4); 191 192 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "smoothstep", float1, float1, float1); 193 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float2, float2, float2); 194 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float3, float3, float3); 195 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float4, float4, float4); 196 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float1, float1, float2); 197 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float1, float1, float3); 198 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float1, float1, float4); 199 200 // 201 // Geometric Functions. 202 // 203 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float1); 204 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float2); 205 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float3); 206 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float4); 207 208 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float1, float1); 209 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float2, float2); 210 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float3, float3); 211 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float4, float4); 212 213 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float1, float1); 214 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float2, float2); 215 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float3, float3); 216 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float4, float4); 217 218 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cross", float3, float3); 219 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "normalize", float1); 220 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "normalize", float2); 221 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "normalize", float3); 222 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "normalize", float4); 223 224 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "faceforward", float1, float1, float1); 225 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "faceforward", float2, float2, float2); 226 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "faceforward", float3, float3, float3); 227 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "faceforward", float4, float4, float4); 228 229 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "reflect", float1, float1); 230 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "reflect", float2, float2); 231 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "reflect", float3, float3); 232 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "reflect", float4, float4); 233 234 symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "refract", float1, float1, float1); 235 symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "refract", float2, float2, float1); 236 symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "refract", float3, float3, float1); 237 symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "refract", float4, float4, float1); 238 239 TType *mat2 = new TType(EbtFloat, 2, 2); 240 TType *mat3 = new TType(EbtFloat, 3, 3); 241 TType *mat4 = new TType(EbtFloat, 4, 4); 242 243 // 244 // Matrix Functions. 245 // 246 symbolTable.insertBuiltIn(COMMON_BUILTINS, mat2, "matrixCompMult", mat2, mat2); 247 symbolTable.insertBuiltIn(COMMON_BUILTINS, mat3, "matrixCompMult", mat3, mat3); 248 symbolTable.insertBuiltIn(COMMON_BUILTINS, mat4, "matrixCompMult", mat4, mat4); 249 250 TType *bool1 = new TType(EbtBool); 251 TType *bool2 = new TType(EbtBool, 2); 252 TType *bool3 = new TType(EbtBool, 3); 253 TType *bool4 = new TType(EbtBool, 4); 254 255 // 256 // Vector relational functions. 257 // 258 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", float2, float2); 259 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", float3, float3); 260 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", float4, float4); 261 262 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", int2, int2); 263 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", int3, int3); 264 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", int4, int4); 265 266 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", float2, float2); 267 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", float3, float3); 268 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", float4, float4); 269 270 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", int2, int2); 271 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", int3, int3); 272 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", int4, int4); 273 274 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", float2, float2); 275 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", float3, float3); 276 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", float4, float4); 277 278 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", int2, int2); 279 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", int3, int3); 280 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", int4, int4); 281 282 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", float2, float2); 283 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", float3, float3); 284 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", float4, float4); 285 286 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", int2, int2); 287 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", int3, int3); 288 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", int4, int4); 289 290 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", float2, float2); 291 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", float3, float3); 292 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", float4, float4); 293 294 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", int2, int2); 295 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", int3, int3); 296 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", int4, int4); 297 298 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", bool2, bool2); 299 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", bool3, bool3); 300 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", bool4, bool4); 301 302 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", float2, float2); 303 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", float3, float3); 304 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", float4, float4); 305 306 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", int2, int2); 307 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", int3, int3); 308 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", int4, int4); 309 310 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", bool2, bool2); 311 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", bool3, bool3); 312 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", bool4, bool4); 313 314 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool2); 315 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool3); 316 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool4); 317 318 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool2); 319 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool3); 320 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool4); 321 322 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "not", bool2); 323 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "not", bool3); 324 symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "not", bool4); 325 326 TType *sampler2D = new TType(EbtSampler2D); 327 TType *samplerCube = new TType(EbtSamplerCube); 328 329 // 330 // Texture Functions for GLSL ES 1.0 331 // 332 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2); 333 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3); 334 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4); 335 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3); 336 337 if (resources.OES_EGL_image_external) 338 { 339 TType *samplerExternalOES = new TType(EbtSamplerExternalOES); 340 341 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", samplerExternalOES, float2); 342 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, float3); 343 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", samplerExternalOES, float4); 344 } 345 346 if (resources.ARB_texture_rectangle) 347 { 348 TType *sampler2DRect = new TType(EbtSampler2DRect); 349 350 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRect", sampler2DRect, float2); 351 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float3); 352 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float4); 353 } 354 355 if (resources.EXT_shader_texture_lod) 356 { 357 /* The *Grad* variants are new to both vertex and fragment shaders; the fragment 358 * shader specific pieces are added separately below. 359 */ 360 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DGradEXT", sampler2D, float2, float2, float2); 361 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjGradEXT", sampler2D, float3, float2, float2); 362 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjGradEXT", sampler2D, float4, float2, float2); 363 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeGradEXT", samplerCube, float3, float3, float3); 364 } 365 366 if (type == GL_FRAGMENT_SHADER) 367 { 368 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2, float1); 369 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float3, float1); 370 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProj", sampler2D, float4, float1); 371 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3, float1); 372 373 if (resources.OES_standard_derivatives) 374 { 375 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdx", float1); 376 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdx", float2); 377 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdx", float3); 378 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdx", float4); 379 380 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdy", float1); 381 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdy", float2); 382 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdy", float3); 383 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdy", float4); 384 385 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "fwidth", float1); 386 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "fwidth", float2); 387 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "fwidth", float3); 388 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "fwidth", float4); 389 } 390 391 if (resources.EXT_shader_texture_lod) 392 { 393 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLodEXT", sampler2D, float2, float1); 394 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLodEXT", sampler2D, float3, float1); 395 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLodEXT", sampler2D, float4, float1); 396 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLodEXT", samplerCube, float3, float1); 397 } 398 } 399 400 if(type == GL_VERTEX_SHADER) 401 { 402 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DLod", sampler2D, float2, float1); 403 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float3, float1); 404 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DProjLod", sampler2D, float4, float1); 405 symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCubeLod", samplerCube, float3, float1); 406 } 407 408 TType *gvec4 = new TType(EbtGVec4); 409 410 TType *gsampler2D = new TType(EbtGSampler2D); 411 TType *gsamplerCube = new TType(EbtGSamplerCube); 412 TType *gsampler3D = new TType(EbtGSampler3D); 413 TType *gsampler2DArray = new TType(EbtGSampler2DArray); 414 415 // 416 // Texture Functions for GLSL ES 3.0 417 // 418 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2); 419 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3); 420 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3); 421 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3); 422 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3); 423 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4); 424 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4); 425 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2D, float2, float1); 426 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler3D, float3, float1); 427 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsamplerCube, float3, float1); 428 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLod", gsampler2DArray, float3, float1); 429 430 if (type == GL_FRAGMENT_SHADER) 431 { 432 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2D, float2, float1); 433 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler3D, float3, float1); 434 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsamplerCube, float3, float1); 435 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texture", gsampler2DArray, float3, float1); 436 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float3, float1); 437 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler2D, float4, float1); 438 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProj", gsampler3D, float4, float1); 439 } 440 441 TType *sampler2DShadow = new TType(EbtSampler2DShadow); 442 TType *samplerCubeShadow = new TType(EbtSamplerCubeShadow); 443 TType *sampler2DArrayShadow = new TType(EbtSampler2DArrayShadow); 444 445 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3); 446 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4); 447 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DArrayShadow, float4); 448 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4); 449 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLod", sampler2DShadow, float3, float1); 450 451 if (type == GL_FRAGMENT_SHADER) 452 { 453 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", sampler2DShadow, float3, float1); 454 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "texture", samplerCubeShadow, float4, float1); 455 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProj", sampler2DShadow, float4, float1); 456 } 457 458 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsampler2D, int1); 459 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler3D, int1); 460 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsamplerCube, int1); 461 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", gsampler2DArray, int1); 462 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", sampler2DShadow, int1); 463 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerCubeShadow, int1); 464 symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", sampler2DArrayShadow, int1); 465 466 if(type == GL_FRAGMENT_SHADER) 467 { 468 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "dFdx", float1); 469 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "dFdx", float2); 470 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "dFdx", float3); 471 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "dFdx", float4); 472 473 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "dFdy", float1); 474 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "dFdy", float2); 475 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "dFdy", float3); 476 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "dFdy", float4); 477 478 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "fwidth", float1); 479 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "fwidth", float2); 480 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "fwidth", float3); 481 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "fwidth", float4); 482 } 483 484 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2); 485 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3); 486 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, int2); 487 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, int2); 488 489 if(type == GL_FRAGMENT_SHADER) 490 { 491 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2D, float2, int2, float1); 492 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler3D, float3, int3, float1); 493 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureOffset", sampler2DShadow, float3, int2, float1); 494 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureOffset", gsampler2DArray, float3, int2, float1); 495 } 496 497 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, int2); 498 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, int2); 499 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, int3); 500 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, float4, int2); 501 502 if(type == GL_FRAGMENT_SHADER) 503 { 504 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float3, int2, float1); 505 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler2D, float4, int2, float1); 506 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjOffset", gsampler3D, float4, int3, float1); 507 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjOffset", sampler2DShadow, float4, int2, float1); 508 } 509 510 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2D, float2, float1, int2); 511 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler3D, float3, float1, int3); 512 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureLodOffset", sampler2DShadow, float3, float1, int2); 513 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureLodOffset", gsampler2DArray, float3, float1, int2); 514 515 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float3, float1); 516 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler2D, float4, float1); 517 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLod", gsampler3D, float4, float1); 518 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLod", sampler2DShadow, float4, float1); 519 520 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float3, float1, int2); 521 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler2D, float4, float1, int2); 522 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjLodOffset", gsampler3D, float4, float1, int3); 523 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjLodOffset", sampler2DShadow, float4, float1, int2); 524 525 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2D, int2, int1); 526 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler3D, int3, int1); 527 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetch", gsampler2DArray, int3, int1); 528 529 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2D, int2, int1, int2); 530 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler3D, int3, int1, int3); 531 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "texelFetchOffset", gsampler2DArray, int3, int1, int2); 532 533 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2D, float2, float2, float2); 534 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler3D, float3, float3, float3); 535 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsamplerCube, float3, float3, float3); 536 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DShadow, float3, float2, float2); 537 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", samplerCubeShadow, float4, float3, float3); 538 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGrad", gsampler2DArray, float3, float2, float2); 539 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGrad", sampler2DArrayShadow, float4, float2, float2); 540 541 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2D, float2, float2, float2, int2); 542 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler3D, float3, float3, float3, int3); 543 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DShadow, float3, float2, float2, int2); 544 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureGradOffset", gsampler2DArray, float3, float2, float2, int2); 545 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureGradOffset", sampler2DArrayShadow, float4, float2, float2, int2); 546 547 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float3, float2, float2); 548 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler2D, float4, float2, float2); 549 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGrad", gsampler3D, float4, float3, float3); 550 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGrad", sampler2DShadow, float4, float2, float2); 551 552 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float3, float2, float2, int2); 553 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler2D, float4, float2, float2, int2); 554 symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler3D, float4, float3, float3, int3); 555 symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGradOffset", sampler2DShadow, float4, float2, float2, int2); 556 557 // 558 // Depth range in window coordinates 559 // 560 TFieldList *fields = NewPoolTFieldList(); 561 TSourceLoc zeroSourceLoc = {0, 0, 0, 0}; 562 TField *near = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("near"), zeroSourceLoc); 563 TField *far = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("far"), zeroSourceLoc); 564 TField *diff = new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1), NewPoolTString("diff"), zeroSourceLoc); 565 fields->push_back(near); 566 fields->push_back(far); 567 fields->push_back(diff); 568 TStructure *depthRangeStruct = new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields); 569 TVariable *depthRangeParameters = new TVariable(&depthRangeStruct->name(), depthRangeStruct, true); 570 symbolTable.insert(COMMON_BUILTINS, depthRangeParameters); 571 TVariable *depthRange = new TVariable(NewPoolTString("gl_DepthRange"), TType(depthRangeStruct)); 572 depthRange->setQualifier(EvqUniform); 573 symbolTable.insert(COMMON_BUILTINS, depthRange); 574 575 // 576 // Implementation dependent built-in constants. 577 // 578 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs", resources.MaxVertexAttribs); 579 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors", resources.MaxVertexUniformVectors); 580 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits", resources.MaxVertexTextureImageUnits); 581 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits", resources.MaxCombinedTextureImageUnits); 582 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits", resources.MaxTextureImageUnits); 583 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors); 584 585 symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors); 586 587 if (spec != SH_CSS_SHADERS_SPEC) 588 { 589 symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers); 590 } 591 592 symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors", resources.MaxVertexOutputVectors); 593 symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors", resources.MaxFragmentInputVectors); 594 symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset", resources.MinProgramTexelOffset); 595 symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset", resources.MaxProgramTexelOffset); 596 } 597 598 void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec, 599 const ShBuiltInResources &resources, 600 TSymbolTable &symbolTable) 601 { 602 // 603 // First, insert some special built-in variables that are not in 604 // the built-in header files. 605 // 606 switch(type) { 607 case GL_FRAGMENT_SHADER: 608 symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord, 4))); 609 symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); 610 symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); 611 612 // 613 // In CSS Shaders, gl_FragColor, gl_FragData, and gl_MaxDrawBuffers are not available. 614 // Instead, css_MixColor and css_ColorMatrix are available. 615 // 616 if (spec != SH_CSS_SHADERS_SPEC) { 617 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor, 4))); 618 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); 619 if (resources.EXT_frag_depth) { 620 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragDepthEXT"), TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1))); 621 symbolTable.relateToExtension(ESSL1_BUILTINS, "gl_FragDepthEXT", "GL_EXT_frag_depth"); 622 } 623 } else { 624 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("css_MixColor"), TType(EbtFloat, EbpMedium, EvqGlobal, 4))); 625 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("css_ColorMatrix"), TType(EbtFloat, EbpMedium, EvqGlobal, 4, 4))); 626 } 627 628 break; 629 630 case GL_VERTEX_SHADER: 631 symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4))); 632 symbolTable.insert(COMMON_BUILTINS, new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1))); 633 break; 634 635 default: assert(false && "Language not supported"); 636 } 637 638 // 639 // Next, identify which built-ins from the already loaded headers have 640 // a mapping to an operator. Those that are not identified as such are 641 // expected to be resolved through a library of functions, versus as 642 // operations. 643 // 644 symbolTable.relateToOperator(COMMON_BUILTINS, "matrixCompMult", EOpMul); 645 646 symbolTable.relateToOperator(COMMON_BUILTINS, "equal", EOpVectorEqual); 647 symbolTable.relateToOperator(COMMON_BUILTINS, "notEqual", EOpVectorNotEqual); 648 symbolTable.relateToOperator(COMMON_BUILTINS, "lessThan", EOpLessThan); 649 symbolTable.relateToOperator(COMMON_BUILTINS, "greaterThan", EOpGreaterThan); 650 symbolTable.relateToOperator(COMMON_BUILTINS, "lessThanEqual", EOpLessThanEqual); 651 symbolTable.relateToOperator(COMMON_BUILTINS, "greaterThanEqual", EOpGreaterThanEqual); 652 653 symbolTable.relateToOperator(COMMON_BUILTINS, "radians", EOpRadians); 654 symbolTable.relateToOperator(COMMON_BUILTINS, "degrees", EOpDegrees); 655 symbolTable.relateToOperator(COMMON_BUILTINS, "sin", EOpSin); 656 symbolTable.relateToOperator(COMMON_BUILTINS, "cos", EOpCos); 657 symbolTable.relateToOperator(COMMON_BUILTINS, "tan", EOpTan); 658 symbolTable.relateToOperator(COMMON_BUILTINS, "asin", EOpAsin); 659 symbolTable.relateToOperator(COMMON_BUILTINS, "acos", EOpAcos); 660 symbolTable.relateToOperator(COMMON_BUILTINS, "atan", EOpAtan); 661 662 symbolTable.relateToOperator(COMMON_BUILTINS, "pow", EOpPow); 663 symbolTable.relateToOperator(COMMON_BUILTINS, "exp2", EOpExp2); 664 symbolTable.relateToOperator(COMMON_BUILTINS, "log", EOpLog); 665 symbolTable.relateToOperator(COMMON_BUILTINS, "exp", EOpExp); 666 symbolTable.relateToOperator(COMMON_BUILTINS, "log2", EOpLog2); 667 symbolTable.relateToOperator(COMMON_BUILTINS, "sqrt", EOpSqrt); 668 symbolTable.relateToOperator(COMMON_BUILTINS, "inversesqrt", EOpInverseSqrt); 669 670 symbolTable.relateToOperator(COMMON_BUILTINS, "abs", EOpAbs); 671 symbolTable.relateToOperator(COMMON_BUILTINS, "sign", EOpSign); 672 symbolTable.relateToOperator(COMMON_BUILTINS, "floor", EOpFloor); 673 symbolTable.relateToOperator(COMMON_BUILTINS, "ceil", EOpCeil); 674 symbolTable.relateToOperator(COMMON_BUILTINS, "fract", EOpFract); 675 symbolTable.relateToOperator(COMMON_BUILTINS, "mod", EOpMod); 676 symbolTable.relateToOperator(COMMON_BUILTINS, "min", EOpMin); 677 symbolTable.relateToOperator(COMMON_BUILTINS, "max", EOpMax); 678 symbolTable.relateToOperator(COMMON_BUILTINS, "clamp", EOpClamp); 679 symbolTable.relateToOperator(COMMON_BUILTINS, "mix", EOpMix); 680 symbolTable.relateToOperator(COMMON_BUILTINS, "step", EOpStep); 681 symbolTable.relateToOperator(COMMON_BUILTINS, "smoothstep", EOpSmoothStep); 682 683 symbolTable.relateToOperator(COMMON_BUILTINS, "length", EOpLength); 684 symbolTable.relateToOperator(COMMON_BUILTINS, "distance", EOpDistance); 685 symbolTable.relateToOperator(COMMON_BUILTINS, "dot", EOpDot); 686 symbolTable.relateToOperator(COMMON_BUILTINS, "cross", EOpCross); 687 symbolTable.relateToOperator(COMMON_BUILTINS, "normalize", EOpNormalize); 688 symbolTable.relateToOperator(COMMON_BUILTINS, "faceforward", EOpFaceForward); 689 symbolTable.relateToOperator(COMMON_BUILTINS, "reflect", EOpReflect); 690 symbolTable.relateToOperator(COMMON_BUILTINS, "refract", EOpRefract); 691 692 symbolTable.relateToOperator(COMMON_BUILTINS, "any", EOpAny); 693 symbolTable.relateToOperator(COMMON_BUILTINS, "all", EOpAll); 694 symbolTable.relateToOperator(COMMON_BUILTINS, "not", EOpVectorLogicalNot); 695 696 // Map language-specific operators. 697 switch(type) { 698 case GL_VERTEX_SHADER: 699 break; 700 case GL_FRAGMENT_SHADER: 701 if (resources.OES_standard_derivatives) 702 { 703 symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdx", EOpDFdx); 704 symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdy", EOpDFdy); 705 symbolTable.relateToOperator(ESSL1_BUILTINS, "fwidth", EOpFwidth); 706 707 symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdx", "GL_OES_standard_derivatives"); 708 symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdy", "GL_OES_standard_derivatives"); 709 symbolTable.relateToExtension(ESSL1_BUILTINS, "fwidth", "GL_OES_standard_derivatives"); 710 } 711 if (resources.EXT_shader_texture_lod) 712 { 713 symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DLodEXT", "GL_EXT_shader_texture_lod"); 714 symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DProjLodEXT", "GL_EXT_shader_texture_lod"); 715 symbolTable.relateToExtension(ESSL1_BUILTINS, "textureCubeLodEXT", "GL_EXT_shader_texture_lod"); 716 } 717 break; 718 default: break; 719 } 720 721 symbolTable.relateToOperator(ESSL3_BUILTINS, "dFdx", EOpDFdx); 722 symbolTable.relateToOperator(ESSL3_BUILTINS, "dFdy", EOpDFdy); 723 symbolTable.relateToOperator(ESSL3_BUILTINS, "fwidth", EOpFwidth); 724 725 if (resources.EXT_shader_texture_lod) 726 { 727 symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DGradEXT", "GL_EXT_shader_texture_lod"); 728 symbolTable.relateToExtension(ESSL1_BUILTINS, "texture2DProjGradEXT", "GL_EXT_shader_texture_lod"); 729 symbolTable.relateToExtension(ESSL1_BUILTINS, "textureCubeGradEXT", "GL_EXT_shader_texture_lod"); 730 } 731 732 // Finally add resource-specific variables. 733 switch(type) { 734 case GL_FRAGMENT_SHADER: 735 if (spec != SH_CSS_SHADERS_SPEC) { 736 // Set up gl_FragData. The array size. 737 TType fragData(EbtFloat, EbpMedium, EvqFragData, 4, 1, true); 738 fragData.setArraySize(resources.MaxDrawBuffers); 739 symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString("gl_FragData"), fragData)); 740 } 741 break; 742 default: break; 743 } 744 } 745 746 void InitExtensionBehavior(const ShBuiltInResources& resources, 747 TExtensionBehavior& extBehavior) 748 { 749 if (resources.OES_standard_derivatives) 750 extBehavior["GL_OES_standard_derivatives"] = EBhUndefined; 751 if (resources.OES_EGL_image_external) 752 extBehavior["GL_OES_EGL_image_external"] = EBhUndefined; 753 if (resources.ARB_texture_rectangle) 754 extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined; 755 if (resources.EXT_draw_buffers) 756 extBehavior["GL_EXT_draw_buffers"] = EBhUndefined; 757 if (resources.EXT_frag_depth) 758 extBehavior["GL_EXT_frag_depth"] = EBhUndefined; 759 if (resources.EXT_shader_texture_lod) 760 extBehavior["GL_EXT_shader_texture_lod"] = EBhUndefined; 761 } 762