Changeset 64665 in webkit
- Timestamp:
- Aug 4, 2010 12:31:44 PM (14 years ago)
- Location:
- trunk/ANGLE
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ANGLE/ChangeLog
r64598 r64665 1 2010-08-04 Kenneth Russell <kbr@google.com> 2 3 Reviewed by Dimitri Glazkov. 4 5 Update ANGLE to r352 6 https://bugs.webkit.org/show_bug.cgi?id=43500 7 8 Updated ANGLE to r352 (July 26, 2010). Built WebKit to test. 9 10 * include/GLSLANG/ShaderLang.h: 11 * src/compiler/Initialize.cpp: 12 (BuiltInFunctionsCommon): 13 (BuiltInFunctionsVertex): 14 (BuiltInFunctionsFragment): 15 (StandardUniforms): 16 (DefaultPrecisionVertex): 17 (DefaultPrecisionFragment): 18 (BuiltInConstants): 19 (TBuiltIns::initialize): 20 (IdentifyBuiltIns): 21 * src/compiler/Initialize.h: 22 (TBuiltIns::getBuiltInStrings): 23 * src/compiler/OutputGLSL.cpp: 24 (TOutputGLSL::visitSelection): 25 * src/compiler/ShHandle.h: 26 (TCompiler::getLanguage): 27 (TCompiler::getSpec): 28 (TCompiler::getSymbolTable): 29 (TCompiler::getInfoSink): 30 * src/compiler/ShaderLang.cpp: 31 (InitializeSymbolTable): 32 (GenerateBuiltInSymbolTable): 33 (ShInitialize): 34 (ShConstructCompiler): 35 (ShFinalize): 36 (ShCompile): 37 * src/compiler/SymbolTable.h: 38 (TSymbolTable::atBuiltInLevel): 39 (TSymbolTable::atGlobalLevel): 40 (TSymbolTable::push): 41 (TSymbolTable::getGlobalLevel): 42 (TSymbolTable::currentLevel): 43 * src/libGLESv2/Shader.cpp: 44 (gl::Shader::Shader): 45 (gl::Shader::compileToHLSL): 46 1 47 2010-08-03 Mark Rowe <mrowe@apple.com> 2 48 -
trunk/ANGLE/include/GLSLANG/ShaderLang.h
r64560 r64665 71 71 // Driver calls these to create and destroy compiler objects. 72 72 // 73 ShHandle ShConstructCompiler(EShLanguage, EShSpec ); // one per shader73 ShHandle ShConstructCompiler(EShLanguage, EShSpec, const TBuiltInResource*); 74 74 void ShDestruct(ShHandle); 75 75 … … 86 86 const int numStrings, 87 87 const EShOptimizationLevel, 88 const TBuiltInResource *resources,89 88 int debugOptions 90 89 ); -
trunk/ANGLE/src/compiler/Initialize.cpp
r64560 r64665 15 15 #include "compiler/intermediate.h" 16 16 17 void TBuiltIns::initialize() 18 { 19 // 20 // Initialize all the built-in strings for parsing. 21 // 22 TString BuiltInFunctions; 23 TString BuiltInFunctionsVertex; 24 TString BuiltInFunctionsFragment; 25 TString StandardUniforms; 26 TString VertexDefaultPrecision; 27 TString FragmentDefaultPrecision; 28 29 { 30 //============================================================================ 31 // 32 // Prototypes for built-in functions seen by both vertex and fragment shaders. 33 // 34 //============================================================================ 35 36 TString& s = BuiltInFunctions; 37 38 // 39 // Angle and Trigonometric Functions. 40 // 41 s.append(TString("float radians(float degrees);")); 42 s.append(TString("vec2 radians(vec2 degrees);")); 43 s.append(TString("vec3 radians(vec3 degrees);")); 44 s.append(TString("vec4 radians(vec4 degrees);")); 45 46 s.append(TString("float degrees(float radians);")); 47 s.append(TString("vec2 degrees(vec2 radians);")); 48 s.append(TString("vec3 degrees(vec3 radians);")); 49 s.append(TString("vec4 degrees(vec4 radians);")); 50 51 s.append(TString("float sin(float angle);")); 52 s.append(TString("vec2 sin(vec2 angle);")); 53 s.append(TString("vec3 sin(vec3 angle);")); 54 s.append(TString("vec4 sin(vec4 angle);")); 55 56 s.append(TString("float cos(float angle);")); 57 s.append(TString("vec2 cos(vec2 angle);")); 58 s.append(TString("vec3 cos(vec3 angle);")); 59 s.append(TString("vec4 cos(vec4 angle);")); 60 61 s.append(TString("float tan(float angle);")); 62 s.append(TString("vec2 tan(vec2 angle);")); 63 s.append(TString("vec3 tan(vec3 angle);")); 64 s.append(TString("vec4 tan(vec4 angle);")); 65 66 s.append(TString("float asin(float x);")); 67 s.append(TString("vec2 asin(vec2 x);")); 68 s.append(TString("vec3 asin(vec3 x);")); 69 s.append(TString("vec4 asin(vec4 x);")); 70 71 s.append(TString("float acos(float x);")); 72 s.append(TString("vec2 acos(vec2 x);")); 73 s.append(TString("vec3 acos(vec3 x);")); 74 s.append(TString("vec4 acos(vec4 x);")); 75 76 s.append(TString("float atan(float y, float x);")); 77 s.append(TString("vec2 atan(vec2 y, vec2 x);")); 78 s.append(TString("vec3 atan(vec3 y, vec3 x);")); 79 s.append(TString("vec4 atan(vec4 y, vec4 x);")); 80 81 s.append(TString("float atan(float y_over_x);")); 82 s.append(TString("vec2 atan(vec2 y_over_x);")); 83 s.append(TString("vec3 atan(vec3 y_over_x);")); 84 s.append(TString("vec4 atan(vec4 y_over_x);")); 85 86 // 87 // Exponential Functions. 88 // 89 s.append(TString("float pow(float x, float y);")); 90 s.append(TString("vec2 pow(vec2 x, vec2 y);")); 91 s.append(TString("vec3 pow(vec3 x, vec3 y);")); 92 s.append(TString("vec4 pow(vec4 x, vec4 y);")); 93 94 s.append(TString("float exp(float x);")); 95 s.append(TString("vec2 exp(vec2 x);")); 96 s.append(TString("vec3 exp(vec3 x);")); 97 s.append(TString("vec4 exp(vec4 x);")); 98 99 s.append(TString("float log(float x);")); 100 s.append(TString("vec2 log(vec2 x);")); 101 s.append(TString("vec3 log(vec3 x);")); 102 s.append(TString("vec4 log(vec4 x);")); 103 104 s.append(TString("float exp2(float x);")); 105 s.append(TString("vec2 exp2(vec2 x);")); 106 s.append(TString("vec3 exp2(vec3 x);")); 107 s.append(TString("vec4 exp2(vec4 x);")); 108 109 s.append(TString("float log2(float x);")); 110 s.append(TString("vec2 log2(vec2 x);")); 111 s.append(TString("vec3 log2(vec3 x);")); 112 s.append(TString("vec4 log2(vec4 x);")); 113 114 s.append(TString("float sqrt(float x);")); 115 s.append(TString("vec2 sqrt(vec2 x);")); 116 s.append(TString("vec3 sqrt(vec3 x);")); 117 s.append(TString("vec4 sqrt(vec4 x);")); 118 119 s.append(TString("float inversesqrt(float x);")); 120 s.append(TString("vec2 inversesqrt(vec2 x);")); 121 s.append(TString("vec3 inversesqrt(vec3 x);")); 122 s.append(TString("vec4 inversesqrt(vec4 x);")); 123 124 // 125 // Common Functions. 126 // 127 s.append(TString("float abs(float x);")); 128 s.append(TString("vec2 abs(vec2 x);")); 129 s.append(TString("vec3 abs(vec3 x);")); 130 s.append(TString("vec4 abs(vec4 x);")); 131 132 s.append(TString("float sign(float x);")); 133 s.append(TString("vec2 sign(vec2 x);")); 134 s.append(TString("vec3 sign(vec3 x);")); 135 s.append(TString("vec4 sign(vec4 x);")); 136 137 s.append(TString("float floor(float x);")); 138 s.append(TString("vec2 floor(vec2 x);")); 139 s.append(TString("vec3 floor(vec3 x);")); 140 s.append(TString("vec4 floor(vec4 x);")); 141 142 s.append(TString("float ceil(float x);")); 143 s.append(TString("vec2 ceil(vec2 x);")); 144 s.append(TString("vec3 ceil(vec3 x);")); 145 s.append(TString("vec4 ceil(vec4 x);")); 146 147 s.append(TString("float fract(float x);")); 148 s.append(TString("vec2 fract(vec2 x);")); 149 s.append(TString("vec3 fract(vec3 x);")); 150 s.append(TString("vec4 fract(vec4 x);")); 151 152 s.append(TString("float mod(float x, float y);")); 153 s.append(TString("vec2 mod(vec2 x, float y);")); 154 s.append(TString("vec3 mod(vec3 x, float y);")); 155 s.append(TString("vec4 mod(vec4 x, float y);")); 156 s.append(TString("vec2 mod(vec2 x, vec2 y);")); 157 s.append(TString("vec3 mod(vec3 x, vec3 y);")); 158 s.append(TString("vec4 mod(vec4 x, vec4 y);")); 159 160 s.append(TString("float min(float x, float y);")); 161 s.append(TString("vec2 min(vec2 x, float y);")); 162 s.append(TString("vec3 min(vec3 x, float y);")); 163 s.append(TString("vec4 min(vec4 x, float y);")); 164 s.append(TString("vec2 min(vec2 x, vec2 y);")); 165 s.append(TString("vec3 min(vec3 x, vec3 y);")); 166 s.append(TString("vec4 min(vec4 x, vec4 y);")); 167 168 s.append(TString("float max(float x, float y);")); 169 s.append(TString("vec2 max(vec2 x, float y);")); 170 s.append(TString("vec3 max(vec3 x, float y);")); 171 s.append(TString("vec4 max(vec4 x, float y);")); 172 s.append(TString("vec2 max(vec2 x, vec2 y);")); 173 s.append(TString("vec3 max(vec3 x, vec3 y);")); 174 s.append(TString("vec4 max(vec4 x, vec4 y);")); 175 176 s.append(TString("float clamp(float x, float minVal, float maxVal);")); 177 s.append(TString("vec2 clamp(vec2 x, float minVal, float maxVal);")); 178 s.append(TString("vec3 clamp(vec3 x, float minVal, float maxVal);")); 179 s.append(TString("vec4 clamp(vec4 x, float minVal, float maxVal);")); 180 s.append(TString("vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);")); 181 s.append(TString("vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);")); 182 s.append(TString("vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);")); 183 184 s.append(TString("float mix(float x, float y, float a);")); 185 s.append(TString("vec2 mix(vec2 x, vec2 y, float a);")); 186 s.append(TString("vec3 mix(vec3 x, vec3 y, float a);")); 187 s.append(TString("vec4 mix(vec4 x, vec4 y, float a);")); 188 s.append(TString("vec2 mix(vec2 x, vec2 y, vec2 a);")); 189 s.append(TString("vec3 mix(vec3 x, vec3 y, vec3 a);")); 190 s.append(TString("vec4 mix(vec4 x, vec4 y, vec4 a);")); 191 192 s.append(TString("float step(float edge, float x);")); 193 s.append(TString("vec2 step(vec2 edge, vec2 x);")); 194 s.append(TString("vec3 step(vec3 edge, vec3 x);")); 195 s.append(TString("vec4 step(vec4 edge, vec4 x);")); 196 s.append(TString("vec2 step(float edge, vec2 x);")); 197 s.append(TString("vec3 step(float edge, vec3 x);")); 198 s.append(TString("vec4 step(float edge, vec4 x);")); 199 200 s.append(TString("float smoothstep(float edge0, float edge1, float x);")); 201 s.append(TString("vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);")); 202 s.append(TString("vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);")); 203 s.append(TString("vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);")); 204 s.append(TString("vec2 smoothstep(float edge0, float edge1, vec2 x);")); 205 s.append(TString("vec3 smoothstep(float edge0, float edge1, vec3 x);")); 206 s.append(TString("vec4 smoothstep(float edge0, float edge1, vec4 x);")); 207 208 // 209 // Geometric Functions. 210 // 211 s.append(TString("float length(float x);")); 212 s.append(TString("float length(vec2 x);")); 213 s.append(TString("float length(vec3 x);")); 214 s.append(TString("float length(vec4 x);")); 215 216 s.append(TString("float distance(float p0, float p1);")); 217 s.append(TString("float distance(vec2 p0, vec2 p1);")); 218 s.append(TString("float distance(vec3 p0, vec3 p1);")); 219 s.append(TString("float distance(vec4 p0, vec4 p1);")); 220 221 s.append(TString("float dot(float x, float y);")); 222 s.append(TString("float dot(vec2 x, vec2 y);")); 223 s.append(TString("float dot(vec3 x, vec3 y);")); 224 s.append(TString("float dot(vec4 x, vec4 y);")); 225 226 s.append(TString("vec3 cross(vec3 x, vec3 y);")); 227 s.append(TString("float normalize(float x);")); 228 s.append(TString("vec2 normalize(vec2 x);")); 229 s.append(TString("vec3 normalize(vec3 x);")); 230 s.append(TString("vec4 normalize(vec4 x);")); 231 232 s.append(TString("float faceforward(float N, float I, float Nref);")); 233 s.append(TString("vec2 faceforward(vec2 N, vec2 I, vec2 Nref);")); 234 s.append(TString("vec3 faceforward(vec3 N, vec3 I, vec3 Nref);")); 235 s.append(TString("vec4 faceforward(vec4 N, vec4 I, vec4 Nref);")); 236 237 s.append(TString("float reflect(float I, float N);")); 238 s.append(TString("vec2 reflect(vec2 I, vec2 N);")); 239 s.append(TString("vec3 reflect(vec3 I, vec3 N);")); 240 s.append(TString("vec4 reflect(vec4 I, vec4 N);")); 241 242 s.append(TString("float refract(float I, float N, float eta);")); 243 s.append(TString("vec2 refract(vec2 I, vec2 N, float eta);")); 244 s.append(TString("vec3 refract(vec3 I, vec3 N, float eta);")); 245 s.append(TString("vec4 refract(vec4 I, vec4 N, float eta);")); 246 247 // 248 // Matrix Functions. 249 // 250 s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);")); 251 s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);")); 252 s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);")); 253 254 // 255 // Vector relational functions. 256 // 257 s.append(TString("bvec2 lessThan(vec2 x, vec2 y);")); 258 s.append(TString("bvec3 lessThan(vec3 x, vec3 y);")); 259 s.append(TString("bvec4 lessThan(vec4 x, vec4 y);")); 260 261 s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);")); 262 s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);")); 263 s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);")); 264 265 s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);")); 266 s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);")); 267 s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);")); 268 269 s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);")); 270 s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);")); 271 s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);")); 272 273 s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);")); 274 s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);")); 275 s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);")); 276 277 s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);")); 278 s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);")); 279 s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);")); 280 281 s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);")); 282 s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);")); 283 s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);")); 284 285 s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);")); 286 s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);")); 287 s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);")); 288 289 s.append(TString("bvec2 equal(vec2 x, vec2 y);")); 290 s.append(TString("bvec3 equal(vec3 x, vec3 y);")); 291 s.append(TString("bvec4 equal(vec4 x, vec4 y);")); 292 293 s.append(TString("bvec2 equal(ivec2 x, ivec2 y);")); 294 s.append(TString("bvec3 equal(ivec3 x, ivec3 y);")); 295 s.append(TString("bvec4 equal(ivec4 x, ivec4 y);")); 296 297 s.append(TString("bvec2 equal(bvec2 x, bvec2 y);")); 298 s.append(TString("bvec3 equal(bvec3 x, bvec3 y);")); 299 s.append(TString("bvec4 equal(bvec4 x, bvec4 y);")); 300 301 s.append(TString("bvec2 notEqual(vec2 x, vec2 y);")); 302 s.append(TString("bvec3 notEqual(vec3 x, vec3 y);")); 303 s.append(TString("bvec4 notEqual(vec4 x, vec4 y);")); 304 305 s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);")); 306 s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);")); 307 s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);")); 308 309 s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);")); 310 s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);")); 311 s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);")); 312 313 s.append(TString("bool any(bvec2 x);")); 314 s.append(TString("bool any(bvec3 x);")); 315 s.append(TString("bool any(bvec4 x);")); 316 317 s.append(TString("bool all(bvec2 x);")); 318 s.append(TString("bool all(bvec3 x);")); 319 s.append(TString("bool all(bvec4 x);")); 320 321 s.append(TString("bvec2 not(bvec2 x);")); 322 s.append(TString("bvec3 not(bvec3 x);")); 323 s.append(TString("bvec4 not(bvec4 x);")); 324 325 // 326 // Texture Functions. 327 // 328 s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);")); 329 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);")); 330 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);")); 331 332 s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);")); 333 334 // 335 // Noise functions. 336 // 337 // s.append(TString("float noise1(float x);")); 338 // s.append(TString("float noise1(vec2 x);")); 339 // s.append(TString("float noise1(vec3 x);")); 340 // s.append(TString("float noise1(vec4 x);")); 341 342 // s.append(TString("vec2 noise2(float x);")); 343 // s.append(TString("vec2 noise2(vec2 x);")); 344 // s.append(TString("vec2 noise2(vec3 x);")); 345 // s.append(TString("vec2 noise2(vec4 x);")); 346 347 // s.append(TString("vec3 noise3(float x);")); 348 // s.append(TString("vec3 noise3(vec2 x);")); 349 // s.append(TString("vec3 noise3(vec3 x);")); 350 // s.append(TString("vec3 noise3(vec4 x);")); 351 352 // s.append(TString("vec4 noise4(float x);")); 353 // s.append(TString("vec4 noise4(vec2 x);")); 354 // s.append(TString("vec4 noise4(vec3 x);")); 355 // s.append(TString("vec4 noise4(vec4 x);")); 356 357 s.append(TString("\n")); 17 //============================================================================ 18 // 19 // Prototypes for built-in functions seen by both vertex and fragment shaders. 20 // 21 //============================================================================ 22 static TString BuiltInFunctionsCommon() 23 { 24 TString s; 25 26 // 27 // Angle and Trigonometric Functions. 28 // 29 s.append(TString("float radians(float degrees);")); 30 s.append(TString("vec2 radians(vec2 degrees);")); 31 s.append(TString("vec3 radians(vec3 degrees);")); 32 s.append(TString("vec4 radians(vec4 degrees);")); 33 34 s.append(TString("float degrees(float radians);")); 35 s.append(TString("vec2 degrees(vec2 radians);")); 36 s.append(TString("vec3 degrees(vec3 radians);")); 37 s.append(TString("vec4 degrees(vec4 radians);")); 38 39 s.append(TString("float sin(float angle);")); 40 s.append(TString("vec2 sin(vec2 angle);")); 41 s.append(TString("vec3 sin(vec3 angle);")); 42 s.append(TString("vec4 sin(vec4 angle);")); 43 44 s.append(TString("float cos(float angle);")); 45 s.append(TString("vec2 cos(vec2 angle);")); 46 s.append(TString("vec3 cos(vec3 angle);")); 47 s.append(TString("vec4 cos(vec4 angle);")); 48 49 s.append(TString("float tan(float angle);")); 50 s.append(TString("vec2 tan(vec2 angle);")); 51 s.append(TString("vec3 tan(vec3 angle);")); 52 s.append(TString("vec4 tan(vec4 angle);")); 53 54 s.append(TString("float asin(float x);")); 55 s.append(TString("vec2 asin(vec2 x);")); 56 s.append(TString("vec3 asin(vec3 x);")); 57 s.append(TString("vec4 asin(vec4 x);")); 58 59 s.append(TString("float acos(float x);")); 60 s.append(TString("vec2 acos(vec2 x);")); 61 s.append(TString("vec3 acos(vec3 x);")); 62 s.append(TString("vec4 acos(vec4 x);")); 63 64 s.append(TString("float atan(float y, float x);")); 65 s.append(TString("vec2 atan(vec2 y, vec2 x);")); 66 s.append(TString("vec3 atan(vec3 y, vec3 x);")); 67 s.append(TString("vec4 atan(vec4 y, vec4 x);")); 68 69 s.append(TString("float atan(float y_over_x);")); 70 s.append(TString("vec2 atan(vec2 y_over_x);")); 71 s.append(TString("vec3 atan(vec3 y_over_x);")); 72 s.append(TString("vec4 atan(vec4 y_over_x);")); 73 74 // 75 // Exponential Functions. 76 // 77 s.append(TString("float pow(float x, float y);")); 78 s.append(TString("vec2 pow(vec2 x, vec2 y);")); 79 s.append(TString("vec3 pow(vec3 x, vec3 y);")); 80 s.append(TString("vec4 pow(vec4 x, vec4 y);")); 81 82 s.append(TString("float exp(float x);")); 83 s.append(TString("vec2 exp(vec2 x);")); 84 s.append(TString("vec3 exp(vec3 x);")); 85 s.append(TString("vec4 exp(vec4 x);")); 86 87 s.append(TString("float log(float x);")); 88 s.append(TString("vec2 log(vec2 x);")); 89 s.append(TString("vec3 log(vec3 x);")); 90 s.append(TString("vec4 log(vec4 x);")); 91 92 s.append(TString("float exp2(float x);")); 93 s.append(TString("vec2 exp2(vec2 x);")); 94 s.append(TString("vec3 exp2(vec3 x);")); 95 s.append(TString("vec4 exp2(vec4 x);")); 96 97 s.append(TString("float log2(float x);")); 98 s.append(TString("vec2 log2(vec2 x);")); 99 s.append(TString("vec3 log2(vec3 x);")); 100 s.append(TString("vec4 log2(vec4 x);")); 101 102 s.append(TString("float sqrt(float x);")); 103 s.append(TString("vec2 sqrt(vec2 x);")); 104 s.append(TString("vec3 sqrt(vec3 x);")); 105 s.append(TString("vec4 sqrt(vec4 x);")); 106 107 s.append(TString("float inversesqrt(float x);")); 108 s.append(TString("vec2 inversesqrt(vec2 x);")); 109 s.append(TString("vec3 inversesqrt(vec3 x);")); 110 s.append(TString("vec4 inversesqrt(vec4 x);")); 111 112 // 113 // Common Functions. 114 // 115 s.append(TString("float abs(float x);")); 116 s.append(TString("vec2 abs(vec2 x);")); 117 s.append(TString("vec3 abs(vec3 x);")); 118 s.append(TString("vec4 abs(vec4 x);")); 119 120 s.append(TString("float sign(float x);")); 121 s.append(TString("vec2 sign(vec2 x);")); 122 s.append(TString("vec3 sign(vec3 x);")); 123 s.append(TString("vec4 sign(vec4 x);")); 124 125 s.append(TString("float floor(float x);")); 126 s.append(TString("vec2 floor(vec2 x);")); 127 s.append(TString("vec3 floor(vec3 x);")); 128 s.append(TString("vec4 floor(vec4 x);")); 129 130 s.append(TString("float ceil(float x);")); 131 s.append(TString("vec2 ceil(vec2 x);")); 132 s.append(TString("vec3 ceil(vec3 x);")); 133 s.append(TString("vec4 ceil(vec4 x);")); 134 135 s.append(TString("float fract(float x);")); 136 s.append(TString("vec2 fract(vec2 x);")); 137 s.append(TString("vec3 fract(vec3 x);")); 138 s.append(TString("vec4 fract(vec4 x);")); 139 140 s.append(TString("float mod(float x, float y);")); 141 s.append(TString("vec2 mod(vec2 x, float y);")); 142 s.append(TString("vec3 mod(vec3 x, float y);")); 143 s.append(TString("vec4 mod(vec4 x, float y);")); 144 s.append(TString("vec2 mod(vec2 x, vec2 y);")); 145 s.append(TString("vec3 mod(vec3 x, vec3 y);")); 146 s.append(TString("vec4 mod(vec4 x, vec4 y);")); 147 148 s.append(TString("float min(float x, float y);")); 149 s.append(TString("vec2 min(vec2 x, float y);")); 150 s.append(TString("vec3 min(vec3 x, float y);")); 151 s.append(TString("vec4 min(vec4 x, float y);")); 152 s.append(TString("vec2 min(vec2 x, vec2 y);")); 153 s.append(TString("vec3 min(vec3 x, vec3 y);")); 154 s.append(TString("vec4 min(vec4 x, vec4 y);")); 155 156 s.append(TString("float max(float x, float y);")); 157 s.append(TString("vec2 max(vec2 x, float y);")); 158 s.append(TString("vec3 max(vec3 x, float y);")); 159 s.append(TString("vec4 max(vec4 x, float y);")); 160 s.append(TString("vec2 max(vec2 x, vec2 y);")); 161 s.append(TString("vec3 max(vec3 x, vec3 y);")); 162 s.append(TString("vec4 max(vec4 x, vec4 y);")); 163 164 s.append(TString("float clamp(float x, float minVal, float maxVal);")); 165 s.append(TString("vec2 clamp(vec2 x, float minVal, float maxVal);")); 166 s.append(TString("vec3 clamp(vec3 x, float minVal, float maxVal);")); 167 s.append(TString("vec4 clamp(vec4 x, float minVal, float maxVal);")); 168 s.append(TString("vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);")); 169 s.append(TString("vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);")); 170 s.append(TString("vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);")); 171 172 s.append(TString("float mix(float x, float y, float a);")); 173 s.append(TString("vec2 mix(vec2 x, vec2 y, float a);")); 174 s.append(TString("vec3 mix(vec3 x, vec3 y, float a);")); 175 s.append(TString("vec4 mix(vec4 x, vec4 y, float a);")); 176 s.append(TString("vec2 mix(vec2 x, vec2 y, vec2 a);")); 177 s.append(TString("vec3 mix(vec3 x, vec3 y, vec3 a);")); 178 s.append(TString("vec4 mix(vec4 x, vec4 y, vec4 a);")); 179 180 s.append(TString("float step(float edge, float x);")); 181 s.append(TString("vec2 step(vec2 edge, vec2 x);")); 182 s.append(TString("vec3 step(vec3 edge, vec3 x);")); 183 s.append(TString("vec4 step(vec4 edge, vec4 x);")); 184 s.append(TString("vec2 step(float edge, vec2 x);")); 185 s.append(TString("vec3 step(float edge, vec3 x);")); 186 s.append(TString("vec4 step(float edge, vec4 x);")); 187 188 s.append(TString("float smoothstep(float edge0, float edge1, float x);")); 189 s.append(TString("vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);")); 190 s.append(TString("vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);")); 191 s.append(TString("vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);")); 192 s.append(TString("vec2 smoothstep(float edge0, float edge1, vec2 x);")); 193 s.append(TString("vec3 smoothstep(float edge0, float edge1, vec3 x);")); 194 s.append(TString("vec4 smoothstep(float edge0, float edge1, vec4 x);")); 195 196 // 197 // Geometric Functions. 198 // 199 s.append(TString("float length(float x);")); 200 s.append(TString("float length(vec2 x);")); 201 s.append(TString("float length(vec3 x);")); 202 s.append(TString("float length(vec4 x);")); 203 204 s.append(TString("float distance(float p0, float p1);")); 205 s.append(TString("float distance(vec2 p0, vec2 p1);")); 206 s.append(TString("float distance(vec3 p0, vec3 p1);")); 207 s.append(TString("float distance(vec4 p0, vec4 p1);")); 208 209 s.append(TString("float dot(float x, float y);")); 210 s.append(TString("float dot(vec2 x, vec2 y);")); 211 s.append(TString("float dot(vec3 x, vec3 y);")); 212 s.append(TString("float dot(vec4 x, vec4 y);")); 213 214 s.append(TString("vec3 cross(vec3 x, vec3 y);")); 215 s.append(TString("float normalize(float x);")); 216 s.append(TString("vec2 normalize(vec2 x);")); 217 s.append(TString("vec3 normalize(vec3 x);")); 218 s.append(TString("vec4 normalize(vec4 x);")); 219 220 s.append(TString("float faceforward(float N, float I, float Nref);")); 221 s.append(TString("vec2 faceforward(vec2 N, vec2 I, vec2 Nref);")); 222 s.append(TString("vec3 faceforward(vec3 N, vec3 I, vec3 Nref);")); 223 s.append(TString("vec4 faceforward(vec4 N, vec4 I, vec4 Nref);")); 224 225 s.append(TString("float reflect(float I, float N);")); 226 s.append(TString("vec2 reflect(vec2 I, vec2 N);")); 227 s.append(TString("vec3 reflect(vec3 I, vec3 N);")); 228 s.append(TString("vec4 reflect(vec4 I, vec4 N);")); 229 230 s.append(TString("float refract(float I, float N, float eta);")); 231 s.append(TString("vec2 refract(vec2 I, vec2 N, float eta);")); 232 s.append(TString("vec3 refract(vec3 I, vec3 N, float eta);")); 233 s.append(TString("vec4 refract(vec4 I, vec4 N, float eta);")); 234 235 // 236 // Matrix Functions. 237 // 238 s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);")); 239 s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);")); 240 s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);")); 241 242 // 243 // Vector relational functions. 244 // 245 s.append(TString("bvec2 lessThan(vec2 x, vec2 y);")); 246 s.append(TString("bvec3 lessThan(vec3 x, vec3 y);")); 247 s.append(TString("bvec4 lessThan(vec4 x, vec4 y);")); 248 249 s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);")); 250 s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);")); 251 s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);")); 252 253 s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);")); 254 s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);")); 255 s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);")); 256 257 s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);")); 258 s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);")); 259 s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);")); 260 261 s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);")); 262 s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);")); 263 s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);")); 264 265 s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);")); 266 s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);")); 267 s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);")); 268 269 s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);")); 270 s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);")); 271 s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);")); 272 273 s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);")); 274 s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);")); 275 s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);")); 276 277 s.append(TString("bvec2 equal(vec2 x, vec2 y);")); 278 s.append(TString("bvec3 equal(vec3 x, vec3 y);")); 279 s.append(TString("bvec4 equal(vec4 x, vec4 y);")); 280 281 s.append(TString("bvec2 equal(ivec2 x, ivec2 y);")); 282 s.append(TString("bvec3 equal(ivec3 x, ivec3 y);")); 283 s.append(TString("bvec4 equal(ivec4 x, ivec4 y);")); 284 285 s.append(TString("bvec2 equal(bvec2 x, bvec2 y);")); 286 s.append(TString("bvec3 equal(bvec3 x, bvec3 y);")); 287 s.append(TString("bvec4 equal(bvec4 x, bvec4 y);")); 288 289 s.append(TString("bvec2 notEqual(vec2 x, vec2 y);")); 290 s.append(TString("bvec3 notEqual(vec3 x, vec3 y);")); 291 s.append(TString("bvec4 notEqual(vec4 x, vec4 y);")); 292 293 s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);")); 294 s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);")); 295 s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);")); 296 297 s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);")); 298 s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);")); 299 s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);")); 300 301 s.append(TString("bool any(bvec2 x);")); 302 s.append(TString("bool any(bvec3 x);")); 303 s.append(TString("bool any(bvec4 x);")); 304 305 s.append(TString("bool all(bvec2 x);")); 306 s.append(TString("bool all(bvec3 x);")); 307 s.append(TString("bool all(bvec4 x);")); 308 309 s.append(TString("bvec2 not(bvec2 x);")); 310 s.append(TString("bvec3 not(bvec3 x);")); 311 s.append(TString("bvec4 not(bvec4 x);")); 312 313 // 314 // Texture Functions. 315 // 316 s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);")); 317 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);")); 318 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);")); 319 320 s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);")); 321 322 // 323 // Noise functions. 324 // 325 //s.append(TString("float noise1(float x);")); 326 //s.append(TString("float noise1(vec2 x);")); 327 //s.append(TString("float noise1(vec3 x);")); 328 //s.append(TString("float noise1(vec4 x);")); 329 330 //s.append(TString("vec2 noise2(float x);")); 331 //s.append(TString("vec2 noise2(vec2 x);")); 332 //s.append(TString("vec2 noise2(vec3 x);")); 333 //s.append(TString("vec2 noise2(vec4 x);")); 334 335 //s.append(TString("vec3 noise3(float x);")); 336 //s.append(TString("vec3 noise3(vec2 x);")); 337 //s.append(TString("vec3 noise3(vec3 x);")); 338 //s.append(TString("vec3 noise3(vec4 x);")); 339 340 //s.append(TString("vec4 noise4(float x);")); 341 //s.append(TString("vec4 noise4(vec2 x);")); 342 //s.append(TString("vec4 noise4(vec3 x);")); 343 //s.append(TString("vec4 noise4(vec4 x);")); 344 345 s.append(TString("\n")); 346 return s; 347 } 348 349 //============================================================================ 350 // 351 // Prototypes for built-in functions seen by vertex shaders only. 352 // 353 //============================================================================ 354 static TString BuiltInFunctionsVertex() 355 { 356 TString s; 357 358 // 359 // Geometric Functions. 360 // 361 //s.append(TString("vec4 ftransform();")); 362 363 // 364 // Texture Functions. 365 // 366 s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);")); 367 s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);")); 368 s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);")); 369 s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);")); 370 371 s.append(TString("\n")); 372 return s; 373 } 374 375 //============================================================================ 376 // 377 // Prototypes for built-in functions seen by fragment shaders only. 378 // 379 //============================================================================ 380 static TString BuiltInFunctionsFragment() 381 { 382 TString s; 383 384 // 385 // Texture Functions. 386 // 387 s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);")); 388 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);")); 389 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);")); 390 s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);")); 391 392 //s.append(TString("float dFdx(float p);")); 393 //s.append(TString("vec2 dFdx(vec2 p);")); 394 //s.append(TString("vec3 dFdx(vec3 p);")); 395 //s.append(TString("vec4 dFdx(vec4 p);")); 396 397 //s.append(TString("float dFdy(float p);")); 398 //s.append(TString("vec2 dFdy(vec2 p);")); 399 //s.append(TString("vec3 dFdy(vec3 p);")); 400 //s.append(TString("vec4 dFdy(vec4 p);")); 401 402 s.append(TString("float fwidth(float p);")); 403 s.append(TString("vec2 fwidth(vec2 p);")); 404 s.append(TString("vec3 fwidth(vec3 p);")); 405 s.append(TString("vec4 fwidth(vec4 p);")); 406 407 s.append(TString("\n")); 408 return s; 409 } 410 411 //============================================================================ 412 // 413 // Standard uniforms. 414 // 415 //============================================================================ 416 static TString StandardUniforms() 417 { 418 TString s; 419 420 // 421 // Depth range in window coordinates 422 // 423 s.append(TString("struct gl_DepthRangeParameters {")); 424 s.append(TString(" highp float near;")); // n 425 s.append(TString(" highp float far;")); // f 426 s.append(TString(" highp float diff;")); // f - n 427 s.append(TString("};")); 428 s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;")); 429 430 s.append(TString("\n")); 431 return s; 432 } 433 434 //============================================================================ 435 // 436 // Default precision for vertex shaders. 437 // 438 //============================================================================ 439 static TString DefaultPrecisionVertex() 440 { 441 TString s; 442 443 s.append(TString("precision highp int;")); 444 s.append(TString("precision highp float;")); 445 446 s.append(TString("\n")); 447 return s; 448 } 449 450 //============================================================================ 451 // 452 // Default precision for fragment shaders. 453 // 454 //============================================================================ 455 static TString DefaultPrecisionFragment() 456 { 457 TString s; 458 459 s.append(TString("precision mediump int;")); 460 // No default precision for float in fragment shaders 461 462 s.append(TString("\n")); 463 return s; 464 } 465 466 //============================================================================ 467 // 468 // Implementation dependent built-in constants. 469 // 470 //============================================================================ 471 static TString BuiltInConstants(const TBuiltInResource &resources) 472 { 473 TStringStream s; 474 475 s << "const int gl_MaxVertexAttribs = " << resources.maxVertexAttribs << ";"; 476 s << "const int gl_MaxVertexUniformVectors = " << resources.maxVertexUniformVectors << ";"; 477 478 s << "const int gl_MaxVaryingVectors = " << resources.maxVaryingVectors << ";"; 479 s << "const int gl_MaxVertexTextureImageUnits = " << resources.maxVertexTextureImageUnits << ";"; 480 s << "const int gl_MaxCombinedTextureImageUnits = " << resources.maxCombinedTextureImageUnits << ";"; 481 s << "const int gl_MaxTextureImageUnits = " << resources.maxTextureImageUnits << ";"; 482 s << "const int gl_MaxFragmentUniformVectors = " << resources.maxFragmentUniformVectors << ";"; 483 s << "const int gl_MaxDrawBuffers = " << resources.maxDrawBuffers << ";"; 484 485 return s.str(); 486 } 487 488 void TBuiltIns::initialize(EShLanguage language, EShSpec spec, const TBuiltInResource& resources) 489 { 490 switch (language) { 491 case EShLangFragment: 492 builtInStrings.push_back(DefaultPrecisionFragment()); 493 builtInStrings.push_back(BuiltInFunctionsCommon()); 494 builtInStrings.push_back(BuiltInFunctionsFragment()); 495 builtInStrings.push_back(StandardUniforms()); 496 break; 497 498 case EShLangVertex: 499 builtInStrings.push_back(DefaultPrecisionVertex()); 500 builtInStrings.push_back(BuiltInFunctionsCommon()); 501 builtInStrings.push_back(BuiltInFunctionsVertex()); 502 builtInStrings.push_back(StandardUniforms()); 503 break; 504 505 default: assert(false && "Language not supported"); 358 506 } 359 { 360 //============================================================================ 361 // 362 // Prototypes for built-in functions seen by vertex shaders only. 363 // 364 //============================================================================ 365 366 TString& s = BuiltInFunctionsVertex; 367 368 // 369 // Geometric Functions. 370 // 371 s.append(TString("vec4 ftransform();")); 372 373 // 374 // Texture Functions. 375 // 376 s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);")); 377 s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);")); 378 s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);")); 379 380 s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);")); 381 382 s.append(TString("\n")); 383 } 384 { 385 //============================================================================ 386 // 387 // Prototypes for built-in functions seen by fragment shaders only. 388 // 389 //============================================================================ 390 391 TString& s = BuiltInFunctionsFragment; 392 393 // 394 // Texture Functions. 395 // 396 s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);")); 397 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);")); 398 s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);")); 399 400 s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);")); 401 402 // s.append(TString("float dFdx(float p);")); 403 // s.append(TString("vec2 dFdx(vec2 p);")); 404 // s.append(TString("vec3 dFdx(vec3 p);")); 405 // s.append(TString("vec4 dFdx(vec4 p);")); 406 407 // s.append(TString("float dFdy(float p);")); 408 // s.append(TString("vec2 dFdy(vec2 p);")); 409 // s.append(TString("vec3 dFdy(vec3 p);")); 410 // s.append(TString("vec4 dFdy(vec4 p);")); 411 412 s.append(TString("float fwidth(float p);")); 413 s.append(TString("vec2 fwidth(vec2 p);")); 414 s.append(TString("vec3 fwidth(vec3 p);")); 415 s.append(TString("vec4 fwidth(vec4 p);")); 416 417 s.append(TString("\n")); 418 } 419 { 420 //============================================================================ 421 // 422 // Standard Uniforms 423 // 424 //============================================================================ 425 426 TString& s = StandardUniforms; 427 428 // 429 // Depth range in window coordinates 430 // 431 s.append(TString("struct gl_DepthRangeParameters {")); 432 s.append(TString(" highp float near;")); // n 433 s.append(TString(" highp float far;")); // f 434 s.append(TString(" highp float diff;")); // f - n 435 s.append(TString("};")); 436 s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;")); 437 438 s.append(TString("\n")); 439 } 440 { 441 //============================================================================ 442 // 443 // Default precision for vertex shaders. 444 // 445 //============================================================================ 446 447 TString& s = VertexDefaultPrecision; 448 449 s.append(TString("precision highp int;")); 450 s.append(TString("precision highp float;")); 451 s.append(TString("\n")); 452 } 453 { 454 //============================================================================ 455 // 456 // Default precision for fragment shaders. 457 // 458 //============================================================================ 459 460 TString& s = FragmentDefaultPrecision; 461 462 s.append(TString("precision mediump int;")); 463 // No default precision for float in fragment shaders 464 s.append(TString("\n")); 465 } 466 467 builtInStrings[EShLangFragment].push_back(FragmentDefaultPrecision); 468 builtInStrings[EShLangFragment].push_back(BuiltInFunctions.c_str()); 469 builtInStrings[EShLangFragment].push_back(BuiltInFunctionsFragment); 470 builtInStrings[EShLangFragment].push_back(StandardUniforms); 471 472 builtInStrings[EShLangVertex].push_back(VertexDefaultPrecision); 473 builtInStrings[EShLangVertex].push_back(BuiltInFunctions); 474 builtInStrings[EShLangVertex].push_back(BuiltInFunctionsVertex); 475 builtInStrings[EShLangVertex].push_back(StandardUniforms); 476 } 477 478 void TBuiltIns::initialize(const TBuiltInResource &resources) 479 { 480 TStringStream builtIns; 481 482 // Implementation dependent constants 483 builtIns << "const int gl_MaxVertexAttribs = " << resources.maxVertexAttribs << ";"; 484 builtIns << "const int gl_MaxVertexUniformVectors = " << resources.maxVertexUniformVectors << ";"; 485 486 builtIns << "const int gl_MaxVaryingVectors = " << resources.maxVaryingVectors << ";"; 487 builtIns << "const int gl_MaxVertexTextureImageUnits = " << resources.maxVertexTextureImageUnits << ";"; 488 builtIns << "const int gl_MaxCombinedTextureImageUnits = " << resources.maxCombinedTextureImageUnits << ";"; 489 builtIns << "const int gl_MaxTextureImageUnits = " << resources.maxTextureImageUnits << ";"; 490 builtIns << "const int gl_MaxFragmentUniformVectors = " << resources.maxFragmentUniformVectors << ";"; 491 builtIns << "const int gl_MaxDrawBuffers = " << resources.maxDrawBuffers << ";"; 492 493 builtInStrings[EShLangFragment].push_back(builtIns.str()); 494 builtInStrings[EShLangVertex].push_back(builtIns.str()); 495 } 496 497 void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable) 507 508 builtInStrings.push_back(BuiltInConstants(resources)); 509 } 510 511 void IdentifyBuiltIns(EShLanguage language, EShSpec spec, const TBuiltInResource& resources, TSymbolTable& symbolTable) 498 512 { 499 513 // … … 502 516 // 503 517 switch(language) { 504 505 case EShLangFragment: { 506 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord, 4))); 507 symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); 508 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor, 4))); 509 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); 510 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); 511 512 } 518 case EShLangFragment: 519 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EbpMedium, EvqFragCoord, 4))); 520 symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EbpUndefined, EvqFrontFacing, 1))); 521 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EbpMedium, EvqFragColor, 4))); 522 symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); 523 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EbpMedium, EvqPointCoord, 2))); 513 524 break; 514 525 … … 517 528 symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1))); 518 529 break; 519 default: break; 530 531 default: assert(false && "Language not supported"); 520 532 } 521 533 … … 579 591 symbolTable.relateToOperator("all", EOpAll); 580 592 581 switch(language)582 {593 // Map language-specific operators. 594 switch(language) { 583 595 case EShLangVertex: 584 596 break; 585 597 case EShLangFragment: 586 // symbolTable.relateToOperator("dFdx", EOpDPdx);// OES_standard_derivatives extension587 // symbolTable.relateToOperator("dFdy", EOpDPdy);// OES_standard_derivatives extension588 // symbolTable.relateToOperator("fwidth", EOpFwidth);// OES_standard_derivatives extension598 //symbolTable.relateToOperator("dFdx", EOpDPdx); // OES_standard_derivatives extension 599 //symbolTable.relateToOperator("dFdy", EOpDPdy); // OES_standard_derivatives extension 600 //symbolTable.relateToOperator("fwidth", EOpFwidth); // OES_standard_derivatives extension 589 601 break; 590 default: assert(false && "Language not supported");602 default: break; 591 603 } 592 } 593 594 void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) 595 { 596 // 597 // First, insert some special built-in variables that are not in 598 // the built-in header files. 599 // 604 605 // Finally add resource-specific variables. 600 606 switch(language) { 601 602 607 case EShLangFragment: { 603 608 // Set up gl_FragData. The array size. … … 607 612 } 608 613 break; 609 610 614 default: break; 611 615 } 612 616 } 613 617 614 const char* GetPreprocessorBuiltinString()615 {616 static const char *PreprocessorBuiltinString = "";617 618 return PreprocessorBuiltinString;619 } -
trunk/ANGLE/src/compiler/Initialize.h
r64560 r64665 18 18 class TBuiltIns { 19 19 public: 20 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator) 21 void initialize(); 22 void initialize(const TBuiltInResource& resources); 23 TBuiltInStrings* getBuiltInStrings() { return builtInStrings; } 20 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator) 21 22 void initialize(EShLanguage language, EShSpec spec, const TBuiltInResource& resources); 23 const TBuiltInStrings& getBuiltInStrings() { return builtInStrings; } 24 24 25 protected: 25 TBuiltInStrings builtInStrings[EShLangCount];26 TBuiltInStrings builtInStrings; 26 27 }; 27 28 28 void IdentifyBuiltIns(EShLanguage, TSymbolTable&); 29 void IdentifyBuiltIns(EShLanguage, TSymbolTable&, const TBuiltInResource &resources); 30 bool GenerateBuiltInSymbolTable(const TBuiltInResource* resources, TInfoSink&, TSymbolTable*, EShLanguage language = EShLangCount); 31 bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, const TBuiltInResource *resources, TSymbolTable*); 32 const char* GetPreprocessorBuiltinString(); 29 void IdentifyBuiltIns(EShLanguage language, EShSpec spec, const TBuiltInResource& resources, 30 TSymbolTable& symbolTable); 31 33 32 extern "C" int InitPreprocessor(void); 34 33 extern "C" int FinalizePreprocessor(void); -
trunk/ANGLE/src/compiler/OutputGLSL.cpp
r64560 r64665 392 392 if (node->usesTernaryOperator()) 393 393 { 394 out << "("; 394 // Notice two brackets at the beginning and end. The outer ones 395 // encapsulate the whole ternary expression. This preserves the 396 // order of precedence when ternary expressions are used in a 397 // compound expression, i.e., c = 2 * (a < b ? 1 : 2). 398 out << "(("; 395 399 node->getCondition()->traverse(this); 396 400 out << ") ? ("; … … 398 402 out << ") : ("; 399 403 node->getFalseBlock()->traverse(this); 400 out << ") ";404 out << "))"; 401 405 } 402 406 else -
trunk/ANGLE/src/compiler/ShHandle.h
r64560 r64665 18 18 19 19 #include "compiler/InfoSink.h" 20 #include "compiler/SymbolTable.h" 20 21 21 22 class TCompiler; … … 41 42 virtual ~TCompiler() { } 42 43 43 EShLanguage getLanguage() { return language; } 44 EShSpec getSpec() { return spec; } 45 virtual TInfoSink& getInfoSink() { return infoSink; } 44 EShLanguage getLanguage() const { return language; } 45 EShSpec getSpec() const { return spec; } 46 TSymbolTable& getSymbolTable() { return symbolTable; } 47 TInfoSink& getInfoSink() { return infoSink; } 46 48 47 49 virtual bool compile(TIntermNode* root) = 0; … … 49 51 virtual TCompiler* getAsCompiler() { return this; } 50 52 51 TInfoSink infoSink;52 53 protected: 53 54 EShLanguage language; 54 55 EShSpec spec; 56 57 // Built-in symbol table for the given language, spec, and resources. 58 // It is preserved from compile-to-compile. 59 TSymbolTable symbolTable; 60 // Output sink. 61 TInfoSink infoSink; 55 62 }; 56 63 -
trunk/ANGLE/src/compiler/ShaderLang.cpp
r64560 r64665 18 18 #include "compiler/SymbolTable.h" 19 19 20 // 21 // A symbol table for each language. Each has a different 22 // set of built-ins, and we want to preserve that from 23 // compile to compile. 24 // 25 TSymbolTable* SymbolTables[EShLangCount]; 26 27 28 TPoolAllocator* PerProcessGPA = 0; 29 // 30 // This is the platform independent interface between an OGL driver 31 // and the shading language compiler. 32 // 33 34 // 35 // Driver must call this first, once, before doing any other 36 // compiler operations. 37 // 38 int ShInitialize() 39 { 40 TInfoSink infoSink; 41 bool ret = true; 42 43 if (!InitProcess()) 44 return 0; 45 46 // This method should be called once per process. If its called by multiple threads, then 47 // we need to have thread synchronization code around the initialization of per process 48 // global pool allocator 49 if (!PerProcessGPA) { 50 TPoolAllocator *builtInPoolAllocator = new TPoolAllocator(true); 51 builtInPoolAllocator->push(); 52 TPoolAllocator* gPoolAllocator = &GlobalPoolAllocator; 53 SetGlobalPoolAllocatorPtr(builtInPoolAllocator); 54 55 TSymbolTable symTables[EShLangCount]; 56 GenerateBuiltInSymbolTable(0, infoSink, symTables); 57 58 PerProcessGPA = new TPoolAllocator(true); 59 PerProcessGPA->push(); 60 SetGlobalPoolAllocatorPtr(PerProcessGPA); 61 62 SymbolTables[EShLangVertex] = new TSymbolTable; 63 SymbolTables[EShLangVertex]->copyTable(symTables[EShLangVertex]); 64 SymbolTables[EShLangFragment] = new TSymbolTable; 65 SymbolTables[EShLangFragment]->copyTable(symTables[EShLangFragment]); 66 67 SetGlobalPoolAllocatorPtr(gPoolAllocator); 68 69 symTables[EShLangVertex].pop(); 70 symTables[EShLangFragment].pop(); 71 72 builtInPoolAllocator->popAll(); 73 delete builtInPoolAllocator; 74 75 } 76 77 return ret ? 1 : 0; 78 } 79 80 // 81 // Driver calls these to create and destroy compiler objects. 82 // 83 84 ShHandle ShConstructCompiler(EShLanguage language, EShSpec spec) 85 { 86 if (!InitThread()) 87 return 0; 88 89 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(language, spec)); 90 91 return reinterpret_cast<void*>(base); 92 } 93 94 void ShDestruct(ShHandle handle) 95 { 96 if (handle == 0) 97 return; 98 99 TShHandleBase* base = static_cast<TShHandleBase*>(handle); 100 101 if (base->getAsCompiler()) 102 DeleteCompiler(base->getAsCompiler()); 103 } 104 105 // 106 // Cleanup symbol tables 107 // 108 int ShFinalize() 109 { 110 if (PerProcessGPA) { 111 PerProcessGPA->popAll(); 112 delete PerProcessGPA; 113 PerProcessGPA = 0; 114 } 115 for (int i = 0; i < EShLangCount; ++i) { 116 delete SymbolTables[i]; 117 SymbolTables[i] = 0; 118 } 119 return 1; 120 } 121 122 bool GenerateBuiltInSymbolTable(const TBuiltInResource* resources, TInfoSink& infoSink, TSymbolTable* symbolTables, EShLanguage language) 123 { 124 TBuiltIns builtIns; 125 126 if (resources) { 127 builtIns.initialize(*resources); 128 InitializeSymbolTable(builtIns.getBuiltInStrings(), language, infoSink, resources, symbolTables); 129 } else { 130 builtIns.initialize(); 131 InitializeSymbolTable(builtIns.getBuiltInStrings(), EShLangVertex, infoSink, resources, symbolTables); 132 InitializeSymbolTable(builtIns.getBuiltInStrings(), EShLangFragment, infoSink, resources, symbolTables); 133 } 134 135 return true; 136 } 137 138 bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, const TBuiltInResource* resources, TSymbolTable* symbolTables) 139 { 140 TIntermediate intermediate(infoSink); 141 TSymbolTable* symbolTable; 142 143 if (resources) 144 symbolTable = symbolTables; 145 else 146 symbolTable = &symbolTables[language]; 147 148 // TODO(alokp): Investigate if a parse-context is necessary here and 149 // if symbol-table can be shared between GLES2 and WebGL specs. 150 TParseContext parseContext(*symbolTable, intermediate, language, EShSpecGLES2, infoSink); 20 static bool InitializeSymbolTable( 21 const TBuiltInStrings& builtInStrings, 22 EShLanguage language, EShSpec spec, const TBuiltInResource& resources, 23 TInfoSink& infoSink, TSymbolTable& symbolTable) 24 { 25 TIntermediate intermediate(infoSink); 26 TParseContext parseContext(symbolTable, intermediate, language, spec, infoSink); 151 27 152 28 GlobalParseContext = &parseContext; 153 29 154 30 setInitialState(); 155 31 156 assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); 157 32 assert(symbolTable.isEmpty()); 158 33 // 159 34 // Parse the built-ins. This should only happen once per … … 164 39 // are preserved, and the test for an empty table fails. 165 40 // 166 167 symbolTable->push(); 41 symbolTable.push(); 168 42 169 43 //Initialize the Preprocessor 170 i nt ret = InitPreprocessor();171 if (ret){44 if (InitPreprocessor()) 45 { 172 46 infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); 173 47 return false; 174 48 } 175 176 for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); 177 i != BuiltInStrings[parseContext.language].end(); 178 ++i) { 49 50 for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i) 51 { 179 52 const char* builtInShaders[1]; 180 53 int builtInLengths[1]; … … 183 56 builtInLengths[0] = (int) (*i).size(); 184 57 185 if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) { 58 if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) 59 { 186 60 infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); 187 61 return false; … … 189 63 } 190 64 191 if (resources) { 192 IdentifyBuiltIns(parseContext.language, *symbolTable, *resources); 193 } else { 194 IdentifyBuiltIns(parseContext.language, *symbolTable); 195 } 65 IdentifyBuiltIns(language, spec, resources, symbolTable); 196 66 197 67 FinalizePreprocessor(); 198 68 199 69 return true; 70 } 71 72 static bool GenerateBuiltInSymbolTable( 73 EShLanguage language, EShSpec spec, const TBuiltInResource& resources, 74 TInfoSink& infoSink, TSymbolTable& symbolTable) 75 { 76 TBuiltIns builtIns; 77 78 builtIns.initialize(language, spec, resources); 79 return InitializeSymbolTable(builtIns.getBuiltInStrings(), language, spec, resources, infoSink, symbolTable); 80 } 81 82 // 83 // This is the platform independent interface between an OGL driver 84 // and the shading language compiler. 85 // 86 87 // 88 // Driver must call this first, once, before doing any other 89 // compiler operations. 90 // 91 int ShInitialize() 92 { 93 bool ret = InitProcess(); 94 95 return ret ? 1 : 0; 96 } 97 98 // 99 // Driver calls these to create and destroy compiler objects. 100 // 101 102 ShHandle ShConstructCompiler(EShLanguage language, EShSpec spec, const TBuiltInResource* resources) 103 { 104 if (!InitThread()) 105 return 0; 106 107 TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(language, spec)); 108 TCompiler* compiler = base->getAsCompiler(); 109 if (compiler == 0) 110 return 0; 111 112 // Generate built-in symbol table. 113 if (!GenerateBuiltInSymbolTable(language, spec, *resources, compiler->getInfoSink(), compiler->getSymbolTable())) { 114 ShDestruct(base); 115 return 0; 116 } 117 118 return reinterpret_cast<void*>(base); 119 } 120 121 void ShDestruct(ShHandle handle) 122 { 123 if (handle == 0) 124 return; 125 126 TShHandleBase* base = static_cast<TShHandleBase*>(handle); 127 128 if (base->getAsCompiler()) 129 DeleteCompiler(base->getAsCompiler()); 130 } 131 132 // 133 // Cleanup symbol tables 134 // 135 int ShFinalize() 136 { 137 return 1; 200 138 } 201 139 … … 212 150 const int numStrings, 213 151 const EShOptimizationLevel optLevel, 214 const TBuiltInResource* resources,215 152 int debugOptions 216 153 ) … … 228 165 229 166 GlobalPoolAllocator.push(); 230 TInfoSink& infoSink = compiler-> infoSink;167 TInfoSink& infoSink = compiler->getInfoSink(); 231 168 infoSink.info.erase(); 232 169 infoSink.debug.erase(); … … 237 174 238 175 TIntermediate intermediate(infoSink); 239 TSymbolTable symbolTable(*SymbolTables[compiler->getLanguage()]); 240 241 GenerateBuiltInSymbolTable(resources, infoSink, &symbolTable, compiler->getLanguage()); 176 TSymbolTable& symbolTable = compiler->getSymbolTable(); 242 177 243 178 TParseContext parseContext(symbolTable, intermediate, compiler->getLanguage(), compiler->getSpec(), infoSink); 244 179 parseContext.initializeExtensionBehavior(); 245 246 180 GlobalParseContext = &parseContext; 247 181 248 182 setInitialState(); 249 183 250 InitPreprocessor(); 184 InitPreprocessor(); 251 185 // 252 186 // Parse the application's shaders. All the following symbol table … … 255 189 // 256 190 bool success = true; 257 191 258 192 symbolTable.push(); 259 193 if (!symbolTable.atGlobalLevel()) … … 302 236 // throwing away all but the built-ins. 303 237 // 304 while (! symbolTable.atSharedBuiltInLevel())238 while (!symbolTable.atBuiltInLevel()) 305 239 symbolTable.pop(); 306 240 -
trunk/ANGLE/src/compiler/SymbolTable.h
r64560 r64665 32 32 33 33 #include <assert.h> 34 #include "compiler/Common.h" 34 35 #include "compiler/InfoSink.h" 35 36 #include "compiler/intermediate.h" 36 #include "compiler/InfoSink.h"37 37 38 38 // … … 240 240 } 241 241 242 TSymbolTable(TSymbolTable& symTable)243 {244 table.push_back(symTable.table[0]);245 precisionStack.push_back( symTable.precisionStack[0] );246 uniqueId = symTable.uniqueId;247 }248 249 242 ~TSymbolTable() 250 243 { … … 260 253 // 261 254 bool isEmpty() { return table.size() == 0; } 262 bool atBuiltInLevel() { return atSharedBuiltInLevel() || atDynamicBuiltInLevel(); } 263 bool atSharedBuiltInLevel() { return table.size() == 1; } 264 bool atGlobalLevel() { return table.size() <= 3; } 255 bool atBuiltInLevel() { return table.size() == 1; } 256 bool atGlobalLevel() { return table.size() <= 2; } 265 257 void push() 266 { 258 { 267 259 table.push_back(new TSymbolTableLevel); 268 260 precisionStack.push_back( PrecisionStackLevel() ); … … 298 290 } 299 291 300 TSymbolTableLevel* getGlobalLevel() { assert(table.size() >= 3); return table[2]; }292 TSymbolTableLevel* getGlobalLevel() { assert(table.size() >= 2); return table[1]; } 301 293 void relateToOperator(const char* name, TOperator op) { table[0]->relateToOperator(name, op); } 302 294 int getMaxSymbolId() { return uniqueId; } … … 330 322 protected: 331 323 int currentLevel() const { return static_cast<int>(table.size()) - 1; } 332 bool atDynamicBuiltInLevel() { return table.size() == 2; }333 324 334 325 std::vector<TSymbolTableLevel*> table; -
trunk/ANGLE/src/libGLESv2/Shader.cpp
r64560 r64665 35 35 if (result) 36 36 { 37 mFragmentCompiler = ShConstructCompiler(EShLangFragment, EShSpecGLES2); 38 mVertexCompiler = ShConstructCompiler(EShLangVertex, EShSpecGLES2); 37 TBuiltInResource resources; 38 resources.maxVertexAttribs = MAX_VERTEX_ATTRIBS; 39 resources.maxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; 40 resources.maxVaryingVectors = MAX_VARYING_VECTORS; 41 resources.maxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; 42 resources.maxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; 43 resources.maxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; 44 resources.maxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; 45 resources.maxDrawBuffers = MAX_DRAW_BUFFERS; 46 47 mFragmentCompiler = ShConstructCompiler(EShLangFragment, EShSpecGLES2, &resources); 48 mVertexCompiler = ShConstructCompiler(EShLangVertex, EShSpecGLES2, &resources); 39 49 } 40 50 } … … 268 278 mInfoLog = NULL; 269 279 270 TBuiltInResource resources; 271 272 resources.maxVertexAttribs = MAX_VERTEX_ATTRIBS; 273 resources.maxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; 274 resources.maxVaryingVectors = MAX_VARYING_VECTORS; 275 resources.maxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; 276 resources.maxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; 277 resources.maxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; 278 resources.maxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; 279 resources.maxDrawBuffers = MAX_DRAW_BUFFERS; 280 281 int result = ShCompile(compiler, &mSource, 1, EShOptNone, &resources, EDebugOpNone); 280 int result = ShCompile(compiler, &mSource, 1, EShOptNone, EDebugOpNone); 282 281 const char *obj = ShGetObjectCode(compiler); 283 282 const char *info = ShGetInfoLog(compiler);
Note: See TracChangeset
for help on using the changeset viewer.