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_310_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",
251 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
252 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
253 return s_names[(int)dataType];
256 int getDataTypeScalarSize (DataType dataType)
258 const int s_sizes[] =
291 1, // samplerCubeArray
292 1, // sampler1DShadow
293 1, // sampler2DShadow
294 1, // samplerCubeShadow
295 1, // sampler2DArrayShadow
296 1, // samplerCubeArrayShadow
300 1, // isampler2DArray
302 1, // isamplerCubeArray
306 1, // usampler2DArray
308 1, // usamplerCubeArray
321 1, // iimageCubeArray
326 1, // uimageCubeArray
330 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
331 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
332 return s_sizes[(int)dataType];
335 DataType getDataTypeScalarType (DataType dataType)
337 const DataType s_scalarTypes[] =
339 TYPE_INVALID, // invalid
345 TYPE_FLOAT, // mat2x3
346 TYPE_FLOAT, // mat2x4
347 TYPE_FLOAT, // mat3x2
349 TYPE_FLOAT, // mat3x4
350 TYPE_FLOAT, // mat4x2
351 TYPE_FLOAT, // mat4x3
365 TYPE_SAMPLER_1D, // sampler1D
366 TYPE_SAMPLER_2D, // sampler2D
367 TYPE_SAMPLER_CUBE, // samplerCube
368 TYPE_SAMPLER_2D_ARRAY, // sampler2DArray
369 TYPE_SAMPLER_3D, // sampler3D
370 TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray
371 TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow
372 TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow
373 TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow
374 TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow
375 TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow
376 TYPE_INT_SAMPLER_1D, // isampler1D
377 TYPE_INT_SAMPLER_2D, // isampler2D
378 TYPE_INT_SAMPLER_CUBE, // isamplerCube
379 TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray
380 TYPE_INT_SAMPLER_3D, // isampler3D
381 TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray
382 TYPE_UINT_SAMPLER_1D, // usampler1D
383 TYPE_UINT_SAMPLER_2D, // usampler2D
384 TYPE_UINT_SAMPLER_CUBE, // usamplerCube
385 TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray
386 TYPE_UINT_SAMPLER_3D, // usampler3D
387 TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray
388 TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS
389 TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS
390 TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS
391 TYPE_IMAGE_2D, // image2D
392 TYPE_IMAGE_CUBE, // imageCube
393 TYPE_IMAGE_2D_ARRAY, // image2DArray
394 TYPE_IMAGE_3D, // image3D
395 TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray
396 TYPE_INT_IMAGE_2D, // iimage2D
397 TYPE_INT_IMAGE_CUBE, // iimageCube
398 TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray
399 TYPE_INT_IMAGE_3D, // iimage3D
400 TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray
401 TYPE_UINT_IMAGE_2D, // uimage2D
402 TYPE_UINT_IMAGE_CUBE, // uimageCube
403 TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray
404 TYPE_UINT_IMAGE_3D, // uimage3D
405 TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray
406 TYPE_UINT_ATOMIC_COUNTER, // atomic_uint
409 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
410 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
411 return s_scalarTypes[(int)dataType];
414 DataType getDataTypeFloatScalars (DataType dataType)
416 const DataType s_floatTypes[] =
418 TYPE_INVALID, // invalid
420 TYPE_FLOAT_VEC2, // vec2
421 TYPE_FLOAT_VEC3, // vec3
422 TYPE_FLOAT_VEC4, // vec4
423 TYPE_FLOAT_MAT2, // mat2
424 TYPE_FLOAT_MAT2X3, // mat2x3
425 TYPE_FLOAT_MAT2X4, // mat2x4
426 TYPE_FLOAT_MAT3X2, // mat3x2
427 TYPE_FLOAT_MAT3, // mat3
428 TYPE_FLOAT_MAT3X4, // mat3x4
429 TYPE_FLOAT_MAT4X2, // mat4x2
430 TYPE_FLOAT_MAT4X3, // mat4x3
431 TYPE_FLOAT_MAT4, // mat4
433 TYPE_FLOAT_VEC2, // ivec2
434 TYPE_FLOAT_VEC3, // ivec3
435 TYPE_FLOAT_VEC4, // ivec4
437 TYPE_FLOAT_VEC2, // uvec2
438 TYPE_FLOAT_VEC3, // uvec3
439 TYPE_FLOAT_VEC4, // uvec4
441 TYPE_FLOAT_VEC2, // bvec2
442 TYPE_FLOAT_VEC3, // bvec3
443 TYPE_FLOAT_VEC4, // bvec4
444 TYPE_INVALID, // sampler1D
445 TYPE_INVALID, // sampler2D
446 TYPE_INVALID, // samplerCube
447 TYPE_INVALID, // sampler2DArray
448 TYPE_INVALID, // sampler3D
449 TYPE_INVALID, // samplerCubeArray
450 TYPE_INVALID, // sampler1DShadow
451 TYPE_INVALID, // sampler2DShadow
452 TYPE_INVALID, // samplerCubeShadow
453 TYPE_INVALID, // sampler2DArrayShadow
454 TYPE_INVALID, // samplerCubeArrayShadow
455 TYPE_INVALID, // isampler1D
456 TYPE_INVALID, // isampler2D
457 TYPE_INVALID, // isamplerCube
458 TYPE_INVALID, // isampler2DArray
459 TYPE_INVALID, // isampler3D
460 TYPE_INVALID, // isamplerCubeArray
461 TYPE_INVALID, // usampler1D
462 TYPE_INVALID, // usampler2D
463 TYPE_INVALID, // usamplerCube
464 TYPE_INVALID, // usampler2DArray
465 TYPE_INVALID, // usampler3D
466 TYPE_INVALID, // usamplerCubeArray
467 TYPE_INVALID, // sampler2DMS
468 TYPE_INVALID, // isampler2DMS
469 TYPE_INVALID, // usampler2DMS
470 TYPE_INVALID, // image2D
471 TYPE_INVALID, // imageCube
472 TYPE_INVALID, // image2DArray
473 TYPE_INVALID, // image3D
474 TYPE_INVALID, // imageCubeArray
475 TYPE_INVALID, // iimage2D
476 TYPE_INVALID, // iimageCube
477 TYPE_INVALID, // iimage2DArray
478 TYPE_INVALID, // iimage3D
479 TYPE_INVALID, // iimageCubeArray
480 TYPE_INVALID, // uimage2D
481 TYPE_INVALID, // uimageCube
482 TYPE_INVALID, // uimage2DArray
483 TYPE_INVALID, // uimage3D
484 TYPE_INVALID, // uimageCubeArray
485 TYPE_INVALID, // atomic_uint
488 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
489 DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
490 return s_floatTypes[(int)dataType];
493 DataType getDataTypeVector (DataType scalarType, int size)
495 DE_ASSERT(deInRange32(size, 1, 4));
502 return (DataType)((int)scalarType + size - 1);
508 DataType getDataTypeFloatVec (int vecSize)
510 return getDataTypeVector(TYPE_FLOAT, vecSize);
513 DataType getDataTypeIntVec (int vecSize)
515 return getDataTypeVector(TYPE_INT, vecSize);
518 DataType getDataTypeUintVec (int vecSize)
520 return getDataTypeVector(TYPE_UINT, vecSize);
523 DataType getDataTypeBoolVec (int vecSize)
525 return getDataTypeVector(TYPE_BOOL, vecSize);
528 DataType getDataTypeMatrix (int numCols, int numRows)
530 DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
531 return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
534 int getDataTypeMatrixNumRows (DataType dataType)
538 case TYPE_FLOAT_MAT2: return 2;
539 case TYPE_FLOAT_MAT2X3: return 3;
540 case TYPE_FLOAT_MAT2X4: return 4;
541 case TYPE_FLOAT_MAT3X2: return 2;
542 case TYPE_FLOAT_MAT3: return 3;
543 case TYPE_FLOAT_MAT3X4: return 4;
544 case TYPE_FLOAT_MAT4X2: return 2;
545 case TYPE_FLOAT_MAT4X3: return 3;
546 case TYPE_FLOAT_MAT4: return 4;
553 int getDataTypeMatrixNumColumns (DataType dataType)
557 case TYPE_FLOAT_MAT2: return 2;
558 case TYPE_FLOAT_MAT2X3: return 2;
559 case TYPE_FLOAT_MAT2X4: return 2;
560 case TYPE_FLOAT_MAT3X2: return 3;
561 case TYPE_FLOAT_MAT3: return 3;
562 case TYPE_FLOAT_MAT3X4: return 3;
563 case TYPE_FLOAT_MAT4X2: return 4;
564 case TYPE_FLOAT_MAT4X3: return 4;
565 case TYPE_FLOAT_MAT4: return 4;
572 int getDataTypeNumLocations (DataType dataType)
574 if (isDataTypeScalarOrVector(dataType))
576 else if (isDataTypeMatrix(dataType))
577 return getDataTypeMatrixNumColumns(dataType);
579 DE_FATAL("Illegal datatype.");
583 int getDataTypeNumComponents (DataType dataType)
585 if (isDataTypeScalarOrVector(dataType))
586 return getDataTypeScalarSize(dataType);
587 else if (isDataTypeMatrix(dataType))
588 return getDataTypeMatrixNumRows(dataType);
590 DE_FATAL("Illegal datatype.");
594 DataType getDataTypeFromGLType (deUint32 glType)
598 case GL_FLOAT: return TYPE_FLOAT;
599 case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2;
600 case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3;
601 case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4;
603 case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2;
604 case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3;
605 case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4;
607 case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2;
608 case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3;
609 case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4;
611 case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2;
612 case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3;
613 case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4;
615 case GL_INT: return TYPE_INT;
616 case GL_INT_VEC2: return TYPE_INT_VEC2;
617 case GL_INT_VEC3: return TYPE_INT_VEC3;
618 case GL_INT_VEC4: return TYPE_INT_VEC4;
620 case GL_UNSIGNED_INT: return TYPE_UINT;
621 case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2;
622 case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3;
623 case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4;
625 case GL_BOOL: return TYPE_BOOL;
626 case GL_BOOL_VEC2: return TYPE_BOOL_VEC2;
627 case GL_BOOL_VEC3: return TYPE_BOOL_VEC3;
628 case GL_BOOL_VEC4: return TYPE_BOOL_VEC4;
630 case GL_SAMPLER_1D: return TYPE_SAMPLER_1D;
631 case GL_SAMPLER_2D: return TYPE_SAMPLER_2D;
632 case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE;
633 case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY;
634 case GL_SAMPLER_3D: return TYPE_SAMPLER_3D;
635 case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY;
637 case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW;
638 case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW;
639 case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW;
640 case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW;
641 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
643 case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D;
644 case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D;
645 case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE;
646 case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY;
647 case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D;
648 case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY;
650 case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D;
651 case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D;
652 case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE;
653 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY;
654 case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D;
655 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY;
657 case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE;
658 case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
659 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
661 case GL_IMAGE_2D: return TYPE_IMAGE_2D;
662 case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE;
663 case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY;
664 case GL_IMAGE_3D: return TYPE_IMAGE_3D;
665 case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D;
666 case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE;
667 case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY;
668 case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D;
669 case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D;
670 case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE;
671 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY;
672 case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D;
674 case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER;