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[] =
54 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version);
57 const char* getGLSLVersionDeclaration (GLSLVersion version)
59 static const char* s_decl[] =
78 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version);
81 bool glslVersionUsesInOutQualifiers (GLSLVersion version)
83 return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_320_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_460);
86 bool glslVersionIsES (GLSLVersion version)
88 DE_STATIC_ASSERT(GLSL_VERSION_LAST == 15);
89 DE_ASSERT(version != GLSL_VERSION_LAST);
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)
100 // \todo [2014-10-06 pyry] Export this.
101 static ApiType getMinAPIForGLSLVersion (GLSLVersion version)
103 static const ApiType s_minApi[] =
122 return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version);
125 bool isGLSLVersionSupported (ContextType type, GLSLVersion version)
127 return contextSupports(type, getMinAPIForGLSLVersion(version));
130 GLSLVersion getContextTypeGLSLVersion (ContextType type)
132 // \note From newer to older
133 for (int version = GLSL_VERSION_LAST-1; version >= 0; version--)
135 if (isGLSLVersionSupported(type, GLSLVersion(version)))
136 return GLSLVersion(version);
140 return GLSL_VERSION_LAST;
145 const char* getShaderTypeName (ShaderType shaderType)
147 static const char* s_names[] =
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];
164 const char* getPrecisionName (Precision precision)
166 static const char* s_names[] =
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];
180 const char* getDataTypeName (DataType dataType)
182 static const char* s_names[] =
233 "sampler1DArrayShadow",
234 "sampler2DArrayShadow",
235 "samplerCubeArrayShadow",
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];
285 int getDataTypeScalarSize (DataType dataType)
287 static const int s_sizes[] =
334 1, // samplerCubeArray
335 1, // sampler1DShadow
336 1, // sampler2DShadow
337 1, // samplerCubeShadow
338 1, // sampler1DArrayShadow
339 1, // sampler2DArrayShadow
340 1, // samplerCubeArrayShadow
344 1, // isampler1DArray
345 1, // isampler2DArray
347 1, // isamplerCubeArray
351 1, // usampler1DArray
352 1, // usampler2DArray
354 1, // usamplerCubeArray
367 1, // iimageCubeArray
372 1, // uimageCubeArray
377 1, // sampler2DMSArray
378 1, // isampler2DMSArray
379 1, // usampler2DMSArray
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];
390 DataType getDataTypeScalarType (DataType dataType)
392 static const DataType s_scalarTypes[] =
394 TYPE_INVALID, // invalid
400 TYPE_FLOAT, // mat2x3
401 TYPE_FLOAT, // mat2x4
402 TYPE_FLOAT, // mat3x2
404 TYPE_FLOAT, // mat3x4
405 TYPE_FLOAT, // mat4x2
406 TYPE_FLOAT, // mat4x3
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
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
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];
495 DataType getDataTypeFloatScalars (DataType dataType)
497 static const DataType s_floatTypes[] =
499 TYPE_INVALID, // invalid
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
527 TYPE_FLOAT_VEC2, // ivec2
528 TYPE_FLOAT_VEC3, // ivec3
529 TYPE_FLOAT_VEC4, // ivec4
531 TYPE_FLOAT_VEC2, // uvec2
532 TYPE_FLOAT_VEC3, // uvec3
533 TYPE_FLOAT_VEC4, // uvec4
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
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];
600 DataType getDataTypeDoubleScalars (DataType dataType)
602 static const DataType s_doubleTypes[] =
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
632 TYPE_DOUBLE_VEC2, // ivec2
633 TYPE_DOUBLE_VEC3, // ivec3
634 TYPE_DOUBLE_VEC4, // ivec4
636 TYPE_DOUBLE_VEC2, // uvec2
637 TYPE_DOUBLE_VEC3, // uvec3
638 TYPE_DOUBLE_VEC4, // uvec4
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
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];
705 DataType getDataTypeVector (DataType scalarType, int size)
707 DE_ASSERT(deInRange32(size, 1, 4));
715 return (DataType)((int)scalarType + size - 1);
721 DataType getDataTypeFloatVec (int vecSize)
723 return getDataTypeVector(TYPE_FLOAT, vecSize);
726 DataType getDataTypeIntVec (int vecSize)
728 return getDataTypeVector(TYPE_INT, vecSize);
731 DataType getDataTypeUintVec (int vecSize)
733 return getDataTypeVector(TYPE_UINT, vecSize);
736 DataType getDataTypeBoolVec (int vecSize)
738 return getDataTypeVector(TYPE_BOOL, vecSize);
741 DataType getDataTypeMatrix (int numCols, int numRows)
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));
747 int getDataTypeMatrixNumRows (DataType dataType)
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;
775 int getDataTypeMatrixNumColumns (DataType dataType)
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;
803 int getDataTypeNumLocations (DataType dataType)
805 if (isDataTypeScalarOrVector(dataType))
807 else if (isDataTypeMatrix(dataType))
808 return getDataTypeMatrixNumColumns(dataType);
810 DE_FATAL("Illegal datatype.");
814 int getDataTypeNumComponents (DataType dataType)
816 if (isDataTypeScalarOrVector(dataType))
817 return getDataTypeScalarSize(dataType);
818 else if (isDataTypeMatrix(dataType))
819 return getDataTypeMatrixNumRows(dataType);
821 DE_FATAL("Illegal datatype.");
825 DataType getDataTypeFromGLType (deUint32 glType)
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
926 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER;
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;
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;
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;