| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES Utilities |
| * ------------------------------------------------ |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Shader utilities. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "gluShaderUtil.hpp" |
| #include "glwEnums.hpp" |
| #include "deArrayUtil.hpp" |
| |
| namespace glu |
| { |
| |
| // ShadingLanguageVersion |
| |
| const char* getGLSLVersionName (GLSLVersion version) |
| { |
| static const char* s_names[] = |
| { |
| "GLSL ES 1.0", |
| "GLSL ES 3.0", |
| "GLSL ES 3.1", |
| "GLSL ES 3.2", |
| "GLSL 1.3", |
| "GLSL 1.4", |
| "GLSL 1.5", |
| "GLSL 3.3", |
| "GLSL 4.0", |
| "GLSL 4.1", |
| "GLSL 4.2", |
| "GLSL 4.3", |
| "GLSL 4.4", |
| "GLSL 4.5", |
| }; |
| |
| return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version); |
| } |
| |
| const char* getGLSLVersionDeclaration (GLSLVersion version) |
| { |
| static const char* s_decl[] = |
| { |
| "#version 100", |
| "#version 300 es", |
| "#version 310 es", |
| "#version 320 es", |
| "#version 130", |
| "#version 140", |
| "#version 150", |
| "#version 330", |
| "#version 400", |
| "#version 410", |
| "#version 420", |
| "#version 430", |
| "#version 440", |
| "#version 450", |
| }; |
| |
| return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version); |
| } |
| |
| bool glslVersionUsesInOutQualifiers (GLSLVersion version) |
| { |
| return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_320_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_430); |
| } |
| |
| bool glslVersionIsES (GLSLVersion version) |
| { |
| DE_STATIC_ASSERT(GLSL_VERSION_LAST == 14); |
| DE_ASSERT(version != GLSL_VERSION_LAST); |
| |
| if (version == GLSL_VERSION_100_ES || |
| version == GLSL_VERSION_300_ES || |
| version == GLSL_VERSION_310_ES || |
| version == GLSL_VERSION_320_ES) |
| return true; |
| else |
| return false; |
| } |
| |
| // \todo [2014-10-06 pyry] Export this. |
| static ApiType getMinAPIForGLSLVersion (GLSLVersion version) |
| { |
| static const ApiType s_minApi[] = |
| { |
| ApiType::es(2,0), |
| ApiType::es(3,0), |
| ApiType::es(3,1), |
| ApiType::es(3,2), |
| ApiType::core(3,0), |
| ApiType::core(3,1), |
| ApiType::core(3,2), |
| ApiType::core(3,3), |
| ApiType::core(4,0), |
| ApiType::core(4,1), |
| ApiType::core(4,2), |
| ApiType::core(4,3), |
| ApiType::core(4,4), |
| ApiType::core(4,5), |
| }; |
| |
| return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version); |
| } |
| |
| bool isGLSLVersionSupported (ContextType type, GLSLVersion version) |
| { |
| return contextSupports(type, getMinAPIForGLSLVersion(version)); |
| } |
| |
| GLSLVersion getContextTypeGLSLVersion (ContextType type) |
| { |
| // \note From newer to older |
| for (int version = GLSL_VERSION_LAST-1; version >= 0; version--) |
| { |
| if (isGLSLVersionSupported(type, GLSLVersion(version))) |
| return GLSLVersion(version); |
| } |
| |
| DE_ASSERT(false); |
| return GLSL_VERSION_LAST; |
| } |
| |
| // ShaderType |
| |
| const char* getShaderTypeName (ShaderType shaderType) |
| { |
| static const char* s_names[] = |
| { |
| "vertex", |
| "fragment", |
| "geometry", |
| "tess_control", |
| "tess_eval", |
| "compute", |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST); |
| DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST)); |
| return s_names[(int)shaderType]; |
| } |
| |
| // Precision |
| |
| const char* getPrecisionName (Precision precision) |
| { |
| static const char* s_names[] = |
| { |
| "lowp", |
| "mediump", |
| "highp" |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST); |
| DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST)); |
| return s_names[(int)precision]; |
| } |
| |
| // DataType |
| |
| const char* getDataTypeName (DataType dataType) |
| { |
| static const char* s_names[] = |
| { |
| "invalid", |
| "float", |
| "vec2", |
| "vec3", |
| "vec4", |
| "mat2", |
| "mat2x3", |
| "mat2x4", |
| "mat3x2", |
| "mat3", |
| "mat3x4", |
| "mat4x2", |
| "mat4x3", |
| "mat4", |
| "double", |
| "dvec2", |
| "dvec3", |
| "dvec4", |
| "dmat2", |
| "dmat2x3", |
| "dmat2x4", |
| "dmat3x2", |
| "dmat3", |
| "dmat3x4", |
| "dmat4x2", |
| "dmat4x3", |
| "dmat4", |
| "int", |
| "ivec2", |
| "ivec3", |
| "ivec4", |
| "uint", |
| "uvec2", |
| "uvec3", |
| "uvec4", |
| "bool", |
| "bvec2", |
| "bvec3", |
| "bvec4", |
| "sampler1D", |
| "sampler2D", |
| "samplerCube", |
| "sampler1DArray", |
| "sampler2DArray", |
| "sampler3D", |
| "samplerCubeArray", |
| "sampler1DShadow", |
| "sampler2DShadow", |
| "samplerCubeShadow", |
| "sampler1DArrayShadow", |
| "sampler2DArrayShadow", |
| "samplerCubeArrayShadow", |
| "isampler1D", |
| "isampler2D", |
| "isamplerCube", |
| "isampler1DArray", |
| "isampler2DArray", |
| "isampler3D", |
| "isamplerCubeArray", |
| "usampler1D", |
| "usampler2D", |
| "usamplerCube", |
| "usampler1DArray", |
| "usampler2DArray", |
| "usampler3D", |
| "usamplerCubeArray", |
| "sampler2DMS", |
| "isampler2DMS", |
| "usampler2DMS", |
| "image2D", |
| "imageCube", |
| "image2DArray", |
| "image3D", |
| "imageCubeArray", |
| "iimage2D", |
| "iimageCube", |
| "iimage2DArray", |
| "iimage3D", |
| "iimageCubeArray", |
| "uimage2D", |
| "uimageCube", |
| "uimage2DArray", |
| "uimage3D", |
| "uimageCubeArray", |
| "atomic_uint", |
| "samplerBuffer", |
| "isamplerBuffer", |
| "usamplerBuffer", |
| "sampler2DMSArray", |
| "isampler2DMSArray", |
| "usampler2DMSArray", |
| "imageBuffer", |
| "iimageBuffer", |
| "uimageBuffer", |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST); |
| DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names))); |
| return s_names[(int)dataType]; |
| } |
| |
| int getDataTypeScalarSize (DataType dataType) |
| { |
| static const int s_sizes[] = |
| { |
| -1, // invalid |
| 1, // float |
| 2, // vec2 |
| 3, // vec3 |
| 4, // vec4 |
| 4, // mat2 |
| 6, // mat2x3 |
| 8, // mat2x4 |
| 6, // mat3x2 |
| 9, // mat3 |
| 12, // mat3x4 |
| 8, // mat4x2 |
| 12, // mat4x3 |
| 16, // mat4 |
| 1, // double |
| 2, // dvec2 |
| 3, // dvec3 |
| 4, // dvec4 |
| 4, // dmat2 |
| 6, // dmat2x3 |
| 8, // dmat2x4 |
| 6, // dmat3x2 |
| 9, // dmat3 |
| 12, // dmat3x4 |
| 8, // dmat4x2 |
| 12, // dmat4x3 |
| 16, // dmat4 |
| 1, // int |
| 2, // ivec2 |
| 3, // ivec3 |
| 4, // ivec4 |
| 1, // uint |
| 2, // uvec2 |
| 3, // uvec3 |
| 4, // uvec4 |
| 1, // bool |
| 2, // bvec2 |
| 3, // bvec3 |
| 4, // bvec4 |
| 1, // sampler1D |
| 1, // sampler2D |
| 1, // samplerCube |
| 1, // sampler1DArray |
| 1, // sampler2DArray |
| 1, // sampler3D |
| 1, // samplerCubeArray |
| 1, // sampler1DShadow |
| 1, // sampler2DShadow |
| 1, // samplerCubeShadow |
| 1, // sampler1DArrayShadow |
| 1, // sampler2DArrayShadow |
| 1, // samplerCubeArrayShadow |
| 1, // isampler1D |
| 1, // isampler2D |
| 1, // isamplerCube |
| 1, // isampler1DArray |
| 1, // isampler2DArray |
| 1, // isampler3D |
| 1, // isamplerCubeArray |
| 1, // usampler1D |
| 1, // usampler2D |
| 1, // usamplerCube |
| 1, // usampler1DArray |
| 1, // usampler2DArray |
| 1, // usampler3D |
| 1, // usamplerCubeArray |
| 1, // sampler2DMS |
| 1, // isampler2DMS |
| 1, // usampler2DMS |
| 1, // image2D |
| 1, // imageCube |
| 1, // image2DArray |
| 1, // image3D |
| 1, // imageCubeArray |
| 1, // iimage2D |
| 1, // iimageCube |
| 1, // iimage2DArray |
| 1, // iimage3D |
| 1, // iimageCubeArray |
| 1, // uimage2D |
| 1, // uimageCube |
| 1, // uimage2DArray |
| 1, // uimage3D |
| 1, // uimageCubeArray |
| 1, // atomic_uint |
| 1, // samplerBuffer |
| 1, // isamplerBuffer |
| 1, // usamplerBuffer |
| 1, // sampler2DMSArray |
| 1, // isampler2DMSArray |
| 1, // usampler2DMSArray |
| 1, // imageBuffer |
| 1, // iimageBuffer |
| 1, // uimageBuffer |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST); |
| DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes))); |
| return s_sizes[(int)dataType]; |
| } |
| |
| DataType getDataTypeScalarType (DataType dataType) |
| { |
| static const DataType s_scalarTypes[] = |
| { |
| TYPE_INVALID, // invalid |
| TYPE_FLOAT, // float |
| TYPE_FLOAT, // vec2 |
| TYPE_FLOAT, // vec3 |
| TYPE_FLOAT, // vec4 |
| TYPE_FLOAT, // mat2 |
| TYPE_FLOAT, // mat2x3 |
| TYPE_FLOAT, // mat2x4 |
| TYPE_FLOAT, // mat3x2 |
| TYPE_FLOAT, // mat3 |
| TYPE_FLOAT, // mat3x4 |
| TYPE_FLOAT, // mat4x2 |
| TYPE_FLOAT, // mat4x3 |
| TYPE_FLOAT, // mat4 |
| TYPE_DOUBLE, // double |
| TYPE_DOUBLE, // dvec2 |
| TYPE_DOUBLE, // dvec3 |
| TYPE_DOUBLE, // dvec4 |
| TYPE_DOUBLE, // dmat2 |
| TYPE_DOUBLE, // dmat2x3 |
| TYPE_DOUBLE, // dmat2x4 |
| TYPE_DOUBLE, // dmat3x2 |
| TYPE_DOUBLE, // dmat3 |
| TYPE_DOUBLE, // dmat3x4 |
| TYPE_DOUBLE, // dmat4x2 |
| TYPE_DOUBLE, // dmat4x3 |
| TYPE_DOUBLE, // dmat4 |
| TYPE_INT, // int |
| TYPE_INT, // ivec2 |
| TYPE_INT, // ivec3 |
| TYPE_INT, // ivec4 |
| TYPE_UINT, // uint |
| TYPE_UINT, // uvec2 |
| TYPE_UINT, // uvec3 |
| TYPE_UINT, // uvec4 |
| TYPE_BOOL, // bool |
| TYPE_BOOL, // bvec2 |
| TYPE_BOOL, // bvec3 |
| TYPE_BOOL, // bvec4 |
| TYPE_SAMPLER_1D, // sampler1D |
| TYPE_SAMPLER_2D, // sampler2D |
| TYPE_SAMPLER_CUBE, // samplerCube |
| TYPE_SAMPLER_1D_ARRAY, // sampler1DArray |
| TYPE_SAMPLER_2D_ARRAY, // sampler2DArray |
| TYPE_SAMPLER_3D, // sampler3D |
| TYPE_SAMPLER_CUBE_ARRAY, // samplerCubeArray |
| TYPE_SAMPLER_1D_SHADOW, // sampler1DShadow |
| TYPE_SAMPLER_2D_SHADOW, // sampler2DShadow |
| TYPE_SAMPLER_CUBE_SHADOW, // samplerCubeShadow |
| TYPE_SAMPLER_1D_ARRAY_SHADOW, // sampler1DArrayShadow |
| TYPE_SAMPLER_2D_ARRAY_SHADOW, // sampler2DArrayShadow |
| TYPE_SAMPLER_CUBE_ARRAY_SHADOW, // samplerCubeArrayShadow |
| TYPE_INT_SAMPLER_1D, // isampler1D |
| TYPE_INT_SAMPLER_2D, // isampler2D |
| TYPE_INT_SAMPLER_CUBE, // isamplerCube |
| TYPE_INT_SAMPLER_1D_ARRAY, // isampler1DArray |
| TYPE_INT_SAMPLER_2D_ARRAY, // isampler2DArray |
| TYPE_INT_SAMPLER_3D, // isampler3D |
| TYPE_INT_SAMPLER_CUBE_ARRAY, // isamplerCubeArray |
| TYPE_UINT_SAMPLER_1D, // usampler1D |
| TYPE_UINT_SAMPLER_2D, // usampler2D |
| TYPE_UINT_SAMPLER_CUBE, // usamplerCube |
| TYPE_UINT_SAMPLER_1D_ARRAY, // usampler1DArray |
| TYPE_UINT_SAMPLER_2D_ARRAY, // usampler2DArray |
| TYPE_UINT_SAMPLER_3D, // usampler3D |
| TYPE_UINT_SAMPLER_CUBE_ARRAY, // usamplerCubeArray |
| TYPE_SAMPLER_2D_MULTISAMPLE, // sampler2DMS |
| TYPE_INT_SAMPLER_2D_MULTISAMPLE, // isampler2DMS |
| TYPE_UINT_SAMPLER_2D_MULTISAMPLE, // usampler2DMS |
| TYPE_IMAGE_2D, // image2D |
| TYPE_IMAGE_CUBE, // imageCube |
| TYPE_IMAGE_2D_ARRAY, // image2DArray |
| TYPE_IMAGE_3D, // image3D |
| TYPE_IMAGE_CUBE_ARRAY, // imageCubeArray |
| TYPE_INT_IMAGE_2D, // iimage2D |
| TYPE_INT_IMAGE_CUBE, // iimageCube |
| TYPE_INT_IMAGE_2D_ARRAY, // iimage2DArray |
| TYPE_INT_IMAGE_3D, // iimage3D |
| TYPE_INT_IMAGE_CUBE_ARRAY, // iimageCubeArray |
| TYPE_UINT_IMAGE_2D, // uimage2D |
| TYPE_UINT_IMAGE_CUBE, // uimageCube |
| TYPE_UINT_IMAGE_2D_ARRAY, // uimage2DArray |
| TYPE_UINT_IMAGE_3D, // uimage3D |
| TYPE_UINT_IMAGE_CUBE_ARRAY, // uimageCubeArray |
| TYPE_UINT_ATOMIC_COUNTER, // atomic_uint |
| TYPE_SAMPLER_BUFFER, // samplerBuffer |
| TYPE_INT_SAMPLER_BUFFER, // isamplerBuffer |
| TYPE_UINT_SAMPLER_BUFFER, // usamplerBuffer |
| TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY, // sampler2DMSArray |
| TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, // isampler2DMSArray |
| TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY, // usampler2DMSArray |
| TYPE_IMAGE_BUFFER, // imageBuffer |
| TYPE_INT_IMAGE_BUFFER, // iimageBuffer |
| TYPE_UINT_IMAGE_BUFFER, // uimageBuffer |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST); |
| DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes))); |
| return s_scalarTypes[(int)dataType]; |
| } |
| |
| DataType getDataTypeFloatScalars (DataType dataType) |
| { |
| static const DataType s_floatTypes[] = |
| { |
| TYPE_INVALID, // invalid |
| TYPE_FLOAT, // float |
| TYPE_FLOAT_VEC2, // vec2 |
| TYPE_FLOAT_VEC3, // vec3 |
| TYPE_FLOAT_VEC4, // vec4 |
| TYPE_FLOAT_MAT2, // mat2 |
| TYPE_FLOAT_MAT2X3, // mat2x3 |
| TYPE_FLOAT_MAT2X4, // mat2x4 |
| TYPE_FLOAT_MAT3X2, // mat3x2 |
| TYPE_FLOAT_MAT3, // mat3 |
| TYPE_FLOAT_MAT3X4, // mat3x4 |
| TYPE_FLOAT_MAT4X2, // mat4x2 |
| TYPE_FLOAT_MAT4X3, // mat4x3 |
| TYPE_FLOAT_MAT4, // mat4 |
| TYPE_FLOAT, // double |
| TYPE_FLOAT_VEC2, // dvec2 |
| TYPE_FLOAT_VEC3, // dvec3 |
| TYPE_FLOAT_VEC4, // dvec4 |
| TYPE_FLOAT_MAT2, // dmat2 |
| TYPE_FLOAT_MAT2X3, // dmat2x3 |
| TYPE_FLOAT_MAT2X4, // dmat2x4 |
| TYPE_FLOAT_MAT3X2, // dmat3x2 |
| TYPE_FLOAT_MAT3, // dmat3 |
| TYPE_FLOAT_MAT3X4, // dmat3x4 |
| TYPE_FLOAT_MAT4X2, // dmat4x2 |
| TYPE_FLOAT_MAT4X3, // dmat4x3 |
| TYPE_FLOAT_MAT4, // dmat4 |
| TYPE_FLOAT, // int |
| TYPE_FLOAT_VEC2, // ivec2 |
| TYPE_FLOAT_VEC3, // ivec3 |
| TYPE_FLOAT_VEC4, // ivec4 |
| TYPE_FLOAT, // uint |
| TYPE_FLOAT_VEC2, // uvec2 |
| TYPE_FLOAT_VEC3, // uvec3 |
| TYPE_FLOAT_VEC4, // uvec4 |
| TYPE_FLOAT, // bool |
| TYPE_FLOAT_VEC2, // bvec2 |
| TYPE_FLOAT_VEC3, // bvec3 |
| TYPE_FLOAT_VEC4, // bvec4 |
| TYPE_INVALID, // sampler1D |
| TYPE_INVALID, // sampler2D |
| TYPE_INVALID, // samplerCube |
| TYPE_INVALID, // sampler1DArray |
| TYPE_INVALID, // sampler2DArray |
| TYPE_INVALID, // sampler3D |
| TYPE_INVALID, // samplerCubeArray |
| TYPE_INVALID, // sampler1DShadow |
| TYPE_INVALID, // sampler2DShadow |
| TYPE_INVALID, // samplerCubeShadow |
| TYPE_INVALID, // sampler1DArrayShadow |
| TYPE_INVALID, // sampler2DArrayShadow |
| TYPE_INVALID, // samplerCubeArrayShadow |
| TYPE_INVALID, // isampler1D |
| TYPE_INVALID, // isampler2D |
| TYPE_INVALID, // isamplerCube |
| TYPE_INVALID, // isampler1DArray |
| TYPE_INVALID, // isampler2DArray |
| TYPE_INVALID, // isampler3D |
| TYPE_INVALID, // isamplerCubeArray |
| TYPE_INVALID, // usampler1D |
| TYPE_INVALID, // usampler2D |
| TYPE_INVALID, // usamplerCube |
| TYPE_INVALID, // usampler1DArray |
| TYPE_INVALID, // usampler2DArray |
| TYPE_INVALID, // usampler3D |
| TYPE_INVALID, // usamplerCubeArray |
| TYPE_INVALID, // sampler2DMS |
| TYPE_INVALID, // isampler2DMS |
| TYPE_INVALID, // usampler2DMS |
| TYPE_INVALID, // image2D |
| TYPE_INVALID, // imageCube |
| TYPE_INVALID, // image2DArray |
| TYPE_INVALID, // image3D |
| TYPE_INVALID, // imageCubeArray |
| TYPE_INVALID, // iimage2D |
| TYPE_INVALID, // iimageCube |
| TYPE_INVALID, // iimage2DArray |
| TYPE_INVALID, // iimage3D |
| TYPE_INVALID, // iimageCubeArray |
| TYPE_INVALID, // uimage2D |
| TYPE_INVALID, // uimageCube |
| TYPE_INVALID, // uimage2DArray |
| TYPE_INVALID, // uimage3D |
| TYPE_INVALID, // uimageCubeArray |
| TYPE_INVALID, // atomic_uint |
| TYPE_INVALID, // samplerBuffer |
| TYPE_INVALID, // isamplerBuffer |
| TYPE_INVALID, // usamplerBuffer |
| TYPE_INVALID, // sampler2DMSArray |
| TYPE_INVALID, // isampler2DMSArray |
| TYPE_INVALID, // usampler2DMSArray |
| TYPE_INVALID, // imageBuffer |
| TYPE_INVALID, // iimageBuffer |
| TYPE_INVALID, // uimageBuffer |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST); |
| DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes))); |
| return s_floatTypes[(int)dataType]; |
| } |
| |
| DataType getDataTypeDoubleScalars (DataType dataType) |
| { |
| static const DataType s_doubleTypes[] = |
| { |
| TYPE_INVALID, // invalid |
| TYPE_DOUBLE, // float |
| TYPE_DOUBLE_VEC2, // vec2 |
| TYPE_DOUBLE_VEC3, // vec3 |
| TYPE_DOUBLE_VEC4, // vec4 |
| TYPE_DOUBLE_MAT2, // mat2 |
| TYPE_DOUBLE_MAT2X3, // mat2x3 |
| TYPE_DOUBLE_MAT2X4, // mat2x4 |
| TYPE_DOUBLE_MAT3X2, // mat3x2 |
| TYPE_DOUBLE_MAT3, // mat3 |
| TYPE_DOUBLE_MAT3X4, // mat3x4 |
| TYPE_DOUBLE_MAT4X2, // mat4x2 |
| TYPE_DOUBLE_MAT4X3, // mat4x3 |
| TYPE_DOUBLE_MAT4, // mat4 |
| TYPE_DOUBLE, // double |
| TYPE_DOUBLE_VEC2, // dvec2 |
| TYPE_DOUBLE_VEC3, // dvec3 |
| TYPE_DOUBLE_VEC4, // dvec4 |
| TYPE_DOUBLE_MAT2, // dmat2 |
| TYPE_DOUBLE_MAT2X3, // dmat2x3 |
| TYPE_DOUBLE_MAT2X4, // dmat2x4 |
| TYPE_DOUBLE_MAT3X2, // dmat3x2 |
| TYPE_DOUBLE_MAT3, // dmat3 |
| TYPE_DOUBLE_MAT3X4, // dmat3x4 |
| TYPE_DOUBLE_MAT4X2, // dmat4x2 |
| TYPE_DOUBLE_MAT4X3, // dmat4x3 |
| TYPE_DOUBLE_MAT4, // dmat4 |
| TYPE_DOUBLE, // int |
| TYPE_DOUBLE_VEC2, // ivec2 |
| TYPE_DOUBLE_VEC3, // ivec3 |
| TYPE_DOUBLE_VEC4, // ivec4 |
| TYPE_DOUBLE, // uint |
| TYPE_DOUBLE_VEC2, // uvec2 |
| TYPE_DOUBLE_VEC3, // uvec3 |
| TYPE_DOUBLE_VEC4, // uvec4 |
| TYPE_DOUBLE, // bool |
| TYPE_DOUBLE_VEC2, // bvec2 |
| TYPE_DOUBLE_VEC3, // bvec3 |
| TYPE_DOUBLE_VEC4, // bvec4 |
| TYPE_INVALID, // sampler1D |
| TYPE_INVALID, // sampler2D |
| TYPE_INVALID, // samplerCube |
| TYPE_INVALID, // sampler1DArray |
| TYPE_INVALID, // sampler2DArray |
| TYPE_INVALID, // sampler3D |
| TYPE_INVALID, // samplerCubeArray |
| TYPE_INVALID, // sampler1DShadow |
| TYPE_INVALID, // sampler2DShadow |
| TYPE_INVALID, // samplerCubeShadow |
| TYPE_INVALID, // sampler1DArrayShadow |
| TYPE_INVALID, // sampler2DArrayShadow |
| TYPE_INVALID, // samplerCubeArrayShadow |
| TYPE_INVALID, // isampler1D |
| TYPE_INVALID, // isampler2D |
| TYPE_INVALID, // isamplerCube |
| TYPE_INVALID, // isampler1DArray |
| TYPE_INVALID, // isampler2DArray |
| TYPE_INVALID, // isampler3D |
| TYPE_INVALID, // isamplerCubeArray |
| TYPE_INVALID, // usampler1D |
| TYPE_INVALID, // usampler2D |
| TYPE_INVALID, // usamplerCube |
| TYPE_INVALID, // usampler1DArray |
| TYPE_INVALID, // usampler2DArray |
| TYPE_INVALID, // usampler3D |
| TYPE_INVALID, // usamplerCubeArray |
| TYPE_INVALID, // sampler2DMS |
| TYPE_INVALID, // isampler2DMS |
| TYPE_INVALID, // usampler2DMS |
| TYPE_INVALID, // image2D |
| TYPE_INVALID, // imageCube |
| TYPE_INVALID, // image2DArray |
| TYPE_INVALID, // image3D |
| TYPE_INVALID, // imageCubeArray |
| TYPE_INVALID, // iimage2D |
| TYPE_INVALID, // iimageCube |
| TYPE_INVALID, // iimage2DArray |
| TYPE_INVALID, // iimage3D |
| TYPE_INVALID, // iimageCubeArray |
| TYPE_INVALID, // uimage2D |
| TYPE_INVALID, // uimageCube |
| TYPE_INVALID, // uimage2DArray |
| TYPE_INVALID, // uimage3D |
| TYPE_INVALID, // uimageCubeArray |
| TYPE_INVALID, // atomic_uint |
| TYPE_INVALID, // samplerBuffer |
| TYPE_INVALID, // isamplerBuffer |
| TYPE_INVALID, // usamplerBuffer |
| TYPE_INVALID, // sampler2DMSArray |
| TYPE_INVALID, // isampler2DMSArray |
| TYPE_INVALID, // usampler2DMSArray |
| TYPE_INVALID, // imageBuffer |
| TYPE_INVALID, // iimageBuffer |
| TYPE_INVALID, // uimageBuffer |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_doubleTypes) == TYPE_LAST); |
| DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_doubleTypes))); |
| return s_doubleTypes[(int)dataType]; |
| } |
| |
| DataType getDataTypeVector (DataType scalarType, int size) |
| { |
| DE_ASSERT(deInRange32(size, 1, 4)); |
| switch (scalarType) |
| { |
| case TYPE_FLOAT: |
| case TYPE_DOUBLE: |
| case TYPE_INT: |
| case TYPE_UINT: |
| case TYPE_BOOL: |
| return (DataType)((int)scalarType + size - 1); |
| default: |
| return TYPE_INVALID; |
| } |
| } |
| |
| DataType getDataTypeFloatVec (int vecSize) |
| { |
| return getDataTypeVector(TYPE_FLOAT, vecSize); |
| } |
| |
| DataType getDataTypeIntVec (int vecSize) |
| { |
| return getDataTypeVector(TYPE_INT, vecSize); |
| } |
| |
| DataType getDataTypeUintVec (int vecSize) |
| { |
| return getDataTypeVector(TYPE_UINT, vecSize); |
| } |
| |
| DataType getDataTypeBoolVec (int vecSize) |
| { |
| return getDataTypeVector(TYPE_BOOL, vecSize); |
| } |
| |
| DataType getDataTypeMatrix (int numCols, int numRows) |
| { |
| DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4)); |
| return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2)); |
| } |
| |
| int getDataTypeMatrixNumRows (DataType dataType) |
| { |
| switch (dataType) |
| { |
| case TYPE_FLOAT_MAT2: return 2; |
| case TYPE_FLOAT_MAT2X3: return 3; |
| case TYPE_FLOAT_MAT2X4: return 4; |
| case TYPE_FLOAT_MAT3X2: return 2; |
| case TYPE_FLOAT_MAT3: return 3; |
| case TYPE_FLOAT_MAT3X4: return 4; |
| case TYPE_FLOAT_MAT4X2: return 2; |
| case TYPE_FLOAT_MAT4X3: return 3; |
| case TYPE_FLOAT_MAT4: return 4; |
| case TYPE_DOUBLE_MAT2: return 2; |
| case TYPE_DOUBLE_MAT2X3: return 3; |
| case TYPE_DOUBLE_MAT2X4: return 4; |
| case TYPE_DOUBLE_MAT3X2: return 2; |
| case TYPE_DOUBLE_MAT3: return 3; |
| case TYPE_DOUBLE_MAT3X4: return 4; |
| case TYPE_DOUBLE_MAT4X2: return 2; |
| case TYPE_DOUBLE_MAT4X3: return 3; |
| case TYPE_DOUBLE_MAT4: return 4; |
| default: |
| DE_ASSERT(false); |
| return 0; |
| } |
| } |
| |
| int getDataTypeMatrixNumColumns (DataType dataType) |
| { |
| switch (dataType) |
| { |
| case TYPE_FLOAT_MAT2: return 2; |
| case TYPE_FLOAT_MAT2X3: return 2; |
| case TYPE_FLOAT_MAT2X4: return 2; |
| case TYPE_FLOAT_MAT3X2: return 3; |
| case TYPE_FLOAT_MAT3: return 3; |
| case TYPE_FLOAT_MAT3X4: return 3; |
| case TYPE_FLOAT_MAT4X2: return 4; |
| case TYPE_FLOAT_MAT4X3: return 4; |
| case TYPE_FLOAT_MAT4: return 4; |
| case TYPE_DOUBLE_MAT2: return 2; |
| case TYPE_DOUBLE_MAT2X3: return 2; |
| case TYPE_DOUBLE_MAT2X4: return 2; |
| case TYPE_DOUBLE_MAT3X2: return 3; |
| case TYPE_DOUBLE_MAT3: return 3; |
| case TYPE_DOUBLE_MAT3X4: return 3; |
| case TYPE_DOUBLE_MAT4X2: return 4; |
| case TYPE_DOUBLE_MAT4X3: return 4; |
| case TYPE_DOUBLE_MAT4: return 4; |
| default: |
| DE_ASSERT(false); |
| return 0; |
| } |
| } |
| |
| int getDataTypeNumLocations (DataType dataType) |
| { |
| if (isDataTypeScalarOrVector(dataType)) |
| return 1; |
| else if (isDataTypeMatrix(dataType)) |
| return getDataTypeMatrixNumColumns(dataType); |
| |
| DE_FATAL("Illegal datatype."); |
| return 0; |
| } |
| |
| int getDataTypeNumComponents (DataType dataType) |
| { |
| if (isDataTypeScalarOrVector(dataType)) |
| return getDataTypeScalarSize(dataType); |
| else if (isDataTypeMatrix(dataType)) |
| return getDataTypeMatrixNumRows(dataType); |
| |
| DE_FATAL("Illegal datatype."); |
| return 0; |
| } |
| |
| DataType getDataTypeFromGLType (deUint32 glType) |
| { |
| switch (glType) |
| { |
| case GL_FLOAT: return TYPE_FLOAT; |
| case GL_FLOAT_VEC2: return TYPE_FLOAT_VEC2; |
| case GL_FLOAT_VEC3: return TYPE_FLOAT_VEC3; |
| case GL_FLOAT_VEC4: return TYPE_FLOAT_VEC4; |
| |
| case GL_FLOAT_MAT2: return TYPE_FLOAT_MAT2; |
| case GL_FLOAT_MAT2x3: return TYPE_FLOAT_MAT2X3; |
| case GL_FLOAT_MAT2x4: return TYPE_FLOAT_MAT2X4; |
| |
| case GL_FLOAT_MAT3x2: return TYPE_FLOAT_MAT3X2; |
| case GL_FLOAT_MAT3: return TYPE_FLOAT_MAT3; |
| case GL_FLOAT_MAT3x4: return TYPE_FLOAT_MAT3X4; |
| |
| case GL_FLOAT_MAT4x2: return TYPE_FLOAT_MAT4X2; |
| case GL_FLOAT_MAT4x3: return TYPE_FLOAT_MAT4X3; |
| case GL_FLOAT_MAT4: return TYPE_FLOAT_MAT4; |
| |
| case GL_DOUBLE: return TYPE_DOUBLE; |
| case GL_DOUBLE_VEC2: return TYPE_DOUBLE_VEC2; |
| case GL_DOUBLE_VEC3: return TYPE_DOUBLE_VEC3; |
| case GL_DOUBLE_VEC4: return TYPE_DOUBLE_VEC4; |
| |
| case GL_DOUBLE_MAT2: return TYPE_DOUBLE_MAT2; |
| case GL_DOUBLE_MAT2x3: return TYPE_DOUBLE_MAT2X3; |
| case GL_DOUBLE_MAT2x4: return TYPE_DOUBLE_MAT2X4; |
| |
| case GL_DOUBLE_MAT3x2: return TYPE_DOUBLE_MAT3X2; |
| case GL_DOUBLE_MAT3: return TYPE_DOUBLE_MAT3; |
| case GL_DOUBLE_MAT3x4: return TYPE_DOUBLE_MAT3X4; |
| |
| case GL_DOUBLE_MAT4x2: return TYPE_DOUBLE_MAT4X2; |
| case GL_DOUBLE_MAT4x3: return TYPE_DOUBLE_MAT4X3; |
| case GL_DOUBLE_MAT4: return TYPE_DOUBLE_MAT4; |
| |
| case GL_INT: return TYPE_INT; |
| case GL_INT_VEC2: return TYPE_INT_VEC2; |
| case GL_INT_VEC3: return TYPE_INT_VEC3; |
| case GL_INT_VEC4: return TYPE_INT_VEC4; |
| |
| case GL_UNSIGNED_INT: return TYPE_UINT; |
| case GL_UNSIGNED_INT_VEC2: return TYPE_UINT_VEC2; |
| case GL_UNSIGNED_INT_VEC3: return TYPE_UINT_VEC3; |
| case GL_UNSIGNED_INT_VEC4: return TYPE_UINT_VEC4; |
| |
| case GL_BOOL: return TYPE_BOOL; |
| case GL_BOOL_VEC2: return TYPE_BOOL_VEC2; |
| case GL_BOOL_VEC3: return TYPE_BOOL_VEC3; |
| case GL_BOOL_VEC4: return TYPE_BOOL_VEC4; |
| |
| case GL_SAMPLER_1D: return TYPE_SAMPLER_1D; |
| case GL_SAMPLER_2D: return TYPE_SAMPLER_2D; |
| case GL_SAMPLER_CUBE: return TYPE_SAMPLER_CUBE; |
| case GL_SAMPLER_1D_ARRAY: return TYPE_SAMPLER_1D_ARRAY; |
| case GL_SAMPLER_2D_ARRAY: return TYPE_SAMPLER_2D_ARRAY; |
| case GL_SAMPLER_3D: return TYPE_SAMPLER_3D; |
| case GL_SAMPLER_CUBE_MAP_ARRAY: return TYPE_SAMPLER_CUBE_ARRAY; |
| |
| case GL_SAMPLER_1D_SHADOW: return TYPE_SAMPLER_1D_SHADOW; |
| case GL_SAMPLER_2D_SHADOW: return TYPE_SAMPLER_2D_SHADOW; |
| case GL_SAMPLER_CUBE_SHADOW: return TYPE_SAMPLER_CUBE_SHADOW; |
| case GL_SAMPLER_1D_ARRAY_SHADOW: return TYPE_SAMPLER_1D_ARRAY_SHADOW; |
| case GL_SAMPLER_2D_ARRAY_SHADOW: return TYPE_SAMPLER_2D_ARRAY_SHADOW; |
| case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: return TYPE_SAMPLER_CUBE_ARRAY_SHADOW; |
| |
| case GL_INT_SAMPLER_1D: return TYPE_INT_SAMPLER_1D; |
| case GL_INT_SAMPLER_2D: return TYPE_INT_SAMPLER_2D; |
| case GL_INT_SAMPLER_CUBE: return TYPE_INT_SAMPLER_CUBE; |
| case GL_INT_SAMPLER_1D_ARRAY: return TYPE_INT_SAMPLER_1D_ARRAY; |
| case GL_INT_SAMPLER_2D_ARRAY: return TYPE_INT_SAMPLER_2D_ARRAY; |
| case GL_INT_SAMPLER_3D: return TYPE_INT_SAMPLER_3D; |
| case GL_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_INT_SAMPLER_CUBE_ARRAY; |
| |
| case GL_UNSIGNED_INT_SAMPLER_1D: return TYPE_UINT_SAMPLER_1D; |
| case GL_UNSIGNED_INT_SAMPLER_2D: return TYPE_UINT_SAMPLER_2D; |
| case GL_UNSIGNED_INT_SAMPLER_CUBE: return TYPE_UINT_SAMPLER_CUBE; |
| case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: return TYPE_UINT_SAMPLER_1D_ARRAY; |
| case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return TYPE_UINT_SAMPLER_2D_ARRAY; |
| case GL_UNSIGNED_INT_SAMPLER_3D: return TYPE_UINT_SAMPLER_3D; |
| case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: return TYPE_UINT_SAMPLER_CUBE_ARRAY; |
| |
| case GL_SAMPLER_2D_MULTISAMPLE: return TYPE_SAMPLER_2D_MULTISAMPLE; |
| case GL_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_INT_SAMPLER_2D_MULTISAMPLE; |
| case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE; |
| |
| case GL_IMAGE_2D: return TYPE_IMAGE_2D; |
| case GL_IMAGE_CUBE: return TYPE_IMAGE_CUBE; |
| case GL_IMAGE_2D_ARRAY: return TYPE_IMAGE_2D_ARRAY; |
| case GL_IMAGE_3D: return TYPE_IMAGE_3D; |
| case GL_INT_IMAGE_2D: return TYPE_INT_IMAGE_2D; |
| case GL_INT_IMAGE_CUBE: return TYPE_INT_IMAGE_CUBE; |
| case GL_INT_IMAGE_2D_ARRAY: return TYPE_INT_IMAGE_2D_ARRAY; |
| case GL_INT_IMAGE_3D: return TYPE_INT_IMAGE_3D; |
| case GL_UNSIGNED_INT_IMAGE_2D: return TYPE_UINT_IMAGE_2D; |
| case GL_UNSIGNED_INT_IMAGE_CUBE: return TYPE_UINT_IMAGE_CUBE; |
| case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: return TYPE_UINT_IMAGE_2D_ARRAY; |
| case GL_UNSIGNED_INT_IMAGE_3D: return TYPE_UINT_IMAGE_3D; |
| |
| case GL_UNSIGNED_INT_ATOMIC_COUNTER: return TYPE_UINT_ATOMIC_COUNTER; |
| |
| case GL_SAMPLER_BUFFER: return TYPE_SAMPLER_BUFFER; |
| case GL_INT_SAMPLER_BUFFER: return TYPE_INT_SAMPLER_BUFFER; |
| case GL_UNSIGNED_INT_SAMPLER_BUFFER: return TYPE_UINT_SAMPLER_BUFFER; |
| |
| case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY; |
| case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY; |
| case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY; |
| |
| case GL_IMAGE_BUFFER: return TYPE_IMAGE_BUFFER; |
| case GL_INT_IMAGE_BUFFER: return TYPE_INT_IMAGE_BUFFER; |
| case GL_UNSIGNED_INT_IMAGE_BUFFER: return TYPE_UINT_IMAGE_BUFFER; |
| |
| default: |
| return TYPE_LAST; |
| } |
| } |
| |
| } // glu |