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 	};
    279 
    280 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_names) == TYPE_LAST);
    281 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_names)));
    282 	return s_names[(int)dataType];
    283 }
    284 
    285 int getDataTypeScalarSize (DataType dataType)
    286 {
    287 	static const int s_sizes[] =
    288 	{
    289 		-1,		// invalid
    290 		1,		// float
    291 		2,		// vec2
    292 		3,		// vec3
    293 		4,		// vec4
    294 		4,		// mat2
    295 		6,		// mat2x3
    296 		8,		// mat2x4
    297 		6,		// mat3x2
    298 		9,		// mat3
    299 		12,		// mat3x4
    300 		8,		// mat4x2
    301 		12,		// mat4x3
    302 		16,		// mat4
    303 		1,		// double
    304 		2,		// dvec2
    305 		3,		// dvec3
    306 		4,		// dvec4
    307 		4,		// dmat2
    308 		6,		// dmat2x3
    309 		8,		// dmat2x4
    310 		6,		// dmat3x2
    311 		9,		// dmat3
    312 		12,		// dmat3x4
    313 		8,		// dmat4x2
    314 		12,		// dmat4x3
    315 		16,		// dmat4
    316 		1,		// int
    317 		2,		// ivec2
    318 		3,		// ivec3
    319 		4,		// ivec4
    320 		1,		// uint
    321 		2,		// uvec2
    322 		3,		// uvec3
    323 		4,		// uvec4
    324 		1,		// bool
    325 		2,		// bvec2
    326 		3,		// bvec3
    327 		4,		// bvec4
    328 		1,		// sampler1D
    329 		1,		// sampler2D
    330 		1,		// samplerCube
    331 		1,		// sampler1DArray
    332 		1,		// sampler2DArray
    333 		1,		// sampler3D
    334 		1,		// samplerCubeArray
    335 		1,		// sampler1DShadow
    336 		1,		// sampler2DShadow
    337 		1,		// samplerCubeShadow
    338 		1,		// sampler1DArrayShadow
    339 		1,		// sampler2DArrayShadow
    340 		1,		// samplerCubeArrayShadow
    341 		1,		// isampler1D
    342 		1,		// isampler2D
    343 		1,		// isamplerCube
    344 		1,		// isampler1DArray
    345 		1,		// isampler2DArray
    346 		1,		// isampler3D
    347 		1,		// isamplerCubeArray
    348 		1,		// usampler1D
    349 		1,		// usampler2D
    350 		1,		// usamplerCube
    351 		1,		// usampler1DArray
    352 		1,		// usampler2DArray
    353 		1,		// usampler3D
    354 		1,		// usamplerCubeArray
    355 		1,		// sampler2DMS
    356 		1,		// isampler2DMS
    357 		1,		// usampler2DMS
    358 		1,		// image2D
    359 		1,		// imageCube
    360 		1,		// image2DArray
    361 		1,		// image3D
    362 		1,		// imageCubeArray
    363 		1,		// iimage2D
    364 		1,		// iimageCube
    365 		1,		// iimage2DArray
    366 		1,		// iimage3D
    367 		1,		// iimageCubeArray
    368 		1,		// uimage2D
    369 		1,		// uimageCube
    370 		1,		// uimage2DArray
    371 		1,		// uimage3D
    372 		1,		// uimageCubeArray
    373 		1,		// atomic_uint
    374 		1,		// samplerBuffer
    375 		1,		// isamplerBuffer
    376 		1,		// usamplerBuffer
    377 		1,		// sampler2DMSArray
    378 		1,		// isampler2DMSArray
    379 		1,		// usampler2DMSArray
    380 		1,		// imageBuffer
    381 		1,		// iimageBuffer
    382 		1,		// uimageBuffer
    383 	};
    384 
    385 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_sizes) == TYPE_LAST);
    386 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_sizes)));
    387 	return s_sizes[(int)dataType];
    388 }
    389 
    390 DataType getDataTypeScalarType (DataType dataType)
    391 {
    392 	static const DataType s_scalarTypes[] =
    393 	{
    394 		TYPE_INVALID,							// invalid
    395 		TYPE_FLOAT,								// float
    396 		TYPE_FLOAT,								// vec2
    397 		TYPE_FLOAT,								// vec3
    398 		TYPE_FLOAT,								// vec4
    399 		TYPE_FLOAT,								// mat2
    400 		TYPE_FLOAT,								// mat2x3
    401 		TYPE_FLOAT,								// mat2x4
    402 		TYPE_FLOAT,								// mat3x2
    403 		TYPE_FLOAT,								// mat3
    404 		TYPE_FLOAT,								// mat3x4
    405 		TYPE_FLOAT,								// mat4x2
    406 		TYPE_FLOAT,								// mat4x3
    407 		TYPE_FLOAT,								// mat4
    408 		TYPE_DOUBLE,							// double
    409 		TYPE_DOUBLE,							// dvec2
    410 		TYPE_DOUBLE,							// dvec3
    411 		TYPE_DOUBLE,							// dvec4
    412 		TYPE_DOUBLE,							// dmat2
    413 		TYPE_DOUBLE,							// dmat2x3
    414 		TYPE_DOUBLE,							// dmat2x4
    415 		TYPE_DOUBLE,							// dmat3x2
    416 		TYPE_DOUBLE,							// dmat3
    417 		TYPE_DOUBLE,							// dmat3x4
    418 		TYPE_DOUBLE,							// dmat4x2
    419 		TYPE_DOUBLE,							// dmat4x3
    420 		TYPE_DOUBLE,							// dmat4
    421 		TYPE_INT,								// int
    422 		TYPE_INT,								// ivec2
    423 		TYPE_INT,								// ivec3
    424 		TYPE_INT,								// ivec4
    425 		TYPE_UINT,								// uint
    426 		TYPE_UINT,								// uvec2
    427 		TYPE_UINT,								// uvec3
    428 		TYPE_UINT,								// uvec4
    429 		TYPE_BOOL,								// bool
    430 		TYPE_BOOL,								// bvec2
    431 		TYPE_BOOL,								// bvec3
    432 		TYPE_BOOL,								// bvec4
    433 		TYPE_SAMPLER_1D,						// sampler1D
    434 		TYPE_SAMPLER_2D,						// sampler2D
    435 		TYPE_SAMPLER_CUBE,						// samplerCube
    436 		TYPE_SAMPLER_1D_ARRAY,					// sampler1DArray
    437 		TYPE_SAMPLER_2D_ARRAY,					// sampler2DArray
    438 		TYPE_SAMPLER_3D,						// sampler3D
    439 		TYPE_SAMPLER_CUBE_ARRAY,				// samplerCubeArray
    440 		TYPE_SAMPLER_1D_SHADOW,					// sampler1DShadow
    441 		TYPE_SAMPLER_2D_SHADOW,					// sampler2DShadow
    442 		TYPE_SAMPLER_CUBE_SHADOW,				// samplerCubeShadow
    443 		TYPE_SAMPLER_1D_ARRAY_SHADOW,			// sampler1DArrayShadow
    444 		TYPE_SAMPLER_2D_ARRAY_SHADOW,			// sampler2DArrayShadow
    445 		TYPE_SAMPLER_CUBE_ARRAY_SHADOW,			// samplerCubeArrayShadow
    446 		TYPE_INT_SAMPLER_1D,					// isampler1D
    447 		TYPE_INT_SAMPLER_2D,					// isampler2D
    448 		TYPE_INT_SAMPLER_CUBE,					// isamplerCube
    449 		TYPE_INT_SAMPLER_1D_ARRAY,				// isampler1DArray
    450 		TYPE_INT_SAMPLER_2D_ARRAY,				// isampler2DArray
    451 		TYPE_INT_SAMPLER_3D,					// isampler3D
    452 		TYPE_INT_SAMPLER_CUBE_ARRAY,			// isamplerCubeArray
    453 		TYPE_UINT_SAMPLER_1D,					// usampler1D
    454 		TYPE_UINT_SAMPLER_2D,					// usampler2D
    455 		TYPE_UINT_SAMPLER_CUBE,					// usamplerCube
    456 		TYPE_UINT_SAMPLER_1D_ARRAY,				// usampler1DArray
    457 		TYPE_UINT_SAMPLER_2D_ARRAY,				// usampler2DArray
    458 		TYPE_UINT_SAMPLER_3D,					// usampler3D
    459 		TYPE_UINT_SAMPLER_CUBE_ARRAY,			// usamplerCubeArray
    460 		TYPE_SAMPLER_2D_MULTISAMPLE,			// sampler2DMS
    461 		TYPE_INT_SAMPLER_2D_MULTISAMPLE,		// isampler2DMS
    462 		TYPE_UINT_SAMPLER_2D_MULTISAMPLE,		// usampler2DMS
    463 		TYPE_IMAGE_2D,							// image2D
    464 		TYPE_IMAGE_CUBE,						// imageCube
    465 		TYPE_IMAGE_2D_ARRAY,					// image2DArray
    466 		TYPE_IMAGE_3D,							// image3D
    467 		TYPE_IMAGE_CUBE_ARRAY,					// imageCubeArray
    468 		TYPE_INT_IMAGE_2D,						// iimage2D
    469 		TYPE_INT_IMAGE_CUBE,					// iimageCube
    470 		TYPE_INT_IMAGE_2D_ARRAY,				// iimage2DArray
    471 		TYPE_INT_IMAGE_3D,						// iimage3D
    472 		TYPE_INT_IMAGE_CUBE_ARRAY,				// iimageCubeArray
    473 		TYPE_UINT_IMAGE_2D,						// uimage2D
    474 		TYPE_UINT_IMAGE_CUBE,					// uimageCube
    475 		TYPE_UINT_IMAGE_2D_ARRAY,				// uimage2DArray
    476 		TYPE_UINT_IMAGE_3D,						// uimage3D
    477 		TYPE_UINT_IMAGE_CUBE_ARRAY,				// uimageCubeArray
    478 		TYPE_UINT_ATOMIC_COUNTER,				// atomic_uint
    479 		TYPE_SAMPLER_BUFFER,					// samplerBuffer
    480 		TYPE_INT_SAMPLER_BUFFER,				// isamplerBuffer
    481 		TYPE_UINT_SAMPLER_BUFFER,				// usamplerBuffer
    482 		TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY,		// sampler2DMSArray
    483 		TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,	// isampler2DMSArray
    484 		TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY,	// usampler2DMSArray
    485 		TYPE_IMAGE_BUFFER,						// imageBuffer
    486 		TYPE_INT_IMAGE_BUFFER,					// iimageBuffer
    487 		TYPE_UINT_IMAGE_BUFFER,					// uimageBuffer
    488 	};
    489 
    490 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_scalarTypes) == TYPE_LAST);
    491 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_scalarTypes)));
    492 	return s_scalarTypes[(int)dataType];
    493 }
    494 
    495 DataType getDataTypeFloatScalars (DataType dataType)
    496 {
    497 	static const DataType s_floatTypes[] =
    498 	{
    499 		TYPE_INVALID,		// invalid
    500 		TYPE_FLOAT,			// float
    501 		TYPE_FLOAT_VEC2,	// vec2
    502 		TYPE_FLOAT_VEC3,	// vec3
    503 		TYPE_FLOAT_VEC4,	// vec4
    504 		TYPE_FLOAT_MAT2,	// mat2
    505 		TYPE_FLOAT_MAT2X3,	// mat2x3
    506 		TYPE_FLOAT_MAT2X4,	// mat2x4
    507 		TYPE_FLOAT_MAT3X2,	// mat3x2
    508 		TYPE_FLOAT_MAT3,	// mat3
    509 		TYPE_FLOAT_MAT3X4,	// mat3x4
    510 		TYPE_FLOAT_MAT4X2,	// mat4x2
    511 		TYPE_FLOAT_MAT4X3,	// mat4x3
    512 		TYPE_FLOAT_MAT4,	// mat4
    513 		TYPE_FLOAT,			// double
    514 		TYPE_FLOAT_VEC2,	// dvec2
    515 		TYPE_FLOAT_VEC3,	// dvec3
    516 		TYPE_FLOAT_VEC4,	// dvec4
    517 		TYPE_FLOAT_MAT2,	// dmat2
    518 		TYPE_FLOAT_MAT2X3,	// dmat2x3
    519 		TYPE_FLOAT_MAT2X4,	// dmat2x4
    520 		TYPE_FLOAT_MAT3X2,	// dmat3x2
    521 		TYPE_FLOAT_MAT3,	// dmat3
    522 		TYPE_FLOAT_MAT3X4,	// dmat3x4
    523 		TYPE_FLOAT_MAT4X2,	// dmat4x2
    524 		TYPE_FLOAT_MAT4X3,	// dmat4x3
    525 		TYPE_FLOAT_MAT4,	// dmat4
    526 		TYPE_FLOAT,			// int
    527 		TYPE_FLOAT_VEC2,	// ivec2
    528 		TYPE_FLOAT_VEC3,	// ivec3
    529 		TYPE_FLOAT_VEC4,	// ivec4
    530 		TYPE_FLOAT,			// uint
    531 		TYPE_FLOAT_VEC2,	// uvec2
    532 		TYPE_FLOAT_VEC3,	// uvec3
    533 		TYPE_FLOAT_VEC4,	// uvec4
    534 		TYPE_FLOAT,			// bool
    535 		TYPE_FLOAT_VEC2,	// bvec2
    536 		TYPE_FLOAT_VEC3,	// bvec3
    537 		TYPE_FLOAT_VEC4,	// bvec4
    538 		TYPE_INVALID,		// sampler1D
    539 		TYPE_INVALID,		// sampler2D
    540 		TYPE_INVALID,		// samplerCube
    541 		TYPE_INVALID,		// sampler1DArray
    542 		TYPE_INVALID,		// sampler2DArray
    543 		TYPE_INVALID,		// sampler3D
    544 		TYPE_INVALID,		// samplerCubeArray
    545 		TYPE_INVALID,		// sampler1DShadow
    546 		TYPE_INVALID,		// sampler2DShadow
    547 		TYPE_INVALID,		// samplerCubeShadow
    548 		TYPE_INVALID,		// sampler1DArrayShadow
    549 		TYPE_INVALID,		// sampler2DArrayShadow
    550 		TYPE_INVALID,		// samplerCubeArrayShadow
    551 		TYPE_INVALID,		// isampler1D
    552 		TYPE_INVALID,		// isampler2D
    553 		TYPE_INVALID,		// isamplerCube
    554 		TYPE_INVALID,		// isampler1DArray
    555 		TYPE_INVALID,		// isampler2DArray
    556 		TYPE_INVALID,		// isampler3D
    557 		TYPE_INVALID,		// isamplerCubeArray
    558 		TYPE_INVALID,		// usampler1D
    559 		TYPE_INVALID,		// usampler2D
    560 		TYPE_INVALID,		// usamplerCube
    561 		TYPE_INVALID,		// usampler1DArray
    562 		TYPE_INVALID,		// usampler2DArray
    563 		TYPE_INVALID,		// usampler3D
    564 		TYPE_INVALID,		// usamplerCubeArray
    565 		TYPE_INVALID,		// sampler2DMS
    566 		TYPE_INVALID,		// isampler2DMS
    567 		TYPE_INVALID,		// usampler2DMS
    568 		TYPE_INVALID,		// image2D
    569 		TYPE_INVALID,		// imageCube
    570 		TYPE_INVALID,		// image2DArray
    571 		TYPE_INVALID,		// image3D
    572 		TYPE_INVALID,		// imageCubeArray
    573 		TYPE_INVALID,		// iimage2D
    574 		TYPE_INVALID,		// iimageCube
    575 		TYPE_INVALID,		// iimage2DArray
    576 		TYPE_INVALID,		// iimage3D
    577 		TYPE_INVALID,		// iimageCubeArray
    578 		TYPE_INVALID,		// uimage2D
    579 		TYPE_INVALID,		// uimageCube
    580 		TYPE_INVALID,		// uimage2DArray
    581 		TYPE_INVALID,		// uimage3D
    582 		TYPE_INVALID,		// uimageCubeArray
    583 		TYPE_INVALID,		// atomic_uint
    584 		TYPE_INVALID,		// samplerBuffer
    585 		TYPE_INVALID,		// isamplerBuffer
    586 		TYPE_INVALID,		// usamplerBuffer
    587 		TYPE_INVALID,		// sampler2DMSArray
    588 		TYPE_INVALID,		// isampler2DMSArray
    589 		TYPE_INVALID,		// usampler2DMSArray
    590 		TYPE_INVALID,		// imageBuffer
    591 		TYPE_INVALID,		// iimageBuffer
    592 		TYPE_INVALID,		// uimageBuffer
    593 	};
    594 
    595 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == TYPE_LAST);
    596 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_floatTypes)));
    597 	return s_floatTypes[(int)dataType];
    598 }
    599 
    600 DataType getDataTypeDoubleScalars (DataType dataType)
    601 {
    602 	static const DataType s_doubleTypes[] =
    603 	{
    604 		TYPE_INVALID,		// invalid
    605 		TYPE_DOUBLE,		// float
    606 		TYPE_DOUBLE_VEC2,	// vec2
    607 		TYPE_DOUBLE_VEC3,	// vec3
    608 		TYPE_DOUBLE_VEC4,	// vec4
    609 		TYPE_DOUBLE_MAT2,	// mat2
    610 		TYPE_DOUBLE_MAT2X3,	// mat2x3
    611 		TYPE_DOUBLE_MAT2X4,	// mat2x4
    612 		TYPE_DOUBLE_MAT3X2,	// mat3x2
    613 		TYPE_DOUBLE_MAT3,	// mat3
    614 		TYPE_DOUBLE_MAT3X4,	// mat3x4
    615 		TYPE_DOUBLE_MAT4X2,	// mat4x2
    616 		TYPE_DOUBLE_MAT4X3,	// mat4x3
    617 		TYPE_DOUBLE_MAT4,	// mat4
    618 		TYPE_DOUBLE,		// double
    619 		TYPE_DOUBLE_VEC2,	// dvec2
    620 		TYPE_DOUBLE_VEC3,	// dvec3
    621 		TYPE_DOUBLE_VEC4,	// dvec4
    622 		TYPE_DOUBLE_MAT2,	// dmat2
    623 		TYPE_DOUBLE_MAT2X3,	// dmat2x3
    624 		TYPE_DOUBLE_MAT2X4,	// dmat2x4
    625 		TYPE_DOUBLE_MAT3X2,	// dmat3x2
    626 		TYPE_DOUBLE_MAT3,	// dmat3
    627 		TYPE_DOUBLE_MAT3X4,	// dmat3x4
    628 		TYPE_DOUBLE_MAT4X2,	// dmat4x2
    629 		TYPE_DOUBLE_MAT4X3,	// dmat4x3
    630 		TYPE_DOUBLE_MAT4,	// dmat4
    631 		TYPE_DOUBLE,		// int
    632 		TYPE_DOUBLE_VEC2,	// ivec2
    633 		TYPE_DOUBLE_VEC3,	// ivec3
    634 		TYPE_DOUBLE_VEC4,	// ivec4
    635 		TYPE_DOUBLE,		// uint
    636 		TYPE_DOUBLE_VEC2,	// uvec2
    637 		TYPE_DOUBLE_VEC3,	// uvec3
    638 		TYPE_DOUBLE_VEC4,	// uvec4
    639 		TYPE_DOUBLE,		// bool
    640 		TYPE_DOUBLE_VEC2,	// bvec2
    641 		TYPE_DOUBLE_VEC3,	// bvec3
    642 		TYPE_DOUBLE_VEC4,	// bvec4
    643 		TYPE_INVALID,		// sampler1D
    644 		TYPE_INVALID,		// sampler2D
    645 		TYPE_INVALID,		// samplerCube
    646 		TYPE_INVALID,		// sampler1DArray
    647 		TYPE_INVALID,		// sampler2DArray
    648 		TYPE_INVALID,		// sampler3D
    649 		TYPE_INVALID,		// samplerCubeArray
    650 		TYPE_INVALID,		// sampler1DShadow
    651 		TYPE_INVALID,		// sampler2DShadow
    652 		TYPE_INVALID,		// samplerCubeShadow
    653 		TYPE_INVALID,		// sampler1DArrayShadow
    654 		TYPE_INVALID,		// sampler2DArrayShadow
    655 		TYPE_INVALID,		// samplerCubeArrayShadow
    656 		TYPE_INVALID,		// isampler1D
    657 		TYPE_INVALID,		// isampler2D
    658 		TYPE_INVALID,		// isamplerCube
    659 		TYPE_INVALID,		// isampler1DArray
    660 		TYPE_INVALID,		// isampler2DArray
    661 		TYPE_INVALID,		// isampler3D
    662 		TYPE_INVALID,		// isamplerCubeArray
    663 		TYPE_INVALID,		// usampler1D
    664 		TYPE_INVALID,		// usampler2D
    665 		TYPE_INVALID,		// usamplerCube
    666 		TYPE_INVALID,		// usampler1DArray
    667 		TYPE_INVALID,		// usampler2DArray
    668 		TYPE_INVALID,		// usampler3D
    669 		TYPE_INVALID,		// usamplerCubeArray
    670 		TYPE_INVALID,		// sampler2DMS
    671 		TYPE_INVALID,		// isampler2DMS
    672 		TYPE_INVALID,		// usampler2DMS
    673 		TYPE_INVALID,		// image2D
    674 		TYPE_INVALID,		// imageCube
    675 		TYPE_INVALID,		// image2DArray
    676 		TYPE_INVALID,		// image3D
    677 		TYPE_INVALID,		// imageCubeArray
    678 		TYPE_INVALID,		// iimage2D
    679 		TYPE_INVALID,		// iimageCube
    680 		TYPE_INVALID,		// iimage2DArray
    681 		TYPE_INVALID,		// iimage3D
    682 		TYPE_INVALID,		// iimageCubeArray
    683 		TYPE_INVALID,		// uimage2D
    684 		TYPE_INVALID,		// uimageCube
    685 		TYPE_INVALID,		// uimage2DArray
    686 		TYPE_INVALID,		// uimage3D
    687 		TYPE_INVALID,		// uimageCubeArray
    688 		TYPE_INVALID,		// atomic_uint
    689 		TYPE_INVALID,		// samplerBuffer
    690 		TYPE_INVALID,		// isamplerBuffer
    691 		TYPE_INVALID,		// usamplerBuffer
    692 		TYPE_INVALID,		// sampler2DMSArray
    693 		TYPE_INVALID,		// isampler2DMSArray
    694 		TYPE_INVALID,		// usampler2DMSArray
    695 		TYPE_INVALID,		// imageBuffer
    696 		TYPE_INVALID,		// iimageBuffer
    697 		TYPE_INVALID,		// uimageBuffer
    698 	};
    699 
    700 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_doubleTypes) == TYPE_LAST);
    701 	DE_ASSERT(deInBounds32((int)dataType, 0, DE_LENGTH_OF_ARRAY(s_doubleTypes)));
    702 	return s_doubleTypes[(int)dataType];
    703 }
    704 
    705 DataType getDataTypeVector (DataType scalarType, int size)
    706 {
    707 	DE_ASSERT(deInRange32(size, 1, 4));
    708 	switch (scalarType)
    709 	{
    710 		case TYPE_FLOAT:
    711 		case TYPE_DOUBLE:
    712 		case TYPE_INT:
    713 		case TYPE_UINT:
    714 		case TYPE_BOOL:
    715 			return (DataType)((int)scalarType + size - 1);
    716 		default:
    717 			return TYPE_INVALID;
    718 	}
    719 }
    720 
    721 DataType getDataTypeFloatVec (int vecSize)
    722 {
    723 	return getDataTypeVector(TYPE_FLOAT, vecSize);
    724 }
    725 
    726 DataType getDataTypeIntVec (int vecSize)
    727 {
    728 	return getDataTypeVector(TYPE_INT, vecSize);
    729 }
    730 
    731 DataType getDataTypeUintVec (int vecSize)
    732 {
    733 	return getDataTypeVector(TYPE_UINT, vecSize);
    734 }
    735 
    736 DataType getDataTypeBoolVec (int vecSize)
    737 {
    738 	return getDataTypeVector(TYPE_BOOL, vecSize);
    739 }
    740 
    741 DataType getDataTypeMatrix (int numCols, int numRows)
    742 {
    743 	DE_ASSERT(de::inRange(numCols, 2, 4) && de::inRange(numRows, 2, 4));
    744 	return (DataType)((int)TYPE_FLOAT_MAT2 + (numCols-2)*3 + (numRows-2));
    745 }
    746 
    747 int getDataTypeMatrixNumRows (DataType dataType)
    748 {
    749 	switch (dataType)
    750 	{
    751 		case TYPE_FLOAT_MAT2:		return 2;
    752 		case TYPE_FLOAT_MAT2X3:		return 3;
    753 		case TYPE_FLOAT_MAT2X4:		return 4;
    754 		case TYPE_FLOAT_MAT3X2:		return 2;
    755 		case TYPE_FLOAT_MAT3:		return 3;
    756 		case TYPE_FLOAT_MAT3X4:		return 4;
    757 		case TYPE_FLOAT_MAT4X2:		return 2;
    758 		case TYPE_FLOAT_MAT4X3:		return 3;
    759 		case TYPE_FLOAT_MAT4:		return 4;
    760 		case TYPE_DOUBLE_MAT2:		return 2;
    761 		case TYPE_DOUBLE_MAT2X3:	return 3;
    762 		case TYPE_DOUBLE_MAT2X4:	return 4;
    763 		case TYPE_DOUBLE_MAT3X2:	return 2;
    764 		case TYPE_DOUBLE_MAT3:		return 3;
    765 		case TYPE_DOUBLE_MAT3X4:	return 4;
    766 		case TYPE_DOUBLE_MAT4X2:	return 2;
    767 		case TYPE_DOUBLE_MAT4X3:	return 3;
    768 		case TYPE_DOUBLE_MAT4:		return 4;
    769 		default:
    770 			DE_ASSERT(false);
    771 			return 0;
    772 	}
    773 }
    774 
    775 int getDataTypeMatrixNumColumns (DataType dataType)
    776 {
    777 	switch (dataType)
    778 	{
    779 		case TYPE_FLOAT_MAT2:		return 2;
    780 		case TYPE_FLOAT_MAT2X3:		return 2;
    781 		case TYPE_FLOAT_MAT2X4:		return 2;
    782 		case TYPE_FLOAT_MAT3X2:		return 3;
    783 		case TYPE_FLOAT_MAT3:		return 3;
    784 		case TYPE_FLOAT_MAT3X4:		return 3;
    785 		case TYPE_FLOAT_MAT4X2:		return 4;
    786 		case TYPE_FLOAT_MAT4X3:		return 4;
    787 		case TYPE_FLOAT_MAT4:		return 4;
    788 		case TYPE_DOUBLE_MAT2:		return 2;
    789 		case TYPE_DOUBLE_MAT2X3:	return 2;
    790 		case TYPE_DOUBLE_MAT2X4:	return 2;
    791 		case TYPE_DOUBLE_MAT3X2:	return 3;
    792 		case TYPE_DOUBLE_MAT3:		return 3;
    793 		case TYPE_DOUBLE_MAT3X4:	return 3;
    794 		case TYPE_DOUBLE_MAT4X2:	return 4;
    795 		case TYPE_DOUBLE_MAT4X3:	return 4;
    796 		case TYPE_DOUBLE_MAT4:		return 4;
    797 		default:
    798 			DE_ASSERT(false);
    799 			return 0;
    800 	}
    801 }
    802 
    803 int	getDataTypeNumLocations	(DataType dataType)
    804 {
    805 	if (isDataTypeScalarOrVector(dataType))
    806 		return 1;
    807 	else if (isDataTypeMatrix(dataType))
    808 		return getDataTypeMatrixNumColumns(dataType);
    809 
    810 	DE_FATAL("Illegal datatype.");
    811 	return 0;
    812 }
    813 
    814 int	getDataTypeNumComponents (DataType dataType)
    815 {
    816 	if (isDataTypeScalarOrVector(dataType))
    817 		return getDataTypeScalarSize(dataType);
    818 	else if (isDataTypeMatrix(dataType))
    819 		return getDataTypeMatrixNumRows(dataType);
    820 
    821 	DE_FATAL("Illegal datatype.");
    822 	return 0;
    823 }
    824 
    825 DataType getDataTypeFromGLType (deUint32 glType)
    826 {
    827 	switch (glType)
    828 	{
    829 		case GL_FLOAT:										return TYPE_FLOAT;
    830 		case GL_FLOAT_VEC2:									return TYPE_FLOAT_VEC2;
    831 		case GL_FLOAT_VEC3:									return TYPE_FLOAT_VEC3;
    832 		case GL_FLOAT_VEC4:									return TYPE_FLOAT_VEC4;
    833 
    834 		case GL_FLOAT_MAT2:									return TYPE_FLOAT_MAT2;
    835 		case GL_FLOAT_MAT2x3:								return TYPE_FLOAT_MAT2X3;
    836 		case GL_FLOAT_MAT2x4:								return TYPE_FLOAT_MAT2X4;
    837 
    838 		case GL_FLOAT_MAT3x2:								return TYPE_FLOAT_MAT3X2;
    839 		case GL_FLOAT_MAT3:									return TYPE_FLOAT_MAT3;
    840 		case GL_FLOAT_MAT3x4:								return TYPE_FLOAT_MAT3X4;
    841 
    842 		case GL_FLOAT_MAT4x2:								return TYPE_FLOAT_MAT4X2;
    843 		case GL_FLOAT_MAT4x3:								return TYPE_FLOAT_MAT4X3;
    844 		case GL_FLOAT_MAT4:									return TYPE_FLOAT_MAT4;
    845 
    846 		case GL_DOUBLE:										return TYPE_DOUBLE;
    847 		case GL_DOUBLE_VEC2:								return TYPE_DOUBLE_VEC2;
    848 		case GL_DOUBLE_VEC3:								return TYPE_DOUBLE_VEC3;
    849 		case GL_DOUBLE_VEC4:								return TYPE_DOUBLE_VEC4;
    850 
    851 		case GL_DOUBLE_MAT2:								return TYPE_DOUBLE_MAT2;
    852 		case GL_DOUBLE_MAT2x3:								return TYPE_DOUBLE_MAT2X3;
    853 		case GL_DOUBLE_MAT2x4:								return TYPE_DOUBLE_MAT2X4;
    854 
    855 		case GL_DOUBLE_MAT3x2:								return TYPE_DOUBLE_MAT3X2;
    856 		case GL_DOUBLE_MAT3:								return TYPE_DOUBLE_MAT3;
    857 		case GL_DOUBLE_MAT3x4:								return TYPE_DOUBLE_MAT3X4;
    858 
    859 		case GL_DOUBLE_MAT4x2:								return TYPE_DOUBLE_MAT4X2;
    860 		case GL_DOUBLE_MAT4x3:								return TYPE_DOUBLE_MAT4X3;
    861 		case GL_DOUBLE_MAT4:								return TYPE_DOUBLE_MAT4;
    862 
    863 		case GL_INT:										return TYPE_INT;
    864 		case GL_INT_VEC2:									return TYPE_INT_VEC2;
    865 		case GL_INT_VEC3:									return TYPE_INT_VEC3;
    866 		case GL_INT_VEC4:									return TYPE_INT_VEC4;
    867 
    868 		case GL_UNSIGNED_INT:								return TYPE_UINT;
    869 		case GL_UNSIGNED_INT_VEC2:							return TYPE_UINT_VEC2;
    870 		case GL_UNSIGNED_INT_VEC3:							return TYPE_UINT_VEC3;
    871 		case GL_UNSIGNED_INT_VEC4:							return TYPE_UINT_VEC4;
    872 
    873 		case GL_BOOL:										return TYPE_BOOL;
    874 		case GL_BOOL_VEC2:									return TYPE_BOOL_VEC2;
    875 		case GL_BOOL_VEC3:									return TYPE_BOOL_VEC3;
    876 		case GL_BOOL_VEC4:									return TYPE_BOOL_VEC4;
    877 
    878 		case GL_SAMPLER_1D:									return TYPE_SAMPLER_1D;
    879 		case GL_SAMPLER_2D:									return TYPE_SAMPLER_2D;
    880 		case GL_SAMPLER_CUBE:								return TYPE_SAMPLER_CUBE;
    881 		case GL_SAMPLER_1D_ARRAY:							return TYPE_SAMPLER_1D_ARRAY;
    882 		case GL_SAMPLER_2D_ARRAY:							return TYPE_SAMPLER_2D_ARRAY;
    883 		case GL_SAMPLER_3D:									return TYPE_SAMPLER_3D;
    884 		case GL_SAMPLER_CUBE_MAP_ARRAY:						return TYPE_SAMPLER_CUBE_ARRAY;
    885 
    886 		case GL_SAMPLER_1D_SHADOW:							return TYPE_SAMPLER_1D_SHADOW;
    887 		case GL_SAMPLER_2D_SHADOW:							return TYPE_SAMPLER_2D_SHADOW;
    888 		case GL_SAMPLER_CUBE_SHADOW:						return TYPE_SAMPLER_CUBE_SHADOW;
    889 		case GL_SAMPLER_1D_ARRAY_SHADOW:					return TYPE_SAMPLER_1D_ARRAY_SHADOW;
    890 		case GL_SAMPLER_2D_ARRAY_SHADOW:					return TYPE_SAMPLER_2D_ARRAY_SHADOW;
    891 		case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:				return TYPE_SAMPLER_CUBE_ARRAY_SHADOW;
    892 
    893 		case GL_INT_SAMPLER_1D:								return TYPE_INT_SAMPLER_1D;
    894 		case GL_INT_SAMPLER_2D:								return TYPE_INT_SAMPLER_2D;
    895 		case GL_INT_SAMPLER_CUBE:							return TYPE_INT_SAMPLER_CUBE;
    896 		case GL_INT_SAMPLER_1D_ARRAY:						return TYPE_INT_SAMPLER_1D_ARRAY;
    897 		case GL_INT_SAMPLER_2D_ARRAY:						return TYPE_INT_SAMPLER_2D_ARRAY;
    898 		case GL_INT_SAMPLER_3D:								return TYPE_INT_SAMPLER_3D;
    899 		case GL_INT_SAMPLER_CUBE_MAP_ARRAY:					return TYPE_INT_SAMPLER_CUBE_ARRAY;
    900 
    901 		case GL_UNSIGNED_INT_SAMPLER_1D:					return TYPE_UINT_SAMPLER_1D;
    902 		case GL_UNSIGNED_INT_SAMPLER_2D:					return TYPE_UINT_SAMPLER_2D;
    903 		case GL_UNSIGNED_INT_SAMPLER_CUBE:					return TYPE_UINT_SAMPLER_CUBE;
    904 		case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY:				return TYPE_UINT_SAMPLER_1D_ARRAY;
    905 		case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:				return TYPE_UINT_SAMPLER_2D_ARRAY;
    906 		case GL_UNSIGNED_INT_SAMPLER_3D:					return TYPE_UINT_SAMPLER_3D;
    907 		case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:		return TYPE_UINT_SAMPLER_CUBE_ARRAY;
    908 
    909 		case GL_SAMPLER_2D_MULTISAMPLE:						return TYPE_SAMPLER_2D_MULTISAMPLE;
    910 		case GL_INT_SAMPLER_2D_MULTISAMPLE:					return TYPE_INT_SAMPLER_2D_MULTISAMPLE;
    911 		case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:		return TYPE_UINT_SAMPLER_2D_MULTISAMPLE;
    912 
    913 		case GL_IMAGE_2D:									return TYPE_IMAGE_2D;
    914 		case GL_IMAGE_CUBE:									return TYPE_IMAGE_CUBE;
    915 		case GL_IMAGE_2D_ARRAY:								return TYPE_IMAGE_2D_ARRAY;
    916 		case GL_IMAGE_3D:									return TYPE_IMAGE_3D;
    917 		case GL_INT_IMAGE_2D:								return TYPE_INT_IMAGE_2D;
    918 		case GL_INT_IMAGE_CUBE:								return TYPE_INT_IMAGE_CUBE;
    919 		case GL_INT_IMAGE_2D_ARRAY:							return TYPE_INT_IMAGE_2D_ARRAY;
    920 		case GL_INT_IMAGE_3D:								return TYPE_INT_IMAGE_3D;
    921 		case GL_UNSIGNED_INT_IMAGE_2D:						return TYPE_UINT_IMAGE_2D;
    922 		case GL_UNSIGNED_INT_IMAGE_CUBE:					return TYPE_UINT_IMAGE_CUBE;
    923 		case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:				return TYPE_UINT_IMAGE_2D_ARRAY;
    924 		case GL_UNSIGNED_INT_IMAGE_3D:						return TYPE_UINT_IMAGE_3D;
    925 
    926 		case GL_UNSIGNED_INT_ATOMIC_COUNTER:				return TYPE_UINT_ATOMIC_COUNTER;
    927 
    928 		case GL_SAMPLER_BUFFER:								return TYPE_SAMPLER_BUFFER;
    929 		case GL_INT_SAMPLER_BUFFER:							return TYPE_INT_SAMPLER_BUFFER;
    930 		case GL_UNSIGNED_INT_SAMPLER_BUFFER:				return TYPE_UINT_SAMPLER_BUFFER;
    931 
    932 		case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:				return TYPE_SAMPLER_2D_MULTISAMPLE_ARRAY;
    933 		case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:			return TYPE_INT_SAMPLER_2D_MULTISAMPLE_ARRAY;
    934 		case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:	return TYPE_UINT_SAMPLER_2D_MULTISAMPLE_ARRAY;
    935 
    936 		case GL_IMAGE_BUFFER:								return TYPE_IMAGE_BUFFER;
    937 		case GL_INT_IMAGE_BUFFER:							return TYPE_INT_IMAGE_BUFFER;
    938 		case GL_UNSIGNED_INT_IMAGE_BUFFER:					return TYPE_UINT_IMAGE_BUFFER;
    939 
    940 		default:
    941 			return TYPE_LAST;
    942 	}
    943 }
    944 
    945 } // glu
    946