Home | History | Annotate | Download | only in opengl
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES Utilities
      3  * ------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      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
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     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.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Shader utilities.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "gluShaderUtil.hpp"
     25 #include "glwEnums.hpp"
     26 #include "deArrayUtil.hpp"
     27 
     28 namespace glu
     29 {
     30 
     31 // ShadingLanguageVersion
     32 
     33 const char* getGLSLVersionName (GLSLVersion version)
     34 {
     35 	static const char* s_names[] =
     36 	{
     37 		"GLSL ES 1.0",
     38 		"GLSL ES 3.0",
     39 		"GLSL ES 3.1",
     40 		"GLSL 1.3",
     41 		"GLSL 1.4",
     42 		"GLSL 1.5",
     43 		"GLSL 3.3",
     44 		"GLSL 4.0",
     45 		"GLSL 4.1",
     46 		"GLSL 4.2",
     47 		"GLSL 4.3",
     48 		"GLSL 4.4",
     49 	};
     50 
     51 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version);
     52 }
     53 
     54 const char* getGLSLVersionDeclaration (GLSLVersion version)
     55 {
     56 	static const char* s_decl[] =
     57 	{
     58 		"#version 100",
     59 		"#version 300 es",
     60 		"#version 310 es",
     61 		"#version 130",
     62 		"#version 140",
     63 		"#version 150",
     64 		"#version 330",
     65 		"#version 400",
     66 		"#version 410",
     67 		"#version 420",
     68 		"#version 430",
     69 		"#version 440",
     70 	};
     71 
     72 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version);
     73 }
     74 
     75 bool glslVersionUsesInOutQualifiers (GLSLVersion version)
     76 {
     77 	return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_310_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_430);
     78 }
     79 
     80 bool glslVersionIsES (GLSLVersion version)
     81 {
     82 	DE_ASSERT(version != GLSL_VERSION_LAST);
     83 
     84 	if (version == GLSL_VERSION_100_ES	||
     85 		version == GLSL_VERSION_300_ES	||
     86 		version == GLSL_VERSION_310_ES)
     87 		return true;
     88 	else
     89 		return false;
     90 }
     91 
     92 // \todo [2014-10-06 pyry] Export this.
     93 static ApiType getMinAPIForGLSLVersion (GLSLVersion version)
     94 {
     95 	static const ApiType s_minApi[] =
     96 	{
     97 		ApiType::es(2,0),
     98 		ApiType::es(3,0),
     99 		ApiType::es(3,1),
    100 		ApiType::core(3,0),
    101 		ApiType::core(3,1),
    102 		ApiType::core(3,2),
    103 		ApiType::core(3,3),
    104 		ApiType::core(4,0),
    105 		ApiType::core(4,1),
    106 		ApiType::core(4,2),
    107 		ApiType::core(4,3),
    108 		ApiType::core(4,4),
    109 	};
    110 
    111 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version);
    112 }
    113 
    114 bool isGLSLVersionSupported (ContextType type, GLSLVersion version)
    115 {
    116 	return contextSupports(type, getMinAPIForGLSLVersion(version));
    117 }
    118 
    119 GLSLVersion getContextTypeGLSLVersion (ContextType type)
    120 {
    121 	// \note From newer to older
    122 	for (int version = GLSL_VERSION_LAST-1; version >= 0; version--)
    123 	{
    124 		if (isGLSLVersionSupported(type, GLSLVersion(version)))
    125 			return GLSLVersion(version);
    126 	}
    127 
    128 	DE_ASSERT(false);
    129 	return GLSL_VERSION_LAST;
    130 }
    131 
    132 // ShaderType
    133 
    134 const char* getShaderTypeName (ShaderType shaderType)
    135 {
    136 	const char* s_names[] =
    137 	{
    138 		"vertex",
    139 		"fragment",
    140 		"geometry",
    141 		"tess_control",
    142 		"tess_eval",
    143 		"compute",
    144 	};
    145 
    146 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST);
    147 	DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST));
    148 	return s_names[(int)shaderType];
    149 }
    150 
    151 // Precision
    152 
    153 const char* getPrecisionName (Precision precision)
    154 {
    155 	const char* s_names[] =
    156 	{
    157 		"lowp",
    158 		"mediump",
    159 		"highp"
    160 	};
    161 
    162 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST);
    163 	DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST));
    164 	return s_names[(int)precision];
    165 }
    166 
    167 // DataType
    168 
    169 const char* getDataTypeName (DataType dataType)
    170 {
    171 	const char* s_names[] =
    172 	{
    173 		"invalid",
    174 		"float",
    175 		"vec2",
    176 		"vec3",
    177 		"vec4",
    178 		"mat2",
    179 		"mat2x3",
    180 		"mat2x4",
    181 		"mat3x2",
    182 		"mat3",
    183 		"mat3x4",
    184 		"mat4x2",
    185 		"mat4x3",
    186 		"mat4",
    187 		"int",
    188 		"ivec2",
    189 		"ivec3",
    190 		"ivec4",
    191 		"uint",
    192 		"uvec2",
    193 		"uvec3",
    194 		"uvec4",
    195 		"bool",
    196 		"bvec2",
    197 		"bvec3",
    198 		"bvec4",
    199 		"sampler1D",
    200 		"sampler2D",
    201 		"samplerCube",
    202 		"sampler2DArray",
    203 		"sampler3D",
    204 		"samplerCubeArray",
    205 		"sampler1DShadow",
    206 		"sampler2DShadow",
    207 		"samplerCubeShadow",
    208 		"sampler2DArrayShadow",
    209 		"samplerCubeArrayShadow",
    210 		"isampler1D",
    211 		"isampler2D",
    212 		"isamplerCube",
    213 		"isampler2DArray",
    214 		"isampler3D",
    215 		"isamplerCubeArray",
    216 		"usampler1D",
    217 		"usampler2D",
    218 		"usamplerCube",
    219 		"usampler2DArray",
    220 		"usampler3D",
    221 		"usamplerCubeArray",
    222 		"sampler2DMS",
    223 		"isampler2DMS",
    224 		"usampler2DMS",
    225 		"image2D",
    226 		"imageCube",
    227 		"image2DArray",
    228 		"image3D",
    229 		"imageCubeArray",
    230 		"iimage2D",
    231 		"iimageCube",
    232 		"iimage2DArray",
    233 		"iimage3D",
    234 		"iimageCubeArray",
    235 		"uimage2D",
    236 		"uimageCube",
    237 		"uimage2DArray",
    238 		"uimage3D",
    239 		"uimageCubeArray",
    240 		"atomic_uint",
    241 	};
    242 
    243 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
    244 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
    245 	return s_names[(int)dataType];
    246 }
    247 
    248 int getDataTypeScalarSize (DataType dataType)
    249 {
    250 	const int s_sizes[] =
    251 	{
    252 		-1,		// invalid
    253 		1,		// float
    254 		2,		// vec2
    255 		3,		// vec3
    256 		4,		// vec4
    257 		4,		// mat2
    258 		6,		// mat2x3
    259 		8,		// mat2x4
    260 		6,		// mat3x2
    261 		9,		// mat3
    262 		12,		// mat3x4
    263 		8,		// mat4x2
    264 		12,		// mat4x3
    265 		16,		// mat4
    266 		1,		// int
    267 		2,		// ivec2
    268 		3,		// ivec3
    269 		4,		// ivec4
    270 		1,		// uint
    271 		2,		// uvec2
    272 		3,		// uvec3
    273 		4,		// uvec4
    274 		1,		// bool
    275 		2,		// bvec2
    276 		3,		// bvec3
    277 		4,		// bvec4
    278 		1,		// sampler1D
    279 		1,		// sampler2D
    280 		1,		// samplerCube
    281 		1,		// sampler2DArray
    282 		1,		// sampler3D
    283 		1,		// samplerCubeArray
    284 		1,		// sampler1DShadow
    285 		1,		// sampler2DShadow
    286 		1,		// samplerCubeShadow
    287 		1,		// sampler2DArrayShadow
    288 		1,		// samplerCubeArrayShadow
    289 		1,		// isampler1D
    290 		1,		// isampler2D
    291 		1,		// isamplerCube
    292 		1,		// isampler2DArray
    293 		1,		// isampler3D
    294 		1,		// isamplerCubeArray
    295 		1,		// usampler1D
    296 		1,		// usampler2D
    297 		1,		// usamplerCube
    298 		1,		// usampler2DArray
    299 		1,		// usampler3D
    300 		1,		// usamplerCubeArray
    301 		1,		// sampler2DMS
    302 		1,		// isampler2DMS
    303 		1,		// usampler2DMS
    304 		1,		// image2D
    305 		1,		// imageCube
    306 		1,		// image2DArray
    307 		1,		// image3D
    308 		1,		// imageCubeArray
    309 		1,		// iimage2D
    310 		1,		// iimageCube
    311 		1,		// iimage2DArray
    312 		1,		// iimage3D
    313 		1,		// iimageCubeArray
    314 		1,		// uimage2D
    315 		1,		// uimageCube
    316 		1,		// uimage2DArray
    317 		1,		// uimage3D
    318 		1,		// uimageCubeArray
    319 		1,		// atomic_uint
    320 	};
    321 
    322 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
    323 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
    324 	return s_sizes[(int)dataType];
    325 }
    326 
    327 DataType getDataTypeScalarType (DataType dataType)
    328 {
    329 	const DataType s_scalarTypes[] =
    330 	{
    331 		TYPE_INVALID,		// invalid
    332 		TYPE_FLOAT,			// float
    333 		TYPE_FLOAT,			// vec2
    334 		TYPE_FLOAT,			// vec3
    335 		TYPE_FLOAT,			// vec4
    336 		TYPE_FLOAT,			// mat2
    337 		TYPE_FLOAT,			// mat2x3
    338 		TYPE_FLOAT,			// mat2x4
    339 		TYPE_FLOAT,			// mat3x2
    340 		TYPE_FLOAT,			// mat3
    341 		TYPE_FLOAT,			// mat3x4
    342 		TYPE_FLOAT,			// mat4x2
    343 		TYPE_FLOAT,			// mat4x3
    344 		TYPE_FLOAT,			// mat4
    345 		TYPE_INT,			// int
    346 		TYPE_INT,			// ivec2
    347 		TYPE_INT,			// ivec3
    348 		TYPE_INT,			// ivec4
    349 		TYPE_UINT,			// uint
    350 		TYPE_UINT,			// uvec2
    351 		TYPE_UINT,			// uvec3
    352 		TYPE_UINT,			// uvec4
    353 		TYPE_BOOL,			// bool
    354 		TYPE_BOOL,			// bvec2
    355 		TYPE_BOOL,			// bvec3
    356 		TYPE_BOOL,			// bvec4
    357 		TYPE_SAMPLER_1D,					// sampler1D
    358 		TYPE_SAMPLER_2D,					// sampler2D
    359 		TYPE_SAMPLER_CUBE,					// samplerCube
    360 		TYPE_SAMPLER_2D_ARRAY,				// sampler2DArray
    361 		TYPE_SAMPLER_3D,					// sampler3D
    362 		TYPE_SAMPLER_CUBE_ARRAY,			// samplerCubeArray
    363 		TYPE_SAMPLER_1D_SHADOW,				// sampler1DShadow
    364 		TYPE_SAMPLER_2D_SHADOW,				// sampler2DShadow
    365 		TYPE_SAMPLER_CUBE_SHADOW,			// samplerCubeShadow
    366 		TYPE_SAMPLER_2D_ARRAY_SHADOW,		// sampler2DArrayShadow
    367 		TYPE_SAMPLER_CUBE_ARRAY_SHADOW,		// samplerCubeArrayShadow
    368 		TYPE_INT_SAMPLER_1D,				// isampler1D
    369 		TYPE_INT_SAMPLER_2D,				// isampler2D
    370 		TYPE_INT_SAMPLER_CUBE,				// isamplerCube
    371 		TYPE_INT_SAMPLER_2D_ARRAY,			// isampler2DArray
    372 		TYPE_INT_SAMPLER_3D,				// isampler3D
    373 		TYPE_INT_SAMPLER_CUBE_ARRAY,		// isamplerCubeArray
    374 		TYPE_UINT_SAMPLER_1D,				// usampler1D
    375 		TYPE_UINT_SAMPLER_2D,				// usampler2D
    376 		TYPE_UINT_SAMPLER_CUBE,				// usamplerCube
    377 		TYPE_UINT_SAMPLER_2D_ARRAY,			// usampler2DArray
    378 		TYPE_UINT_SAMPLER_3D,				// usampler3D
    379 		TYPE_UINT_SAMPLER_CUBE_ARRAY,		// usamplerCubeArray
    380 		TYPE_SAMPLER_2D_MULTISAMPLE,		// sampler2DMS
    381 		TYPE_INT_SAMPLER_2D_MULTISAMPLE,	// isampler2DMS
    382 		TYPE_UINT_SAMPLER_2D_MULTISAMPLE,	// usampler2DMS
    383 		TYPE_IMAGE_2D,						// image2D
    384 		TYPE_IMAGE_CUBE,					// imageCube
    385 		TYPE_IMAGE_2D_ARRAY,				// image2DArray
    386 		TYPE_IMAGE_3D,						// image3D
    387 		TYPE_IMAGE_CUBE_ARRAY,				// imageCubeArray
    388 		TYPE_INT_IMAGE_2D,					// iimage2D
    389 		TYPE_INT_IMAGE_CUBE,				// iimageCube
    390 		TYPE_INT_IMAGE_2D_ARRAY,			// iimage2DArray
    391 		TYPE_INT_IMAGE_3D,					// iimage3D
    392 		TYPE_INT_IMAGE_CUBE_ARRAY,			// iimageCubeArray
    393 		TYPE_UINT_IMAGE_2D,					// uimage2D
    394 		TYPE_UINT_IMAGE_CUBE,				// uimageCube
    395 		TYPE_UINT_IMAGE_2D_ARRAY,			// uimage2DArray
    396 		TYPE_UINT_IMAGE_3D,					// uimage3D
    397 		TYPE_UINT_IMAGE_CUBE_ARRAY,			// uimageCubeArray
    398 		TYPE_UINT_ATOMIC_COUNTER,			// atomic_uint
    399 	};
    400 
    401 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
    402 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
    403 	return s_scalarTypes[(int)dataType];
    404 }
    405 
    406 DataType getDataTypeFloatScalars (DataType dataType)
    407 {
    408 	const DataType s_floatTypes[] =
    409 	{
    410 		TYPE_INVALID,		// invalid
    411 		TYPE_FLOAT,			// float
    412 		TYPE_FLOAT_VEC2,	// vec2
    413 		TYPE_FLOAT_VEC3,	// vec3
    414 		TYPE_FLOAT_VEC4,	// vec4
    415 		TYPE_FLOAT_MAT2,	// mat2
    416 		TYPE_FLOAT_MAT2X3,	// mat2x3
    417 		TYPE_FLOAT_MAT2X4,	// mat2x4
    418 		TYPE_FLOAT_MAT3X2,	// mat3x2
    419 		TYPE_FLOAT_MAT3,	// mat3
    420 		TYPE_FLOAT_MAT3X4,	// mat3x4
    421 		TYPE_FLOAT_MAT4X2,	// mat4x2
    422 		TYPE_FLOAT_MAT4X3,	// mat4x3
    423 		TYPE_FLOAT_MAT4,	// mat4
    424 		TYPE_FLOAT,			// int
    425 		TYPE_FLOAT_VEC2,	// ivec2
    426 		TYPE_FLOAT_VEC3,	// ivec3
    427 		TYPE_FLOAT_VEC4,	// ivec4
    428 		TYPE_FLOAT,			// uint
    429 		TYPE_FLOAT_VEC2,	// uvec2
    430 		TYPE_FLOAT_VEC3,	// uvec3
    431 		TYPE_FLOAT_VEC4,	// uvec4
    432 		TYPE_FLOAT,			// bool
    433 		TYPE_FLOAT_VEC2,	// bvec2
    434 		TYPE_FLOAT_VEC3,	// bvec3
    435 		TYPE_FLOAT_VEC4,	// bvec4
    436 		TYPE_INVALID,		// sampler1D
    437 		TYPE_INVALID,		// sampler2D
    438 		TYPE_INVALID,		// samplerCube
    439 		TYPE_INVALID,		// sampler2DArray
    440 		TYPE_INVALID,		// sampler3D
    441 		TYPE_INVALID,		// samplerCubeArray
    442 		TYPE_INVALID,		// sampler1DShadow
    443 		TYPE_INVALID,		// sampler2DShadow
    444 		TYPE_INVALID,		// samplerCubeShadow
    445 		TYPE_INVALID,		// sampler2DArrayShadow
    446 		TYPE_INVALID,		// samplerCubeArrayShadow
    447 		TYPE_INVALID,		// isampler1D
    448 		TYPE_INVALID,		// isampler2D
    449 		TYPE_INVALID,		// isamplerCube
    450 		TYPE_INVALID,		// isampler2DArray
    451 		TYPE_INVALID,		// isampler3D
    452 		TYPE_INVALID,		// isamplerCubeArray
    453 		TYPE_INVALID,		// usampler1D
    454 		TYPE_INVALID,		// usampler2D
    455 		TYPE_INVALID,		// usamplerCube
    456 		TYPE_INVALID,		// usampler2DArray
    457 		TYPE_INVALID,		// usampler3D
    458 		TYPE_INVALID,		// usamplerCubeArray
    459 		TYPE_INVALID,		// sampler2DMS
    460 		TYPE_INVALID,		// isampler2DMS
    461 		TYPE_INVALID,		// usampler2DMS
    462 		TYPE_INVALID,		// image2D
    463 		TYPE_INVALID,		// imageCube
    464 		TYPE_INVALID,		// image2DArray
    465 		TYPE_INVALID,		// image3D
    466 		TYPE_INVALID,		// imageCubeArray
    467 		TYPE_INVALID,		// iimage2D
    468 		TYPE_INVALID,		// iimageCube
    469 		TYPE_INVALID,		// iimage2DArray
    470 		TYPE_INVALID,		// iimage3D
    471 		TYPE_INVALID,		// iimageCubeArray
    472 		TYPE_INVALID,		// uimage2D
    473 		TYPE_INVALID,		// uimageCube
    474 		TYPE_INVALID,		// uimage2DArray
    475 		TYPE_INVALID,		// uimage3D
    476 		TYPE_INVALID,		// uimageCubeArray
    477 		TYPE_INVALID,		// atomic_uint
    478 	};
    479 
    480 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
    481 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
    482 	return s_floatTypes[(int)dataType];
    483 }
    484 
    485 DataType getDataTypeVector (DataType scalarType, int size)
    486 {
    487 	DE_ASSERT(deInRange32(size, 1, 4));
    488 	switch (scalarType)
    489 	{
    490 		case TYPE_FLOAT:
    491 		case TYPE_INT:
    492 		case TYPE_UINT:
    493 		case TYPE_BOOL:
    494 			return (DataType)((int)scalarType + size - 1);
    495 		default:
    496 			return TYPE_INVALID;
    497 	}
    498 }
    499 
    500 DataType getDataTypeFloatVec (int vecSize)
    501 {
    502 	return getDataTypeVector(TYPE_FLOAT, vecSize);
    503 }
    504 
    505 DataType getDataTypeIntVec (int vecSize)
    506 {
    507 	return getDataTypeVector(TYPE_INT, vecSize);
    508 }
    509 
    510 DataType getDataTypeUintVec (int vecSize)
    511 {
    512 	return getDataTypeVector(TYPE_UINT, vecSize);
    513 }
    514 
    515 DataType getDataTypeBoolVec (int vecSize)
    516 {
    517 	return getDataTypeVector(TYPE_BOOL, vecSize);
    518 }
    519 
    520 DataType getDataTypeMatrix (int numCols, int numRows)
    521 {
    522 	DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
    523 	return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
    524 }
    525 
    526 int getDataTypeMatrixNumRows (DataType dataType)
    527 {
    528 	switch (dataType)
    529 	{
    530 		case TYPE_FLOAT_MAT2:	return 2;
    531 		case TYPE_FLOAT_MAT2X3:	return 3;
    532 		case TYPE_FLOAT_MAT2X4:	return 4;
    533 		case TYPE_FLOAT_MAT3X2:	return 2;
    534 		case TYPE_FLOAT_MAT3:	return 3;
    535 		case TYPE_FLOAT_MAT3X4:	return 4;
    536 		case TYPE_FLOAT_MAT4X2:	return 2;
    537 		case TYPE_FLOAT_MAT4X3:	return 3;
    538 		case TYPE_FLOAT_MAT4:	return 4;
    539 		default:
    540 			DE_ASSERT(false);
    541 			return 0;
    542 	}
    543 }
    544 
    545 int getDataTypeMatrixNumColumns (DataType dataType)
    546 {
    547 	switch (dataType)
    548 	{
    549 		case TYPE_FLOAT_MAT2:	return 2;
    550 		case TYPE_FLOAT_MAT2X3:	return 2;
    551 		case TYPE_FLOAT_MAT2X4:	return 2;
    552 		case TYPE_FLOAT_MAT3X2:	return 3;
    553 		case TYPE_FLOAT_MAT3:	return 3;
    554 		case TYPE_FLOAT_MAT3X4:	return 3;
    555 		case TYPE_FLOAT_MAT4X2:	return 4;
    556 		case TYPE_FLOAT_MAT4X3:	return 4;
    557 		case TYPE_FLOAT_MAT4:	return 4;
    558 		default:
    559 			DE_ASSERT(false);
    560 			return 0;
    561 	}
    562 }
    563 
    564 int	getDataTypeNumLocations	(DataType dataType)
    565 {
    566 	if (isDataTypeScalarOrVector(dataType))
    567 		return 1;
    568 	else if (isDataTypeMatrix(dataType))
    569 		return getDataTypeMatrixNumColumns(dataType);
    570 
    571 	DE_ASSERT(!"Illegal datatype.");
    572 	return 0;
    573 }
    574 
    575 int	getDataTypeNumComponents (DataType dataType)
    576 {
    577 	if (isDataTypeScalarOrVector(dataType))
    578 		return getDataTypeScalarSize(dataType);
    579 	else if (isDataTypeMatrix(dataType))
    580 		return getDataTypeMatrixNumRows(dataType);
    581 
    582 	DE_ASSERT(!"Illegal datatype.");
    583 	return 0;
    584 }
    585 
    586 DataType getDataTypeFromGLType (deUint32 glType)
    587 {
    588 	switch (glType)
    589 	{
    590 		case GL_FLOAT:									return TYPE_FLOAT;
    591 		case GL_FLOAT_VEC2:								return TYPE_FLOAT_VEC2;
    592 		case GL_FLOAT_VEC3:								return TYPE_FLOAT_VEC3;
    593 		case GL_FLOAT_VEC4:								return TYPE_FLOAT_VEC4;
    594 
    595 		case GL_FLOAT_MAT2:								return TYPE_FLOAT_MAT2;
    596 		case GL_FLOAT_MAT2x3:							return TYPE_FLOAT_MAT2X3;
    597 		case GL_FLOAT_MAT2x4:							return TYPE_FLOAT_MAT2X4;
    598 
    599 		case GL_FLOAT_MAT3x2:							return TYPE_FLOAT_MAT3X2;
    600 		case GL_FLOAT_MAT3:								return TYPE_FLOAT_MAT3;
    601 		case GL_FLOAT_MAT3x4:							return TYPE_FLOAT_MAT3X4;
    602 
    603 		case GL_FLOAT_MAT4x2:							return TYPE_FLOAT_MAT4X2;
    604 		case GL_FLOAT_MAT4x3:							return TYPE_FLOAT_MAT4X3;
    605 		case GL_FLOAT_MAT4:								return TYPE_FLOAT_MAT4;
    606 
    607 		case GL_INT:									return TYPE_INT;
    608 		case GL_INT_VEC2:								return TYPE_INT_VEC2;
    609 		case GL_INT_VEC3:								return TYPE_INT_VEC3;
    610 		case GL_INT_VEC4:								return TYPE_INT_VEC4;
    611 
    612 		case GL_UNSIGNED_INT:							return TYPE_UINT;
    613 		case GL_UNSIGNED_INT_VEC2:						return TYPE_UINT_VEC2;
    614 		case GL_UNSIGNED_INT_VEC3:						return TYPE_UINT_VEC3;
    615 		case GL_UNSIGNED_INT_VEC4:						return TYPE_UINT_VEC4;
    616 
    617 		case GL_BOOL:									return TYPE_BOOL;
    618 		case GL_BOOL_VEC2:								return TYPE_BOOL_VEC2;
    619 		case GL_BOOL_VEC3:								return TYPE_BOOL_VEC3;
    620 		case GL_BOOL_VEC4:								return TYPE_BOOL_VEC4;
    621 
    622 		case GL_SAMPLER_1D:								return TYPE_SAMPLER_1D;
    623 		case GL_SAMPLER_2D:								return TYPE_SAMPLER_2D;
    624 		case GL_SAMPLER_CUBE:							return TYPE_SAMPLER_CUBE;
    625 		case GL_SAMPLER_2D_ARRAY:						return TYPE_SAMPLER_2D_ARRAY;
    626 		case GL_SAMPLER_3D:								return TYPE_SAMPLER_3D;
    627 		case GL_SAMPLER_CUBE_MAP_ARRAY:					return TYPE_SAMPLER_CUBE_ARRAY;
    628 
    629 		case GL_SAMPLER_1D_SHADOW:						return TYPE_SAMPLER_1D_SHADOW;
    630 		case GL_SAMPLER_2D_SHADOW:						return TYPE_SAMPLER_2D_SHADOW;
    631 		case GL_SAMPLER_CUBE_SHADOW:					return TYPE_SAMPLER_CUBE_SHADOW;
    632 		case GL_SAMPLER_2D_ARRAY_SHADOW:				return TYPE_SAMPLER_2D_ARRAY_SHADOW;
    633 		case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:			return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
    634 
    635 		case GL_INT_SAMPLER_1D:							return TYPE_INT_SAMPLER_1D;
    636 		case GL_INT_SAMPLER_2D:							return TYPE_INT_SAMPLER_2D;
    637 		case GL_INT_SAMPLER_CUBE:						return TYPE_INT_SAMPLER_CUBE;
    638 		case GL_INT_SAMPLER_2D_ARRAY:					return TYPE_INT_SAMPLER_2D_ARRAY;
    639 		case GL_INT_SAMPLER_3D:							return TYPE_INT_SAMPLER_3D;
    640 		case GL_INT_SAMPLER_CUBE_MAP_ARRAY:				return TYPE_INT_SAMPLER_CUBE_ARRAY;
    641 
    642 		case GL_UNSIGNED_INT_SAMPLER_1D:				return TYPE_UINT_SAMPLER_1D;
    643 		case GL_UNSIGNED_INT_SAMPLER_2D:				return TYPE_UINT_SAMPLER_2D;
    644 		case GL_UNSIGNED_INT_SAMPLER_CUBE:				return TYPE_UINT_SAMPLER_CUBE;
    645 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:			return TYPE_UINT_SAMPLER_2D_ARRAY;
    646 		case GL_UNSIGNED_INT_SAMPLER_3D:				return TYPE_UINT_SAMPLER_3D;
    647 		case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:	return TYPE_UINT_SAMPLER_CUBE_ARRAY;
    648 
    649 		case GL_SAMPLER_2D_MULTISAMPLE:					return TYPE_SAMPLER_2D_MULTISAMPLE;
    650 		case GL_INT_SAMPLER_2D_MULTISAMPLE:				return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
    651 		case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:	return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
    652 
    653 		case GL_IMAGE_2D:								return TYPE_IMAGE_2D;
    654 		case GL_IMAGE_CUBE:								return TYPE_IMAGE_CUBE;
    655 		case GL_IMAGE_2D_ARRAY:							return TYPE_IMAGE_2D_ARRAY;
    656 		case GL_IMAGE_3D:								return TYPE_IMAGE_3D;
    657 		case GL_INT_IMAGE_2D:							return TYPE_INT_IMAGE_2D;
    658 		case GL_INT_IMAGE_CUBE:							return TYPE_INT_IMAGE_CUBE;
    659 		case GL_INT_IMAGE_2D_ARRAY:						return TYPE_INT_IMAGE_2D_ARRAY;
    660 		case GL_INT_IMAGE_3D:							return TYPE_INT_IMAGE_3D;
    661 		case GL_UNSIGNED_INT_IMAGE_2D:					return TYPE_UINT_IMAGE_2D;
    662 		case GL_UNSIGNED_INT_IMAGE_CUBE:				return TYPE_UINT_IMAGE_CUBE;
    663 		case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:			return TYPE_UINT_IMAGE_2D_ARRAY;
    664 		case GL_UNSIGNED_INT_IMAGE_3D:					return TYPE_UINT_IMAGE_3D;
    665 
    666 		case GL_UNSIGNED_INT_ATOMIC_COUNTER:			return TYPE_UINT_ATOMIC_COUNTER;
    667 
    668 		default:
    669 			return TYPE_LAST;
    670 	}
    671 }
    672 
    673 } // glu
    674