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 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 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 const char* s_names[] =
216 "sampler2DArrayShadow",
217 "samplerCubeArrayShadow",
260 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
261 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
262 return s_names[(int)dataType];
265 int getDataTypeScalarSize (DataType dataType)
267 const int s_sizes[] =
300 1, // samplerCubeArray
301 1, // sampler1DShadow
302 1, // sampler2DShadow
303 1, // samplerCubeShadow
304 1, // sampler2DArrayShadow
305 1, // samplerCubeArrayShadow
309 1, // isampler2DArray
311 1, // isamplerCubeArray
315 1, // usampler2DArray
317 1, // usamplerCubeArray
330 1, // iimageCubeArray
335 1, // uimageCubeArray
340 1, // sampler2DMSArray
341 1, // isampler2DMSArray
342 1, // usampler2DMSArray
348 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
349 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
350 return s_sizes[(int)dataType];
353 DataType getDataTypeScalarType (DataType dataType)
355 const DataType s_scalarTypes[] =
357 TYPE_INVALID, // invalid
363 TYPE_FLOAT, // mat2x3
364 TYPE_FLOAT, // mat2x4
365 TYPE_FLOAT, // mat3x2
367 TYPE_FLOAT, // mat3x4
368 TYPE_FLOAT, // mat4x2
369 TYPE_FLOAT, // mat4x3
383 TYPE_SAMPLER_1D, // sampler1D
384 TYPE_SAMPLER_2D, // sampler2D
385 TYPE_SAMPLER_CUBE, // samplerCube
386 TYPE_SAMPLER_2D_ARRAY, // sampler2DArray
387 TYPE_SAMPLER_3D, // sampler3D
388 TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray
389 TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow
390 TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow
391 TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow
392 TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow
393 TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow
394 TYPE_INT_SAMPLER_1D, // isampler1D
395 TYPE_INT_SAMPLER_2D, // isampler2D
396 TYPE_INT_SAMPLER_CUBE, // isamplerCube
397 TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray
398 TYPE_INT_SAMPLER_3D, // isampler3D
399 TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray
400 TYPE_UINT_SAMPLER_1D, // usampler1D
401 TYPE_UINT_SAMPLER_2D, // usampler2D
402 TYPE_UINT_SAMPLER_CUBE, // usamplerCube
403 TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray
404 TYPE_UINT_SAMPLER_3D, // usampler3D
405 TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray
406 TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS
407 TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS
408 TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS
409 TYPE_IMAGE_2D, // image2D
410 TYPE_IMAGE_CUBE, // imageCube
411 TYPE_IMAGE_2D_ARRAY, // image2DArray
412 TYPE_IMAGE_3D, // image3D
413 TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray
414 TYPE_INT_IMAGE_2D, // iimage2D
415 TYPE_INT_IMAGE_CUBE, // iimageCube
416 TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray
417 TYPE_INT_IMAGE_3D, // iimage3D
418 TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray
419 TYPE_UINT_IMAGE_2D, // uimage2D
420 TYPE_UINT_IMAGE_CUBE, // uimageCube
421 TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray
422 TYPE_UINT_IMAGE_3D, // uimage3D
423 TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray
424 TYPE_UINT_ATOMIC_COUNTER, // atomic_uint
425 TYPE_SAMPLER_BUFFER, // samplerBuffer
426 TYPE_INT_SAMPLER_BUFFER, // isamplerBuffer
427 TYPE_UINT_SAMPLER_BUFFER, // usamplerBuffer
428 TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY, // sampler2DMSArray
429 TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, // isampler2DMSArray
430 TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY, // usampler2DMSArray
431 TYPE_IMAGE_BUFFER, // imageBuffer
432 TYPE_INT_IMAGE_BUFFER, // iimageBuffer
433 TYPE_UINT_IMAGE_BUFFER, // uimageBuffer
436 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
437 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
438 return s_scalarTypes[(int)dataType];
441 DataType getDataTypeFloatScalars (DataType dataType)
443 const DataType s_floatTypes[] =
445 TYPE_INVALID, // invalid
447 TYPE_FLOAT_VEC2, // vec2
448 TYPE_FLOAT_VEC3, // vec3
449 TYPE_FLOAT_VEC4, // vec4
450 TYPE_FLOAT_MAT2, // mat2
451 TYPE_FLOAT_MAT2X3, // mat2x3
452 TYPE_FLOAT_MAT2X4, // mat2x4
453 TYPE_FLOAT_MAT3X2, // mat3x2
454 TYPE_FLOAT_MAT3, // mat3
455 TYPE_FLOAT_MAT3X4, // mat3x4
456 TYPE_FLOAT_MAT4X2, // mat4x2
457 TYPE_FLOAT_MAT4X3, // mat4x3
458 TYPE_FLOAT_MAT4, // mat4
460 TYPE_FLOAT_VEC2, // ivec2
461 TYPE_FLOAT_VEC3, // ivec3
462 TYPE_FLOAT_VEC4, // ivec4
464 TYPE_FLOAT_VEC2, // uvec2
465 TYPE_FLOAT_VEC3, // uvec3
466 TYPE_FLOAT_VEC4, // uvec4
468 TYPE_FLOAT_VEC2, // bvec2
469 TYPE_FLOAT_VEC3, // bvec3
470 TYPE_FLOAT_VEC4, // bvec4
471 TYPE_INVALID, // sampler1D
472 TYPE_INVALID, // sampler2D
473 TYPE_INVALID, // samplerCube
474 TYPE_INVALID, // sampler2DArray
475 TYPE_INVALID, // sampler3D
476 TYPE_INVALID, // samplerCubeArray
477 TYPE_INVALID, // sampler1DShadow
478 TYPE_INVALID, // sampler2DShadow
479 TYPE_INVALID, // samplerCubeShadow
480 TYPE_INVALID, // sampler2DArrayShadow
481 TYPE_INVALID, // samplerCubeArrayShadow
482 TYPE_INVALID, // isampler1D
483 TYPE_INVALID, // isampler2D
484 TYPE_INVALID, // isamplerCube
485 TYPE_INVALID, // isampler2DArray
486 TYPE_INVALID, // isampler3D
487 TYPE_INVALID, // isamplerCubeArray
488 TYPE_INVALID, // usampler1D
489 TYPE_INVALID, // usampler2D
490 TYPE_INVALID, // usamplerCube
491 TYPE_INVALID, // usampler2DArray
492 TYPE_INVALID, // usampler3D
493 TYPE_INVALID, // usamplerCubeArray
494 TYPE_INVALID, // sampler2DMS
495 TYPE_INVALID, // isampler2DMS
496 TYPE_INVALID, // usampler2DMS
497 TYPE_INVALID, // image2D
498 TYPE_INVALID, // imageCube
499 TYPE_INVALID, // image2DArray
500 TYPE_INVALID, // image3D
501 TYPE_INVALID, // imageCubeArray
502 TYPE_INVALID, // iimage2D
503 TYPE_INVALID, // iimageCube
504 TYPE_INVALID, // iimage2DArray
505 TYPE_INVALID, // iimage3D
506 TYPE_INVALID, // iimageCubeArray
507 TYPE_INVALID, // uimage2D
508 TYPE_INVALID, // uimageCube
509 TYPE_INVALID, // uimage2DArray
510 TYPE_INVALID, // uimage3D
511 TYPE_INVALID, // uimageCubeArray
512 TYPE_INVALID, // atomic_uint
513 TYPE_INVALID, // samplerBuffer
514 TYPE_INVALID, // isamplerBuffer
515 TYPE_INVALID, // usamplerBuffer
516 TYPE_INVALID, // sampler2DMSArray
517 TYPE_INVALID, // isampler2DMSArray
518 TYPE_INVALID, // usampler2DMSArray
519 TYPE_INVALID, // imageBuffer
520 TYPE_INVALID, // iimageBuffer
521 TYPE_INVALID, // uimageBuffer
524 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
525 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
526 return s_floatTypes[(int)dataType];
529 DataType getDataTypeVector (DataType scalarType, int size)
531 DE_ASSERT(deInRange32(size, 1, 4));
538 return (DataType)((int)scalarType + size - 1);
544 DataType getDataTypeFloatVec (int vecSize)
546 return getDataTypeVector(TYPE_FLOAT, vecSize);
549 DataType getDataTypeIntVec (int vecSize)
551 return getDataTypeVector(TYPE_INT, vecSize);
554 DataType getDataTypeUintVec (int vecSize)
556 return getDataTypeVector(TYPE_UINT, vecSize);
559 DataType getDataTypeBoolVec (int vecSize)
561 return getDataTypeVector(TYPE_BOOL, vecSize);
564 DataType getDataTypeMatrix (int numCols, int numRows)
566 DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
567 return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
570 int getDataTypeMatrixNumRows (DataType dataType)
574 case TYPE_FLOAT_MAT2: return 2;
575 case TYPE_FLOAT_MAT2X3: return 3;
576 case TYPE_FLOAT_MAT2X4: return 4;
577 case TYPE_FLOAT_MAT3X2: return 2;
578 case TYPE_FLOAT_MAT3: return 3;
579 case TYPE_FLOAT_MAT3X4: return 4;
580 case TYPE_FLOAT_MAT4X2: return 2;
581 case TYPE_FLOAT_MAT4X3: return 3;
582 case TYPE_FLOAT_MAT4: return 4;
589 int getDataTypeMatrixNumColumns (DataType dataType)
593 case TYPE_FLOAT_MAT2: return 2;
594 case TYPE_FLOAT_MAT2X3: return 2;
595 case TYPE_FLOAT_MAT2X4: return 2;
596 case TYPE_FLOAT_MAT3X2: return 3;
597 case TYPE_FLOAT_MAT3: return 3;
598 case TYPE_FLOAT_MAT3X4: return 3;
599 case TYPE_FLOAT_MAT4X2: return 4;
600 case TYPE_FLOAT_MAT4X3: return 4;
601 case TYPE_FLOAT_MAT4: return 4;
608 int getDataTypeNumLocations (DataType dataType)
610 if (isDataTypeScalarOrVector(dataType))
612 else if (isDataTypeMatrix(dataType))
613 return getDataTypeMatrixNumColumns(dataType);
615 DE_FATAL("Illegal datatype.");
619 int getDataTypeNumComponents (DataType dataType)
621 if (isDataTypeScalarOrVector(dataType))
622 return getDataTypeScalarSize(dataType);
623 else if (isDataTypeMatrix(dataType))
624 return getDataTypeMatrixNumRows(dataType);
626 DE_FATAL("Illegal datatype.");
630 DataType getDataTypeFromGLType (deUint32 glType)
634 case GL_FLOAT: return TYPE_FLOAT;
635 case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2;
636 case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3;
637 case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4;
639 case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2;
640 case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3;
641 case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4;
643 case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2;
644 case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3;
645 case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4;
647 case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2;
648 case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3;
649 case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4;
651 case GL_INT: return TYPE_INT;
652 case GL_INT_VEC2: return TYPE_INT_VEC2;
653 case GL_INT_VEC3: return TYPE_INT_VEC3;
654 case GL_INT_VEC4: return TYPE_INT_VEC4;
656 case GL_UNSIGNED_INT: return TYPE_UINT;
657 case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2;
658 case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3;
659 case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4;
661 case GL_BOOL: return TYPE_BOOL;
662 case GL_BOOL_VEC2: return TYPE_BOOL_VEC2;
663 case GL_BOOL_VEC3: return TYPE_BOOL_VEC3;
664 case GL_BOOL_VEC4: return TYPE_BOOL_VEC4;
666 case GL_SAMPLER_1D: return TYPE_SAMPLER_1D;
667 case GL_SAMPLER_2D: return TYPE_SAMPLER_2D;
668 case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE;
669 case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY;
670 case GL_SAMPLER_3D: return TYPE_SAMPLER_3D;
671 case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY;
673 case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW;
674 case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW;
675 case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW;
676 case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW;
677 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
679 case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D;
680 case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D;
681 case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE;
682 case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY;
683 case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D;
684 case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY;
686 case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D;
687 case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D;
688 case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE;
689 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY;
690 case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D;
691 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY;
693 case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE;
694 case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
695 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
697 case GL_IMAGE_2D: return TYPE_IMAGE_2D;
698 case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE;
699 case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY;
700 case GL_IMAGE_3D: return TYPE_IMAGE_3D;
701 case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D;
702 case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE;
703 case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY;
704 case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D;
705 case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D;
706 case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE;
707 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY;
708 case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D;
710 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER;
712 case GL_SAMPLER_BUFFER: return TYPE_SAMPLER_BUFFER;
713 case GL_INT_SAMPLER_BUFFER: return TYPE_INT_SAMPLER_BUFFER;
714 case GL_UNSIGNED_INT_SAMPLER_BUFFER: return TYPE_UINT_SAMPLER_BUFFER;
716 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY;
717 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY;
718 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY;
720 case GL_IMAGE_BUFFER: return TYPE_IMAGE_BUFFER;
721 case GL_INT_IMAGE_BUFFER: return TYPE_INT_IMAGE_BUFFER;
722 case GL_UNSIGNED_INT_IMAGE_BUFFER: return TYPE_UINT_IMAGE_BUFFER;