/*-------------------------------------------------------------------------
 * 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",
		"uint8_t",
		"u8vec2",
		"u8vec3",
		"u8vec4",
		"int8_t",
		"i8vec2",
		"i8vec3",
		"i8vec4",
		"uint16_t",
		"u16vec2",
		"u16vec3",
		"u16vec4",
		"int16_t",
		"i16vec2",
		"i16vec3",
		"i16vec4",
		"float16_t",
		"f16vec2",
		"f16vec3",
		"f16vec4",
		"f16mat2",
		"f16mat2x3",
		"f16mat2x4",
		"f16mat3x2",
		"f16mat3",
		"f16mat3x4",
		"f16mat4x2",
		"f16mat4x3",
		"f16mat4",
	};

	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
		1,		// uint8_t
		2,		// u8vec2
		3,		// u8vec3
		4,		// u8vec4
		1,		// int8_t
		2,		// i8vec2
		3,		// i8vec3
		4,		// i8vec4
		1,		// uint16_t
		2,		// u16vec2
		3,		// u16vec3
		4,		// u16vec4
		1,		// int16_t
		2,		// i16vec2
		3,		// i16vec3
		4,		// i16vec4
		1,		// float16_t
		2,		// f16vec2
		3,		// f16vec3
		4,		// f16vec4
		4,		// f16mat2
		6,		// f16mat2x3
		8,		// f16mat2x4
		6,		// f16mat3x2
		9,		// f16mat3
		12,		// f16mat3x4
		8,		// f16mat4x2
		12,		// f16mat4x3
		16,		// f16mat4
	};

	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
		TYPE_UINT8,								// uint8_t
		TYPE_UINT8,								// u8vec2
		TYPE_UINT8,								// u8vec3
		TYPE_UINT8,								// u8vec4
		TYPE_INT8,								// int8_t
		TYPE_INT8,								// i8vec2
		TYPE_INT8,								// i8vec3
		TYPE_INT8,								// i8vec4
		TYPE_UINT16,							// uint16_t
		TYPE_UINT16,							// u16vec2
		TYPE_UINT16,							// u16vec3
		TYPE_UINT16,							// u16vec4
		TYPE_INT16,								// int16_t
		TYPE_INT16,								// i16vec2
		TYPE_INT16,								// i16vec3
		TYPE_INT16,								// i16vec4
		TYPE_FLOAT16,							// float16_t
		TYPE_FLOAT16,							// f16vec2
		TYPE_FLOAT16,							// f16vec3
		TYPE_FLOAT16,							// f16vec4
		TYPE_FLOAT16,							// f16mat2
		TYPE_FLOAT16,							// f16mat2x3
		TYPE_FLOAT16,							// f16mat2x4
		TYPE_FLOAT16,							// f16mat3x2
		TYPE_FLOAT16,							// f16mat3
		TYPE_FLOAT16,							// f16mat3x4
		TYPE_FLOAT16,							// f16mat4x2
		TYPE_FLOAT16,							// f16mat4x3
		TYPE_FLOAT16,							// f16mat4
	};

	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 getDataTypeFloat16Scalars (DataType dataType)
{
	static const DataType s_floatTypes[] =
	{
		TYPE_INVALID,			// invalid
		TYPE_FLOAT16,			// float
		TYPE_FLOAT16_VEC2,		// vec2
		TYPE_FLOAT16_VEC3,		// vec3
		TYPE_FLOAT16_VEC4,		// vec4
		TYPE_FLOAT16_MAT2,		// mat2
		TYPE_FLOAT16_MAT2X3,	// mat2x3
		TYPE_FLOAT16_MAT2X4,	// mat2x4
		TYPE_FLOAT16_MAT3X2,	// mat3x2
		TYPE_FLOAT16_MAT3,		// mat3
		TYPE_FLOAT16_MAT3X4,	// mat3x4
		TYPE_FLOAT16_MAT4X2,	// mat4x2
		TYPE_FLOAT16_MAT4X3,	// mat4x3
		TYPE_FLOAT16_MAT4,		// mat4
		TYPE_FLOAT16,			// double
		TYPE_FLOAT16_VEC2,		// dvec2
		TYPE_FLOAT16_VEC3,		// dvec3
		TYPE_FLOAT16_VEC4,		// dvec4
		TYPE_FLOAT16_MAT2,		// dmat2
		TYPE_FLOAT16_MAT2X3,	// dmat2x3
		TYPE_FLOAT16_MAT2X4,	// dmat2x4
		TYPE_FLOAT16_MAT3X2,	// dmat3x2
		TYPE_FLOAT16_MAT3,		// dmat3
		TYPE_FLOAT16_MAT3X4,	// dmat3x4
		TYPE_FLOAT16_MAT4X2,	// dmat4x2
		TYPE_FLOAT16_MAT4X3,	// dmat4x3
		TYPE_FLOAT16_MAT4,		// dmat4
		TYPE_FLOAT16,			// int
		TYPE_FLOAT16_VEC2,		// ivec2
		TYPE_FLOAT16_VEC3,		// ivec3
		TYPE_FLOAT16_VEC4,		// ivec4
		TYPE_FLOAT16,			// uint
		TYPE_FLOAT16_VEC2,		// uvec2
		TYPE_FLOAT16_VEC3,		// uvec3
		TYPE_FLOAT16_VEC4,		// uvec4
		TYPE_FLOAT16,			// bool
		TYPE_FLOAT16_VEC2,		// bvec2
		TYPE_FLOAT16_VEC3,		// bvec3
		TYPE_FLOAT16_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
		TYPE_FLOAT16,			// uint8_t
		TYPE_FLOAT16_VEC2,		// u8vec2
		TYPE_FLOAT16_VEC3,		// u8vec3
		TYPE_FLOAT16_VEC4,		// u8vec4
		TYPE_FLOAT16,			// int8_t
		TYPE_FLOAT16_VEC2,		// i8vec2
		TYPE_FLOAT16_VEC3,		// i8vec3
		TYPE_FLOAT16_VEC4,		// i8vec4
		TYPE_FLOAT16,			// uint16_t
		TYPE_FLOAT16_VEC2,		// u16vec2
		TYPE_FLOAT16_VEC3,		// u16vec3
		TYPE_FLOAT16_VEC4,		// u16vec4
		TYPE_FLOAT16,			// int16_t
		TYPE_FLOAT16_VEC2,		// i16vec2
		TYPE_FLOAT16_VEC3,		// i16vec3
		TYPE_FLOAT16_VEC4,		// i16vec4
		TYPE_FLOAT16,			// float16_t
		TYPE_FLOAT16_VEC2,		// f16vec2
		TYPE_FLOAT16_VEC3,		// f16vec3
		TYPE_FLOAT16_VEC4,		// f16vec4
		TYPE_FLOAT16_MAT2,		// f16mat2
		TYPE_FLOAT16_MAT2X3,	// f16mat2x3
		TYPE_FLOAT16_MAT2X4,	// f16mat2x4
		TYPE_FLOAT16_MAT3X2,	// f16mat3x2
		TYPE_FLOAT16_MAT3,		// f16mat3
		TYPE_FLOAT16_MAT3X4,	// f16mat3x4
		TYPE_FLOAT16_MAT4X2,	// f16mat4x2
		TYPE_FLOAT16_MAT4X3,	// f16mat4x3
		TYPE_FLOAT16_MAT4,		// f16mat4
	};

	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 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
		TYPE_FLOAT,			// uint8_t
		TYPE_FLOAT_VEC2,	// u8vec2
		TYPE_FLOAT_VEC3,	// u8vec3
		TYPE_FLOAT_VEC4,	// u8vec4
		TYPE_FLOAT,			// int8_t
		TYPE_FLOAT_VEC2,	// i8vec2
		TYPE_FLOAT_VEC3,	// i8vec3
		TYPE_FLOAT_VEC4,	// i8vec4
		TYPE_FLOAT,			// uint16_t
		TYPE_FLOAT_VEC2,	// u16vec2
		TYPE_FLOAT_VEC3,	// u16vec3
		TYPE_FLOAT_VEC4,	// u16vec4
		TYPE_FLOAT,			// int16_t
		TYPE_FLOAT_VEC2,	// i16vec2
		TYPE_FLOAT_VEC3,	// i16vec3
		TYPE_FLOAT_VEC4,	// i16vec4
		TYPE_FLOAT,			// float16_t
		TYPE_FLOAT_VEC2,	// f16vec2
		TYPE_FLOAT_VEC3,	// f16vec3
		TYPE_FLOAT_VEC4,	// f16vec4
		TYPE_FLOAT_MAT2,	// f16mat2
		TYPE_FLOAT_MAT2X3,	// f16mat2x3
		TYPE_FLOAT_MAT2X4,	// f16mat2x4
		TYPE_FLOAT_MAT3X2,	// f16mat3x2
		TYPE_FLOAT_MAT3,	// f16mat3
		TYPE_FLOAT_MAT3X4,	// f16mat3x4
		TYPE_FLOAT_MAT4X2,	// f16mat4x2
		TYPE_FLOAT_MAT4X3,	// f16mat4x3
		TYPE_FLOAT_MAT4,	// f16mat4
	};

	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
		TYPE_DOUBLE,		// uint18_t
		TYPE_DOUBLE_VEC2,	// u8vec2
		TYPE_DOUBLE_VEC3,	// u8vec3
		TYPE_DOUBLE_VEC4,	// u8vec4
		TYPE_DOUBLE,		// int8_t
		TYPE_DOUBLE_VEC2,	// i8vec2
		TYPE_DOUBLE_VEC3,	// i8vec3
		TYPE_DOUBLE_VEC4,	// i8vec4
		TYPE_DOUBLE,		// uint16_t
		TYPE_DOUBLE_VEC2,	// u16vec2
		TYPE_DOUBLE_VEC3,	// u16vec3
		TYPE_DOUBLE_VEC4,	// u16vec4
		TYPE_DOUBLE,		// int16_t
		TYPE_DOUBLE_VEC2,	// i16vec2
		TYPE_DOUBLE_VEC3,	// i16vec3
		TYPE_DOUBLE_VEC4,	// i16vec4
		TYPE_DOUBLE,		// float16_t
		TYPE_DOUBLE_VEC2,	// f16vec2
		TYPE_DOUBLE_VEC3,	// f16vec3
		TYPE_DOUBLE_VEC4,	// f16vec4
		TYPE_DOUBLE_MAT2,	// f16mat2
		TYPE_DOUBLE_MAT2X3,	// f16mat2x3
		TYPE_DOUBLE_MAT2X4,	// f16mat2x4
		TYPE_DOUBLE_MAT3X2,	// f16mat3x2
		TYPE_DOUBLE_MAT3,	// f16mat3
		TYPE_DOUBLE_MAT3X4,	// f16mat3x4
		TYPE_DOUBLE_MAT4X2,	// f16mat4x2
		TYPE_DOUBLE_MAT4X3,	// f16mat4x3
		TYPE_DOUBLE_MAT4,	// f16mat4
	};

	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:
		case TYPE_UINT8:
		case TYPE_INT8:
		case TYPE_UINT16:
		case TYPE_INT16:
		case TYPE_FLOAT16:
			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;
		case TYPE_FLOAT16_MAT2:		return 2;
		case TYPE_FLOAT16_MAT2X3:	return 3;
		case TYPE_FLOAT16_MAT2X4:	return 4;
		case TYPE_FLOAT16_MAT3X2:	return 2;
		case TYPE_FLOAT16_MAT3:		return 3;
		case TYPE_FLOAT16_MAT3X4:	return 4;
		case TYPE_FLOAT16_MAT4X2:	return 2;
		case TYPE_FLOAT16_MAT4X3:	return 3;
		case TYPE_FLOAT16_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;
		case TYPE_FLOAT16_MAT2:		return 2;
		case TYPE_FLOAT16_MAT2X3:	return 2;
		case TYPE_FLOAT16_MAT2X4:	return 2;
		case TYPE_FLOAT16_MAT3X2:	return 3;
		case TYPE_FLOAT16_MAT3:		return 3;
		case TYPE_FLOAT16_MAT3X4:	return 3;
		case TYPE_FLOAT16_MAT4X2:	return 4;
		case TYPE_FLOAT16_MAT4X3:	return 4;
		case TYPE_FLOAT16_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
