gluShaderUtil.cpp revision 3c827367444ee418f129b2c238299f49d3264554
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 27namespace glu 28{ 29 30// ShadingLanguageVersion 31 32const char* getGLSLVersionName (GLSLVersion version) 33{ 34 static const char* s_names[] = 35 { 36 "GLSL ES 1.0", 37 "GLSL ES 3.0", 38 "GLSL ES 3.1", 39 "GLSL 1.3", 40 "GLSL 1.4", 41 "GLSL 1.5", 42 "GLSL 3.3", 43 "GLSL 4.0", 44 "GLSL 4.1", 45 "GLSL 4.2", 46 "GLSL 4.3", 47 "GLSL 4.4", 48 }; 49 50 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version); 51} 52 53const char* getGLSLVersionDeclaration (GLSLVersion version) 54{ 55 static const char* s_decl[] = 56 { 57 "#version 100", 58 "#version 300 es", 59 "#version 310 es", 60 "#version 130", 61 "#version 140", 62 "#version 150", 63 "#version 330", 64 "#version 400", 65 "#version 410", 66 "#version 420", 67 "#version 430", 68 "#version 440", 69 }; 70 71 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version); 72} 73 74bool glslVersionUsesInOutQualifiers (GLSLVersion version) 75{ 76 return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_310_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_430); 77} 78 79bool glslVersionIsES (GLSLVersion version) 80{ 81 DE_ASSERT(version != GLSL_VERSION_LAST); 82 83 if (version == GLSL_VERSION_100_ES || 84 version == GLSL_VERSION_300_ES || 85 version == GLSL_VERSION_310_ES) 86 return true; 87 else 88 return false; 89} 90 91// \todo [2014-10-06 pyry] Export this. 92static ApiType getMinAPIForGLSLVersion (GLSLVersion version) 93{ 94 static const ApiType s_minApi[] = 95 { 96 ApiType::es(2,0), 97 ApiType::es(3,0), 98 ApiType::es(3,1), 99 ApiType::core(3,0), 100 ApiType::core(3,1), 101 ApiType::core(3,2), 102 ApiType::core(3,3), 103 ApiType::core(4,0), 104 ApiType::core(4,1), 105 ApiType::core(4,2), 106 ApiType::core(4,3), 107 ApiType::core(4,4), 108 }; 109 110 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version); 111} 112 113bool isGLSLVersionSupported (ContextType type, GLSLVersion version) 114{ 115 return contextSupports(type, getMinAPIForGLSLVersion(version)); 116} 117 118GLSLVersion getContextTypeGLSLVersion (ContextType type) 119{ 120 // \note From newer to older 121 for (int version = GLSL_VERSION_LAST-1; version >= 0; version--) 122 { 123 if (isGLSLVersionSupported(type, GLSLVersion(version))) 124 return GLSLVersion(version); 125 } 126 127 DE_ASSERT(false); 128 return GLSL_VERSION_LAST; 129} 130 131// ShaderType 132 133const char* getShaderTypeName (ShaderType shaderType) 134{ 135 const char* s_names[] = 136 { 137 "vertex", 138 "fragment", 139 "geometry", 140 "tess_control", 141 "tess_eval", 142 "compute", 143 }; 144 145 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST); 146 DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST)); 147 return s_names[(int)shaderType]; 148} 149 150// Precision 151 152const char* getPrecisionName (Precision precision) 153{ 154 const char* s_names[] = 155 { 156 "lowp", 157 "mediump", 158 "highp" 159 }; 160 161 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST); 162 DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST)); 163 return s_names[(int)precision]; 164} 165 166// DataType 167 168const char* getDataTypeName (DataType dataType) 169{ 170 const char* s_names[] = 171 { 172 "invalid", 173 "float", 174 "vec2", 175 "vec3", 176 "vec4", 177 "mat2", 178 "mat2x3", 179 "mat2x4", 180 "mat3x2", 181 "mat3", 182 "mat3x4", 183 "mat4x2", 184 "mat4x3", 185 "mat4", 186 "int", 187 "ivec2", 188 "ivec3", 189 "ivec4", 190 "uint", 191 "uvec2", 192 "uvec3", 193 "uvec4", 194 "bool", 195 "bvec2", 196 "bvec3", 197 "bvec4", 198 "sampler1D", 199 "sampler2D", 200 "samplerCube", 201 "sampler2DArray", 202 "sampler3D", 203 "samplerCubeArray", 204 "sampler1DShadow", 205 "sampler2DShadow", 206 "samplerCubeShadow", 207 "sampler2DArrayShadow", 208 "samplerCubeArrayShadow", 209 "isampler1D", 210 "isampler2D", 211 "isamplerCube", 212 "isampler2DArray", 213 "isampler3D", 214 "isamplerCubeArray", 215 "usampler1D", 216 "usampler2D", 217 "usamplerCube", 218 "usampler2DArray", 219 "usampler3D", 220 "usamplerCubeArray", 221 "sampler2DMS", 222 "isampler2DMS", 223 "usampler2DMS", 224 "image2D", 225 "imageCube", 226 "image2DArray", 227 "image3D", 228 "imageCubeArray", 229 "iimage2D", 230 "iimageCube", 231 "iimage2DArray", 232 "iimage3D", 233 "iimageCubeArray", 234 "uimage2D", 235 "uimageCube", 236 "uimage2DArray", 237 "uimage3D", 238 "uimageCubeArray", 239 "atomic_uint", 240 }; 241 242 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST); 243 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names))); 244 return s_names[(int)dataType]; 245} 246 247int getDataTypeScalarSize (DataType dataType) 248{ 249 const int s_sizes[] = 250 { 251 -1, // invalid 252 1, // float 253 2, // vec2 254 3, // vec3 255 4, // vec4 256 4, // mat2 257 6, // mat2x3 258 8, // mat2x4 259 6, // mat3x2 260 9, // mat3 261 12, // mat3x4 262 8, // mat4x2 263 12, // mat4x3 264 16, // mat4 265 1, // int 266 2, // ivec2 267 3, // ivec3 268 4, // ivec4 269 1, // uint 270 2, // uvec2 271 3, // uvec3 272 4, // uvec4 273 1, // bool 274 2, // bvec2 275 3, // bvec3 276 4, // bvec4 277 1, // sampler1D 278 1, // sampler2D 279 1, // samplerCube 280 1, // sampler2DArray 281 1, // sampler3D 282 1, // samplerCubeArray 283 1, // sampler1DShadow 284 1, // sampler2DShadow 285 1, // samplerCubeShadow 286 1, // sampler2DArrayShadow 287 1, // samplerCubeArrayShadow 288 1, // isampler1D 289 1, // isampler2D 290 1, // isamplerCube 291 1, // isampler2DArray 292 1, // isampler3D 293 1, // isamplerCubeArray 294 1, // usampler1D 295 1, // usampler2D 296 1, // usamplerCube 297 1, // usampler2DArray 298 1, // usampler3D 299 1, // usamplerCubeArray 300 1, // sampler2DMS 301 1, // isampler2DMS 302 1, // usampler2DMS 303 1, // image2D 304 1, // imageCube 305 1, // image2DArray 306 1, // image3D 307 1, // imageCubeArray 308 1, // iimage2D 309 1, // iimageCube 310 1, // iimage2DArray 311 1, // iimage3D 312 1, // iimageCubeArray 313 1, // uimage2D 314 1, // uimageCube 315 1, // uimage2DArray 316 1, // uimage3D 317 1, // uimageCubeArray 318 1, // atomic_uint 319 }; 320 321 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST); 322 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes))); 323 return s_sizes[(int)dataType]; 324} 325 326DataType getDataTypeScalarType (DataType dataType) 327{ 328 const DataType s_scalarTypes[] = 329 { 330 TYPE_INVALID, // invalid 331 TYPE_FLOAT, // float 332 TYPE_FLOAT, // vec2 333 TYPE_FLOAT, // vec3 334 TYPE_FLOAT, // vec4 335 TYPE_FLOAT, // mat2 336 TYPE_FLOAT, // mat2x3 337 TYPE_FLOAT, // mat2x4 338 TYPE_FLOAT, // mat3x2 339 TYPE_FLOAT, // mat3 340 TYPE_FLOAT, // mat3x4 341 TYPE_FLOAT, // mat4x2 342 TYPE_FLOAT, // mat4x3 343 TYPE_FLOAT, // mat4 344 TYPE_INT, // int 345 TYPE_INT, // ivec2 346 TYPE_INT, // ivec3 347 TYPE_INT, // ivec4 348 TYPE_UINT, // uint 349 TYPE_UINT, // uvec2 350 TYPE_UINT, // uvec3 351 TYPE_UINT, // uvec4 352 TYPE_BOOL, // bool 353 TYPE_BOOL, // bvec2 354 TYPE_BOOL, // bvec3 355 TYPE_BOOL, // bvec4 356 TYPE_SAMPLER_1D, // sampler1D 357 TYPE_SAMPLER_2D, // sampler2D 358 TYPE_SAMPLER_CUBE, // samplerCube 359 TYPE_SAMPLER_2D_ARRAY, // sampler2DArray 360 TYPE_SAMPLER_3D, // sampler3D 361 TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray 362 TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow 363 TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow 364 TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow 365 TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow 366 TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow 367 TYPE_INT_SAMPLER_1D, // isampler1D 368 TYPE_INT_SAMPLER_2D, // isampler2D 369 TYPE_INT_SAMPLER_CUBE, // isamplerCube 370 TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray 371 TYPE_INT_SAMPLER_3D, // isampler3D 372 TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray 373 TYPE_UINT_SAMPLER_1D, // usampler1D 374 TYPE_UINT_SAMPLER_2D, // usampler2D 375 TYPE_UINT_SAMPLER_CUBE, // usamplerCube 376 TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray 377 TYPE_UINT_SAMPLER_3D, // usampler3D 378 TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray 379 TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS 380 TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS 381 TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS 382 TYPE_IMAGE_2D, // image2D 383 TYPE_IMAGE_CUBE, // imageCube 384 TYPE_IMAGE_2D_ARRAY, // image2DArray 385 TYPE_IMAGE_3D, // image3D 386 TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray 387 TYPE_INT_IMAGE_2D, // iimage2D 388 TYPE_INT_IMAGE_CUBE, // iimageCube 389 TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray 390 TYPE_INT_IMAGE_3D, // iimage3D 391 TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray 392 TYPE_UINT_IMAGE_2D, // uimage2D 393 TYPE_UINT_IMAGE_CUBE, // uimageCube 394 TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray 395 TYPE_UINT_IMAGE_3D, // uimage3D 396 TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray 397 TYPE_UINT_ATOMIC_COUNTER, // atomic_uint 398 }; 399 400 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST); 401 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes))); 402 return s_scalarTypes[(int)dataType]; 403} 404 405DataType getDataTypeFloatScalars (DataType dataType) 406{ 407 const DataType s_floatTypes[] = 408 { 409 TYPE_INVALID, // invalid 410 TYPE_FLOAT, // float 411 TYPE_FLOAT_VEC2, // vec2 412 TYPE_FLOAT_VEC3, // vec3 413 TYPE_FLOAT_VEC4, // vec4 414 TYPE_FLOAT_MAT2, // mat2 415 TYPE_FLOAT_MAT2X3, // mat2x3 416 TYPE_FLOAT_MAT2X4, // mat2x4 417 TYPE_FLOAT_MAT3X2, // mat3x2 418 TYPE_FLOAT_MAT3, // mat3 419 TYPE_FLOAT_MAT3X4, // mat3x4 420 TYPE_FLOAT_MAT4X2, // mat4x2 421 TYPE_FLOAT_MAT4X3, // mat4x3 422 TYPE_FLOAT_MAT4, // mat4 423 TYPE_FLOAT, // int 424 TYPE_FLOAT_VEC2, // ivec2 425 TYPE_FLOAT_VEC3, // ivec3 426 TYPE_FLOAT_VEC4, // ivec4 427 TYPE_FLOAT, // uint 428 TYPE_FLOAT_VEC2, // uvec2 429 TYPE_FLOAT_VEC3, // uvec3 430 TYPE_FLOAT_VEC4, // uvec4 431 TYPE_FLOAT, // bool 432 TYPE_FLOAT_VEC2, // bvec2 433 TYPE_FLOAT_VEC3, // bvec3 434 TYPE_FLOAT_VEC4, // bvec4 435 TYPE_INVALID, // sampler1D 436 TYPE_INVALID, // sampler2D 437 TYPE_INVALID, // samplerCube 438 TYPE_INVALID, // sampler2DArray 439 TYPE_INVALID, // sampler3D 440 TYPE_INVALID, // samplerCubeArray 441 TYPE_INVALID, // sampler1DShadow 442 TYPE_INVALID, // sampler2DShadow 443 TYPE_INVALID, // samplerCubeShadow 444 TYPE_INVALID, // sampler2DArrayShadow 445 TYPE_INVALID, // samplerCubeArrayShadow 446 TYPE_INVALID, // isampler1D 447 TYPE_INVALID, // isampler2D 448 TYPE_INVALID, // isamplerCube 449 TYPE_INVALID, // isampler2DArray 450 TYPE_INVALID, // isampler3D 451 TYPE_INVALID, // isamplerCubeArray 452 TYPE_INVALID, // usampler1D 453 TYPE_INVALID, // usampler2D 454 TYPE_INVALID, // usamplerCube 455 TYPE_INVALID, // usampler2DArray 456 TYPE_INVALID, // usampler3D 457 TYPE_INVALID, // usamplerCubeArray 458 TYPE_INVALID, // sampler2DMS 459 TYPE_INVALID, // isampler2DMS 460 TYPE_INVALID, // usampler2DMS 461 TYPE_INVALID, // image2D 462 TYPE_INVALID, // imageCube 463 TYPE_INVALID, // image2DArray 464 TYPE_INVALID, // image3D 465 TYPE_INVALID, // imageCubeArray 466 TYPE_INVALID, // iimage2D 467 TYPE_INVALID, // iimageCube 468 TYPE_INVALID, // iimage2DArray 469 TYPE_INVALID, // iimage3D 470 TYPE_INVALID, // iimageCubeArray 471 TYPE_INVALID, // uimage2D 472 TYPE_INVALID, // uimageCube 473 TYPE_INVALID, // uimage2DArray 474 TYPE_INVALID, // uimage3D 475 TYPE_INVALID, // uimageCubeArray 476 TYPE_INVALID, // atomic_uint 477 }; 478 479 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST); 480 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes))); 481 return s_floatTypes[(int)dataType]; 482} 483 484DataType getDataTypeVector (DataType scalarType, int size) 485{ 486 DE_ASSERT(deInRange32(size, 1, 4)); 487 switch (scalarType) 488 { 489 case TYPE_FLOAT: 490 case TYPE_INT: 491 case TYPE_UINT: 492 case TYPE_BOOL: 493 return (DataType)((int)scalarType + size - 1); 494 default: 495 return TYPE_INVALID; 496 } 497} 498 499DataType getDataTypeFloatVec (int vecSize) 500{ 501 return getDataTypeVector(TYPE_FLOAT, vecSize); 502} 503 504DataType getDataTypeIntVec (int vecSize) 505{ 506 return getDataTypeVector(TYPE_INT, vecSize); 507} 508 509DataType getDataTypeUintVec (int vecSize) 510{ 511 return getDataTypeVector(TYPE_UINT, vecSize); 512} 513 514DataType getDataTypeBoolVec (int vecSize) 515{ 516 return getDataTypeVector(TYPE_BOOL, vecSize); 517} 518 519DataType getDataTypeMatrix (int numCols, int numRows) 520{ 521 DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4)); 522 return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2)); 523} 524 525int getDataTypeMatrixNumRows (DataType dataType) 526{ 527 switch (dataType) 528 { 529 case TYPE_FLOAT_MAT2: return 2; 530 case TYPE_FLOAT_MAT2X3: return 3; 531 case TYPE_FLOAT_MAT2X4: return 4; 532 case TYPE_FLOAT_MAT3X2: return 2; 533 case TYPE_FLOAT_MAT3: return 3; 534 case TYPE_FLOAT_MAT3X4: return 4; 535 case TYPE_FLOAT_MAT4X2: return 2; 536 case TYPE_FLOAT_MAT4X3: return 3; 537 case TYPE_FLOAT_MAT4: return 4; 538 default: 539 DE_ASSERT(false); 540 return 0; 541 } 542} 543 544int getDataTypeMatrixNumColumns (DataType dataType) 545{ 546 switch (dataType) 547 { 548 case TYPE_FLOAT_MAT2: return 2; 549 case TYPE_FLOAT_MAT2X3: return 2; 550 case TYPE_FLOAT_MAT2X4: return 2; 551 case TYPE_FLOAT_MAT3X2: return 3; 552 case TYPE_FLOAT_MAT3: return 3; 553 case TYPE_FLOAT_MAT3X4: return 3; 554 case TYPE_FLOAT_MAT4X2: return 4; 555 case TYPE_FLOAT_MAT4X3: return 4; 556 case TYPE_FLOAT_MAT4: return 4; 557 default: 558 DE_ASSERT(false); 559 return 0; 560 } 561} 562 563int getDataTypeNumLocations (DataType dataType) 564{ 565 if (isDataTypeScalarOrVector(dataType)) 566 return 1; 567 else if (isDataTypeMatrix(dataType)) 568 return getDataTypeMatrixNumColumns(dataType); 569 570 DE_ASSERT(!"Illegal datatype."); 571 return 0; 572} 573 574int getDataTypeNumComponents (DataType dataType) 575{ 576 if (isDataTypeScalarOrVector(dataType)) 577 return getDataTypeScalarSize(dataType); 578 else if (isDataTypeMatrix(dataType)) 579 return getDataTypeMatrixNumRows(dataType); 580 581 DE_ASSERT(!"Illegal datatype."); 582 return 0; 583} 584 585DataType getDataTypeFromGLType (deUint32 glType) 586{ 587 switch (glType) 588 { 589 case GL_FLOAT: return TYPE_FLOAT; 590 case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2; 591 case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3; 592 case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4; 593 594 case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2; 595 case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3; 596 case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4; 597 598 case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2; 599 case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3; 600 case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4; 601 602 case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2; 603 case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3; 604 case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4; 605 606 case GL_INT: return TYPE_INT; 607 case GL_INT_VEC2: return TYPE_INT_VEC2; 608 case GL_INT_VEC3: return TYPE_INT_VEC3; 609 case GL_INT_VEC4: return TYPE_INT_VEC4; 610 611 case GL_UNSIGNED_INT: return TYPE_UINT; 612 case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2; 613 case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3; 614 case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4; 615 616 case GL_BOOL: return TYPE_BOOL; 617 case GL_BOOL_VEC2: return TYPE_BOOL_VEC2; 618 case GL_BOOL_VEC3: return TYPE_BOOL_VEC3; 619 case GL_BOOL_VEC4: return TYPE_BOOL_VEC4; 620 621 case GL_SAMPLER_1D: return TYPE_SAMPLER_1D; 622 case GL_SAMPLER_2D: return TYPE_SAMPLER_2D; 623 case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE; 624 case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY; 625 case GL_SAMPLER_3D: return TYPE_SAMPLER_3D; 626 case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY; 627 628 case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW; 629 case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW; 630 case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW; 631 case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW; 632 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW; 633 634 case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D; 635 case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D; 636 case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE; 637 case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY; 638 case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D; 639 case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY; 640 641 case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D; 642 case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D; 643 case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE; 644 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY; 645 case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D; 646 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY; 647 648 case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE; 649 case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE; 650 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE; 651 652 case GL_IMAGE_2D: return TYPE_IMAGE_2D; 653 case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE; 654 case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY; 655 case GL_IMAGE_3D: return TYPE_IMAGE_3D; 656 case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D; 657 case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE; 658 case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY; 659 case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D; 660 case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D; 661 case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE; 662 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY; 663 case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D; 664 665 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER; 666 667 default: 668 return TYPE_LAST; 669 } 670} 671 672} // glu 673