Merge "x11: Fix deadlock" into nougat-cts-dev am: 34b869eeea am: b6766f9949 am: 7b1b2...
[platform/upstream/VK-GL-CTS.git] / framework / opengl / gluShaderUtil.cpp
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