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