/*------------------------------------------------------------------------- * 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", "GLSL 4.6", }; 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", "#version 460", }; 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_460); } bool glslVersionIsES (GLSLVersion version) { DE_STATIC_ASSERT(GLSL_VERSION_LAST == 15); 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), ApiType::core(4,6), }; 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