1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES Utilities 3 * ------------------------------------------------ 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Shader utilities. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "gluShaderUtil.hpp" 25 #include "glwEnums.hpp" 26 #include "deArrayUtil.hpp" 27 28 namespace glu 29 { 30 31 // ShadingLanguageVersion 32 33 const char* getGLSLVersionName (GLSLVersion version) 34 { 35 static const char* s_names[] = 36 { 37 "GLSL ES 1.0", 38 "GLSL ES 3.0", 39 "GLSL ES 3.1", 40 "GLSL ES 3.2", 41 "GLSL 1.3", 42 "GLSL 1.4", 43 "GLSL 1.5", 44 "GLSL 3.3", 45 "GLSL 4.0", 46 "GLSL 4.1", 47 "GLSL 4.2", 48 "GLSL 4.3", 49 "GLSL 4.4", 50 "GLSL 4.5", 51 "GLSL 4.6", 52 }; 53 54 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version); 55 } 56 57 const char* getGLSLVersionDeclaration (GLSLVersion version) 58 { 59 static const char* s_decl[] = 60 { 61 "#version 100", 62 "#version 300 es", 63 "#version 310 es", 64 "#version 320 es", 65 "#version 130", 66 "#version 140", 67 "#version 150", 68 "#version 330", 69 "#version 400", 70 "#version 410", 71 "#version 420", 72 "#version 430", 73 "#version 440", 74 "#version 450", 75 "#version 460", 76 }; 77 78 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version); 79 } 80 81 bool glslVersionUsesInOutQualifiers (GLSLVersion version) 82 { 83 return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_320_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_460); 84 } 85 86 bool glslVersionIsES (GLSLVersion version) 87 { 88 DE_STATIC_ASSERT(GLSL_VERSION_LAST == 15); 89 DE_ASSERT(version != GLSL_VERSION_LAST); 90 91 if (version == GLSL_VERSION_100_ES || 92 version == GLSL_VERSION_300_ES || 93 version == GLSL_VERSION_310_ES || 94 version == GLSL_VERSION_320_ES) 95 return true; 96 else 97 return false; 98 } 99 100 // \todo [2014-10-06 pyry] Export this. 101 static ApiType getMinAPIForGLSLVersion (GLSLVersion version) 102 { 103 static const ApiType s_minApi[] = 104 { 105 ApiType::es(2,0), 106 ApiType::es(3,0), 107 ApiType::es(3,1), 108 ApiType::es(3,2), 109 ApiType::core(3,0), 110 ApiType::core(3,1), 111 ApiType::core(3,2), 112 ApiType::core(3,3), 113 ApiType::core(4,0), 114 ApiType::core(4,1), 115 ApiType::core(4,2), 116 ApiType::core(4,3), 117 ApiType::core(4,4), 118 ApiType::core(4,5), 119 ApiType::core(4,6), 120 }; 121 122 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version); 123 } 124 125 bool isGLSLVersionSupported (ContextType type, GLSLVersion version) 126 { 127 return contextSupports(type, getMinAPIForGLSLVersion(version)); 128 } 129 130 GLSLVersion getContextTypeGLSLVersion (ContextType type) 131 { 132 // \note From newer to older 133 for (int version = GLSL_VERSION_LAST-1; version >= 0; version--) 134 { 135 if (isGLSLVersionSupported(type, GLSLVersion(version))) 136 return GLSLVersion(version); 137 } 138 139 DE_ASSERT(false); 140 return GLSL_VERSION_LAST; 141 } 142 143 // ShaderType 144 145 const char* getShaderTypeName (ShaderType shaderType) 146 { 147 static const char* s_names[] = 148 { 149 "vertex", 150 "fragment", 151 "geometry", 152 "tess_control", 153 "tess_eval", 154 "compute", 155 }; 156 157 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST); 158 DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST)); 159 return s_names[(int)shaderType]; 160 } 161 162 // Precision 163 164 const char* getPrecisionName (Precision precision) 165 { 166 static const char* s_names[] = 167 { 168 "lowp", 169 "mediump", 170 "highp" 171 }; 172 173 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST); 174 DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST)); 175 return s_names[(int)precision]; 176 } 177 178 // DataType 179 180 const char* getDataTypeName (DataType dataType) 181 { 182 static const char* s_names[] = 183 { 184 "invalid", 185 "float", 186 "vec2", 187 "vec3", 188 "vec4", 189 "mat2", 190 "mat2x3", 191 "mat2x4", 192 "mat3x2", 193 "mat3", 194 "mat3x4", 195 "mat4x2", 196 "mat4x3", 197 "mat4", 198 "double", 199 "dvec2", 200 "dvec3", 201 "dvec4", 202 "dmat2", 203 "dmat2x3", 204 "dmat2x4", 205 "dmat3x2", 206 "dmat3", 207 "dmat3x4", 208 "dmat4x2", 209 "dmat4x3", 210 "dmat4", 211 "int", 212 "ivec2", 213 "ivec3", 214 "ivec4", 215 "uint", 216 "uvec2", 217 "uvec3", 218 "uvec4", 219 "bool", 220 "bvec2", 221 "bvec3", 222 "bvec4", 223 "sampler1D", 224 "sampler2D", 225 "samplerCube", 226 "sampler1DArray", 227 "sampler2DArray", 228 "sampler3D", 229 "samplerCubeArray", 230 "sampler1DShadow", 231 "sampler2DShadow", 232 "samplerCubeShadow", 233 "sampler1DArrayShadow", 234 "sampler2DArrayShadow", 235 "samplerCubeArrayShadow", 236 "isampler1D", 237 "isampler2D", 238 "isamplerCube", 239 "isampler1DArray", 240 "isampler2DArray", 241 "isampler3D", 242 "isamplerCubeArray", 243 "usampler1D", 244 "usampler2D", 245 "usamplerCube", 246 "usampler1DArray", 247 "usampler2DArray", 248 "usampler3D", 249 "usamplerCubeArray", 250 "sampler2DMS", 251 "isampler2DMS", 252 "usampler2DMS", 253 "image2D", 254 "imageCube", 255 "image2DArray", 256 "image3D", 257 "imageCubeArray", 258 "iimage2D", 259 "iimageCube", 260 "iimage2DArray", 261 "iimage3D", 262 "iimageCubeArray", 263 "uimage2D", 264 "uimageCube", 265 "uimage2DArray", 266 "uimage3D", 267 "uimageCubeArray", 268 "atomic_uint", 269 "samplerBuffer", 270 "isamplerBuffer", 271 "usamplerBuffer", 272 "sampler2DMSArray", 273 "isampler2DMSArray", 274 "usampler2DMSArray", 275 "imageBuffer", 276 "iimageBuffer", 277 "uimageBuffer", 278 }; 279 280 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST); 281 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names))); 282 return s_names[(int)dataType]; 283 } 284 285 int getDataTypeScalarSize (DataType dataType) 286 { 287 static const int s_sizes[] = 288 { 289 -1, // invalid 290 1, // float 291 2, // vec2 292 3, // vec3 293 4, // vec4 294 4, // mat2 295 6, // mat2x3 296 8, // mat2x4 297 6, // mat3x2 298 9, // mat3 299 12, // mat3x4 300 8, // mat4x2 301 12, // mat4x3 302 16, // mat4 303 1, // double 304 2, // dvec2 305 3, // dvec3 306 4, // dvec4 307 4, // dmat2 308 6, // dmat2x3 309 8, // dmat2x4 310 6, // dmat3x2 311 9, // dmat3 312 12, // dmat3x4 313 8, // dmat4x2 314 12, // dmat4x3 315 16, // dmat4 316 1, // int 317 2, // ivec2 318 3, // ivec3 319 4, // ivec4 320 1, // uint 321 2, // uvec2 322 3, // uvec3 323 4, // uvec4 324 1, // bool 325 2, // bvec2 326 3, // bvec3 327 4, // bvec4 328 1, // sampler1D 329 1, // sampler2D 330 1, // samplerCube 331 1, // sampler1DArray 332 1, // sampler2DArray 333 1, // sampler3D 334 1, // samplerCubeArray 335 1, // sampler1DShadow 336 1, // sampler2DShadow 337 1, // samplerCubeShadow 338 1, // sampler1DArrayShadow 339 1, // sampler2DArrayShadow 340 1, // samplerCubeArrayShadow 341 1, // isampler1D 342 1, // isampler2D 343 1, // isamplerCube 344 1, // isampler1DArray 345 1, // isampler2DArray 346 1, // isampler3D 347 1, // isamplerCubeArray 348 1, // usampler1D 349 1, // usampler2D 350 1, // usamplerCube 351 1, // usampler1DArray 352 1, // usampler2DArray 353 1, // usampler3D 354 1, // usamplerCubeArray 355 1, // sampler2DMS 356 1, // isampler2DMS 357 1, // usampler2DMS 358 1, // image2D 359 1, // imageCube 360 1, // image2DArray 361 1, // image3D 362 1, // imageCubeArray 363 1, // iimage2D 364 1, // iimageCube 365 1, // iimage2DArray 366 1, // iimage3D 367 1, // iimageCubeArray 368 1, // uimage2D 369 1, // uimageCube 370 1, // uimage2DArray 371 1, // uimage3D 372 1, // uimageCubeArray 373 1, // atomic_uint 374 1, // samplerBuffer 375 1, // isamplerBuffer 376 1, // usamplerBuffer 377 1, // sampler2DMSArray 378 1, // isampler2DMSArray 379 1, // usampler2DMSArray 380 1, // imageBuffer 381 1, // iimageBuffer 382 1, // uimageBuffer 383 }; 384 385 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST); 386 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes))); 387 return s_sizes[(int)dataType]; 388 } 389 390 DataType getDataTypeScalarType (DataType dataType) 391 { 392 static const DataType s_scalarTypes[] = 393 { 394 TYPE_INVALID, // invalid 395 TYPE_FLOAT, // float 396 TYPE_FLOAT, // vec2 397 TYPE_FLOAT, // vec3 398 TYPE_FLOAT, // vec4 399 TYPE_FLOAT, // mat2 400 TYPE_FLOAT, // mat2x3 401 TYPE_FLOAT, // mat2x4 402 TYPE_FLOAT, // mat3x2 403 TYPE_FLOAT, // mat3 404 TYPE_FLOAT, // mat3x4 405 TYPE_FLOAT, // mat4x2 406 TYPE_FLOAT, // mat4x3 407 TYPE_FLOAT, // mat4 408 TYPE_DOUBLE, // double 409 TYPE_DOUBLE, // dvec2 410 TYPE_DOUBLE, // dvec3 411 TYPE_DOUBLE, // dvec4 412 TYPE_DOUBLE, // dmat2 413 TYPE_DOUBLE, // dmat2x3 414 TYPE_DOUBLE, // dmat2x4 415 TYPE_DOUBLE, // dmat3x2 416 TYPE_DOUBLE, // dmat3 417 TYPE_DOUBLE, // dmat3x4 418 TYPE_DOUBLE, // dmat4x2 419 TYPE_DOUBLE, // dmat4x3 420 TYPE_DOUBLE, // dmat4 421 TYPE_INT, // int 422 TYPE_INT, // ivec2 423 TYPE_INT, // ivec3 424 TYPE_INT, // ivec4 425 TYPE_UINT, // uint 426 TYPE_UINT, // uvec2 427 TYPE_UINT, // uvec3 428 TYPE_UINT, // uvec4 429 TYPE_BOOL, // bool 430 TYPE_BOOL, // bvec2 431 TYPE_BOOL, // bvec3 432 TYPE_BOOL, // bvec4 433 TYPE_SAMPLER_1D, // sampler1D 434 TYPE_SAMPLER_2D, // sampler2D 435 TYPE_SAMPLER_CUBE, // samplerCube 436 TYPE_SAMPLER_1D_ARRAY, // sampler1DArray 437 TYPE_SAMPLER_2D_ARRAY, // sampler2DArray 438 TYPE_SAMPLER_3D, // sampler3D 439 TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray 440 TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow 441 TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow 442 TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow 443 TYPE_SAMPLER_1D_ARRAY_SHADOW, // sampler1DArrayShadow 444 TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow 445 TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow 446 TYPE_INT_SAMPLER_1D, // isampler1D 447 TYPE_INT_SAMPLER_2D, // isampler2D 448 TYPE_INT_SAMPLER_CUBE, // isamplerCube 449 TYPE_INT_SAMPLER_1D_ARRAY, // isampler1DArray 450 TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray 451 TYPE_INT_SAMPLER_3D, // isampler3D 452 TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray 453 TYPE_UINT_SAMPLER_1D, // usampler1D 454 TYPE_UINT_SAMPLER_2D, // usampler2D 455 TYPE_UINT_SAMPLER_CUBE, // usamplerCube 456 TYPE_UINT_SAMPLER_1D_ARRAY, // usampler1DArray 457 TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray 458 TYPE_UINT_SAMPLER_3D, // usampler3D 459 TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray 460 TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS 461 TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS 462 TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS 463 TYPE_IMAGE_2D, // image2D 464 TYPE_IMAGE_CUBE, // imageCube 465 TYPE_IMAGE_2D_ARRAY, // image2DArray 466 TYPE_IMAGE_3D, // image3D 467 TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray 468 TYPE_INT_IMAGE_2D, // iimage2D 469 TYPE_INT_IMAGE_CUBE, // iimageCube 470 TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray 471 TYPE_INT_IMAGE_3D, // iimage3D 472 TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray 473 TYPE_UINT_IMAGE_2D, // uimage2D 474 TYPE_UINT_IMAGE_CUBE, // uimageCube 475 TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray 476 TYPE_UINT_IMAGE_3D, // uimage3D 477 TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray 478 TYPE_UINT_ATOMIC_COUNTER, // atomic_uint 479 TYPE_SAMPLER_BUFFER, // samplerBuffer 480 TYPE_INT_SAMPLER_BUFFER, // isamplerBuffer 481 TYPE_UINT_SAMPLER_BUFFER, // usamplerBuffer 482 TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY, // sampler2DMSArray 483 TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, // isampler2DMSArray 484 TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY, // usampler2DMSArray 485 TYPE_IMAGE_BUFFER, // imageBuffer 486 TYPE_INT_IMAGE_BUFFER, // iimageBuffer 487 TYPE_UINT_IMAGE_BUFFER, // uimageBuffer 488 }; 489 490 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST); 491 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes))); 492 return s_scalarTypes[(int)dataType]; 493 } 494 495 DataType getDataTypeFloatScalars (DataType dataType) 496 { 497 static const DataType s_floatTypes[] = 498 { 499 TYPE_INVALID, // invalid 500 TYPE_FLOAT, // float 501 TYPE_FLOAT_VEC2, // vec2 502 TYPE_FLOAT_VEC3, // vec3 503 TYPE_FLOAT_VEC4, // vec4 504 TYPE_FLOAT_MAT2, // mat2 505 TYPE_FLOAT_MAT2X3, // mat2x3 506 TYPE_FLOAT_MAT2X4, // mat2x4 507 TYPE_FLOAT_MAT3X2, // mat3x2 508 TYPE_FLOAT_MAT3, // mat3 509 TYPE_FLOAT_MAT3X4, // mat3x4 510 TYPE_FLOAT_MAT4X2, // mat4x2 511 TYPE_FLOAT_MAT4X3, // mat4x3 512 TYPE_FLOAT_MAT4, // mat4 513 TYPE_FLOAT, // double 514 TYPE_FLOAT_VEC2, // dvec2 515 TYPE_FLOAT_VEC3, // dvec3 516 TYPE_FLOAT_VEC4, // dvec4 517 TYPE_FLOAT_MAT2, // dmat2 518 TYPE_FLOAT_MAT2X3, // dmat2x3 519 TYPE_FLOAT_MAT2X4, // dmat2x4 520 TYPE_FLOAT_MAT3X2, // dmat3x2 521 TYPE_FLOAT_MAT3, // dmat3 522 TYPE_FLOAT_MAT3X4, // dmat3x4 523 TYPE_FLOAT_MAT4X2, // dmat4x2 524 TYPE_FLOAT_MAT4X3, // dmat4x3 525 TYPE_FLOAT_MAT4, // dmat4 526 TYPE_FLOAT, // int 527 TYPE_FLOAT_VEC2, // ivec2 528 TYPE_FLOAT_VEC3, // ivec3 529 TYPE_FLOAT_VEC4, // ivec4 530 TYPE_FLOAT, // uint 531 TYPE_FLOAT_VEC2, // uvec2 532 TYPE_FLOAT_VEC3, // uvec3 533 TYPE_FLOAT_VEC4, // uvec4 534 TYPE_FLOAT, // bool 535 TYPE_FLOAT_VEC2, // bvec2 536 TYPE_FLOAT_VEC3, // bvec3 537 TYPE_FLOAT_VEC4, // bvec4 538 TYPE_INVALID, // sampler1D 539 TYPE_INVALID, // sampler2D 540 TYPE_INVALID, // samplerCube 541 TYPE_INVALID, // sampler1DArray 542 TYPE_INVALID, // sampler2DArray 543 TYPE_INVALID, // sampler3D 544 TYPE_INVALID, // samplerCubeArray 545 TYPE_INVALID, // sampler1DShadow 546 TYPE_INVALID, // sampler2DShadow 547 TYPE_INVALID, // samplerCubeShadow 548 TYPE_INVALID, // sampler1DArrayShadow 549 TYPE_INVALID, // sampler2DArrayShadow 550 TYPE_INVALID, // samplerCubeArrayShadow 551 TYPE_INVALID, // isampler1D 552 TYPE_INVALID, // isampler2D 553 TYPE_INVALID, // isamplerCube 554 TYPE_INVALID, // isampler1DArray 555 TYPE_INVALID, // isampler2DArray 556 TYPE_INVALID, // isampler3D 557 TYPE_INVALID, // isamplerCubeArray 558 TYPE_INVALID, // usampler1D 559 TYPE_INVALID, // usampler2D 560 TYPE_INVALID, // usamplerCube 561 TYPE_INVALID, // usampler1DArray 562 TYPE_INVALID, // usampler2DArray 563 TYPE_INVALID, // usampler3D 564 TYPE_INVALID, // usamplerCubeArray 565 TYPE_INVALID, // sampler2DMS 566 TYPE_INVALID, // isampler2DMS 567 TYPE_INVALID, // usampler2DMS 568 TYPE_INVALID, // image2D 569 TYPE_INVALID, // imageCube 570 TYPE_INVALID, // image2DArray 571 TYPE_INVALID, // image3D 572 TYPE_INVALID, // imageCubeArray 573 TYPE_INVALID, // iimage2D 574 TYPE_INVALID, // iimageCube 575 TYPE_INVALID, // iimage2DArray 576 TYPE_INVALID, // iimage3D 577 TYPE_INVALID, // iimageCubeArray 578 TYPE_INVALID, // uimage2D 579 TYPE_INVALID, // uimageCube 580 TYPE_INVALID, // uimage2DArray 581 TYPE_INVALID, // uimage3D 582 TYPE_INVALID, // uimageCubeArray 583 TYPE_INVALID, // atomic_uint 584 TYPE_INVALID, // samplerBuffer 585 TYPE_INVALID, // isamplerBuffer 586 TYPE_INVALID, // usamplerBuffer 587 TYPE_INVALID, // sampler2DMSArray 588 TYPE_INVALID, // isampler2DMSArray 589 TYPE_INVALID, // usampler2DMSArray 590 TYPE_INVALID, // imageBuffer 591 TYPE_INVALID, // iimageBuffer 592 TYPE_INVALID, // uimageBuffer 593 }; 594 595 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST); 596 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes))); 597 return s_floatTypes[(int)dataType]; 598 } 599 600 DataType getDataTypeDoubleScalars (DataType dataType) 601 { 602 static const DataType s_doubleTypes[] = 603 { 604 TYPE_INVALID, // invalid 605 TYPE_DOUBLE, // float 606 TYPE_DOUBLE_VEC2, // vec2 607 TYPE_DOUBLE_VEC3, // vec3 608 TYPE_DOUBLE_VEC4, // vec4 609 TYPE_DOUBLE_MAT2, // mat2 610 TYPE_DOUBLE_MAT2X3, // mat2x3 611 TYPE_DOUBLE_MAT2X4, // mat2x4 612 TYPE_DOUBLE_MAT3X2, // mat3x2 613 TYPE_DOUBLE_MAT3, // mat3 614 TYPE_DOUBLE_MAT3X4, // mat3x4 615 TYPE_DOUBLE_MAT4X2, // mat4x2 616 TYPE_DOUBLE_MAT4X3, // mat4x3 617 TYPE_DOUBLE_MAT4, // mat4 618 TYPE_DOUBLE, // double 619 TYPE_DOUBLE_VEC2, // dvec2 620 TYPE_DOUBLE_VEC3, // dvec3 621 TYPE_DOUBLE_VEC4, // dvec4 622 TYPE_DOUBLE_MAT2, // dmat2 623 TYPE_DOUBLE_MAT2X3, // dmat2x3 624 TYPE_DOUBLE_MAT2X4, // dmat2x4 625 TYPE_DOUBLE_MAT3X2, // dmat3x2 626 TYPE_DOUBLE_MAT3, // dmat3 627 TYPE_DOUBLE_MAT3X4, // dmat3x4 628 TYPE_DOUBLE_MAT4X2, // dmat4x2 629 TYPE_DOUBLE_MAT4X3, // dmat4x3 630 TYPE_DOUBLE_MAT4, // dmat4 631 TYPE_DOUBLE, // int 632 TYPE_DOUBLE_VEC2, // ivec2 633 TYPE_DOUBLE_VEC3, // ivec3 634 TYPE_DOUBLE_VEC4, // ivec4 635 TYPE_DOUBLE, // uint 636 TYPE_DOUBLE_VEC2, // uvec2 637 TYPE_DOUBLE_VEC3, // uvec3 638 TYPE_DOUBLE_VEC4, // uvec4 639 TYPE_DOUBLE, // bool 640 TYPE_DOUBLE_VEC2, // bvec2 641 TYPE_DOUBLE_VEC3, // bvec3 642 TYPE_DOUBLE_VEC4, // bvec4 643 TYPE_INVALID, // sampler1D 644 TYPE_INVALID, // sampler2D 645 TYPE_INVALID, // samplerCube 646 TYPE_INVALID, // sampler1DArray 647 TYPE_INVALID, // sampler2DArray 648 TYPE_INVALID, // sampler3D 649 TYPE_INVALID, // samplerCubeArray 650 TYPE_INVALID, // sampler1DShadow 651 TYPE_INVALID, // sampler2DShadow 652 TYPE_INVALID, // samplerCubeShadow 653 TYPE_INVALID, // sampler1DArrayShadow 654 TYPE_INVALID, // sampler2DArrayShadow 655 TYPE_INVALID, // samplerCubeArrayShadow 656 TYPE_INVALID, // isampler1D 657 TYPE_INVALID, // isampler2D 658 TYPE_INVALID, // isamplerCube 659 TYPE_INVALID, // isampler1DArray 660 TYPE_INVALID, // isampler2DArray 661 TYPE_INVALID, // isampler3D 662 TYPE_INVALID, // isamplerCubeArray 663 TYPE_INVALID, // usampler1D 664 TYPE_INVALID, // usampler2D 665 TYPE_INVALID, // usamplerCube 666 TYPE_INVALID, // usampler1DArray 667 TYPE_INVALID, // usampler2DArray 668 TYPE_INVALID, // usampler3D 669 TYPE_INVALID, // usamplerCubeArray 670 TYPE_INVALID, // sampler2DMS 671 TYPE_INVALID, // isampler2DMS 672 TYPE_INVALID, // usampler2DMS 673 TYPE_INVALID, // image2D 674 TYPE_INVALID, // imageCube 675 TYPE_INVALID, // image2DArray 676 TYPE_INVALID, // image3D 677 TYPE_INVALID, // imageCubeArray 678 TYPE_INVALID, // iimage2D 679 TYPE_INVALID, // iimageCube 680 TYPE_INVALID, // iimage2DArray 681 TYPE_INVALID, // iimage3D 682 TYPE_INVALID, // iimageCubeArray 683 TYPE_INVALID, // uimage2D 684 TYPE_INVALID, // uimageCube 685 TYPE_INVALID, // uimage2DArray 686 TYPE_INVALID, // uimage3D 687 TYPE_INVALID, // uimageCubeArray 688 TYPE_INVALID, // atomic_uint 689 TYPE_INVALID, // samplerBuffer 690 TYPE_INVALID, // isamplerBuffer 691 TYPE_INVALID, // usamplerBuffer 692 TYPE_INVALID, // sampler2DMSArray 693 TYPE_INVALID, // isampler2DMSArray 694 TYPE_INVALID, // usampler2DMSArray 695 TYPE_INVALID, // imageBuffer 696 TYPE_INVALID, // iimageBuffer 697 TYPE_INVALID, // uimageBuffer 698 }; 699 700 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_doubleTypes) == TYPE_LAST); 701 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_doubleTypes))); 702 return s_doubleTypes[(int)dataType]; 703 } 704 705 DataType getDataTypeVector (DataType scalarType, int size) 706 { 707 DE_ASSERT(deInRange32(size, 1, 4)); 708 switch (scalarType) 709 { 710 case TYPE_FLOAT: 711 case TYPE_DOUBLE: 712 case TYPE_INT: 713 case TYPE_UINT: 714 case TYPE_BOOL: 715 return (DataType)((int)scalarType + size - 1); 716 default: 717 return TYPE_INVALID; 718 } 719 } 720 721 DataType getDataTypeFloatVec (int vecSize) 722 { 723 return getDataTypeVector(TYPE_FLOAT, vecSize); 724 } 725 726 DataType getDataTypeIntVec (int vecSize) 727 { 728 return getDataTypeVector(TYPE_INT, vecSize); 729 } 730 731 DataType getDataTypeUintVec (int vecSize) 732 { 733 return getDataTypeVector(TYPE_UINT, vecSize); 734 } 735 736 DataType getDataTypeBoolVec (int vecSize) 737 { 738 return getDataTypeVector(TYPE_BOOL, vecSize); 739 } 740 741 DataType getDataTypeMatrix (int numCols, int numRows) 742 { 743 DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4)); 744 return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2)); 745 } 746 747 int getDataTypeMatrixNumRows (DataType dataType) 748 { 749 switch (dataType) 750 { 751 case TYPE_FLOAT_MAT2: return 2; 752 case TYPE_FLOAT_MAT2X3: return 3; 753 case TYPE_FLOAT_MAT2X4: return 4; 754 case TYPE_FLOAT_MAT3X2: return 2; 755 case TYPE_FLOAT_MAT3: return 3; 756 case TYPE_FLOAT_MAT3X4: return 4; 757 case TYPE_FLOAT_MAT4X2: return 2; 758 case TYPE_FLOAT_MAT4X3: return 3; 759 case TYPE_FLOAT_MAT4: return 4; 760 case TYPE_DOUBLE_MAT2: return 2; 761 case TYPE_DOUBLE_MAT2X3: return 3; 762 case TYPE_DOUBLE_MAT2X4: return 4; 763 case TYPE_DOUBLE_MAT3X2: return 2; 764 case TYPE_DOUBLE_MAT3: return 3; 765 case TYPE_DOUBLE_MAT3X4: return 4; 766 case TYPE_DOUBLE_MAT4X2: return 2; 767 case TYPE_DOUBLE_MAT4X3: return 3; 768 case TYPE_DOUBLE_MAT4: return 4; 769 default: 770 DE_ASSERT(false); 771 return 0; 772 } 773 } 774 775 int getDataTypeMatrixNumColumns (DataType dataType) 776 { 777 switch (dataType) 778 { 779 case TYPE_FLOAT_MAT2: return 2; 780 case TYPE_FLOAT_MAT2X3: return 2; 781 case TYPE_FLOAT_MAT2X4: return 2; 782 case TYPE_FLOAT_MAT3X2: return 3; 783 case TYPE_FLOAT_MAT3: return 3; 784 case TYPE_FLOAT_MAT3X4: return 3; 785 case TYPE_FLOAT_MAT4X2: return 4; 786 case TYPE_FLOAT_MAT4X3: return 4; 787 case TYPE_FLOAT_MAT4: return 4; 788 case TYPE_DOUBLE_MAT2: return 2; 789 case TYPE_DOUBLE_MAT2X3: return 2; 790 case TYPE_DOUBLE_MAT2X4: return 2; 791 case TYPE_DOUBLE_MAT3X2: return 3; 792 case TYPE_DOUBLE_MAT3: return 3; 793 case TYPE_DOUBLE_MAT3X4: return 3; 794 case TYPE_DOUBLE_MAT4X2: return 4; 795 case TYPE_DOUBLE_MAT4X3: return 4; 796 case TYPE_DOUBLE_MAT4: return 4; 797 default: 798 DE_ASSERT(false); 799 return 0; 800 } 801 } 802 803 int getDataTypeNumLocations (DataType dataType) 804 { 805 if (isDataTypeScalarOrVector(dataType)) 806 return 1; 807 else if (isDataTypeMatrix(dataType)) 808 return getDataTypeMatrixNumColumns(dataType); 809 810 DE_FATAL("Illegal datatype."); 811 return 0; 812 } 813 814 int getDataTypeNumComponents (DataType dataType) 815 { 816 if (isDataTypeScalarOrVector(dataType)) 817 return getDataTypeScalarSize(dataType); 818 else if (isDataTypeMatrix(dataType)) 819 return getDataTypeMatrixNumRows(dataType); 820 821 DE_FATAL("Illegal datatype."); 822 return 0; 823 } 824 825 DataType getDataTypeFromGLType (deUint32 glType) 826 { 827 switch (glType) 828 { 829 case GL_FLOAT: return TYPE_FLOAT; 830 case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2; 831 case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3; 832 case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4; 833 834 case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2; 835 case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3; 836 case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4; 837 838 case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2; 839 case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3; 840 case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4; 841 842 case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2; 843 case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3; 844 case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4; 845 846 case GL_DOUBLE: return TYPE_DOUBLE; 847 case GL_DOUBLE_VEC2: return TYPE_DOUBLE_VEC2; 848 case GL_DOUBLE_VEC3: return TYPE_DOUBLE_VEC3; 849 case GL_DOUBLE_VEC4: return TYPE_DOUBLE_VEC4; 850 851 case GL_DOUBLE_MAT2: return TYPE_DOUBLE_MAT2; 852 case GL_DOUBLE_MAT2x3: return TYPE_DOUBLE_MAT2X3; 853 case GL_DOUBLE_MAT2x4: return TYPE_DOUBLE_MAT2X4; 854 855 case GL_DOUBLE_MAT3x2: return TYPE_DOUBLE_MAT3X2; 856 case GL_DOUBLE_MAT3: return TYPE_DOUBLE_MAT3; 857 case GL_DOUBLE_MAT3x4: return TYPE_DOUBLE_MAT3X4; 858 859 case GL_DOUBLE_MAT4x2: return TYPE_DOUBLE_MAT4X2; 860 case GL_DOUBLE_MAT4x3: return TYPE_DOUBLE_MAT4X3; 861 case GL_DOUBLE_MAT4: return TYPE_DOUBLE_MAT4; 862 863 case GL_INT: return TYPE_INT; 864 case GL_INT_VEC2: return TYPE_INT_VEC2; 865 case GL_INT_VEC3: return TYPE_INT_VEC3; 866 case GL_INT_VEC4: return TYPE_INT_VEC4; 867 868 case GL_UNSIGNED_INT: return TYPE_UINT; 869 case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2; 870 case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3; 871 case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4; 872 873 case GL_BOOL: return TYPE_BOOL; 874 case GL_BOOL_VEC2: return TYPE_BOOL_VEC2; 875 case GL_BOOL_VEC3: return TYPE_BOOL_VEC3; 876 case GL_BOOL_VEC4: return TYPE_BOOL_VEC4; 877 878 case GL_SAMPLER_1D: return TYPE_SAMPLER_1D; 879 case GL_SAMPLER_2D: return TYPE_SAMPLER_2D; 880 case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE; 881 case GL_SAMPLER_1D_ARRAY: return TYPE_SAMPLER_1D_ARRAY; 882 case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY; 883 case GL_SAMPLER_3D: return TYPE_SAMPLER_3D; 884 case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY; 885 886 case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW; 887 case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW; 888 case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW; 889 case GL_SAMPLER_1D_ARRAY_SHADOW: return TYPE_SAMPLER_1D_ARRAY_SHADOW; 890 case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW; 891 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW; 892 893 case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D; 894 case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D; 895 case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE; 896 case GL_INT_SAMPLER_1D_ARRAY: return TYPE_INT_SAMPLER_1D_ARRAY; 897 case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY; 898 case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D; 899 case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY; 900 901 case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D; 902 case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D; 903 case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE; 904 case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: return TYPE_UINT_SAMPLER_1D_ARRAY; 905 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY; 906 case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D; 907 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY; 908 909 case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE; 910 case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE; 911 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE; 912 913 case GL_IMAGE_2D: return TYPE_IMAGE_2D; 914 case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE; 915 case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY; 916 case GL_IMAGE_3D: return TYPE_IMAGE_3D; 917 case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D; 918 case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE; 919 case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY; 920 case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D; 921 case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D; 922 case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE; 923 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY; 924 case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D; 925 926 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER; 927 928 case GL_SAMPLER_BUFFER: return TYPE_SAMPLER_BUFFER; 929 case GL_INT_SAMPLER_BUFFER: return TYPE_INT_SAMPLER_BUFFER; 930 case GL_UNSIGNED_INT_SAMPLER_BUFFER: return TYPE_UINT_SAMPLER_BUFFER; 931 932 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY; 933 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY; 934 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY; 935 936 case GL_IMAGE_BUFFER: return TYPE_IMAGE_BUFFER; 937 case GL_INT_IMAGE_BUFFER: return TYPE_INT_IMAGE_BUFFER; 938 case GL_UNSIGNED_INT_IMAGE_BUFFER: return TYPE_UINT_IMAGE_BUFFER; 939 940 default: 941 return TYPE_LAST; 942 } 943 } 944 945 } // glu 946