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 		"GLSL 4.6",
     52 	};
     53 
     54 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_names, version);
     55 }
     56 
     57 const char* getGLSLVersionDeclaration (GLSLVersion version)
     58 {
     59 	static const char* s_decl[] =
     60 	{
     61 		"#version 100",
     62 		"#version 300 es",
     63 		"#version 310 es",
     64 		"#version 320 es",
     65 		"#version 130",
     66 		"#version 140",
     67 		"#version 150",
     68 		"#version 330",
     69 		"#version 400",
     70 		"#version 410",
     71 		"#version 420",
     72 		"#version 430",
     73 		"#version 440",
     74 		"#version 450",
     75 		"#version 460",
     76 	};
     77 
     78 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_decl, version);
     79 }
     80 
     81 bool glslVersionUsesInOutQualifiers (GLSLVersion version)
     82 {
     83 	return de::inRange<int>(version, GLSL_VERSION_300_ES, GLSL_VERSION_320_ES) || de::inRange<int>(version, GLSL_VERSION_330, GLSL_VERSION_460);
     84 }
     85 
     86 bool glslVersionIsES (GLSLVersion version)
     87 {
     88 	DE_STATIC_ASSERT(GLSL_VERSION_LAST == 15);
     89 	DE_ASSERT(version != GLSL_VERSION_LAST);
     90 
     91 	if (version == GLSL_VERSION_100_ES	||
     92 		version == GLSL_VERSION_300_ES	||
     93 		version == GLSL_VERSION_310_ES	||
     94 		version == GLSL_VERSION_320_ES)
     95 		return true;
     96 	else
     97 		return false;
     98 }
     99 
    100 // \todo [2014-10-06 pyry] Export this.
    101 static ApiType getMinAPIForGLSLVersion (GLSLVersion version)
    102 {
    103 	static const ApiType s_minApi[] =
    104 	{
    105 		ApiType::es(2,0),
    106 		ApiType::es(3,0),
    107 		ApiType::es(3,1),
    108 		ApiType::es(3,2),
    109 		ApiType::core(3,0),
    110 		ApiType::core(3,1),
    111 		ApiType::core(3,2),
    112 		ApiType::core(3,3),
    113 		ApiType::core(4,0),
    114 		ApiType::core(4,1),
    115 		ApiType::core(4,2),
    116 		ApiType::core(4,3),
    117 		ApiType::core(4,4),
    118 		ApiType::core(4,5),
    119 		ApiType::core(4,6),
    120 	};
    121 
    122 	return de::getSizedArrayElement<GLSL_VERSION_LAST>(s_minApi, version);
    123 }
    124 
    125 bool isGLSLVersionSupported (ContextType type, GLSLVersion version)
    126 {
    127 	return contextSupports(type, getMinAPIForGLSLVersion(version));
    128 }
    129 
    130 GLSLVersion getContextTypeGLSLVersion (ContextType type)
    131 {
    132 	// \note From newer to older
    133 	for (int version = GLSL_VERSION_LAST-1; version >= 0; version--)
    134 	{
    135 		if (isGLSLVersionSupported(type, GLSLVersion(version)))
    136 			return GLSLVersion(version);
    137 	}
    138 
    139 	DE_ASSERT(false);
    140 	return GLSL_VERSION_LAST;
    141 }
    142 
    143 // ShaderType
    144 
    145 const char* getShaderTypeName (ShaderType shaderType)
    146 {
    147 	static const char* s_names[] =
    148 	{
    149 		"vertex",
    150 		"fragment",
    151 		"geometry",
    152 		"tess_control",
    153 		"tess_eval",
    154 		"compute",
    155 	};
    156 
    157 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == SHADERTYPE_LAST);
    158 	DE_ASSERT(deInBounds32((int)shaderType, 0, SHADERTYPE_LAST));
    159 	return s_names[(int)shaderType];
    160 }
    161 
    162 // Precision
    163 
    164 const char* getPrecisionName (Precision precision)
    165 {
    166 	static const char* s_names[] =
    167 	{
    168 		"lowp",
    169 		"mediump",
    170 		"highp"
    171 	};
    172 
    173 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == PRECISION_LAST);
    174 	DE_ASSERT(deInBounds32((int)precision, 0, PRECISION_LAST));
    175 	return s_names[(int)precision];
    176 }
    177 
    178 // DataType
    179 
    180 const char* getDataTypeName (DataType dataType)
    181 {
    182 	static const char* s_names[] =
    183 	{
    184 		"invalid",
    185 		"float",
    186 		"vec2",
    187 		"vec3",
    188 		"vec4",
    189 		"mat2",
    190 		"mat2x3",
    191 		"mat2x4",
    192 		"mat3x2",
    193 		"mat3",
    194 		"mat3x4",
    195 		"mat4x2",
    196 		"mat4x3",
    197 		"mat4",
    198 		"double",
    199 		"dvec2",
    200 		"dvec3",
    201 		"dvec4",
    202 		"dmat2",
    203 		"dmat2x3",
    204 		"dmat2x4",
    205 		"dmat3x2",
    206 		"dmat3",
    207 		"dmat3x4",
    208 		"dmat4x2",
    209 		"dmat4x3",
    210 		"dmat4",
    211 		"int",
    212 		"ivec2",
    213 		"ivec3",
    214 		"ivec4",
    215 		"uint",
    216 		"uvec2",
    217 		"uvec3",
    218 		"uvec4",
    219 		"bool",
    220 		"bvec2",
    221 		"bvec3",
    222 		"bvec4",
    223 		"sampler1D",
    224 		"sampler2D",
    225 		"samplerCube",
    226 		"sampler1DArray",
    227 		"sampler2DArray",
    228 		"sampler3D",
    229 		"samplerCubeArray",
    230 		"sampler1DShadow",
    231 		"sampler2DShadow",
    232 		"samplerCubeShadow",
    233 		"sampler1DArrayShadow",
    234 		"sampler2DArrayShadow",
    235 		"samplerCubeArrayShadow",
    236 		"isampler1D",
    237 		"isampler2D",
    238 		"isamplerCube",
    239 		"isampler1DArray",
    240 		"isampler2DArray",
    241 		"isampler3D",
    242 		"isamplerCubeArray",
    243 		"usampler1D",
    244 		"usampler2D",
    245 		"usamplerCube",
    246 		"usampler1DArray",
    247 		"usampler2DArray",
    248 		"usampler3D",
    249 		"usamplerCubeArray",
    250 		"sampler2DMS",
    251 		"isampler2DMS",
    252 		"usampler2DMS",
    253 		"image2D",
    254 		"imageCube",
    255 		"image2DArray",
    256 		"image3D",
    257 		"imageCubeArray",
    258 		"iimage2D",
    259 		"iimageCube",
    260 		"iimage2DArray",
    261 		"iimage3D",
    262 		"iimageCubeArray",
    263 		"uimage2D",
    264 		"uimageCube",
    265 		"uimage2DArray",
    266 		"uimage3D",
    267 		"uimageCubeArray",
    268 		"atomic_uint",
    269 		"samplerBuffer",
    270 		"isamplerBuffer",
    271 		"usamplerBuffer",
    272 		"sampler2DMSArray",
    273 		"isampler2DMSArray",
    274 		"usampler2DMSArray",
    275 		"imageBuffer",
    276 		"iimageBuffer",
    277 		"uimageBuffer",
    278 		"uint8_t",
    279 		"u8vec2",
    280 		"u8vec3",
    281 		"u8vec4",
    282 		"int8_t",
    283 		"i8vec2",
    284 		"i8vec3",
    285 		"i8vec4",
    286 		"uint16_t",
    287 		"u16vec2",
    288 		"u16vec3",
    289 		"u16vec4",
    290 		"int16_t",
    291 		"i16vec2",
    292 		"i16vec3",
    293 		"i16vec4",
    294 		"float16_t",
    295 		"f16vec2",
    296 		"f16vec3",
    297 		"f16vec4",
    298 		"f16mat2",
    299 		"f16mat2x3",
    300 		"f16mat2x4",
    301 		"f16mat3x2",
    302 		"f16mat3",
    303 		"f16mat3x4",
    304 		"f16mat4x2",
    305 		"f16mat4x3",
    306 		"f16mat4",
    307 	};
    308 
    309 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
    310 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
    311 	return s_names[(int)dataType];
    312 }
    313 
    314 int getDataTypeScalarSize (DataType dataType)
    315 {
    316 	static const int s_sizes[] =
    317 	{
    318 		-1,		// invalid
    319 		1,		// float
    320 		2,		// vec2
    321 		3,		// vec3
    322 		4,		// vec4
    323 		4,		// mat2
    324 		6,		// mat2x3
    325 		8,		// mat2x4
    326 		6,		// mat3x2
    327 		9,		// mat3
    328 		12,		// mat3x4
    329 		8,		// mat4x2
    330 		12,		// mat4x3
    331 		16,		// mat4
    332 		1,		// double
    333 		2,		// dvec2
    334 		3,		// dvec3
    335 		4,		// dvec4
    336 		4,		// dmat2
    337 		6,		// dmat2x3
    338 		8,		// dmat2x4
    339 		6,		// dmat3x2
    340 		9,		// dmat3
    341 		12,		// dmat3x4
    342 		8,		// dmat4x2
    343 		12,		// dmat4x3
    344 		16,		// dmat4
    345 		1,		// int
    346 		2,		// ivec2
    347 		3,		// ivec3
    348 		4,		// ivec4
    349 		1,		// uint
    350 		2,		// uvec2
    351 		3,		// uvec3
    352 		4,		// uvec4
    353 		1,		// bool
    354 		2,		// bvec2
    355 		3,		// bvec3
    356 		4,		// bvec4
    357 		1,		// sampler1D
    358 		1,		// sampler2D
    359 		1,		// samplerCube
    360 		1,		// sampler1DArray
    361 		1,		// sampler2DArray
    362 		1,		// sampler3D
    363 		1,		// samplerCubeArray
    364 		1,		// sampler1DShadow
    365 		1,		// sampler2DShadow
    366 		1,		// samplerCubeShadow
    367 		1,		// sampler1DArrayShadow
    368 		1,		// sampler2DArrayShadow
    369 		1,		// samplerCubeArrayShadow
    370 		1,		// isampler1D
    371 		1,		// isampler2D
    372 		1,		// isamplerCube
    373 		1,		// isampler1DArray
    374 		1,		// isampler2DArray
    375 		1,		// isampler3D
    376 		1,		// isamplerCubeArray
    377 		1,		// usampler1D
    378 		1,		// usampler2D
    379 		1,		// usamplerCube
    380 		1,		// usampler1DArray
    381 		1,		// usampler2DArray
    382 		1,		// usampler3D
    383 		1,		// usamplerCubeArray
    384 		1,		// sampler2DMS
    385 		1,		// isampler2DMS
    386 		1,		// usampler2DMS
    387 		1,		// image2D
    388 		1,		// imageCube
    389 		1,		// image2DArray
    390 		1,		// image3D
    391 		1,		// imageCubeArray
    392 		1,		// iimage2D
    393 		1,		// iimageCube
    394 		1,		// iimage2DArray
    395 		1,		// iimage3D
    396 		1,		// iimageCubeArray
    397 		1,		// uimage2D
    398 		1,		// uimageCube
    399 		1,		// uimage2DArray
    400 		1,		// uimage3D
    401 		1,		// uimageCubeArray
    402 		1,		// atomic_uint
    403 		1,		// samplerBuffer
    404 		1,		// isamplerBuffer
    405 		1,		// usamplerBuffer
    406 		1,		// sampler2DMSArray
    407 		1,		// isampler2DMSArray
    408 		1,		// usampler2DMSArray
    409 		1,		// imageBuffer
    410 		1,		// iimageBuffer
    411 		1,		// uimageBuffer
    412 		1,		// uint8_t
    413 		2,		// u8vec2
    414 		3,		// u8vec3
    415 		4,		// u8vec4
    416 		1,		// int8_t
    417 		2,		// i8vec2
    418 		3,		// i8vec3
    419 		4,		// i8vec4
    420 		1,		// uint16_t
    421 		2,		// u16vec2
    422 		3,		// u16vec3
    423 		4,		// u16vec4
    424 		1,		// int16_t
    425 		2,		// i16vec2
    426 		3,		// i16vec3
    427 		4,		// i16vec4
    428 		1,		// float16_t
    429 		2,		// f16vec2
    430 		3,		// f16vec3
    431 		4,		// f16vec4
    432 		4,		// f16mat2
    433 		6,		// f16mat2x3
    434 		8,		// f16mat2x4
    435 		6,		// f16mat3x2
    436 		9,		// f16mat3
    437 		12,		// f16mat3x4
    438 		8,		// f16mat4x2
    439 		12,		// f16mat4x3
    440 		16,		// f16mat4
    441 	};
    442 
    443 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
    444 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
    445 	return s_sizes[(int)dataType];
    446 }
    447 
    448 DataType getDataTypeScalarType (DataType dataType)
    449 {
    450 	static const DataType s_scalarTypes[] =
    451 	{
    452 		TYPE_INVALID,							// invalid
    453 		TYPE_FLOAT,								// float
    454 		TYPE_FLOAT,								// vec2
    455 		TYPE_FLOAT,								// vec3
    456 		TYPE_FLOAT,								// vec4
    457 		TYPE_FLOAT,								// mat2
    458 		TYPE_FLOAT,								// mat2x3
    459 		TYPE_FLOAT,								// mat2x4
    460 		TYPE_FLOAT,								// mat3x2
    461 		TYPE_FLOAT,								// mat3
    462 		TYPE_FLOAT,								// mat3x4
    463 		TYPE_FLOAT,								// mat4x2
    464 		TYPE_FLOAT,								// mat4x3
    465 		TYPE_FLOAT,								// mat4
    466 		TYPE_DOUBLE,							// double
    467 		TYPE_DOUBLE,							// dvec2
    468 		TYPE_DOUBLE,							// dvec3
    469 		TYPE_DOUBLE,							// dvec4
    470 		TYPE_DOUBLE,							// dmat2
    471 		TYPE_DOUBLE,							// dmat2x3
    472 		TYPE_DOUBLE,							// dmat2x4
    473 		TYPE_DOUBLE,							// dmat3x2
    474 		TYPE_DOUBLE,							// dmat3
    475 		TYPE_DOUBLE,							// dmat3x4
    476 		TYPE_DOUBLE,							// dmat4x2
    477 		TYPE_DOUBLE,							// dmat4x3
    478 		TYPE_DOUBLE,							// dmat4
    479 		TYPE_INT,								// int
    480 		TYPE_INT,								// ivec2
    481 		TYPE_INT,								// ivec3
    482 		TYPE_INT,								// ivec4
    483 		TYPE_UINT,								// uint
    484 		TYPE_UINT,								// uvec2
    485 		TYPE_UINT,								// uvec3
    486 		TYPE_UINT,								// uvec4
    487 		TYPE_BOOL,								// bool
    488 		TYPE_BOOL,								// bvec2
    489 		TYPE_BOOL,								// bvec3
    490 		TYPE_BOOL,								// bvec4
    491 		TYPE_SAMPLER_1D,						// sampler1D
    492 		TYPE_SAMPLER_2D,						// sampler2D
    493 		TYPE_SAMPLER_CUBE,						// samplerCube
    494 		TYPE_SAMPLER_1D_ARRAY,					// sampler1DArray
    495 		TYPE_SAMPLER_2D_ARRAY,					// sampler2DArray
    496 		TYPE_SAMPLER_3D,						// sampler3D
    497 		TYPE_SAMPLER_CUBE_ARRAY,				// samplerCubeArray
    498 		TYPE_SAMPLER_1D_SHADOW,					// sampler1DShadow
    499 		TYPE_SAMPLER_2D_SHADOW,					// sampler2DShadow
    500 		TYPE_SAMPLER_CUBE_SHADOW,				// samplerCubeShadow
    501 		TYPE_SAMPLER_1D_ARRAY_SHADOW,			// sampler1DArrayShadow
    502 		TYPE_SAMPLER_2D_ARRAY_SHADOW,			// sampler2DArrayShadow
    503 		TYPE_SAMPLER_CUBE_ARRAY_SHADOW,			// samplerCubeArrayShadow
    504 		TYPE_INT_SAMPLER_1D,					// isampler1D
    505 		TYPE_INT_SAMPLER_2D,					// isampler2D
    506 		TYPE_INT_SAMPLER_CUBE,					// isamplerCube
    507 		TYPE_INT_SAMPLER_1D_ARRAY,				// isampler1DArray
    508 		TYPE_INT_SAMPLER_2D_ARRAY,				// isampler2DArray
    509 		TYPE_INT_SAMPLER_3D,					// isampler3D
    510 		TYPE_INT_SAMPLER_CUBE_ARRAY,			// isamplerCubeArray
    511 		TYPE_UINT_SAMPLER_1D,					// usampler1D
    512 		TYPE_UINT_SAMPLER_2D,					// usampler2D
    513 		TYPE_UINT_SAMPLER_CUBE,					// usamplerCube
    514 		TYPE_UINT_SAMPLER_1D_ARRAY,				// usampler1DArray
    515 		TYPE_UINT_SAMPLER_2D_ARRAY,				// usampler2DArray
    516 		TYPE_UINT_SAMPLER_3D,					// usampler3D
    517 		TYPE_UINT_SAMPLER_CUBE_ARRAY,			// usamplerCubeArray
    518 		TYPE_SAMPLER_2D_MULTISAMPLE,			// sampler2DMS
    519 		TYPE_INT_SAMPLER_2D_MULTISAMPLE,		// isampler2DMS
    520 		TYPE_UINT_SAMPLER_2D_MULTISAMPLE,		// usampler2DMS
    521 		TYPE_IMAGE_2D,							// image2D
    522 		TYPE_IMAGE_CUBE,						// imageCube
    523 		TYPE_IMAGE_2D_ARRAY,					// image2DArray
    524 		TYPE_IMAGE_3D,							// image3D
    525 		TYPE_IMAGE_CUBE_ARRAY,					// imageCubeArray
    526 		TYPE_INT_IMAGE_2D,						// iimage2D
    527 		TYPE_INT_IMAGE_CUBE,					// iimageCube
    528 		TYPE_INT_IMAGE_2D_ARRAY,				// iimage2DArray
    529 		TYPE_INT_IMAGE_3D,						// iimage3D
    530 		TYPE_INT_IMAGE_CUBE_ARRAY,				// iimageCubeArray
    531 		TYPE_UINT_IMAGE_2D,						// uimage2D
    532 		TYPE_UINT_IMAGE_CUBE,					// uimageCube
    533 		TYPE_UINT_IMAGE_2D_ARRAY,				// uimage2DArray
    534 		TYPE_UINT_IMAGE_3D,						// uimage3D
    535 		TYPE_UINT_IMAGE_CUBE_ARRAY,				// uimageCubeArray
    536 		TYPE_UINT_ATOMIC_COUNTER,				// atomic_uint
    537 		TYPE_SAMPLER_BUFFER,					// samplerBuffer
    538 		TYPE_INT_SAMPLER_BUFFER,				// isamplerBuffer
    539 		TYPE_UINT_SAMPLER_BUFFER,				// usamplerBuffer
    540 		TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY,		// sampler2DMSArray
    541 		TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,	// isampler2DMSArray
    542 		TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY,	// usampler2DMSArray
    543 		TYPE_IMAGE_BUFFER,						// imageBuffer
    544 		TYPE_INT_IMAGE_BUFFER,					// iimageBuffer
    545 		TYPE_UINT_IMAGE_BUFFER,					// uimageBuffer
    546 		TYPE_UINT8,								// uint8_t
    547 		TYPE_UINT8,								// u8vec2
    548 		TYPE_UINT8,								// u8vec3
    549 		TYPE_UINT8,								// u8vec4
    550 		TYPE_INT8,								// int8_t
    551 		TYPE_INT8,								// i8vec2
    552 		TYPE_INT8,								// i8vec3
    553 		TYPE_INT8,								// i8vec4
    554 		TYPE_UINT16,							// uint16_t
    555 		TYPE_UINT16,							// u16vec2
    556 		TYPE_UINT16,							// u16vec3
    557 		TYPE_UINT16,							// u16vec4
    558 		TYPE_INT16,								// int16_t
    559 		TYPE_INT16,								// i16vec2
    560 		TYPE_INT16,								// i16vec3
    561 		TYPE_INT16,								// i16vec4
    562 		TYPE_FLOAT16,							// float16_t
    563 		TYPE_FLOAT16,							// f16vec2
    564 		TYPE_FLOAT16,							// f16vec3
    565 		TYPE_FLOAT16,							// f16vec4
    566 		TYPE_FLOAT16,							// f16mat2
    567 		TYPE_FLOAT16,							// f16mat2x3
    568 		TYPE_FLOAT16,							// f16mat2x4
    569 		TYPE_FLOAT16,							// f16mat3x2
    570 		TYPE_FLOAT16,							// f16mat3
    571 		TYPE_FLOAT16,							// f16mat3x4
    572 		TYPE_FLOAT16,							// f16mat4x2
    573 		TYPE_FLOAT16,							// f16mat4x3
    574 		TYPE_FLOAT16,							// f16mat4
    575 	};
    576 
    577 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
    578 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
    579 	return s_scalarTypes[(int)dataType];
    580 }
    581 
    582 DataType getDataTypeFloat16Scalars (DataType dataType)
    583 {
    584 	static const DataType s_floatTypes[] =
    585 	{
    586 		TYPE_INVALID,			// invalid
    587 		TYPE_FLOAT16,			// float
    588 		TYPE_FLOAT16_VEC2,		// vec2
    589 		TYPE_FLOAT16_VEC3,		// vec3
    590 		TYPE_FLOAT16_VEC4,		// vec4
    591 		TYPE_FLOAT16_MAT2,		// mat2
    592 		TYPE_FLOAT16_MAT2X3,	// mat2x3
    593 		TYPE_FLOAT16_MAT2X4,	// mat2x4
    594 		TYPE_FLOAT16_MAT3X2,	// mat3x2
    595 		TYPE_FLOAT16_MAT3,		// mat3
    596 		TYPE_FLOAT16_MAT3X4,	// mat3x4
    597 		TYPE_FLOAT16_MAT4X2,	// mat4x2
    598 		TYPE_FLOAT16_MAT4X3,	// mat4x3
    599 		TYPE_FLOAT16_MAT4,		// mat4
    600 		TYPE_FLOAT16,			// double
    601 		TYPE_FLOAT16_VEC2,		// dvec2
    602 		TYPE_FLOAT16_VEC3,		// dvec3
    603 		TYPE_FLOAT16_VEC4,		// dvec4
    604 		TYPE_FLOAT16_MAT2,		// dmat2
    605 		TYPE_FLOAT16_MAT2X3,	// dmat2x3
    606 		TYPE_FLOAT16_MAT2X4,	// dmat2x4
    607 		TYPE_FLOAT16_MAT3X2,	// dmat3x2
    608 		TYPE_FLOAT16_MAT3,		// dmat3
    609 		TYPE_FLOAT16_MAT3X4,	// dmat3x4
    610 		TYPE_FLOAT16_MAT4X2,	// dmat4x2
    611 		TYPE_FLOAT16_MAT4X3,	// dmat4x3
    612 		TYPE_FLOAT16_MAT4,		// dmat4
    613 		TYPE_FLOAT16,			// int
    614 		TYPE_FLOAT16_VEC2,		// ivec2
    615 		TYPE_FLOAT16_VEC3,		// ivec3
    616 		TYPE_FLOAT16_VEC4,		// ivec4
    617 		TYPE_FLOAT16,			// uint
    618 		TYPE_FLOAT16_VEC2,		// uvec2
    619 		TYPE_FLOAT16_VEC3,		// uvec3
    620 		TYPE_FLOAT16_VEC4,		// uvec4
    621 		TYPE_FLOAT16,			// bool
    622 		TYPE_FLOAT16_VEC2,		// bvec2
    623 		TYPE_FLOAT16_VEC3,		// bvec3
    624 		TYPE_FLOAT16_VEC4,		// bvec4
    625 		TYPE_INVALID,			// sampler1D
    626 		TYPE_INVALID,			// sampler2D
    627 		TYPE_INVALID,			// samplerCube
    628 		TYPE_INVALID,			// sampler1DArray
    629 		TYPE_INVALID,			// sampler2DArray
    630 		TYPE_INVALID,			// sampler3D
    631 		TYPE_INVALID,			// samplerCubeArray
    632 		TYPE_INVALID,			// sampler1DShadow
    633 		TYPE_INVALID,			// sampler2DShadow
    634 		TYPE_INVALID,			// samplerCubeShadow
    635 		TYPE_INVALID,			// sampler1DArrayShadow
    636 		TYPE_INVALID,			// sampler2DArrayShadow
    637 		TYPE_INVALID,			// samplerCubeArrayShadow
    638 		TYPE_INVALID,			// isampler1D
    639 		TYPE_INVALID,			// isampler2D
    640 		TYPE_INVALID,			// isamplerCube
    641 		TYPE_INVALID,			// isampler1DArray
    642 		TYPE_INVALID,			// isampler2DArray
    643 		TYPE_INVALID,			// isampler3D
    644 		TYPE_INVALID,			// isamplerCubeArray
    645 		TYPE_INVALID,			// usampler1D
    646 		TYPE_INVALID,			// usampler2D
    647 		TYPE_INVALID,			// usamplerCube
    648 		TYPE_INVALID,			// usampler1DArray
    649 		TYPE_INVALID,			// usampler2DArray
    650 		TYPE_INVALID,			// usampler3D
    651 		TYPE_INVALID,			// usamplerCubeArray
    652 		TYPE_INVALID,			// sampler2DMS
    653 		TYPE_INVALID,			// isampler2DMS
    654 		TYPE_INVALID,			// usampler2DMS
    655 		TYPE_INVALID,			// image2D
    656 		TYPE_INVALID,			// imageCube
    657 		TYPE_INVALID,			// image2DArray
    658 		TYPE_INVALID,			// image3D
    659 		TYPE_INVALID,			// imageCubeArray
    660 		TYPE_INVALID,			// iimage2D
    661 		TYPE_INVALID,			// iimageCube
    662 		TYPE_INVALID,			// iimage2DArray
    663 		TYPE_INVALID,			// iimage3D
    664 		TYPE_INVALID,			// iimageCubeArray
    665 		TYPE_INVALID,			// uimage2D
    666 		TYPE_INVALID,			// uimageCube
    667 		TYPE_INVALID,			// uimage2DArray
    668 		TYPE_INVALID,			// uimage3D
    669 		TYPE_INVALID,			// uimageCubeArray
    670 		TYPE_INVALID,			// atomic_uint
    671 		TYPE_INVALID,			// samplerBuffer
    672 		TYPE_INVALID,			// isamplerBuffer
    673 		TYPE_INVALID,			// usamplerBuffer
    674 		TYPE_INVALID,			// sampler2DMSArray
    675 		TYPE_INVALID,			// isampler2DMSArray
    676 		TYPE_INVALID,			// usampler2DMSArray
    677 		TYPE_INVALID,			// imageBuffer
    678 		TYPE_INVALID,			// iimageBuffer
    679 		TYPE_INVALID,			// uimageBuffer
    680 		TYPE_FLOAT16,			// uint8_t
    681 		TYPE_FLOAT16_VEC2,		// u8vec2
    682 		TYPE_FLOAT16_VEC3,		// u8vec3
    683 		TYPE_FLOAT16_VEC4,		// u8vec4
    684 		TYPE_FLOAT16,			// int8_t
    685 		TYPE_FLOAT16_VEC2,		// i8vec2
    686 		TYPE_FLOAT16_VEC3,		// i8vec3
    687 		TYPE_FLOAT16_VEC4,		// i8vec4
    688 		TYPE_FLOAT16,			// uint16_t
    689 		TYPE_FLOAT16_VEC2,		// u16vec2
    690 		TYPE_FLOAT16_VEC3,		// u16vec3
    691 		TYPE_FLOAT16_VEC4,		// u16vec4
    692 		TYPE_FLOAT16,			// int16_t
    693 		TYPE_FLOAT16_VEC2,		// i16vec2
    694 		TYPE_FLOAT16_VEC3,		// i16vec3
    695 		TYPE_FLOAT16_VEC4,		// i16vec4
    696 		TYPE_FLOAT16,			// float16_t
    697 		TYPE_FLOAT16_VEC2,		// f16vec2
    698 		TYPE_FLOAT16_VEC3,		// f16vec3
    699 		TYPE_FLOAT16_VEC4,		// f16vec4
    700 		TYPE_FLOAT16_MAT2,		// f16mat2
    701 		TYPE_FLOAT16_MAT2X3,	// f16mat2x3
    702 		TYPE_FLOAT16_MAT2X4,	// f16mat2x4
    703 		TYPE_FLOAT16_MAT3X2,	// f16mat3x2
    704 		TYPE_FLOAT16_MAT3,		// f16mat3
    705 		TYPE_FLOAT16_MAT3X4,	// f16mat3x4
    706 		TYPE_FLOAT16_MAT4X2,	// f16mat4x2
    707 		TYPE_FLOAT16_MAT4X3,	// f16mat4x3
    708 		TYPE_FLOAT16_MAT4,		// f16mat4
    709 	};
    710 
    711 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
    712 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
    713 	return s_floatTypes[(int)dataType];
    714 }
    715 
    716 DataType getDataTypeFloatScalars (DataType dataType)
    717 {
    718 	static const DataType s_floatTypes[] =
    719 	{
    720 		TYPE_INVALID,		// invalid
    721 		TYPE_FLOAT,			// float
    722 		TYPE_FLOAT_VEC2,	// vec2
    723 		TYPE_FLOAT_VEC3,	// vec3
    724 		TYPE_FLOAT_VEC4,	// vec4
    725 		TYPE_FLOAT_MAT2,	// mat2
    726 		TYPE_FLOAT_MAT2X3,	// mat2x3
    727 		TYPE_FLOAT_MAT2X4,	// mat2x4
    728 		TYPE_FLOAT_MAT3X2,	// mat3x2
    729 		TYPE_FLOAT_MAT3,	// mat3
    730 		TYPE_FLOAT_MAT3X4,	// mat3x4
    731 		TYPE_FLOAT_MAT4X2,	// mat4x2
    732 		TYPE_FLOAT_MAT4X3,	// mat4x3
    733 		TYPE_FLOAT_MAT4,	// mat4
    734 		TYPE_FLOAT,			// double
    735 		TYPE_FLOAT_VEC2,	// dvec2
    736 		TYPE_FLOAT_VEC3,	// dvec3
    737 		TYPE_FLOAT_VEC4,	// dvec4
    738 		TYPE_FLOAT_MAT2,	// dmat2
    739 		TYPE_FLOAT_MAT2X3,	// dmat2x3
    740 		TYPE_FLOAT_MAT2X4,	// dmat2x4
    741 		TYPE_FLOAT_MAT3X2,	// dmat3x2
    742 		TYPE_FLOAT_MAT3,	// dmat3
    743 		TYPE_FLOAT_MAT3X4,	// dmat3x4
    744 		TYPE_FLOAT_MAT4X2,	// dmat4x2
    745 		TYPE_FLOAT_MAT4X3,	// dmat4x3
    746 		TYPE_FLOAT_MAT4,	// dmat4
    747 		TYPE_FLOAT,			// int
    748 		TYPE_FLOAT_VEC2,	// ivec2
    749 		TYPE_FLOAT_VEC3,	// ivec3
    750 		TYPE_FLOAT_VEC4,	// ivec4
    751 		TYPE_FLOAT,			// uint
    752 		TYPE_FLOAT_VEC2,	// uvec2
    753 		TYPE_FLOAT_VEC3,	// uvec3
    754 		TYPE_FLOAT_VEC4,	// uvec4
    755 		TYPE_FLOAT,			// bool
    756 		TYPE_FLOAT_VEC2,	// bvec2
    757 		TYPE_FLOAT_VEC3,	// bvec3
    758 		TYPE_FLOAT_VEC4,	// bvec4
    759 		TYPE_INVALID,		// sampler1D
    760 		TYPE_INVALID,		// sampler2D
    761 		TYPE_INVALID,		// samplerCube
    762 		TYPE_INVALID,		// sampler1DArray
    763 		TYPE_INVALID,		// sampler2DArray
    764 		TYPE_INVALID,		// sampler3D
    765 		TYPE_INVALID,		// samplerCubeArray
    766 		TYPE_INVALID,		// sampler1DShadow
    767 		TYPE_INVALID,		// sampler2DShadow
    768 		TYPE_INVALID,		// samplerCubeShadow
    769 		TYPE_INVALID,		// sampler1DArrayShadow
    770 		TYPE_INVALID,		// sampler2DArrayShadow
    771 		TYPE_INVALID,		// samplerCubeArrayShadow
    772 		TYPE_INVALID,		// isampler1D
    773 		TYPE_INVALID,		// isampler2D
    774 		TYPE_INVALID,		// isamplerCube
    775 		TYPE_INVALID,		// isampler1DArray
    776 		TYPE_INVALID,		// isampler2DArray
    777 		TYPE_INVALID,		// isampler3D
    778 		TYPE_INVALID,		// isamplerCubeArray
    779 		TYPE_INVALID,		// usampler1D
    780 		TYPE_INVALID,		// usampler2D
    781 		TYPE_INVALID,		// usamplerCube
    782 		TYPE_INVALID,		// usampler1DArray
    783 		TYPE_INVALID,		// usampler2DArray
    784 		TYPE_INVALID,		// usampler3D
    785 		TYPE_INVALID,		// usamplerCubeArray
    786 		TYPE_INVALID,		// sampler2DMS
    787 		TYPE_INVALID,		// isampler2DMS
    788 		TYPE_INVALID,		// usampler2DMS
    789 		TYPE_INVALID,		// image2D
    790 		TYPE_INVALID,		// imageCube
    791 		TYPE_INVALID,		// image2DArray
    792 		TYPE_INVALID,		// image3D
    793 		TYPE_INVALID,		// imageCubeArray
    794 		TYPE_INVALID,		// iimage2D
    795 		TYPE_INVALID,		// iimageCube
    796 		TYPE_INVALID,		// iimage2DArray
    797 		TYPE_INVALID,		// iimage3D
    798 		TYPE_INVALID,		// iimageCubeArray
    799 		TYPE_INVALID,		// uimage2D
    800 		TYPE_INVALID,		// uimageCube
    801 		TYPE_INVALID,		// uimage2DArray
    802 		TYPE_INVALID,		// uimage3D
    803 		TYPE_INVALID,		// uimageCubeArray
    804 		TYPE_INVALID,		// atomic_uint
    805 		TYPE_INVALID,		// samplerBuffer
    806 		TYPE_INVALID,		// isamplerBuffer
    807 		TYPE_INVALID,		// usamplerBuffer
    808 		TYPE_INVALID,		// sampler2DMSArray
    809 		TYPE_INVALID,		// isampler2DMSArray
    810 		TYPE_INVALID,		// usampler2DMSArray
    811 		TYPE_INVALID,		// imageBuffer
    812 		TYPE_INVALID,		// iimageBuffer
    813 		TYPE_INVALID,		// uimageBuffer
    814 		TYPE_FLOAT,			// uint8_t
    815 		TYPE_FLOAT_VEC2,	// u8vec2
    816 		TYPE_FLOAT_VEC3,	// u8vec3
    817 		TYPE_FLOAT_VEC4,	// u8vec4
    818 		TYPE_FLOAT,			// int8_t
    819 		TYPE_FLOAT_VEC2,	// i8vec2
    820 		TYPE_FLOAT_VEC3,	// i8vec3
    821 		TYPE_FLOAT_VEC4,	// i8vec4
    822 		TYPE_FLOAT,			// uint16_t
    823 		TYPE_FLOAT_VEC2,	// u16vec2
    824 		TYPE_FLOAT_VEC3,	// u16vec3
    825 		TYPE_FLOAT_VEC4,	// u16vec4
    826 		TYPE_FLOAT,			// int16_t
    827 		TYPE_FLOAT_VEC2,	// i16vec2
    828 		TYPE_FLOAT_VEC3,	// i16vec3
    829 		TYPE_FLOAT_VEC4,	// i16vec4
    830 		TYPE_FLOAT,			// float16_t
    831 		TYPE_FLOAT_VEC2,	// f16vec2
    832 		TYPE_FLOAT_VEC3,	// f16vec3
    833 		TYPE_FLOAT_VEC4,	// f16vec4
    834 		TYPE_FLOAT_MAT2,	// f16mat2
    835 		TYPE_FLOAT_MAT2X3,	// f16mat2x3
    836 		TYPE_FLOAT_MAT2X4,	// f16mat2x4
    837 		TYPE_FLOAT_MAT3X2,	// f16mat3x2
    838 		TYPE_FLOAT_MAT3,	// f16mat3
    839 		TYPE_FLOAT_MAT3X4,	// f16mat3x4
    840 		TYPE_FLOAT_MAT4X2,	// f16mat4x2
    841 		TYPE_FLOAT_MAT4X3,	// f16mat4x3
    842 		TYPE_FLOAT_MAT4,	// f16mat4
    843 	};
    844 
    845 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
    846 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
    847 	return s_floatTypes[(int)dataType];
    848 }
    849 
    850 DataType getDataTypeDoubleScalars (DataType dataType)
    851 {
    852 	static const DataType s_doubleTypes[] =
    853 	{
    854 		TYPE_INVALID,		// invalid
    855 		TYPE_DOUBLE,		// float
    856 		TYPE_DOUBLE_VEC2,	// vec2
    857 		TYPE_DOUBLE_VEC3,	// vec3
    858 		TYPE_DOUBLE_VEC4,	// vec4
    859 		TYPE_DOUBLE_MAT2,	// mat2
    860 		TYPE_DOUBLE_MAT2X3,	// mat2x3
    861 		TYPE_DOUBLE_MAT2X4,	// mat2x4
    862 		TYPE_DOUBLE_MAT3X2,	// mat3x2
    863 		TYPE_DOUBLE_MAT3,	// mat3
    864 		TYPE_DOUBLE_MAT3X4,	// mat3x4
    865 		TYPE_DOUBLE_MAT4X2,	// mat4x2
    866 		TYPE_DOUBLE_MAT4X3,	// mat4x3
    867 		TYPE_DOUBLE_MAT4,	// mat4
    868 		TYPE_DOUBLE,		// double
    869 		TYPE_DOUBLE_VEC2,	// dvec2
    870 		TYPE_DOUBLE_VEC3,	// dvec3
    871 		TYPE_DOUBLE_VEC4,	// dvec4
    872 		TYPE_DOUBLE_MAT2,	// dmat2
    873 		TYPE_DOUBLE_MAT2X3,	// dmat2x3
    874 		TYPE_DOUBLE_MAT2X4,	// dmat2x4
    875 		TYPE_DOUBLE_MAT3X2,	// dmat3x2
    876 		TYPE_DOUBLE_MAT3,	// dmat3
    877 		TYPE_DOUBLE_MAT3X4,	// dmat3x4
    878 		TYPE_DOUBLE_MAT4X2,	// dmat4x2
    879 		TYPE_DOUBLE_MAT4X3,	// dmat4x3
    880 		TYPE_DOUBLE_MAT4,	// dmat4
    881 		TYPE_DOUBLE,		// int
    882 		TYPE_DOUBLE_VEC2,	// ivec2
    883 		TYPE_DOUBLE_VEC3,	// ivec3
    884 		TYPE_DOUBLE_VEC4,	// ivec4
    885 		TYPE_DOUBLE,		// uint
    886 		TYPE_DOUBLE_VEC2,	// uvec2
    887 		TYPE_DOUBLE_VEC3,	// uvec3
    888 		TYPE_DOUBLE_VEC4,	// uvec4
    889 		TYPE_DOUBLE,		// bool
    890 		TYPE_DOUBLE_VEC2,	// bvec2
    891 		TYPE_DOUBLE_VEC3,	// bvec3
    892 		TYPE_DOUBLE_VEC4,	// bvec4
    893 		TYPE_INVALID,		// sampler1D
    894 		TYPE_INVALID,		// sampler2D
    895 		TYPE_INVALID,		// samplerCube
    896 		TYPE_INVALID,		// sampler1DArray
    897 		TYPE_INVALID,		// sampler2DArray
    898 		TYPE_INVALID,		// sampler3D
    899 		TYPE_INVALID,		// samplerCubeArray
    900 		TYPE_INVALID,		// sampler1DShadow
    901 		TYPE_INVALID,		// sampler2DShadow
    902 		TYPE_INVALID,		// samplerCubeShadow
    903 		TYPE_INVALID,		// sampler1DArrayShadow
    904 		TYPE_INVALID,		// sampler2DArrayShadow
    905 		TYPE_INVALID,		// samplerCubeArrayShadow
    906 		TYPE_INVALID,		// isampler1D
    907 		TYPE_INVALID,		// isampler2D
    908 		TYPE_INVALID,		// isamplerCube
    909 		TYPE_INVALID,		// isampler1DArray
    910 		TYPE_INVALID,		// isampler2DArray
    911 		TYPE_INVALID,		// isampler3D
    912 		TYPE_INVALID,		// isamplerCubeArray
    913 		TYPE_INVALID,		// usampler1D
    914 		TYPE_INVALID,		// usampler2D
    915 		TYPE_INVALID,		// usamplerCube
    916 		TYPE_INVALID,		// usampler1DArray
    917 		TYPE_INVALID,		// usampler2DArray
    918 		TYPE_INVALID,		// usampler3D
    919 		TYPE_INVALID,		// usamplerCubeArray
    920 		TYPE_INVALID,		// sampler2DMS
    921 		TYPE_INVALID,		// isampler2DMS
    922 		TYPE_INVALID,		// usampler2DMS
    923 		TYPE_INVALID,		// image2D
    924 		TYPE_INVALID,		// imageCube
    925 		TYPE_INVALID,		// image2DArray
    926 		TYPE_INVALID,		// image3D
    927 		TYPE_INVALID,		// imageCubeArray
    928 		TYPE_INVALID,		// iimage2D
    929 		TYPE_INVALID,		// iimageCube
    930 		TYPE_INVALID,		// iimage2DArray
    931 		TYPE_INVALID,		// iimage3D
    932 		TYPE_INVALID,		// iimageCubeArray
    933 		TYPE_INVALID,		// uimage2D
    934 		TYPE_INVALID,		// uimageCube
    935 		TYPE_INVALID,		// uimage2DArray
    936 		TYPE_INVALID,		// uimage3D
    937 		TYPE_INVALID,		// uimageCubeArray
    938 		TYPE_INVALID,		// atomic_uint
    939 		TYPE_INVALID,		// samplerBuffer
    940 		TYPE_INVALID,		// isamplerBuffer
    941 		TYPE_INVALID,		// usamplerBuffer
    942 		TYPE_INVALID,		// sampler2DMSArray
    943 		TYPE_INVALID,		// isampler2DMSArray
    944 		TYPE_INVALID,		// usampler2DMSArray
    945 		TYPE_INVALID,		// imageBuffer
    946 		TYPE_INVALID,		// iimageBuffer
    947 		TYPE_INVALID,		// uimageBuffer
    948 		TYPE_DOUBLE,		// uint18_t
    949 		TYPE_DOUBLE_VEC2,	// u8vec2
    950 		TYPE_DOUBLE_VEC3,	// u8vec3
    951 		TYPE_DOUBLE_VEC4,	// u8vec4
    952 		TYPE_DOUBLE,		// int8_t
    953 		TYPE_DOUBLE_VEC2,	// i8vec2
    954 		TYPE_DOUBLE_VEC3,	// i8vec3
    955 		TYPE_DOUBLE_VEC4,	// i8vec4
    956 		TYPE_DOUBLE,		// uint16_t
    957 		TYPE_DOUBLE_VEC2,	// u16vec2
    958 		TYPE_DOUBLE_VEC3,	// u16vec3
    959 		TYPE_DOUBLE_VEC4,	// u16vec4
    960 		TYPE_DOUBLE,		// int16_t
    961 		TYPE_DOUBLE_VEC2,	// i16vec2
    962 		TYPE_DOUBLE_VEC3,	// i16vec3
    963 		TYPE_DOUBLE_VEC4,	// i16vec4
    964 		TYPE_DOUBLE,		// float16_t
    965 		TYPE_DOUBLE_VEC2,	// f16vec2
    966 		TYPE_DOUBLE_VEC3,	// f16vec3
    967 		TYPE_DOUBLE_VEC4,	// f16vec4
    968 		TYPE_DOUBLE_MAT2,	// f16mat2
    969 		TYPE_DOUBLE_MAT2X3,	// f16mat2x3
    970 		TYPE_DOUBLE_MAT2X4,	// f16mat2x4
    971 		TYPE_DOUBLE_MAT3X2,	// f16mat3x2
    972 		TYPE_DOUBLE_MAT3,	// f16mat3
    973 		TYPE_DOUBLE_MAT3X4,	// f16mat3x4
    974 		TYPE_DOUBLE_MAT4X2,	// f16mat4x2
    975 		TYPE_DOUBLE_MAT4X3,	// f16mat4x3
    976 		TYPE_DOUBLE_MAT4,	// f16mat4
    977 	};
    978 
    979 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_doubleTypes) == TYPE_LAST);
    980 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_doubleTypes)));
    981 	return s_doubleTypes[(int)dataType];
    982 }
    983 
    984 DataType getDataTypeVector (DataType scalarType, int size)
    985 {
    986 	DE_ASSERT(deInRange32(size, 1, 4));
    987 	switch (scalarType)
    988 	{
    989 		case TYPE_FLOAT:
    990 		case TYPE_DOUBLE:
    991 		case TYPE_INT:
    992 		case TYPE_UINT:
    993 		case TYPE_BOOL:
    994 		case TYPE_UINT8:
    995 		case TYPE_INT8:
    996 		case TYPE_UINT16:
    997 		case TYPE_INT16:
    998 		case TYPE_FLOAT16:
    999 			return (DataType)((int)scalarType + size - 1);
   1000 		default:
   1001 			return TYPE_INVALID;
   1002 	}
   1003 }
   1004 
   1005 DataType getDataTypeFloatVec (int vecSize)
   1006 {
   1007 	return getDataTypeVector(TYPE_FLOAT, vecSize);
   1008 }
   1009 
   1010 DataType getDataTypeIntVec (int vecSize)
   1011 {
   1012 	return getDataTypeVector(TYPE_INT, vecSize);
   1013 }
   1014 
   1015 DataType getDataTypeUintVec (int vecSize)
   1016 {
   1017 	return getDataTypeVector(TYPE_UINT, vecSize);
   1018 }
   1019 
   1020 DataType getDataTypeBoolVec (int vecSize)
   1021 {
   1022 	return getDataTypeVector(TYPE_BOOL, vecSize);
   1023 }
   1024 
   1025 DataType getDataTypeMatrix (int numCols, int numRows)
   1026 {
   1027 	DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
   1028 	return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
   1029 }
   1030 
   1031 int getDataTypeMatrixNumRows (DataType dataType)
   1032 {
   1033 	switch (dataType)
   1034 	{
   1035 		case TYPE_FLOAT_MAT2:		return 2;
   1036 		case TYPE_FLOAT_MAT2X3:		return 3;
   1037 		case TYPE_FLOAT_MAT2X4:		return 4;
   1038 		case TYPE_FLOAT_MAT3X2:		return 2;
   1039 		case TYPE_FLOAT_MAT3:		return 3;
   1040 		case TYPE_FLOAT_MAT3X4:		return 4;
   1041 		case TYPE_FLOAT_MAT4X2:		return 2;
   1042 		case TYPE_FLOAT_MAT4X3:		return 3;
   1043 		case TYPE_FLOAT_MAT4:		return 4;
   1044 		case TYPE_DOUBLE_MAT2:		return 2;
   1045 		case TYPE_DOUBLE_MAT2X3:	return 3;
   1046 		case TYPE_DOUBLE_MAT2X4:	return 4;
   1047 		case TYPE_DOUBLE_MAT3X2:	return 2;
   1048 		case TYPE_DOUBLE_MAT3:		return 3;
   1049 		case TYPE_DOUBLE_MAT3X4:	return 4;
   1050 		case TYPE_DOUBLE_MAT4X2:	return 2;
   1051 		case TYPE_DOUBLE_MAT4X3:	return 3;
   1052 		case TYPE_DOUBLE_MAT4:		return 4;
   1053 		case TYPE_FLOAT16_MAT2:		return 2;
   1054 		case TYPE_FLOAT16_MAT2X3:	return 3;
   1055 		case TYPE_FLOAT16_MAT2X4:	return 4;
   1056 		case TYPE_FLOAT16_MAT3X2:	return 2;
   1057 		case TYPE_FLOAT16_MAT3:		return 3;
   1058 		case TYPE_FLOAT16_MAT3X4:	return 4;
   1059 		case TYPE_FLOAT16_MAT4X2:	return 2;
   1060 		case TYPE_FLOAT16_MAT4X3:	return 3;
   1061 		case TYPE_FLOAT16_MAT4:		return 4;
   1062 		default:
   1063 			DE_ASSERT(false);
   1064 			return 0;
   1065 	}
   1066 }
   1067 
   1068 int getDataTypeMatrixNumColumns (DataType dataType)
   1069 {
   1070 	switch (dataType)
   1071 	{
   1072 		case TYPE_FLOAT_MAT2:		return 2;
   1073 		case TYPE_FLOAT_MAT2X3:		return 2;
   1074 		case TYPE_FLOAT_MAT2X4:		return 2;
   1075 		case TYPE_FLOAT_MAT3X2:		return 3;
   1076 		case TYPE_FLOAT_MAT3:		return 3;
   1077 		case TYPE_FLOAT_MAT3X4:		return 3;
   1078 		case TYPE_FLOAT_MAT4X2:		return 4;
   1079 		case TYPE_FLOAT_MAT4X3:		return 4;
   1080 		case TYPE_FLOAT_MAT4:		return 4;
   1081 		case TYPE_DOUBLE_MAT2:		return 2;
   1082 		case TYPE_DOUBLE_MAT2X3:	return 2;
   1083 		case TYPE_DOUBLE_MAT2X4:	return 2;
   1084 		case TYPE_DOUBLE_MAT3X2:	return 3;
   1085 		case TYPE_DOUBLE_MAT3:		return 3;
   1086 		case TYPE_DOUBLE_MAT3X4:	return 3;
   1087 		case TYPE_DOUBLE_MAT4X2:	return 4;
   1088 		case TYPE_DOUBLE_MAT4X3:	return 4;
   1089 		case TYPE_DOUBLE_MAT4:		return 4;
   1090 		case TYPE_FLOAT16_MAT2:		return 2;
   1091 		case TYPE_FLOAT16_MAT2X3:	return 2;
   1092 		case TYPE_FLOAT16_MAT2X4:	return 2;
   1093 		case TYPE_FLOAT16_MAT3X2:	return 3;
   1094 		case TYPE_FLOAT16_MAT3:		return 3;
   1095 		case TYPE_FLOAT16_MAT3X4:	return 3;
   1096 		case TYPE_FLOAT16_MAT4X2:	return 4;
   1097 		case TYPE_FLOAT16_MAT4X3:	return 4;
   1098 		case TYPE_FLOAT16_MAT4:		return 4;
   1099 		default:
   1100 			DE_ASSERT(false);
   1101 			return 0;
   1102 	}
   1103 }
   1104 
   1105 int	getDataTypeNumLocations	(DataType dataType)
   1106 {
   1107 	if (isDataTypeScalarOrVector(dataType))
   1108 		return 1;
   1109 	else if (isDataTypeMatrix(dataType))
   1110 		return getDataTypeMatrixNumColumns(dataType);
   1111 
   1112 	DE_FATAL("Illegal datatype.");
   1113 	return 0;
   1114 }
   1115 
   1116 int	getDataTypeNumComponents (DataType dataType)
   1117 {
   1118 	if (isDataTypeScalarOrVector(dataType))
   1119 		return getDataTypeScalarSize(dataType);
   1120 	else if (isDataTypeMatrix(dataType))
   1121 		return getDataTypeMatrixNumRows(dataType);
   1122 
   1123 	DE_FATAL("Illegal datatype.");
   1124 	return 0;
   1125 }
   1126 
   1127 DataType getDataTypeFromGLType (deUint32 glType)
   1128 {
   1129 	switch (glType)
   1130 	{
   1131 		case GL_FLOAT:										return TYPE_FLOAT;
   1132 		case GL_FLOAT_VEC2:									return TYPE_FLOAT_VEC2;
   1133 		case GL_FLOAT_VEC3:									return TYPE_FLOAT_VEC3;
   1134 		case GL_FLOAT_VEC4:									return TYPE_FLOAT_VEC4;
   1135 
   1136 		case GL_FLOAT_MAT2:									return TYPE_FLOAT_MAT2;
   1137 		case GL_FLOAT_MAT2x3:								return TYPE_FLOAT_MAT2X3;
   1138 		case GL_FLOAT_MAT2x4:								return TYPE_FLOAT_MAT2X4;
   1139 
   1140 		case GL_FLOAT_MAT3x2:								return TYPE_FLOAT_MAT3X2;
   1141 		case GL_FLOAT_MAT3:									return TYPE_FLOAT_MAT3;
   1142 		case GL_FLOAT_MAT3x4:								return TYPE_FLOAT_MAT3X4;
   1143 
   1144 		case GL_FLOAT_MAT4x2:								return TYPE_FLOAT_MAT4X2;
   1145 		case GL_FLOAT_MAT4x3:								return TYPE_FLOAT_MAT4X3;
   1146 		case GL_FLOAT_MAT4:									return TYPE_FLOAT_MAT4;
   1147 
   1148 		case GL_DOUBLE:										return TYPE_DOUBLE;
   1149 		case GL_DOUBLE_VEC2:								return TYPE_DOUBLE_VEC2;
   1150 		case GL_DOUBLE_VEC3:								return TYPE_DOUBLE_VEC3;
   1151 		case GL_DOUBLE_VEC4:								return TYPE_DOUBLE_VEC4;
   1152 
   1153 		case GL_DOUBLE_MAT2:								return TYPE_DOUBLE_MAT2;
   1154 		case GL_DOUBLE_MAT2x3:								return TYPE_DOUBLE_MAT2X3;
   1155 		case GL_DOUBLE_MAT2x4:								return TYPE_DOUBLE_MAT2X4;
   1156 
   1157 		case GL_DOUBLE_MAT3x2:								return TYPE_DOUBLE_MAT3X2;
   1158 		case GL_DOUBLE_MAT3:								return TYPE_DOUBLE_MAT3;
   1159 		case GL_DOUBLE_MAT3x4:								return TYPE_DOUBLE_MAT3X4;
   1160 
   1161 		case GL_DOUBLE_MAT4x2:								return TYPE_DOUBLE_MAT4X2;
   1162 		case GL_DOUBLE_MAT4x3:								return TYPE_DOUBLE_MAT4X3;
   1163 		case GL_DOUBLE_MAT4:								return TYPE_DOUBLE_MAT4;
   1164 
   1165 		case GL_INT:										return TYPE_INT;
   1166 		case GL_INT_VEC2:									return TYPE_INT_VEC2;
   1167 		case GL_INT_VEC3:									return TYPE_INT_VEC3;
   1168 		case GL_INT_VEC4:									return TYPE_INT_VEC4;
   1169 
   1170 		case GL_UNSIGNED_INT:								return TYPE_UINT;
   1171 		case GL_UNSIGNED_INT_VEC2:							return TYPE_UINT_VEC2;
   1172 		case GL_UNSIGNED_INT_VEC3:							return TYPE_UINT_VEC3;
   1173 		case GL_UNSIGNED_INT_VEC4:							return TYPE_UINT_VEC4;
   1174 
   1175 		case GL_BOOL:										return TYPE_BOOL;
   1176 		case GL_BOOL_VEC2:									return TYPE_BOOL_VEC2;
   1177 		case GL_BOOL_VEC3:									return TYPE_BOOL_VEC3;
   1178 		case GL_BOOL_VEC4:									return TYPE_BOOL_VEC4;
   1179 
   1180 		case GL_SAMPLER_1D:									return TYPE_SAMPLER_1D;
   1181 		case GL_SAMPLER_2D:									return TYPE_SAMPLER_2D;
   1182 		case GL_SAMPLER_CUBE:								return TYPE_SAMPLER_CUBE;
   1183 		case GL_SAMPLER_1D_ARRAY:							return TYPE_SAMPLER_1D_ARRAY;
   1184 		case GL_SAMPLER_2D_ARRAY:							return TYPE_SAMPLER_2D_ARRAY;
   1185 		case GL_SAMPLER_3D:									return TYPE_SAMPLER_3D;
   1186 		case GL_SAMPLER_CUBE_MAP_ARRAY:						return TYPE_SAMPLER_CUBE_ARRAY;
   1187 
   1188 		case GL_SAMPLER_1D_SHADOW:							return TYPE_SAMPLER_1D_SHADOW;
   1189 		case GL_SAMPLER_2D_SHADOW:							return TYPE_SAMPLER_2D_SHADOW;
   1190 		case GL_SAMPLER_CUBE_SHADOW:						return TYPE_SAMPLER_CUBE_SHADOW;
   1191 		case GL_SAMPLER_1D_ARRAY_SHADOW:					return TYPE_SAMPLER_1D_ARRAY_SHADOW;
   1192 		case GL_SAMPLER_2D_ARRAY_SHADOW:					return TYPE_SAMPLER_2D_ARRAY_SHADOW;
   1193 		case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:				return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
   1194 
   1195 		case GL_INT_SAMPLER_1D:								return TYPE_INT_SAMPLER_1D;
   1196 		case GL_INT_SAMPLER_2D:								return TYPE_INT_SAMPLER_2D;
   1197 		case GL_INT_SAMPLER_CUBE:							return TYPE_INT_SAMPLER_CUBE;
   1198 		case GL_INT_SAMPLER_1D_ARRAY:						return TYPE_INT_SAMPLER_1D_ARRAY;
   1199 		case GL_INT_SAMPLER_2D_ARRAY:						return TYPE_INT_SAMPLER_2D_ARRAY;
   1200 		case GL_INT_SAMPLER_3D:								return TYPE_INT_SAMPLER_3D;
   1201 		case GL_INT_SAMPLER_CUBE_MAP_ARRAY:					return TYPE_INT_SAMPLER_CUBE_ARRAY;
   1202 
   1203 		case GL_UNSIGNED_INT_SAMPLER_1D:					return TYPE_UINT_SAMPLER_1D;
   1204 		case GL_UNSIGNED_INT_SAMPLER_2D:					return TYPE_UINT_SAMPLER_2D;
   1205 		case GL_UNSIGNED_INT_SAMPLER_CUBE:					return TYPE_UINT_SAMPLER_CUBE;
   1206 		case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY:				return TYPE_UINT_SAMPLER_1D_ARRAY;
   1207 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:				return TYPE_UINT_SAMPLER_2D_ARRAY;
   1208 		case GL_UNSIGNED_INT_SAMPLER_3D:					return TYPE_UINT_SAMPLER_3D;
   1209 		case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:		return TYPE_UINT_SAMPLER_CUBE_ARRAY;
   1210 
   1211 		case GL_SAMPLER_2D_MULTISAMPLE:						return TYPE_SAMPLER_2D_MULTISAMPLE;
   1212 		case GL_INT_SAMPLER_2D_MULTISAMPLE:					return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
   1213 		case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:		return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
   1214 
   1215 		case GL_IMAGE_2D:									return TYPE_IMAGE_2D;
   1216 		case GL_IMAGE_CUBE:									return TYPE_IMAGE_CUBE;
   1217 		case GL_IMAGE_2D_ARRAY:								return TYPE_IMAGE_2D_ARRAY;
   1218 		case GL_IMAGE_3D:									return TYPE_IMAGE_3D;
   1219 		case GL_INT_IMAGE_2D:								return TYPE_INT_IMAGE_2D;
   1220 		case GL_INT_IMAGE_CUBE:								return TYPE_INT_IMAGE_CUBE;
   1221 		case GL_INT_IMAGE_2D_ARRAY:							return TYPE_INT_IMAGE_2D_ARRAY;
   1222 		case GL_INT_IMAGE_3D:								return TYPE_INT_IMAGE_3D;
   1223 		case GL_UNSIGNED_INT_IMAGE_2D:						return TYPE_UINT_IMAGE_2D;
   1224 		case GL_UNSIGNED_INT_IMAGE_CUBE:					return TYPE_UINT_IMAGE_CUBE;
   1225 		case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:				return TYPE_UINT_IMAGE_2D_ARRAY;
   1226 		case GL_UNSIGNED_INT_IMAGE_3D:						return TYPE_UINT_IMAGE_3D;
   1227 
   1228 		case GL_UNSIGNED_INT_ATOMIC_COUNTER:				return TYPE_UINT_ATOMIC_COUNTER;
   1229 
   1230 		case GL_SAMPLER_BUFFER:								return TYPE_SAMPLER_BUFFER;
   1231 		case GL_INT_SAMPLER_BUFFER:							return TYPE_INT_SAMPLER_BUFFER;
   1232 		case GL_UNSIGNED_INT_SAMPLER_BUFFER:				return TYPE_UINT_SAMPLER_BUFFER;
   1233 
   1234 		case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:				return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY;
   1235 		case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:			return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY;
   1236 		case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:	return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY;
   1237 
   1238 		case GL_IMAGE_BUFFER:								return TYPE_IMAGE_BUFFER;
   1239 		case GL_INT_IMAGE_BUFFER:							return TYPE_INT_IMAGE_BUFFER;
   1240 		case GL_UNSIGNED_INT_IMAGE_BUFFER:					return TYPE_UINT_IMAGE_BUFFER;
   1241 
   1242 		default:
   1243 			return TYPE_LAST;
   1244 	}
   1245 }
   1246 
   1247 } // glu
   1248