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