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