tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gluShaderUtil.js (32324B)


      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 
     21 'use strict';
     22 goog.provide('framework.opengl.gluShaderUtil');
     23 goog.require('framework.delibs.debase.deMath');
     24 
     25 goog.scope(function() {
     26 
     27 var gluShaderUtil = framework.opengl.gluShaderUtil;
     28 var deMath = framework.delibs.debase.deMath;
     29 
     30 /**
     31 * ShadingLanguageVersion
     32 * @enum
     33 */
     34 gluShaderUtil.GLSLVersion = {
     35    V100_ES: 0, //!< GLSL ES 1.0
     36    V300_ES: 1 //!< GLSL ES 3.0
     37 };
     38 
     39 /**
     40 * gluShaderUtil.glslVersionUsesInOutQualifiers
     41 * @param {gluShaderUtil.GLSLVersion} version
     42 * @return {boolean}
     43 */
     44 gluShaderUtil.glslVersionUsesInOutQualifiers = function(version) {
     45    return version == gluShaderUtil.GLSLVersion.V300_ES;
     46 };
     47 
     48 /**
     49 * gluShaderUtil.isGLSLVersionSupported
     50 * @param {WebGL2RenderingContext|WebGLRenderingContextBase} ctx
     51 * @param {gluShaderUtil.GLSLVersion} version
     52 * @return {boolean}
     53 */
     54 gluShaderUtil.isGLSLVersionSupported = function(ctx, version) {
     55    return version <= gluShaderUtil.getGLSLVersion(ctx);
     56 };
     57 
     58 /**
     59 * gluShaderUtil.getGLSLVersion - Returns a gluShaderUtil.GLSLVersion based on a given webgl context.
     60 * @param {WebGL2RenderingContext|WebGLRenderingContextBase} gl
     61 * @return {gluShaderUtil.GLSLVersion}
     62 */
     63 gluShaderUtil.getGLSLVersion = function(gl) {
     64    var glslversion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
     65 
     66    // TODO: Versions are not yet well implemented... Firefox returns GLSL ES 1.0 in some cases,
     67    // and Chromium returns GLSL ES 2.0 in some cases. Returning the right version for
     68    // testing.
     69    // return gluShaderUtil.GLSLVersion.V300_ES;
     70 
     71    if (glslversion.indexOf('WebGL GLSL ES 1.0') != -1) return gluShaderUtil.GLSLVersion.V100_ES;
     72    if (glslversion.indexOf('WebGL GLSL ES 3.0') != -1) return gluShaderUtil.GLSLVersion.V300_ES;
     73 
     74    throw new Error('Invalid WebGL version');
     75 };
     76 
     77 /**
     78 * gluShaderUtil.getGLSLVersionDeclaration - Returns a string declaration for the glsl version in a shader.
     79 * @param {gluShaderUtil.GLSLVersion} version
     80 * @return {string}
     81 */
     82 gluShaderUtil.getGLSLVersionDeclaration = function(version) {
     83    /** @type {Array<string>} */ var s_decl =
     84    [
     85        '#version 100',
     86        '#version 300 es'
     87    ];
     88 
     89    if (version > s_decl.length - 1)
     90        throw new Error('Unsupported GLSL version.');
     91 
     92    return s_decl[version];
     93 };
     94 
     95 /**
     96 * gluShaderUtil.getGLSLVersionString - Returns the same thing as
     97 * getGLSLVersionDeclaration() but without the substring '#version'
     98 * @param {gluShaderUtil.GLSLVersion} version
     99 * @return {string}
    100 */
    101 gluShaderUtil.getGLSLVersionString = function(version) {
    102    /** @type {Array<string>} */ var s_decl =
    103    [
    104        '100',
    105        '300 es'
    106    ];
    107 
    108    if (version > s_decl.length - 1)
    109        throw new Error('Unsupported GLSL version.');
    110 
    111    return s_decl[version];
    112 };
    113 
    114 /**
    115 * @enum
    116 */
    117 gluShaderUtil.precision = {
    118    PRECISION_LOWP: 0,
    119    PRECISION_MEDIUMP: 1,
    120    PRECISION_HIGHP: 2
    121 };
    122 
    123 gluShaderUtil.getPrecisionName = function(prec) {
    124    var s_names = [
    125        'lowp',
    126        'mediump',
    127        'highp'
    128    ];
    129 
    130    return s_names[prec];
    131 };
    132 
    133 /**
    134 * The Type constants
    135 * @enum {number}
    136 */
    137 gluShaderUtil.DataType = {
    138    INVALID: 0,
    139 
    140    FLOAT: 1,
    141    FLOAT_VEC2: 2,
    142    FLOAT_VEC3: 3,
    143    FLOAT_VEC4: 4,
    144    FLOAT_MAT2: 5,
    145    FLOAT_MAT2X3: 6,
    146    FLOAT_MAT2X4: 7,
    147    FLOAT_MAT3X2: 8,
    148    FLOAT_MAT3: 9,
    149    FLOAT_MAT3X4: 10,
    150    FLOAT_MAT4X2: 11,
    151    FLOAT_MAT4X3: 12,
    152    FLOAT_MAT4: 13,
    153 
    154    INT: 14,
    155    INT_VEC2: 15,
    156    INT_VEC3: 16,
    157    INT_VEC4: 17,
    158 
    159    UINT: 18,
    160    UINT_VEC2: 19,
    161    UINT_VEC3: 20,
    162    UINT_VEC4: 21,
    163 
    164    BOOL: 22,
    165    BOOL_VEC2: 23,
    166    BOOL_VEC3: 24,
    167    BOOL_VEC4: 25,
    168 
    169    SAMPLER_2D: 26,
    170    SAMPLER_CUBE: 27,
    171    SAMPLER_2D_ARRAY: 28,
    172    SAMPLER_3D: 29,
    173 
    174    SAMPLER_2D_SHADOW: 30,
    175    SAMPLER_CUBE_SHADOW: 31,
    176    SAMPLER_2D_ARRAY_SHADOW: 32,
    177 
    178    INT_SAMPLER_2D: 33,
    179    INT_SAMPLER_CUBE: 34,
    180    INT_SAMPLER_2D_ARRAY: 35,
    181    INT_SAMPLER_3D: 36,
    182 
    183    UINT_SAMPLER_2D: 37,
    184    UINT_SAMPLER_CUBE: 38,
    185    UINT_SAMPLER_2D_ARRAY: 39,
    186    UINT_SAMPLER_3D: 40
    187 };
    188 
    189 /**
    190 * Returns type of float scalars
    191 * @param {gluShaderUtil.DataType} dataType
    192 * @return {string} type of float scalar
    193 */
    194 gluShaderUtil.getDataTypeFloatScalars = function(dataType) {
    195 
    196    switch (dataType) {
    197        case gluShaderUtil.DataType.FLOAT: return 'float';
    198        case gluShaderUtil.DataType.FLOAT_VEC2: return 'vec2';
    199        case gluShaderUtil.DataType.FLOAT_VEC3: return 'vec3';
    200        case gluShaderUtil.DataType.FLOAT_VEC4: return 'vec4';
    201        case gluShaderUtil.DataType.FLOAT_MAT2: return 'mat2';
    202        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'mat2x3';
    203        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'mat2x4';
    204        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'mat3x2';
    205        case gluShaderUtil.DataType.FLOAT_MAT3: return 'mat3';
    206        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'mat3x4';
    207        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'mat4x2';
    208        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'mat4x3';
    209        case gluShaderUtil.DataType.FLOAT_MAT4: return 'mat4';
    210        case gluShaderUtil.DataType.INT: return 'float';
    211        case gluShaderUtil.DataType.INT_VEC2: return 'vec2';
    212        case gluShaderUtil.DataType.INT_VEC3: return 'vec3';
    213        case gluShaderUtil.DataType.INT_VEC4: return 'vec4';
    214        case gluShaderUtil.DataType.UINT: return 'float';
    215        case gluShaderUtil.DataType.UINT_VEC2: return 'vec2';
    216        case gluShaderUtil.DataType.UINT_VEC3: return 'vec3';
    217        case gluShaderUtil.DataType.UINT_VEC4: return 'vec4';
    218        case gluShaderUtil.DataType.BOOL: return 'float';
    219        case gluShaderUtil.DataType.BOOL_VEC2: return 'vec2';
    220        case gluShaderUtil.DataType.BOOL_VEC3: return 'vec3';
    221        case gluShaderUtil.DataType.BOOL_VEC4: return 'vec4';
    222    }
    223    throw Error('Unrecognized dataType ' + dataType);
    224 };
    225 
    226 /**
    227 * gluShaderUtil.getDataTypeVector
    228 * @param {gluShaderUtil.DataType} scalarType
    229 * @param {number} size
    230 * @return {gluShaderUtil.DataType}
    231 */
    232 gluShaderUtil.getDataTypeVector = function(scalarType, size) {
    233    var floats = [gluShaderUtil.DataType.FLOAT,
    234                  gluShaderUtil.DataType.FLOAT_VEC2,
    235                  gluShaderUtil.DataType.FLOAT_VEC3,
    236                  gluShaderUtil.DataType.FLOAT_VEC4];
    237    var ints = [gluShaderUtil.DataType.INT,
    238                  gluShaderUtil.DataType.INT_VEC2,
    239                  gluShaderUtil.DataType.INT_VEC3,
    240                  gluShaderUtil.DataType.INT_VEC4];
    241    var uints = [gluShaderUtil.DataType.UINT,
    242                  gluShaderUtil.DataType.UINT_VEC2,
    243                  gluShaderUtil.DataType.UINT_VEC3,
    244                  gluShaderUtil.DataType.UINT_VEC4];
    245    var bools = [gluShaderUtil.DataType.BOOL,
    246                  gluShaderUtil.DataType.BOOL_VEC2,
    247                  gluShaderUtil.DataType.BOOL_VEC3,
    248                  gluShaderUtil.DataType.BOOL_VEC4];
    249 
    250    switch (scalarType) {
    251        case gluShaderUtil.DataType.FLOAT: return floats[size - 1];
    252        case gluShaderUtil.DataType.INT: return ints[size - 1];
    253        case gluShaderUtil.DataType.UINT: return uints[size - 1];
    254        case gluShaderUtil.DataType.BOOL: return bools[size - 1];
    255        default:
    256            throw new Error('Scalar type is not a vectoe:' + scalarType);
    257    }
    258 };
    259 
    260 /**
    261 * gluShaderUtil.getDataTypeFloatVec
    262 * @param {number} vecSize
    263 * @return {gluShaderUtil.DataType}
    264 */
    265 gluShaderUtil.getDataTypeFloatVec = function(vecSize) {
    266    return gluShaderUtil.getDataTypeVector(gluShaderUtil.DataType.FLOAT, vecSize);
    267 };
    268 
    269 /**
    270 * gluShaderUtil.isDataTypeBoolOrBVec
    271 * @param {gluShaderUtil.DataType} dataType
    272 * @return {boolean}
    273 */
    274 gluShaderUtil.isDataTypeBoolOrBVec = function(dataType) {
    275    return (dataType >= gluShaderUtil.DataType.BOOL) && (dataType <= gluShaderUtil.DataType.BOOL_VEC4);
    276 };
    277 
    278 /**
    279 * Returns type of scalar
    280 * @param {gluShaderUtil.DataType} dataType shader
    281 * @return {string} type of scalar type
    282 */
    283 gluShaderUtil.getDataTypeScalarType = function(dataType) {
    284    switch (dataType) {
    285        case gluShaderUtil.DataType.FLOAT: return 'float';
    286        case gluShaderUtil.DataType.FLOAT_VEC2: return 'float';
    287        case gluShaderUtil.DataType.FLOAT_VEC3: return 'float';
    288        case gluShaderUtil.DataType.FLOAT_VEC4: return 'float';
    289        case gluShaderUtil.DataType.FLOAT_MAT2: return 'float';
    290        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'float';
    291        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'float';
    292        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'float';
    293        case gluShaderUtil.DataType.FLOAT_MAT3: return 'float';
    294        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'float';
    295        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'float';
    296        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'float';
    297        case gluShaderUtil.DataType.FLOAT_MAT4: return 'float';
    298        case gluShaderUtil.DataType.INT: return 'int';
    299        case gluShaderUtil.DataType.INT_VEC2: return 'int';
    300        case gluShaderUtil.DataType.INT_VEC3: return 'int';
    301        case gluShaderUtil.DataType.INT_VEC4: return 'int';
    302        case gluShaderUtil.DataType.UINT: return 'uint';
    303        case gluShaderUtil.DataType.UINT_VEC2: return 'uint';
    304        case gluShaderUtil.DataType.UINT_VEC3: return 'uint';
    305        case gluShaderUtil.DataType.UINT_VEC4: return 'uint';
    306        case gluShaderUtil.DataType.BOOL: return 'bool';
    307        case gluShaderUtil.DataType.BOOL_VEC2: return 'bool';
    308        case gluShaderUtil.DataType.BOOL_VEC3: return 'bool';
    309        case gluShaderUtil.DataType.BOOL_VEC4: return 'bool';
    310        case gluShaderUtil.DataType.SAMPLER_2D: return 'sampler2D';
    311        case gluShaderUtil.DataType.SAMPLER_CUBE: return 'samplerCube';
    312        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 'sampler2DArray';
    313        case gluShaderUtil.DataType.SAMPLER_3D: return 'sampler3D';
    314        case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 'sampler2DShadow';
    315        case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 'samplerCubeShadow';
    316        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 'sampler2DArrayShadow';
    317        case gluShaderUtil.DataType.INT_SAMPLER_2D: return 'isampler2D';
    318        case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 'isamplerCube';
    319        case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 'isampler2DArray';
    320        case gluShaderUtil.DataType.INT_SAMPLER_3D: return 'isampler3D';
    321        case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 'usampler2D';
    322        case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 'usamplerCube';
    323        case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 'usampler2DArray';
    324        case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 'usampler3D';
    325    }
    326   throw new Error('Unrecognized datatype:' + dataType);
    327 };
    328 
    329 /**
    330 * Returns type of scalar
    331 * @param {?gluShaderUtil.DataType} dataType shader
    332 * @return {gluShaderUtil.DataType} type of scalar type
    333 */
    334 gluShaderUtil.getDataTypeScalarTypeAsDataType = function(dataType) {
    335    switch (dataType) {
    336        case gluShaderUtil.DataType.FLOAT: return gluShaderUtil.DataType.FLOAT;
    337        case gluShaderUtil.DataType.FLOAT_VEC2: return gluShaderUtil.DataType.FLOAT;
    338        case gluShaderUtil.DataType.FLOAT_VEC3: return gluShaderUtil.DataType.FLOAT;
    339        case gluShaderUtil.DataType.FLOAT_VEC4: return gluShaderUtil.DataType.FLOAT;
    340        case gluShaderUtil.DataType.FLOAT_MAT2: return gluShaderUtil.DataType.FLOAT;
    341        case gluShaderUtil.DataType.FLOAT_MAT2X3: return gluShaderUtil.DataType.FLOAT;
    342        case gluShaderUtil.DataType.FLOAT_MAT2X4: return gluShaderUtil.DataType.FLOAT;
    343        case gluShaderUtil.DataType.FLOAT_MAT3X2: return gluShaderUtil.DataType.FLOAT;
    344        case gluShaderUtil.DataType.FLOAT_MAT3: return gluShaderUtil.DataType.FLOAT;
    345        case gluShaderUtil.DataType.FLOAT_MAT3X4: return gluShaderUtil.DataType.FLOAT;
    346        case gluShaderUtil.DataType.FLOAT_MAT4X2: return gluShaderUtil.DataType.FLOAT;
    347        case gluShaderUtil.DataType.FLOAT_MAT4X3: return gluShaderUtil.DataType.FLOAT;
    348        case gluShaderUtil.DataType.FLOAT_MAT4: return gluShaderUtil.DataType.FLOAT;
    349        case gluShaderUtil.DataType.INT: return gluShaderUtil.DataType.INT;
    350        case gluShaderUtil.DataType.INT_VEC2: return gluShaderUtil.DataType.INT;
    351        case gluShaderUtil.DataType.INT_VEC3: return gluShaderUtil.DataType.INT;
    352        case gluShaderUtil.DataType.INT_VEC4: return gluShaderUtil.DataType.INT;
    353        case gluShaderUtil.DataType.UINT: return gluShaderUtil.DataType.UINT;
    354        case gluShaderUtil.DataType.UINT_VEC2: return gluShaderUtil.DataType.UINT;
    355        case gluShaderUtil.DataType.UINT_VEC3: return gluShaderUtil.DataType.UINT;
    356        case gluShaderUtil.DataType.UINT_VEC4: return gluShaderUtil.DataType.UINT;
    357        case gluShaderUtil.DataType.BOOL: return gluShaderUtil.DataType.BOOL;
    358        case gluShaderUtil.DataType.BOOL_VEC2: return gluShaderUtil.DataType.BOOL;
    359        case gluShaderUtil.DataType.BOOL_VEC3: return gluShaderUtil.DataType.BOOL;
    360        case gluShaderUtil.DataType.BOOL_VEC4: return gluShaderUtil.DataType.BOOL;
    361        case gluShaderUtil.DataType.SAMPLER_2D:
    362        case gluShaderUtil.DataType.SAMPLER_CUBE:
    363        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY:
    364        case gluShaderUtil.DataType.SAMPLER_3D:
    365        case gluShaderUtil.DataType.SAMPLER_2D_SHADOW:
    366        case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW:
    367        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW:
    368        case gluShaderUtil.DataType.INT_SAMPLER_2D:
    369        case gluShaderUtil.DataType.INT_SAMPLER_CUBE:
    370        case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY:
    371        case gluShaderUtil.DataType.INT_SAMPLER_3D:
    372        case gluShaderUtil.DataType.UINT_SAMPLER_2D:
    373        case gluShaderUtil.DataType.UINT_SAMPLER_CUBE:
    374        case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY:
    375        case gluShaderUtil.DataType.UINT_SAMPLER_3D:
    376            return dataType;
    377    }
    378    throw Error('Unrecognized dataType ' + dataType);
    379 };
    380 
    381 /**
    382 * Checks if dataType is integer or vectors of integers
    383 * @param {gluShaderUtil.DataType} dataType shader
    384 * @return {boolean} Is dataType integer or integer vector
    385 */
    386 gluShaderUtil.isDataTypeIntOrIVec = function(dataType) {
    387    /** @type {boolean} */ var retVal = false;
    388    switch (dataType) {
    389        case gluShaderUtil.DataType.INT:
    390        case gluShaderUtil.DataType.INT_VEC2:
    391        case gluShaderUtil.DataType.INT_VEC3:
    392        case gluShaderUtil.DataType.INT_VEC4:
    393            retVal = true;
    394    }
    395 
    396    return retVal;
    397 };
    398 
    399 /**
    400 * Checks if dataType is unsigned integer or vectors of unsigned integers
    401 * @param {gluShaderUtil.DataType} dataType shader
    402 * @return {boolean} Is dataType unsigned integer or unsigned integer vector
    403 */
    404 gluShaderUtil.isDataTypeUintOrUVec = function(dataType) {
    405    /** @type {boolean} */ var retVal = false;
    406    switch (dataType) {
    407        case gluShaderUtil.DataType.UINT:
    408        case gluShaderUtil.DataType.UINT_VEC2:
    409        case gluShaderUtil.DataType.UINT_VEC3:
    410        case gluShaderUtil.DataType.UINT_VEC4:
    411            retVal = true;
    412    }
    413 
    414    return retVal;
    415 };
    416 
    417 /**
    418 * Returns type of scalar size
    419 * @param {gluShaderUtil.DataType} dataType shader
    420 * @return {number} with size of the type of scalar
    421 */
    422 gluShaderUtil.getDataTypeScalarSize = function(dataType) {
    423    switch (dataType) {
    424        case gluShaderUtil.DataType.FLOAT: return 1;
    425        case gluShaderUtil.DataType.FLOAT_VEC2: return 2;
    426        case gluShaderUtil.DataType.FLOAT_VEC3: return 3;
    427        case gluShaderUtil.DataType.FLOAT_VEC4: return 4;
    428        case gluShaderUtil.DataType.FLOAT_MAT2: return 4;
    429        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 6;
    430        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 8;
    431        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 6;
    432        case gluShaderUtil.DataType.FLOAT_MAT3: return 9;
    433        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 12;
    434        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 8;
    435        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 12;
    436        case gluShaderUtil.DataType.FLOAT_MAT4: return 16;
    437        case gluShaderUtil.DataType.INT: return 1;
    438        case gluShaderUtil.DataType.INT_VEC2: return 2;
    439        case gluShaderUtil.DataType.INT_VEC3: return 3;
    440        case gluShaderUtil.DataType.INT_VEC4: return 4;
    441        case gluShaderUtil.DataType.UINT: return 1;
    442        case gluShaderUtil.DataType.UINT_VEC2: return 2;
    443        case gluShaderUtil.DataType.UINT_VEC3: return 3;
    444        case gluShaderUtil.DataType.UINT_VEC4: return 4;
    445        case gluShaderUtil.DataType.BOOL: return 1;
    446        case gluShaderUtil.DataType.BOOL_VEC2: return 2;
    447        case gluShaderUtil.DataType.BOOL_VEC3: return 3;
    448        case gluShaderUtil.DataType.BOOL_VEC4: return 4;
    449        case gluShaderUtil.DataType.SAMPLER_2D: return 1;
    450        case gluShaderUtil.DataType.SAMPLER_CUBE: return 1;
    451        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 1;
    452        case gluShaderUtil.DataType.SAMPLER_3D: return 1;
    453        case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 1;
    454        case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 1;
    455        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 1;
    456        case gluShaderUtil.DataType.INT_SAMPLER_2D: return 1;
    457        case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 1;
    458        case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 1;
    459        case gluShaderUtil.DataType.INT_SAMPLER_3D: return 1;
    460        case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 1;
    461        case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 1;
    462        case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 1;
    463        case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 1;
    464    }
    465    throw Error('Unrecognized dataType ' + dataType);
    466 };
    467 
    468 /**
    469 * Checks if dataType is float or vector
    470 * @param {?gluShaderUtil.DataType} dataType shader
    471 * @return {boolean} Is dataType float or vector
    472 */
    473 gluShaderUtil.isDataTypeFloatOrVec = function(dataType) {
    474    switch (dataType) {
    475        case gluShaderUtil.DataType.FLOAT:
    476        case gluShaderUtil.DataType.FLOAT_VEC2:
    477        case gluShaderUtil.DataType.FLOAT_VEC3:
    478        case gluShaderUtil.DataType.FLOAT_VEC4:
    479            return true;
    480    }
    481    return false;
    482 };
    483 
    484 /**
    485 * Checks if dataType is a matrix
    486 * @param {gluShaderUtil.DataType} dataType shader
    487 * @return {boolean} Is dataType matrix or not
    488 */
    489 gluShaderUtil.isDataTypeMatrix = function(dataType) {
    490    switch (dataType) {
    491        case gluShaderUtil.DataType.FLOAT_MAT2:
    492        case gluShaderUtil.DataType.FLOAT_MAT2X3:
    493        case gluShaderUtil.DataType.FLOAT_MAT2X4:
    494        case gluShaderUtil.DataType.FLOAT_MAT3X2:
    495        case gluShaderUtil.DataType.FLOAT_MAT3:
    496        case gluShaderUtil.DataType.FLOAT_MAT3X4:
    497        case gluShaderUtil.DataType.FLOAT_MAT4X2:
    498        case gluShaderUtil.DataType.FLOAT_MAT4X3:
    499        case gluShaderUtil.DataType.FLOAT_MAT4:
    500            return true;
    501    }
    502    return false;
    503 };
    504 
    505 /**
    506 * Checks if dataType is a vector
    507 * @param {gluShaderUtil.DataType} dataType shader
    508 * @return {boolean} Is dataType vector or not
    509 */
    510 gluShaderUtil.isDataTypeScalar = function(dataType) {
    511    switch (dataType) {
    512        case gluShaderUtil.DataType.FLOAT:
    513        case gluShaderUtil.DataType.INT:
    514        case gluShaderUtil.DataType.UINT:
    515        case gluShaderUtil.DataType.BOOL:
    516            return true;
    517    }
    518    return false;
    519 };
    520 
    521 /**
    522 * Checks if dataType is a vector
    523 * @param {gluShaderUtil.DataType} dataType shader
    524 * @return {boolean} Is dataType vector or not
    525 */
    526 gluShaderUtil.isDataTypeVector = function(dataType) {
    527    switch (dataType) {
    528        case gluShaderUtil.DataType.FLOAT_VEC2:
    529        case gluShaderUtil.DataType.FLOAT_VEC3:
    530        case gluShaderUtil.DataType.FLOAT_VEC4:
    531        case gluShaderUtil.DataType.INT_VEC2:
    532        case gluShaderUtil.DataType.INT_VEC3:
    533        case gluShaderUtil.DataType.INT_VEC4:
    534        case gluShaderUtil.DataType.UINT_VEC2:
    535        case gluShaderUtil.DataType.UINT_VEC3:
    536        case gluShaderUtil.DataType.UINT_VEC4:
    537        case gluShaderUtil.DataType.BOOL_VEC2:
    538        case gluShaderUtil.DataType.BOOL_VEC3:
    539        case gluShaderUtil.DataType.BOOL_VEC4:
    540            return true;
    541    }
    542    return false;
    543 };
    544 
    545 /**
    546 * Checks if dataType is a vector or a scalar type
    547 * @param {gluShaderUtil.DataType} dataType shader
    548 * @return {boolean} Is dataType vector or scalar or not
    549 */
    550 gluShaderUtil.isDataTypeScalarOrVector = function(dataType) {
    551    switch (dataType) {
    552        case gluShaderUtil.DataType.FLOAT:
    553        case gluShaderUtil.DataType.FLOAT_VEC2:
    554        case gluShaderUtil.DataType.FLOAT_VEC3:
    555        case gluShaderUtil.DataType.FLOAT_VEC4:
    556        case gluShaderUtil.DataType.INT:
    557        case gluShaderUtil.DataType.INT_VEC2:
    558        case gluShaderUtil.DataType.INT_VEC3:
    559        case gluShaderUtil.DataType.INT_VEC4:
    560        case gluShaderUtil.DataType.UINT:
    561        case gluShaderUtil.DataType.UINT_VEC2:
    562        case gluShaderUtil.DataType.UINT_VEC3:
    563        case gluShaderUtil.DataType.UINT_VEC4:
    564        case gluShaderUtil.DataType.BOOL:
    565        case gluShaderUtil.DataType.BOOL_VEC2:
    566        case gluShaderUtil.DataType.BOOL_VEC3:
    567        case gluShaderUtil.DataType.BOOL_VEC4:
    568            return true;
    569    }
    570    return false;
    571 };
    572 
    573 /**
    574 * Checks if dataType is a sampler
    575 * @param {gluShaderUtil.DataType} dataType shader
    576 * @return {boolean} Is dataType vector or scalar or not
    577 */
    578 gluShaderUtil.isDataTypeSampler = function(dataType) {
    579    return (dataType >= gluShaderUtil.DataType.SAMPLER_2D) && (dataType <= gluShaderUtil.DataType.UINT_SAMPLER_3D);
    580 };
    581 
    582 /**
    583 * Returns a gluShaderUtil.DataType based on given rows and columns
    584 * @param {number} numCols
    585 * @param {number} numRows
    586 * @return {gluShaderUtil.DataType}
    587 */
    588 gluShaderUtil.getDataTypeMatrix = function(numCols, numRows) {
    589    if (!(deMath.deInRange32(numCols, 2, 4) && deMath.deInRange32(numRows, 2, 4)))
    590        throw new Error('Out of bounds: (' + numCols + ',' + numRows + ')');
    591 
    592    var size = numCols.toString() + 'x' + numRows.toString();
    593    var datatypes = {
    594        '2x2': gluShaderUtil.DataType.FLOAT_MAT2,
    595        '2x3': gluShaderUtil.DataType.FLOAT_MAT2X3,
    596        '2x4': gluShaderUtil.DataType.FLOAT_MAT2X4,
    597        '3x2': gluShaderUtil.DataType.FLOAT_MAT3X2,
    598        '3x3': gluShaderUtil.DataType.FLOAT_MAT3,
    599        '3x4': gluShaderUtil.DataType.FLOAT_MAT3X4,
    600        '4x2': gluShaderUtil.DataType.FLOAT_MAT4X2,
    601        '4x3': gluShaderUtil.DataType.FLOAT_MAT4X3,
    602        '4x4': gluShaderUtil.DataType.FLOAT_MAT4
    603    };
    604    return datatypes[size];
    605 };
    606 
    607 /**
    608 * Returns number of rows of a gluShaderUtil.DataType Matrix
    609 * @param {gluShaderUtil.DataType} dataType shader
    610 * @return {number} with number of rows depending on gluShaderUtil.DataType Matrix
    611 */
    612 gluShaderUtil.getDataTypeMatrixNumRows = function(dataType) {
    613    switch (dataType) {
    614        case gluShaderUtil.DataType.FLOAT_MAT2: return 2;
    615        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 3;
    616        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 4;
    617        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 2;
    618        case gluShaderUtil.DataType.FLOAT_MAT3: return 3;
    619        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 4;
    620        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 2;
    621        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 3;
    622        case gluShaderUtil.DataType.FLOAT_MAT4: return 4;
    623    }
    624    throw Error('Unrecognized dataType ' + dataType);
    625 };
    626 
    627 /**
    628 * Returns number of columns of a gluShaderUtil.DataType Matrix
    629 * @param {gluShaderUtil.DataType} dataType shader
    630 * @return {number} with number of columns depending on gluShaderUtil.DataType Matrix
    631 */
    632 gluShaderUtil.getDataTypeMatrixNumColumns = function(dataType) {
    633    switch (dataType) {
    634        case gluShaderUtil.DataType.FLOAT_MAT2: return 2;
    635        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 2;
    636        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 2;
    637        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 3;
    638        case gluShaderUtil.DataType.FLOAT_MAT3: return 3;
    639        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 3;
    640        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 4;
    641        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 4;
    642        case gluShaderUtil.DataType.FLOAT_MAT4: return 4;
    643    }
    644    throw Error('Unrecognized dataType ' + dataType);
    645 };
    646 
    647 /**
    648 * @param {gluShaderUtil.DataType} dataType
    649 * @return {number}
    650 */
    651 gluShaderUtil.getDataTypeNumLocations = function(dataType) {
    652    if (gluShaderUtil.isDataTypeScalarOrVector(dataType))
    653        return 1;
    654    else if (gluShaderUtil.isDataTypeMatrix(dataType))
    655        return gluShaderUtil.getDataTypeMatrixNumColumns(dataType);
    656    throw Error('Unrecognized dataType ' + dataType);
    657 };
    658 
    659 /**
    660 * @param {gluShaderUtil.DataType} dataType
    661 * @return {number}
    662 */
    663 gluShaderUtil.getDataTypeNumComponents = function(dataType) {
    664    if (gluShaderUtil.isDataTypeScalarOrVector(dataType))
    665        return gluShaderUtil.getDataTypeScalarSize(dataType);
    666    else if (gluShaderUtil.isDataTypeMatrix(dataType))
    667        return gluShaderUtil.getDataTypeMatrixNumRows(dataType);
    668 
    669    throw Error('Unrecognized dataType ' + dataType);
    670 };
    671 
    672 /**
    673 * Returns name of the dataType
    674 * @param {?gluShaderUtil.DataType} dataType shader
    675 * @return {string} dataType name
    676 */
    677 gluShaderUtil.getDataTypeName = function(dataType) {
    678    switch (dataType) {
    679        case gluShaderUtil.DataType.INVALID: return 'invalid';
    680 
    681        case gluShaderUtil.DataType.FLOAT: return 'float';
    682        case gluShaderUtil.DataType.FLOAT_VEC2: return 'vec2';
    683        case gluShaderUtil.DataType.FLOAT_VEC3: return 'vec3';
    684        case gluShaderUtil.DataType.FLOAT_VEC4: return 'vec4';
    685        case gluShaderUtil.DataType.FLOAT_MAT2: return 'mat2';
    686        case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'mat2x3';
    687        case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'mat2x4';
    688        case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'mat3x2';
    689        case gluShaderUtil.DataType.FLOAT_MAT3: return 'mat3';
    690        case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'mat3x4';
    691        case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'mat4x2';
    692        case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'mat4x3';
    693        case gluShaderUtil.DataType.FLOAT_MAT4: return 'mat4';
    694 
    695        case gluShaderUtil.DataType.INT: return 'int';
    696        case gluShaderUtil.DataType.INT_VEC2: return 'ivec2';
    697        case gluShaderUtil.DataType.INT_VEC3: return 'ivec3';
    698        case gluShaderUtil.DataType.INT_VEC4: return 'ivec4';
    699 
    700        case gluShaderUtil.DataType.UINT: return 'uint';
    701        case gluShaderUtil.DataType.UINT_VEC2: return 'uvec2';
    702        case gluShaderUtil.DataType.UINT_VEC3: return 'uvec3';
    703        case gluShaderUtil.DataType.UINT_VEC4: return 'uvec4';
    704 
    705        case gluShaderUtil.DataType.BOOL: return 'bool';
    706        case gluShaderUtil.DataType.BOOL_VEC2: return 'bvec2';
    707        case gluShaderUtil.DataType.BOOL_VEC3: return 'bvec3';
    708        case gluShaderUtil.DataType.BOOL_VEC4: return 'bvec4';
    709 
    710        case gluShaderUtil.DataType.SAMPLER_2D: return 'sampler2D';
    711        case gluShaderUtil.DataType.SAMPLER_CUBE: return 'samplerCube';
    712        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 'sampler2DArray';
    713        case gluShaderUtil.DataType.SAMPLER_3D: return 'sampler3D';
    714 
    715        case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 'sampler2DShadow';
    716        case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 'samplerCubeShadow';
    717        case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 'sampler2DArrayShadow';
    718 
    719        case gluShaderUtil.DataType.INT_SAMPLER_2D: return 'isampler2D';
    720        case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 'isamplerCube';
    721        case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 'isampler2DArray';
    722        case gluShaderUtil.DataType.INT_SAMPLER_3D: return 'isampler3D';
    723 
    724        case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 'usampler2D';
    725        case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 'usamplerCube';
    726        case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 'usampler2DArray';
    727        case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 'usampler3D';
    728    }
    729    throw Error('Unrecognized dataType ' + dataType);
    730 };
    731 
    732 /**
    733 * Returns the gluShaderUtil.DataType from the GL type
    734 * @param {number} glType
    735 * @return {gluShaderUtil.DataType}
    736 */
    737 gluShaderUtil.getDataTypeFromGLType = function(glType) {
    738    switch (glType) {
    739        case gl.FLOAT: return gluShaderUtil.DataType.FLOAT;
    740        case gl.FLOAT_VEC2: return gluShaderUtil.DataType.FLOAT_VEC2;
    741        case gl.FLOAT_VEC3: return gluShaderUtil.DataType.FLOAT_VEC3;
    742        case gl.FLOAT_VEC4: return gluShaderUtil.DataType.FLOAT_VEC4;
    743 
    744        case gl.FLOAT_MAT2: return gluShaderUtil.DataType.FLOAT_MAT2;
    745        case gl.FLOAT_MAT2x3: return gluShaderUtil.DataType.FLOAT_MAT2X3;
    746        case gl.FLOAT_MAT2x4: return gluShaderUtil.DataType.FLOAT_MAT2X4;
    747 
    748        case gl.FLOAT_MAT3x2: return gluShaderUtil.DataType.FLOAT_MAT3X2;
    749        case gl.FLOAT_MAT3: return gluShaderUtil.DataType.FLOAT_MAT3;
    750        case gl.FLOAT_MAT3x4: return gluShaderUtil.DataType.FLOAT_MAT3X4;
    751 
    752        case gl.FLOAT_MAT4x2: return gluShaderUtil.DataType.FLOAT_MAT4X2;
    753        case gl.FLOAT_MAT4x3: return gluShaderUtil.DataType.FLOAT_MAT4X3;
    754        case gl.FLOAT_MAT4: return gluShaderUtil.DataType.FLOAT_MAT4;
    755 
    756        case gl.INT: return gluShaderUtil.DataType.INT;
    757        case gl.INT_VEC2: return gluShaderUtil.DataType.INT_VEC2;
    758        case gl.INT_VEC3: return gluShaderUtil.DataType.INT_VEC3;
    759        case gl.INT_VEC4: return gluShaderUtil.DataType.INT_VEC4;
    760 
    761        case gl.UNSIGNED_INT: return gluShaderUtil.DataType.UINT;
    762        case gl.UNSIGNED_INT_VEC2: return gluShaderUtil.DataType.UINT_VEC2;
    763        case gl.UNSIGNED_INT_VEC3: return gluShaderUtil.DataType.UINT_VEC3;
    764        case gl.UNSIGNED_INT_VEC4: return gluShaderUtil.DataType.UINT_VEC4;
    765 
    766        case gl.BOOL: return gluShaderUtil.DataType.BOOL;
    767        case gl.BOOL_VEC2: return gluShaderUtil.DataType.BOOL_VEC2;
    768        case gl.BOOL_VEC3: return gluShaderUtil.DataType.BOOL_VEC3;
    769        case gl.BOOL_VEC4: return gluShaderUtil.DataType.BOOL_VEC4;
    770 
    771        case gl.SAMPLER_2D: return gluShaderUtil.DataType.SAMPLER_2D;
    772        case gl.SAMPLER_CUBE: return gluShaderUtil.DataType.SAMPLER_CUBE;
    773        case gl.SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.SAMPLER_2D_ARRAY;
    774        case gl.SAMPLER_3D: return gluShaderUtil.DataType.SAMPLER_3D;
    775 
    776        case gl.SAMPLER_2D_SHADOW: return gluShaderUtil.DataType.SAMPLER_2D_SHADOW;
    777        case gl.SAMPLER_CUBE_SHADOW: return gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW;
    778        case gl.SAMPLER_2D_ARRAY_SHADOW: return gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW;
    779 
    780        case gl.INT_SAMPLER_2D: return gluShaderUtil.DataType.INT_SAMPLER_2D;
    781        case gl.INT_SAMPLER_CUBE: return gluShaderUtil.DataType.INT_SAMPLER_CUBE;
    782        case gl.INT_SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY;
    783        case gl.INT_SAMPLER_3D: return gluShaderUtil.DataType.INT_SAMPLER_3D;
    784 
    785        case gl.UNSIGNED_INT_SAMPLER_2D: return gluShaderUtil.DataType.UINT_SAMPLER_2D;
    786        case gl.UNSIGNED_INT_SAMPLER_CUBE: return gluShaderUtil.DataType.UINT_SAMPLER_CUBE;
    787        case gl.UNSIGNED_INT_SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY;
    788        case gl.UNSIGNED_INT_SAMPLER_3D: return gluShaderUtil.DataType.UINT_SAMPLER_3D;
    789 
    790        default:
    791            throw new Error('Unrecognized GL type:' + glType);
    792    }
    793 };
    794 
    795 });