1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES Utilities
3 * ------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Shader utilities.
22 *//*--------------------------------------------------------------------*/
24 #include "gluShaderUtil.hpp"
25 #include "glwEnums.hpp"
26 #include "deArrayUtil.hpp"
31 // ShadingLanguageVersion
33 const char* getGLSLVersionName (GLSLVersion version)
35 static const char* s_names[] =
53 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version);
56 const char* getGLSLVersionDeclaration (GLSLVersion version)
58 static const char* s_decl[] =
76 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version);
79 bool glslVersionUsesInOutQualifiers (GLSLVersion version)
81 return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_320_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_430);
84 bool glslVersionIsES (GLSLVersion version)
86 DE_STATIC_ASSERT(GLSL_VERSION_LAST == 14);
87 DE_ASSERT(version != GLSL_VERSION_LAST);
89 if (version == GLSL_VERSION_100_ES ||
90 version == GLSL_VERSION_300_ES ||
91 version == GLSL_VERSION_310_ES ||
92 version == GLSL_VERSION_320_ES)
98 // \todo [2014-10-06 pyry] Export this.
99 static ApiType getMinAPIForGLSLVersion (GLSLVersion version)
101 static const ApiType s_minApi[] =
119 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version);
122 bool isGLSLVersionSupported (ContextType type, GLSLVersion version)
124 return contextSupports(type, getMinAPIForGLSLVersion(version));
127 GLSLVersion getContextTypeGLSLVersion (ContextType type)
129 // \note From newer to older
130 for (int version = GLSL_VERSION_LAST-1; version >= 0; version--)
132 if (isGLSLVersionSupported(type, GLSLVersion(version)))
133 return GLSLVersion(version);
137 return GLSL_VERSION_LAST;
142 const char* getShaderTypeName (ShaderType shaderType)
144 static const char* s_names[] =
154 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST);
155 DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST));
156 return s_names[(int)shaderType];
161 const char* getPrecisionName (Precision precision)
163 static const char* s_names[] =
170 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST);
171 DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST));
172 return s_names[(int)precision];
177 const char* getDataTypeName (DataType dataType)
179 static const char* s_names[] =
230 "sampler1DArrayShadow",
231 "sampler2DArrayShadow",
232 "samplerCubeArrayShadow",
277 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
278 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
279 return s_names[(int)dataType];
282 int getDataTypeScalarSize (DataType dataType)
284 static const int s_sizes[] =
331 1, // samplerCubeArray
332 1, // sampler1DShadow
333 1, // sampler2DShadow
334 1, // samplerCubeShadow
335 1, // sampler1DArrayShadow
336 1, // sampler2DArrayShadow
337 1, // samplerCubeArrayShadow
341 1, // isampler1DArray
342 1, // isampler2DArray
344 1, // isamplerCubeArray
348 1, // usampler1DArray
349 1, // usampler2DArray
351 1, // usamplerCubeArray
364 1, // iimageCubeArray
369 1, // uimageCubeArray
374 1, // sampler2DMSArray
375 1, // isampler2DMSArray
376 1, // usampler2DMSArray
382 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
383 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
384 return s_sizes[(int)dataType];
387 DataType getDataTypeScalarType (DataType dataType)
389 static const DataType s_scalarTypes[] =
391 TYPE_INVALID, // invalid
397 TYPE_FLOAT, // mat2x3
398 TYPE_FLOAT, // mat2x4
399 TYPE_FLOAT, // mat3x2
401 TYPE_FLOAT, // mat3x4
402 TYPE_FLOAT, // mat4x2
403 TYPE_FLOAT, // mat4x3
405 TYPE_DOUBLE, // double
406 TYPE_DOUBLE, // dvec2
407 TYPE_DOUBLE, // dvec3
408 TYPE_DOUBLE, // dvec4
409 TYPE_DOUBLE, // dmat2
410 TYPE_DOUBLE, // dmat2x3
411 TYPE_DOUBLE, // dmat2x4
412 TYPE_DOUBLE, // dmat3x2
413 TYPE_DOUBLE, // dmat3
414 TYPE_DOUBLE, // dmat3x4
415 TYPE_DOUBLE, // dmat4x2
416 TYPE_DOUBLE, // dmat4x3
417 TYPE_DOUBLE, // dmat4
430 TYPE_SAMPLER_1D, // sampler1D
431 TYPE_SAMPLER_2D, // sampler2D
432 TYPE_SAMPLER_CUBE, // samplerCube
433 TYPE_SAMPLER_1D_ARRAY, // sampler1DArray
434 TYPE_SAMPLER_2D_ARRAY, // sampler2DArray
435 TYPE_SAMPLER_3D, // sampler3D
436 TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray
437 TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow
438 TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow
439 TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow
440 TYPE_SAMPLER_1D_ARRAY_SHADOW, // sampler1DArrayShadow
441 TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow
442 TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow
443 TYPE_INT_SAMPLER_1D, // isampler1D
444 TYPE_INT_SAMPLER_2D, // isampler2D
445 TYPE_INT_SAMPLER_CUBE, // isamplerCube
446 TYPE_INT_SAMPLER_1D_ARRAY, // isampler1DArray
447 TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray
448 TYPE_INT_SAMPLER_3D, // isampler3D
449 TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray
450 TYPE_UINT_SAMPLER_1D, // usampler1D
451 TYPE_UINT_SAMPLER_2D, // usampler2D
452 TYPE_UINT_SAMPLER_CUBE, // usamplerCube
453 TYPE_UINT_SAMPLER_1D_ARRAY, // usampler1DArray
454 TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray
455 TYPE_UINT_SAMPLER_3D, // usampler3D
456 TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray
457 TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS
458 TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS
459 TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS
460 TYPE_IMAGE_2D, // image2D
461 TYPE_IMAGE_CUBE, // imageCube
462 TYPE_IMAGE_2D_ARRAY, // image2DArray
463 TYPE_IMAGE_3D, // image3D
464 TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray
465 TYPE_INT_IMAGE_2D, // iimage2D
466 TYPE_INT_IMAGE_CUBE, // iimageCube
467 TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray
468 TYPE_INT_IMAGE_3D, // iimage3D
469 TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray
470 TYPE_UINT_IMAGE_2D, // uimage2D
471 TYPE_UINT_IMAGE_CUBE, // uimageCube
472 TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray
473 TYPE_UINT_IMAGE_3D, // uimage3D
474 TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray
475 TYPE_UINT_ATOMIC_COUNTER, // atomic_uint
476 TYPE_SAMPLER_BUFFER, // samplerBuffer
477 TYPE_INT_SAMPLER_BUFFER, // isamplerBuffer
478 TYPE_UINT_SAMPLER_BUFFER, // usamplerBuffer
479 TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY, // sampler2DMSArray
480 TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, // isampler2DMSArray
481 TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY, // usampler2DMSArray
482 TYPE_IMAGE_BUFFER, // imageBuffer
483 TYPE_INT_IMAGE_BUFFER, // iimageBuffer
484 TYPE_UINT_IMAGE_BUFFER, // uimageBuffer
487 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
488 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
489 return s_scalarTypes[(int)dataType];
492 DataType getDataTypeFloatScalars (DataType dataType)
494 static const DataType s_floatTypes[] =
496 TYPE_INVALID, // invalid
498 TYPE_FLOAT_VEC2, // vec2
499 TYPE_FLOAT_VEC3, // vec3
500 TYPE_FLOAT_VEC4, // vec4
501 TYPE_FLOAT_MAT2, // mat2
502 TYPE_FLOAT_MAT2X3, // mat2x3
503 TYPE_FLOAT_MAT2X4, // mat2x4
504 TYPE_FLOAT_MAT3X2, // mat3x2
505 TYPE_FLOAT_MAT3, // mat3
506 TYPE_FLOAT_MAT3X4, // mat3x4
507 TYPE_FLOAT_MAT4X2, // mat4x2
508 TYPE_FLOAT_MAT4X3, // mat4x3
509 TYPE_FLOAT_MAT4, // mat4
510 TYPE_FLOAT, // double
511 TYPE_FLOAT_VEC2, // dvec2
512 TYPE_FLOAT_VEC3, // dvec3
513 TYPE_FLOAT_VEC4, // dvec4
514 TYPE_FLOAT_MAT2, // dmat2
515 TYPE_FLOAT_MAT2X3, // dmat2x3
516 TYPE_FLOAT_MAT2X4, // dmat2x4
517 TYPE_FLOAT_MAT3X2, // dmat3x2
518 TYPE_FLOAT_MAT3, // dmat3
519 TYPE_FLOAT_MAT3X4, // dmat3x4
520 TYPE_FLOAT_MAT4X2, // dmat4x2
521 TYPE_FLOAT_MAT4X3, // dmat4x3
522 TYPE_FLOAT_MAT4, // dmat4
524 TYPE_FLOAT_VEC2, // ivec2
525 TYPE_FLOAT_VEC3, // ivec3
526 TYPE_FLOAT_VEC4, // ivec4
528 TYPE_FLOAT_VEC2, // uvec2
529 TYPE_FLOAT_VEC3, // uvec3
530 TYPE_FLOAT_VEC4, // uvec4
532 TYPE_FLOAT_VEC2, // bvec2
533 TYPE_FLOAT_VEC3, // bvec3
534 TYPE_FLOAT_VEC4, // bvec4
535 TYPE_INVALID, // sampler1D
536 TYPE_INVALID, // sampler2D
537 TYPE_INVALID, // samplerCube
538 TYPE_INVALID, // sampler1DArray
539 TYPE_INVALID, // sampler2DArray
540 TYPE_INVALID, // sampler3D
541 TYPE_INVALID, // samplerCubeArray
542 TYPE_INVALID, // sampler1DShadow
543 TYPE_INVALID, // sampler2DShadow
544 TYPE_INVALID, // samplerCubeShadow
545 TYPE_INVALID, // sampler1DArrayShadow
546 TYPE_INVALID, // sampler2DArrayShadow
547 TYPE_INVALID, // samplerCubeArrayShadow
548 TYPE_INVALID, // isampler1D
549 TYPE_INVALID, // isampler2D
550 TYPE_INVALID, // isamplerCube
551 TYPE_INVALID, // isampler1DArray
552 TYPE_INVALID, // isampler2DArray
553 TYPE_INVALID, // isampler3D
554 TYPE_INVALID, // isamplerCubeArray
555 TYPE_INVALID, // usampler1D
556 TYPE_INVALID, // usampler2D
557 TYPE_INVALID, // usamplerCube
558 TYPE_INVALID, // usampler1DArray
559 TYPE_INVALID, // usampler2DArray
560 TYPE_INVALID, // usampler3D
561 TYPE_INVALID, // usamplerCubeArray
562 TYPE_INVALID, // sampler2DMS
563 TYPE_INVALID, // isampler2DMS
564 TYPE_INVALID, // usampler2DMS
565 TYPE_INVALID, // image2D
566 TYPE_INVALID, // imageCube
567 TYPE_INVALID, // image2DArray
568 TYPE_INVALID, // image3D
569 TYPE_INVALID, // imageCubeArray
570 TYPE_INVALID, // iimage2D
571 TYPE_INVALID, // iimageCube
572 TYPE_INVALID, // iimage2DArray
573 TYPE_INVALID, // iimage3D
574 TYPE_INVALID, // iimageCubeArray
575 TYPE_INVALID, // uimage2D
576 TYPE_INVALID, // uimageCube
577 TYPE_INVALID, // uimage2DArray
578 TYPE_INVALID, // uimage3D
579 TYPE_INVALID, // uimageCubeArray
580 TYPE_INVALID, // atomic_uint
581 TYPE_INVALID, // samplerBuffer
582 TYPE_INVALID, // isamplerBuffer
583 TYPE_INVALID, // usamplerBuffer
584 TYPE_INVALID, // sampler2DMSArray
585 TYPE_INVALID, // isampler2DMSArray
586 TYPE_INVALID, // usampler2DMSArray
587 TYPE_INVALID, // imageBuffer
588 TYPE_INVALID, // iimageBuffer
589 TYPE_INVALID, // uimageBuffer
592 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
593 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
594 return s_floatTypes[(int)dataType];
597 DataType getDataTypeDoubleScalars (DataType dataType)
599 static const DataType s_doubleTypes[] =
601 TYPE_INVALID, // invalid
602 TYPE_DOUBLE, // float
603 TYPE_DOUBLE_VEC2, // vec2
604 TYPE_DOUBLE_VEC3, // vec3
605 TYPE_DOUBLE_VEC4, // vec4
606 TYPE_DOUBLE_MAT2, // mat2
607 TYPE_DOUBLE_MAT2X3, // mat2x3
608 TYPE_DOUBLE_MAT2X4, // mat2x4
609 TYPE_DOUBLE_MAT3X2, // mat3x2
610 TYPE_DOUBLE_MAT3, // mat3
611 TYPE_DOUBLE_MAT3X4, // mat3x4
612 TYPE_DOUBLE_MAT4X2, // mat4x2
613 TYPE_DOUBLE_MAT4X3, // mat4x3
614 TYPE_DOUBLE_MAT4, // mat4
615 TYPE_DOUBLE, // double
616 TYPE_DOUBLE_VEC2, // dvec2
617 TYPE_DOUBLE_VEC3, // dvec3
618 TYPE_DOUBLE_VEC4, // dvec4
619 TYPE_DOUBLE_MAT2, // dmat2
620 TYPE_DOUBLE_MAT2X3, // dmat2x3
621 TYPE_DOUBLE_MAT2X4, // dmat2x4
622 TYPE_DOUBLE_MAT3X2, // dmat3x2
623 TYPE_DOUBLE_MAT3, // dmat3
624 TYPE_DOUBLE_MAT3X4, // dmat3x4
625 TYPE_DOUBLE_MAT4X2, // dmat4x2
626 TYPE_DOUBLE_MAT4X3, // dmat4x3
627 TYPE_DOUBLE_MAT4, // dmat4
629 TYPE_DOUBLE_VEC2, // ivec2
630 TYPE_DOUBLE_VEC3, // ivec3
631 TYPE_DOUBLE_VEC4, // ivec4
633 TYPE_DOUBLE_VEC2, // uvec2
634 TYPE_DOUBLE_VEC3, // uvec3
635 TYPE_DOUBLE_VEC4, // uvec4
637 TYPE_DOUBLE_VEC2, // bvec2
638 TYPE_DOUBLE_VEC3, // bvec3
639 TYPE_DOUBLE_VEC4, // bvec4
640 TYPE_INVALID, // sampler1D
641 TYPE_INVALID, // sampler2D
642 TYPE_INVALID, // samplerCube
643 TYPE_INVALID, // sampler1DArray
644 TYPE_INVALID, // sampler2DArray
645 TYPE_INVALID, // sampler3D
646 TYPE_INVALID, // samplerCubeArray
647 TYPE_INVALID, // sampler1DShadow
648 TYPE_INVALID, // sampler2DShadow
649 TYPE_INVALID, // samplerCubeShadow
650 TYPE_INVALID, // sampler1DArrayShadow
651 TYPE_INVALID, // sampler2DArrayShadow
652 TYPE_INVALID, // samplerCubeArrayShadow
653 TYPE_INVALID, // isampler1D
654 TYPE_INVALID, // isampler2D
655 TYPE_INVALID, // isamplerCube
656 TYPE_INVALID, // isampler1DArray
657 TYPE_INVALID, // isampler2DArray
658 TYPE_INVALID, // isampler3D
659 TYPE_INVALID, // isamplerCubeArray
660 TYPE_INVALID, // usampler1D
661 TYPE_INVALID, // usampler2D
662 TYPE_INVALID, // usamplerCube
663 TYPE_INVALID, // usampler1DArray
664 TYPE_INVALID, // usampler2DArray
665 TYPE_INVALID, // usampler3D
666 TYPE_INVALID, // usamplerCubeArray
667 TYPE_INVALID, // sampler2DMS
668 TYPE_INVALID, // isampler2DMS
669 TYPE_INVALID, // usampler2DMS
670 TYPE_INVALID, // image2D
671 TYPE_INVALID, // imageCube
672 TYPE_INVALID, // image2DArray
673 TYPE_INVALID, // image3D
674 TYPE_INVALID, // imageCubeArray
675 TYPE_INVALID, // iimage2D
676 TYPE_INVALID, // iimageCube
677 TYPE_INVALID, // iimage2DArray
678 TYPE_INVALID, // iimage3D
679 TYPE_INVALID, // iimageCubeArray
680 TYPE_INVALID, // uimage2D
681 TYPE_INVALID, // uimageCube
682 TYPE_INVALID, // uimage2DArray
683 TYPE_INVALID, // uimage3D
684 TYPE_INVALID, // uimageCubeArray
685 TYPE_INVALID, // atomic_uint
686 TYPE_INVALID, // samplerBuffer
687 TYPE_INVALID, // isamplerBuffer
688 TYPE_INVALID, // usamplerBuffer
689 TYPE_INVALID, // sampler2DMSArray
690 TYPE_INVALID, // isampler2DMSArray
691 TYPE_INVALID, // usampler2DMSArray
692 TYPE_INVALID, // imageBuffer
693 TYPE_INVALID, // iimageBuffer
694 TYPE_INVALID, // uimageBuffer
697 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_doubleTypes) == TYPE_LAST);
698 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_doubleTypes)));
699 return s_doubleTypes[(int)dataType];
702 DataType getDataTypeVector (DataType scalarType, int size)
704 DE_ASSERT(deInRange32(size, 1, 4));
712 return (DataType)((int)scalarType + size - 1);
718 DataType getDataTypeFloatVec (int vecSize)
720 return getDataTypeVector(TYPE_FLOAT, vecSize);
723 DataType getDataTypeIntVec (int vecSize)
725 return getDataTypeVector(TYPE_INT, vecSize);
728 DataType getDataTypeUintVec (int vecSize)
730 return getDataTypeVector(TYPE_UINT, vecSize);
733 DataType getDataTypeBoolVec (int vecSize)
735 return getDataTypeVector(TYPE_BOOL, vecSize);
738 DataType getDataTypeMatrix (int numCols, int numRows)
740 DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
741 return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
744 int getDataTypeMatrixNumRows (DataType dataType)
748 case TYPE_FLOAT_MAT2: return 2;
749 case TYPE_FLOAT_MAT2X3: return 3;
750 case TYPE_FLOAT_MAT2X4: return 4;
751 case TYPE_FLOAT_MAT3X2: return 2;
752 case TYPE_FLOAT_MAT3: return 3;
753 case TYPE_FLOAT_MAT3X4: return 4;
754 case TYPE_FLOAT_MAT4X2: return 2;
755 case TYPE_FLOAT_MAT4X3: return 3;
756 case TYPE_FLOAT_MAT4: return 4;
757 case TYPE_DOUBLE_MAT2: return 2;
758 case TYPE_DOUBLE_MAT2X3: return 3;
759 case TYPE_DOUBLE_MAT2X4: return 4;
760 case TYPE_DOUBLE_MAT3X2: return 2;
761 case TYPE_DOUBLE_MAT3: return 3;
762 case TYPE_DOUBLE_MAT3X4: return 4;
763 case TYPE_DOUBLE_MAT4X2: return 2;
764 case TYPE_DOUBLE_MAT4X3: return 3;
765 case TYPE_DOUBLE_MAT4: return 4;
772 int getDataTypeMatrixNumColumns (DataType dataType)
776 case TYPE_FLOAT_MAT2: return 2;
777 case TYPE_FLOAT_MAT2X3: return 2;
778 case TYPE_FLOAT_MAT2X4: return 2;
779 case TYPE_FLOAT_MAT3X2: return 3;
780 case TYPE_FLOAT_MAT3: return 3;
781 case TYPE_FLOAT_MAT3X4: return 3;
782 case TYPE_FLOAT_MAT4X2: return 4;
783 case TYPE_FLOAT_MAT4X3: return 4;
784 case TYPE_FLOAT_MAT4: return 4;
785 case TYPE_DOUBLE_MAT2: return 2;
786 case TYPE_DOUBLE_MAT2X3: return 2;
787 case TYPE_DOUBLE_MAT2X4: return 2;
788 case TYPE_DOUBLE_MAT3X2: return 3;
789 case TYPE_DOUBLE_MAT3: return 3;
790 case TYPE_DOUBLE_MAT3X4: return 3;
791 case TYPE_DOUBLE_MAT4X2: return 4;
792 case TYPE_DOUBLE_MAT4X3: return 4;
793 case TYPE_DOUBLE_MAT4: return 4;
800 int getDataTypeNumLocations (DataType dataType)
802 if (isDataTypeScalarOrVector(dataType))
804 else if (isDataTypeMatrix(dataType))
805 return getDataTypeMatrixNumColumns(dataType);
807 DE_FATAL("Illegal datatype.");
811 int getDataTypeNumComponents (DataType dataType)
813 if (isDataTypeScalarOrVector(dataType))
814 return getDataTypeScalarSize(dataType);
815 else if (isDataTypeMatrix(dataType))
816 return getDataTypeMatrixNumRows(dataType);
818 DE_FATAL("Illegal datatype.");
822 DataType getDataTypeFromGLType (deUint32 glType)
826 case GL_FLOAT: return TYPE_FLOAT;
827 case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2;
828 case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3;
829 case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4;
831 case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2;
832 case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3;
833 case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4;
835 case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2;
836 case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3;
837 case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4;
839 case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2;
840 case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3;
841 case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4;
843 case GL_DOUBLE: return TYPE_DOUBLE;
844 case GL_DOUBLE_VEC2: return TYPE_DOUBLE_VEC2;
845 case GL_DOUBLE_VEC3: return TYPE_DOUBLE_VEC3;
846 case GL_DOUBLE_VEC4: return TYPE_DOUBLE_VEC4;
848 case GL_DOUBLE_MAT2: return TYPE_DOUBLE_MAT2;
849 case GL_DOUBLE_MAT2x3: return TYPE_DOUBLE_MAT2X3;
850 case GL_DOUBLE_MAT2x4: return TYPE_DOUBLE_MAT2X4;
852 case GL_DOUBLE_MAT3x2: return TYPE_DOUBLE_MAT3X2;
853 case GL_DOUBLE_MAT3: return TYPE_DOUBLE_MAT3;
854 case GL_DOUBLE_MAT3x4: return TYPE_DOUBLE_MAT3X4;
856 case GL_DOUBLE_MAT4x2: return TYPE_DOUBLE_MAT4X2;
857 case GL_DOUBLE_MAT4x3: return TYPE_DOUBLE_MAT4X3;
858 case GL_DOUBLE_MAT4: return TYPE_DOUBLE_MAT4;
860 case GL_INT: return TYPE_INT;
861 case GL_INT_VEC2: return TYPE_INT_VEC2;
862 case GL_INT_VEC3: return TYPE_INT_VEC3;
863 case GL_INT_VEC4: return TYPE_INT_VEC4;
865 case GL_UNSIGNED_INT: return TYPE_UINT;
866 case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2;
867 case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3;
868 case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4;
870 case GL_BOOL: return TYPE_BOOL;
871 case GL_BOOL_VEC2: return TYPE_BOOL_VEC2;
872 case GL_BOOL_VEC3: return TYPE_BOOL_VEC3;
873 case GL_BOOL_VEC4: return TYPE_BOOL_VEC4;
875 case GL_SAMPLER_1D: return TYPE_SAMPLER_1D;
876 case GL_SAMPLER_2D: return TYPE_SAMPLER_2D;
877 case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE;
878 case GL_SAMPLER_1D_ARRAY: return TYPE_SAMPLER_1D_ARRAY;
879 case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY;
880 case GL_SAMPLER_3D: return TYPE_SAMPLER_3D;
881 case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY;
883 case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW;
884 case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW;
885 case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW;
886 case GL_SAMPLER_1D_ARRAY_SHADOW: return TYPE_SAMPLER_1D_ARRAY_SHADOW;
887 case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW;
888 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
890 case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D;
891 case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D;
892 case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE;
893 case GL_INT_SAMPLER_1D_ARRAY: return TYPE_INT_SAMPLER_1D_ARRAY;
894 case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY;
895 case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D;
896 case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY;
898 case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D;
899 case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D;
900 case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE;
901 case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: return TYPE_UINT_SAMPLER_1D_ARRAY;
902 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY;
903 case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D;
904 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY;
906 case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE;
907 case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
908 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
910 case GL_IMAGE_2D: return TYPE_IMAGE_2D;
911 case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE;
912 case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY;
913 case GL_IMAGE_3D: return TYPE_IMAGE_3D;
914 case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D;
915 case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE;
916 case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY;
917 case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D;
918 case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D;
919 case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE;
920 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY;
921 case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D;
923 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER;
925 case GL_SAMPLER_BUFFER: return TYPE_SAMPLER_BUFFER;
926 case GL_INT_SAMPLER_BUFFER: return TYPE_INT_SAMPLER_BUFFER;
927 case GL_UNSIGNED_INT_SAMPLER_BUFFER: return TYPE_UINT_SAMPLER_BUFFER;
929 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY;
930 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY;
931 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY;
933 case GL_IMAGE_BUFFER: return TYPE_IMAGE_BUFFER;
934 case GL_INT_IMAGE_BUFFER: return TYPE_INT_IMAGE_BUFFER;
935 case GL_UNSIGNED_INT_IMAGE_BUFFER: return TYPE_UINT_IMAGE_BUFFER;