tor-browser

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

gluTextureUtil.js (52401B)


      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 /*--------------------------------------------------------------------*//*!
     22 * \brief Map tcuTexture.TextureFormat to GL pixel transfer format.
     23 *
     24 * Maps generic texture format description to GL pixel transfer format.
     25 * If no mapping is found, throws tcu::InternalError.
     26 *
     27 * \param texFormat Generic texture format.
     28 * \return GL pixel transfer format.
     29 *//*--------------------------------------------------------------------*/
     30 'use strict';
     31 goog.provide('framework.opengl.gluTextureUtil');
     32 goog.require('framework.common.tcuCompressedTexture');
     33 goog.require('framework.common.tcuTexture');
     34 goog.require('framework.common.tcuTextureUtil');
     35 goog.require('framework.delibs.debase.deString');
     36 goog.require('framework.opengl.gluShaderUtil');
     37 
     38 goog.scope(function() {
     39 
     40 var gluTextureUtil = framework.opengl.gluTextureUtil;
     41 var deString = framework.delibs.debase.deString;
     42 var tcuTexture = framework.common.tcuTexture;
     43 var tcuTextureUtil = framework.common.tcuTextureUtil;
     44 var tcuCompressedTexture = framework.common.tcuCompressedTexture;
     45 var gluShaderUtil = framework.opengl.gluShaderUtil;
     46 
     47 /**
     48 * @param {number} format
     49 * @param {number} dataType
     50 * @constructor
     51 */
     52 gluTextureUtil.TransferFormat = function(format, dataType) {
     53    this.format = format; //!< Pixel format.
     54    this.dataType = dataType; //!< Data type.
     55 };
     56 
     57 /**
     58 * Map tcuTexture.TextureFormat to GL pixel transfer format.
     59 *
     60 * Maps generic texture format description to GL pixel transfer format.
     61 * If no mapping is found, throws tcu::InternalError.
     62 *
     63 * @param {tcuTexture.TextureFormat} texFormat Generic texture format.
     64 * @return {gluTextureUtil.TransferFormat} GL pixel transfer format.
     65 * @throws {Error}
     66 */
     67 gluTextureUtil.getTransferFormat = function(/* tcuTexture.TextureFormat */ texFormat) {
     68    var format = gl.NONE;
     69    var type = gl.NONE;
     70    /*boolean*/ var isInt = false;
     71 
     72    switch (texFormat.type) {
     73        case tcuTexture.ChannelType.SIGNED_INT8:
     74        case tcuTexture.ChannelType.SIGNED_INT16:
     75        case tcuTexture.ChannelType.SIGNED_INT32:
     76        case tcuTexture.ChannelType.UNSIGNED_INT8:
     77        case tcuTexture.ChannelType.UNSIGNED_INT16:
     78        case tcuTexture.ChannelType.UNSIGNED_INT32:
     79        case tcuTexture.ChannelType.UNSIGNED_INT_1010102_REV:
     80            isInt = true;
     81            break;
     82 
     83        default:
     84            isInt = false;
     85            break;
     86    }
     87 
     88    switch (texFormat.order) {
     89        case tcuTexture.ChannelOrder.A: format = gl.ALPHA; break;
     90        case tcuTexture.ChannelOrder.L: format = gl.LUMINANCE; break;
     91        case tcuTexture.ChannelOrder.LA: format = gl.LUMINANCE_ALPHA; break;
     92        case tcuTexture.ChannelOrder.R: format = isInt ? gl.RED_INTEGER : gl.RED; break;
     93        case tcuTexture.ChannelOrder.RG: format = isInt ? gl.RG_INTEGER : gl.RG; break;
     94        case tcuTexture.ChannelOrder.RGB: format = isInt ? gl.RGB_INTEGER : gl.RGB; break;
     95        case tcuTexture.ChannelOrder.RGBA: format = isInt ? gl.RGBA_INTEGER : gl.RGBA; break;
     96        case tcuTexture.ChannelOrder.sRGB: format = gl.RGB; break;
     97        case tcuTexture.ChannelOrder.sRGBA: format = gl.RGBA; break;
     98        case tcuTexture.ChannelOrder.D: format = gl.DEPTH_COMPONENT; break;
     99        case tcuTexture.ChannelOrder.DS: format = gl.DEPTH_STENCIL; break;
    100        case tcuTexture.ChannelOrder.S: format = gl.STENCIL_INDEX; break;
    101 
    102        default:
    103            throw new Error('Unknown ChannelOrder ' + texFormat.order);
    104    }
    105 
    106    switch (texFormat.type) {
    107        case tcuTexture.ChannelType.SNORM_INT8: type = gl.BYTE; break;
    108        case tcuTexture.ChannelType.SNORM_INT16: type = gl.SHORT; break;
    109        case tcuTexture.ChannelType.UNORM_INT8: type = gl.UNSIGNED_BYTE; break;
    110        case tcuTexture.ChannelType.UNORM_INT16: type = gl.UNSIGNED_SHORT; break;
    111        case tcuTexture.ChannelType.UNORM_SHORT_565: type = gl.UNSIGNED_SHORT_5_6_5; break;
    112        case tcuTexture.ChannelType.UNORM_SHORT_4444: type = gl.UNSIGNED_SHORT_4_4_4_4; break;
    113        case tcuTexture.ChannelType.UNORM_SHORT_5551: type = gl.UNSIGNED_SHORT_5_5_5_1; break;
    114        case tcuTexture.ChannelType.SIGNED_INT8: type = gl.BYTE; break;
    115        case tcuTexture.ChannelType.SIGNED_INT16: type = gl.SHORT; break;
    116        case tcuTexture.ChannelType.SIGNED_INT32: type = gl.INT; break;
    117        case tcuTexture.ChannelType.UNSIGNED_INT8: type = gl.UNSIGNED_BYTE; break;
    118        case tcuTexture.ChannelType.UNSIGNED_INT16: type = gl.UNSIGNED_SHORT; break;
    119        case tcuTexture.ChannelType.UNSIGNED_INT32: type = gl.UNSIGNED_INT; break;
    120        case tcuTexture.ChannelType.FLOAT: type = gl.FLOAT; break;
    121        case tcuTexture.ChannelType.UNORM_INT_101010: type = gl.UNSIGNED_INT_2_10_10_10_REV; break;
    122        case tcuTexture.ChannelType.UNORM_INT_1010102_REV: type = gl.UNSIGNED_INT_2_10_10_10_REV; break;
    123        case tcuTexture.ChannelType.UNSIGNED_INT_1010102_REV: type = gl.UNSIGNED_INT_2_10_10_10_REV; break;
    124        case tcuTexture.ChannelType.UNSIGNED_INT_11F_11F_10F_REV: type = gl.UNSIGNED_INT_10F_11F_11F_REV; break;
    125        case tcuTexture.ChannelType.UNSIGNED_INT_999_E5_REV: type = gl.UNSIGNED_INT_5_9_9_9_REV; break;
    126        case tcuTexture.ChannelType.HALF_FLOAT: type = gl.HALF_FLOAT; break;
    127        case tcuTexture.ChannelType.FLOAT_UNSIGNED_INT_24_8_REV: type = gl.FLOAT_32_UNSIGNED_INT_24_8_REV; break;
    128        case tcuTexture.ChannelType.UNSIGNED_INT_24_8: type = texFormat.order == tcuTexture.ChannelOrder.D ?
    129                                                                 gl.UNSIGNED_INT : gl.UNSIGNED_INT_24_8; break;
    130 
    131        default:
    132            throw new Error("Can't map texture format to GL transfer format " + texFormat.type);
    133    }
    134 
    135    return new gluTextureUtil.TransferFormat(format, type);
    136 };
    137 
    138 /**
    139 * Map tcuTexture.TextureFormat to GL internal sized format.
    140 *
    141 * Maps generic texture format description to GL internal format.
    142 * If no mapping is found, throws Error.
    143 *
    144 * @param {tcuTexture.TextureFormat} texFormat Generic texture format.
    145 * @return {number} GL texture format.
    146 * @throws {Error}
    147 */
    148 gluTextureUtil.getInternalFormat = function(texFormat) {
    149 
    150    var stringify = function(order, type) {
    151        return '' + order + ' ' + type;
    152    };
    153 
    154    switch (stringify(texFormat.order, texFormat.type)) {
    155        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_SHORT_5551): return gl.RGB5_A1;
    156        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_SHORT_4444): return gl.RGBA4;
    157        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_SHORT_565): return gl.RGB565;
    158        case stringify(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNORM_INT16): return gl.DEPTH_COMPONENT16;
    159        case stringify(tcuTexture.ChannelOrder.S, tcuTexture.ChannelType.UNSIGNED_INT8): return gl.STENCIL_INDEX8;
    160 
    161        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.FLOAT): return gl.RGBA32F;
    162        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT32): return gl.RGBA32I;
    163        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT32): return gl.RGBA32UI;
    164        // TODO: Check which ones are valid in WebGL 2 - case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT16): return gl.RGBA16;
    165        //case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SNORM_INT16): return gl.RGBA16_SNORM;
    166        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.HALF_FLOAT): return gl.RGBA16F;
    167        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT16): return gl.RGBA16I;
    168        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT16): return gl.RGBA16UI;
    169        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT8): return gl.RGBA8;
    170        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT8): return gl.RGBA8I;
    171        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT8): return gl.RGBA8UI;
    172        case stringify(tcuTexture.ChannelOrder.sRGBA, tcuTexture.ChannelType.UNORM_INT8): return gl.SRGB8_ALPHA8;
    173        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT_1010102_REV): return gl.RGB10_A2;
    174        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT_1010102_REV): return gl.RGB10_A2UI;
    175        case stringify(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SNORM_INT8): return gl.RGBA8_SNORM;
    176 
    177        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT8): return gl.RGB8;
    178        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT_11F_11F_10F_REV): return gl.R11F_G11F_B10F;
    179        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.FLOAT): return gl.RGB32F;
    180        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT32): return gl.RGB32I;
    181        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT32): return gl.RGB32UI;
    182        //case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT16): return gl.RGB16;
    183        //case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SNORM_INT16): return gl.RGB16_SNORM;
    184        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.HALF_FLOAT): return gl.RGB16F;
    185        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT16): return gl.RGB16I;
    186        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT16): return gl.RGB16UI;
    187        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SNORM_INT8): return gl.RGB8_SNORM;
    188        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT8): return gl.RGB8I;
    189        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT8): return gl.RGB8UI;
    190        case stringify(tcuTexture.ChannelOrder.sRGB, tcuTexture.ChannelType.UNORM_INT8): return gl.SRGB8;
    191        case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT_999_E5_REV): return gl.RGB9_E5;
    192        //case stringify(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT_1010102_REV): return gl.RGB10;
    193 
    194        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.FLOAT): return gl.RG32F;
    195        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT32): return gl.RG32I;
    196        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT32): return gl.RG32UI;
    197        //case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNORM_INT16): return gl.RG16;
    198        //case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SNORM_INT16): return gl.RG16_SNORM;
    199        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.HALF_FLOAT): return gl.RG16F;
    200        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT16): return gl.RG16I;
    201        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT16): return gl.RG16UI;
    202        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNORM_INT8): return gl.RG8;
    203        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT8): return gl.RG8I;
    204        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT8): return gl.RG8UI;
    205        case stringify(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SNORM_INT8): return gl.RG8_SNORM;
    206 
    207        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.FLOAT): return gl.R32F;
    208        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT32): return gl.R32I;
    209        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT32): return gl.R32UI;
    210        //case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNORM_INT16): return gl.R16;
    211        //case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SNORM_INT16): return gl.R16_SNORM;
    212        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.HALF_FLOAT): return gl.R16F;
    213        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT16): return gl.R16I;
    214        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT16): return gl.R16UI;
    215        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNORM_INT8): return gl.R8;
    216        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT8): return gl.R8I;
    217        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT8): return gl.R8UI;
    218        case stringify(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SNORM_INT8): return gl.R8_SNORM;
    219 
    220        case stringify(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.FLOAT): return gl.DEPTH_COMPONENT32F;
    221        case stringify(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNSIGNED_INT_24_8): return gl.DEPTH_COMPONENT24;
    222        //case stringify(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNSIGNED_INT32): return gl.DEPTH_COMPONENT32;
    223        case stringify(tcuTexture.ChannelOrder.DS, tcuTexture.ChannelType.FLOAT_UNSIGNED_INT_24_8_REV): return gl.DEPTH32F_STENCIL8;
    224        case stringify(tcuTexture.ChannelOrder.DS, tcuTexture.ChannelType.UNSIGNED_INT_24_8): return gl.DEPTH24_STENCIL8;
    225 
    226        default:
    227            throw new Error("Can't map texture format to GL internal format");
    228    }
    229 };
    230 
    231 /**
    232 * Enable WEBGL_compressed_texture_etc support if available, by merging it
    233 * into the WebGL2RenderingContext.
    234 *
    235 * This function may be called many times.
    236 *
    237 * @return {boolean} True if enabled.
    238 */
    239 gluTextureUtil.enableCompressedTextureETC = (function() {
    240    var enabled = undefined;
    241    return function() {
    242        if (enabled === undefined) {
    243            enabled = false;
    244 
    245            var WEBGL_compressed_texture_etc = gl.getExtension("WEBGL_compressed_texture_etc");
    246            if (WEBGL_compressed_texture_etc) {
    247                // Extend gl with enums from WEBGL_compressed_texture_etc
    248                // (if it doesn't already have the etc texture formats).
    249                var proto = Object.getPrototypeOf(WEBGL_compressed_texture_etc);
    250                for (var prop in proto) {
    251                    if (proto.hasOwnProperty(prop)) {
    252                        gl[prop] = proto[prop];
    253                    }
    254                }
    255                enabled = true;
    256            }
    257        }
    258        return enabled;
    259    };
    260 })();
    261 
    262 /**
    263 * Map generic compressed format to GL compressed format enum.
    264 *
    265 * Maps generic compressed format to GL compressed format enum value.
    266 * If no mapping is found, throws Error.
    267 
    268 * @param {tcuCompressedTexture.Format} format Generic compressed format.
    269 * @return {number} GL compressed texture format.
    270 * @throws {Error}
    271 */
    272 gluTextureUtil.getGLFormat = function(/* tcuCompressedTexture.Format */ format) {
    273    switch (format) {
    274        // TODO: check which are available in WebGL 2 - case tcuCompressedTexture.Format.ETC1_RGB8: return gl.ETC1_RGB8_OES;
    275        case tcuCompressedTexture.Format.EAC_R11: return gl.COMPRESSED_R11_EAC;
    276        case tcuCompressedTexture.Format.EAC_SIGNED_R11: return gl.COMPRESSED_SIGNED_R11_EAC;
    277        case tcuCompressedTexture.Format.EAC_RG11: return gl.COMPRESSED_RG11_EAC;
    278        case tcuCompressedTexture.Format.EAC_SIGNED_RG11: return gl.COMPRESSED_SIGNED_RG11_EAC;
    279        case tcuCompressedTexture.Format.ETC2_RGB8: return gl.COMPRESSED_RGB8_ETC2;
    280        case tcuCompressedTexture.Format.ETC2_SRGB8: return gl.COMPRESSED_SRGB8_ETC2;
    281        case tcuCompressedTexture.Format.ETC2_RGB8_PUNCHTHROUGH_ALPHA1: return gl.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
    282        case tcuCompressedTexture.Format.ETC2_SRGB8_PUNCHTHROUGH_ALPHA1: return gl.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
    283        case tcuCompressedTexture.Format.ETC2_EAC_RGBA8: return gl.COMPRESSED_RGBA8_ETC2_EAC;
    284        case tcuCompressedTexture.Format.ETC2_EAC_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
    285 
    286        /*case tcuCompressedTexture.Format.ASTC_4x4_RGBA: return gl.COMPRESSED_RGBA_ASTC_4x4_KHR;
    287        case tcuCompressedTexture.Format.ASTC_5x4_RGBA: return gl.COMPRESSED_RGBA_ASTC_5x4_KHR;
    288        case tcuCompressedTexture.Format.ASTC_5x5_RGBA: return gl.COMPRESSED_RGBA_ASTC_5x5_KHR;
    289        case tcuCompressedTexture.Format.ASTC_6x5_RGBA: return gl.COMPRESSED_RGBA_ASTC_6x5_KHR;
    290        case tcuCompressedTexture.Format.ASTC_6x6_RGBA: return gl.COMPRESSED_RGBA_ASTC_6x6_KHR;
    291        case tcuCompressedTexture.Format.ASTC_8x5_RGBA: return gl.COMPRESSED_RGBA_ASTC_8x5_KHR;
    292        case tcuCompressedTexture.Format.ASTC_8x6_RGBA: return gl.COMPRESSED_RGBA_ASTC_8x6_KHR;
    293        case tcuCompressedTexture.Format.ASTC_8x8_RGBA: return gl.COMPRESSED_RGBA_ASTC_8x8_KHR;
    294        case tcuCompressedTexture.Format.ASTC_10x5_RGBA: return gl.COMPRESSED_RGBA_ASTC_10x5_KHR;
    295        case tcuCompressedTexture.Format.ASTC_10x6_RGBA: return gl.COMPRESSED_RGBA_ASTC_10x6_KHR;
    296        case tcuCompressedTexture.Format.ASTC_10x8_RGBA: return gl.COMPRESSED_RGBA_ASTC_10x8_KHR;
    297        case tcuCompressedTexture.Format.ASTC_10x10_RGBA: return gl.COMPRESSED_RGBA_ASTC_10x10_KHR;
    298        case tcuCompressedTexture.Format.ASTC_12x10_RGBA: return gl.COMPRESSED_RGBA_ASTC_12x10_KHR;
    299        case tcuCompressedTexture.Format.ASTC_12x12_RGBA: return gl.COMPRESSED_RGBA_ASTC_12x12_KHR;
    300        case tcuCompressedTexture.Format.ASTC_4x4_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
    301        case tcuCompressedTexture.Format.ASTC_5x4_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
    302        case tcuCompressedTexture.Format.ASTC_5x5_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
    303        case tcuCompressedTexture.Format.ASTC_6x5_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
    304        case tcuCompressedTexture.Format.ASTC_6x6_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
    305        case tcuCompressedTexture.Format.ASTC_8x5_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
    306        case tcuCompressedTexture.Format.ASTC_8x6_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
    307        case tcuCompressedTexture.Format.ASTC_8x8_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
    308        case tcuCompressedTexture.Format.ASTC_10x5_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
    309        case tcuCompressedTexture.Format.ASTC_10x6_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
    310        case tcuCompressedTexture.Format.ASTC_10x8_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
    311        case tcuCompressedTexture.Format.ASTC_10x10_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
    312        case tcuCompressedTexture.Format.ASTC_12x10_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
    313        case tcuCompressedTexture.Format.ASTC_12x12_SRGB8_ALPHA8: return gl.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;*/
    314 
    315        default:
    316            throw new Error("Can't map compressed format to GL format");
    317    }
    318 };
    319 
    320 /**
    321 * @param {number} dataType
    322 * @param {boolean} normalized
    323 * @return {tcuTexture.ChannelType}
    324 * @throws {Error}
    325 */
    326 gluTextureUtil.mapGLChannelType = function(/* deMath.deUint32 */ dataType, /*boolean*/ normalized) {
    327    // \note Normalized bit is ignored where it doesn't apply.
    328 
    329    switch (dataType) {
    330        case gl.UNSIGNED_BYTE: return normalized ? tcuTexture.ChannelType.UNORM_INT8 : tcuTexture.ChannelType.UNSIGNED_INT8;
    331        case gl.BYTE: return normalized ? tcuTexture.ChannelType.SNORM_INT8 : tcuTexture.ChannelType.SIGNED_INT8;
    332        case gl.UNSIGNED_SHORT: return normalized ? tcuTexture.ChannelType.UNORM_INT16 : tcuTexture.ChannelType.UNSIGNED_INT16;
    333        case gl.SHORT: return normalized ? tcuTexture.ChannelType.SNORM_INT16 : tcuTexture.ChannelType.SIGNED_INT16;
    334        case gl.UNSIGNED_INT: return normalized ? tcuTexture.ChannelType.UNORM_INT32 : tcuTexture.ChannelType.UNSIGNED_INT32;
    335        case gl.INT: return normalized ? tcuTexture.ChannelType.SNORM_INT32 : tcuTexture.ChannelType.SIGNED_INT32;
    336        case gl.FLOAT: return tcuTexture.ChannelType.FLOAT;
    337        case gl.UNSIGNED_SHORT_4_4_4_4: return tcuTexture.ChannelType.UNORM_SHORT_4444;
    338        case gl.UNSIGNED_SHORT_5_5_5_1: return tcuTexture.ChannelType.UNORM_SHORT_5551;
    339        case gl.UNSIGNED_SHORT_5_6_5: return tcuTexture.ChannelType.UNORM_SHORT_565;
    340        case gl.HALF_FLOAT: return tcuTexture.ChannelType.HALF_FLOAT;
    341        case gl.UNSIGNED_INT_2_10_10_10_REV: return normalized ? tcuTexture.ChannelType.UNORM_INT_1010102_REV : tcuTexture.ChannelType.UNSIGNED_INT_1010102_REV;
    342        case gl.UNSIGNED_INT_10F_11F_11F_REV: return tcuTexture.ChannelType.UNSIGNED_INT_11F_11F_10F_REV;
    343        case gl.UNSIGNED_INT_24_8: return tcuTexture.ChannelType.UNSIGNED_INT_24_8;
    344        case gl.FLOAT_32_UNSIGNED_INT_24_8_REV: return tcuTexture.ChannelType.FLOAT_UNSIGNED_INT_24_8_REV;
    345        case gl.UNSIGNED_INT_5_9_9_9_REV: return tcuTexture.ChannelType.UNSIGNED_INT_999_E5_REV;
    346 
    347        default:
    348            throw new Error('Unsupported dataType ' + dataType);
    349    }
    350 };
    351 
    352 /**
    353 * @param {number} format Generic compressed format.
    354 * @param {number} dataType
    355 * @return {tcuTexture.TextureFormat} GL texture format.
    356 * @throws {Error}
    357 */
    358 gluTextureUtil.mapGLTransferFormat = function(format, dataType) {
    359    switch (format) {
    360        case gl.ALPHA: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.A, gluTextureUtil.mapGLChannelType(dataType, true));
    361        case gl.LUMINANCE: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.L, gluTextureUtil.mapGLChannelType(dataType, true));
    362        case gl.LUMINANCE_ALPHA: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.LA, gluTextureUtil.mapGLChannelType(dataType, true));
    363        case gl.RGB: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, gluTextureUtil.mapGLChannelType(dataType, true));
    364        case gl.RGBA: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, gluTextureUtil.mapGLChannelType(dataType, true));
    365        //case gl.BGRA: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.BGRA, gluTextureUtil.mapGLChannelType(dataType, true));
    366        case gl.RG: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, gluTextureUtil.mapGLChannelType(dataType, true));
    367        case gl.RED: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, gluTextureUtil.mapGLChannelType(dataType, true));
    368        case gl.RGBA_INTEGER: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, gluTextureUtil.mapGLChannelType(dataType, false));
    369        case gl.RGB_INTEGER: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, gluTextureUtil.mapGLChannelType(dataType, false));
    370        case gl.RG_INTEGER: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, gluTextureUtil.mapGLChannelType(dataType, false));
    371        case gl.RED_INTEGER: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, gluTextureUtil.mapGLChannelType(dataType, false));
    372 
    373        case gl.DEPTH_COMPONENT: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.D, gluTextureUtil.mapGLChannelType(dataType, true));
    374        case gl.DEPTH_STENCIL: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.DS, gluTextureUtil.mapGLChannelType(dataType, true));
    375 
    376        default:
    377            throw new Error("Can't map GL pixel format (" + deString.enumToString(gl, format) + ', ' + deString.enumToString(gl, dataType) + ') to texture format');
    378    }
    379 };
    380 
    381 /**
    382 * Map GL internal texture format to tcuTexture.TextureFormat.
    383 *
    384 * If no mapping is found, throws Error.
    385 * @param {number} internalFormat
    386 * @return {tcuTexture.TextureFormat} GL texture format.
    387 * @throws {Error}
    388 */
    389 gluTextureUtil.mapGLInternalFormat = function(/*deMath.deUint32*/ internalFormat) {
    390    if (internalFormat === undefined)
    391        throw new Error('internalformat is undefined');
    392 
    393    switch (internalFormat) {
    394        case gl.RGB5_A1: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_SHORT_5551);
    395        case gl.RGBA4: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_SHORT_4444);
    396        case gl.RGB565: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_SHORT_565);
    397        case gl.DEPTH_COMPONENT16: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNORM_INT16);
    398        case gl.STENCIL_INDEX8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.S, tcuTexture.ChannelType.UNSIGNED_INT8);
    399 
    400        case gl.RGBA32F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.FLOAT);
    401        case gl.RGBA32I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT32);
    402        case gl.RGBA32UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT32);
    403        //TODO: Check which are available in WebGL 2 case gl.RGBA16: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT16);
    404        //case gl.RGBA16_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SNORM_INT16);
    405        case gl.RGBA16F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.HALF_FLOAT);
    406        case gl.RGBA16I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT16);
    407        case gl.RGBA16UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT16);
    408        case gl.RGBA8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT8);
    409        case gl.RGBA8I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SIGNED_INT8);
    410        case gl.RGBA8UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT8);
    411        case gl.SRGB8_ALPHA8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.sRGBA, tcuTexture.ChannelType.UNORM_INT8);
    412        case gl.RGB10_A2: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT_1010102_REV);
    413        case gl.RGB10_A2UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNSIGNED_INT_1010102_REV);
    414        case gl.RGBA8_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.SNORM_INT8);
    415 
    416        case gl.RGB8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT8);
    417        case gl.R11F_G11F_B10F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT_11F_11F_10F_REV);
    418        case gl.RGB32F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.FLOAT);
    419        case gl.RGB32I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT32);
    420        case gl.RGB32UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT32);
    421        //case gl.RGB16: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT16);
    422        //case gl.RGB16_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SNORM_INT16);
    423        case gl.RGB16F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.HALF_FLOAT);
    424        case gl.RGB16I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT16);
    425        case gl.RGB16UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT16);
    426        case gl.RGB8_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SNORM_INT8);
    427        case gl.RGB8I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.SIGNED_INT8);
    428        case gl.RGB8UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT8);
    429        case gl.SRGB8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.sRGB, tcuTexture.ChannelType.UNORM_INT8);
    430        case gl.RGB9_E5: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNSIGNED_INT_999_E5_REV);
    431        //case gl.RGB10: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT_1010102_REV);
    432 
    433        case gl.RG32F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.FLOAT);
    434        case gl.RG32I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT32);
    435        case gl.RG32UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT32);
    436        //case gl.RG16: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNORM_INT16);
    437        //case gl.RG16_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SNORM_INT16);
    438        case gl.RG16F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.HALF_FLOAT);
    439        case gl.RG16I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT16);
    440        case gl.RG16UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT16);
    441        case gl.RG8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNORM_INT8);
    442        case gl.RG8I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SIGNED_INT8);
    443        case gl.RG8UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.UNSIGNED_INT8);
    444        case gl.RG8_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RG, tcuTexture.ChannelType.SNORM_INT8);
    445 
    446        case gl.R32F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.FLOAT);
    447        case gl.R32I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT32);
    448        case gl.R32UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT32);
    449        //case gl.R16: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNORM_INT16);
    450        //case gl.R16_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SNORM_INT16);
    451        case gl.R16F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.HALF_FLOAT);
    452        case gl.R16I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT16);
    453        case gl.R16UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT16);
    454        case gl.R8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNORM_INT8);
    455        case gl.R8I: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SIGNED_INT8);
    456        case gl.R8UI: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.UNSIGNED_INT8);
    457        case gl.R8_SNORM: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.R, tcuTexture.ChannelType.SNORM_INT8);
    458 
    459        case gl.DEPTH_COMPONENT32F: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.FLOAT);
    460        case gl.DEPTH_COMPONENT24: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNSIGNED_INT_24_8);
    461        //case gl.DEPTH_COMPONENT32: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.D, tcuTexture.ChannelType.UNSIGNED_INT32);
    462        case gl.DEPTH32F_STENCIL8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.DS, tcuTexture.ChannelType.FLOAT_UNSIGNED_INT_24_8_REV);
    463        case gl.DEPTH24_STENCIL8: return new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.DS, tcuTexture.ChannelType.UNSIGNED_INT_24_8);
    464 
    465        default:
    466            throw new Error("Can't map GL sized internal format (" + internalFormat.toString(16) + ') to texture format');
    467    }
    468 };
    469 
    470 /**
    471 * @param {number} format
    472 * @return {boolean}
    473 */
    474 gluTextureUtil.isGLInternalColorFormatFilterable = function(format) {
    475    switch (format) {
    476        case gl.R8:
    477        case gl.R8_SNORM:
    478        case gl.RG8:
    479        case gl.RG8_SNORM:
    480        case gl.RGB8:
    481        case gl.RGB8_SNORM:
    482        case gl.RGB565:
    483        case gl.RGBA4:
    484        case gl.RGB5_A1:
    485        case gl.RGBA8:
    486        case gl.RGBA8_SNORM:
    487        case gl.RGB10_A2:
    488        case gl.SRGB8:
    489        case gl.SRGB8_ALPHA8:
    490        case gl.R16F:
    491        case gl.RG16F:
    492        case gl.RGB16F:
    493        case gl.RGBA16F:
    494        case gl.R11F_G11F_B10F:
    495        case gl.RGB9_E5:
    496            return true;
    497 
    498        case gl.RGB10_A2UI:
    499        case gl.R32F:
    500        case gl.RG32F:
    501        case gl.RGB32F:
    502        case gl.RGBA32F:
    503        case gl.R8I:
    504        case gl.R8UI:
    505        case gl.R16I:
    506        case gl.R16UI:
    507        case gl.R32I:
    508        case gl.R32UI:
    509        case gl.RG8I:
    510        case gl.RG8UI:
    511        case gl.RG16I:
    512        case gl.RG16UI:
    513        case gl.RG32I:
    514        case gl.RG32UI:
    515        case gl.RGB8I:
    516        case gl.RGB8UI:
    517        case gl.RGB16I:
    518        case gl.RGB16UI:
    519        case gl.RGB32I:
    520        case gl.RGB32UI:
    521        case gl.RGBA8I:
    522        case gl.RGBA8UI:
    523        case gl.RGBA16I:
    524        case gl.RGBA16UI:
    525        case gl.RGBA32I:
    526        case gl.RGBA32UI:
    527            return false;
    528 
    529        default:
    530            throw new Error('Unrecognized format ' + format);
    531    }
    532 };
    533 
    534 /**
    535 * @param {number} wrapMode
    536 * @return {tcuTexture.WrapMode}
    537 */
    538 gluTextureUtil.mapGLWrapMode = function(wrapMode) {
    539    switch (wrapMode) {
    540        case gl.CLAMP_TO_EDGE: return tcuTexture.WrapMode.CLAMP_TO_EDGE;
    541        case gl.REPEAT: return tcuTexture.WrapMode.REPEAT_GL;
    542        case gl.MIRRORED_REPEAT: return tcuTexture.WrapMode.MIRRORED_REPEAT_GL;
    543        default:
    544            throw new Error("Can't map GL wrap mode " + deString.enumToString(gl, wrapMode));
    545    }
    546 };
    547 
    548 /**
    549 * @param {number} filterMode
    550 * @return {tcuTexture.FilterMode}
    551 * @throws {Error}
    552 */
    553 gluTextureUtil.mapGLFilterMode = function(filterMode) {
    554    switch (filterMode) {
    555        case gl.NEAREST: return tcuTexture.FilterMode.NEAREST;
    556        case gl.LINEAR: return tcuTexture.FilterMode.LINEAR;
    557        case gl.NEAREST_MIPMAP_NEAREST: return tcuTexture.FilterMode.NEAREST_MIPMAP_NEAREST;
    558        case gl.NEAREST_MIPMAP_LINEAR: return tcuTexture.FilterMode.NEAREST_MIPMAP_LINEAR;
    559        case gl.LINEAR_MIPMAP_NEAREST: return tcuTexture.FilterMode.LINEAR_MIPMAP_NEAREST;
    560        case gl.LINEAR_MIPMAP_LINEAR: return tcuTexture.FilterMode.LINEAR_MIPMAP_LINEAR;
    561        default:
    562            throw new Error("Can't map GL filter mode" + filterMode);
    563    }
    564 };
    565 
    566 /* TODO: Port the code below */
    567 // /*--------------------------------------------------------------------*//*!
    568 //  * \brief Map GL sampler parameters to tcu::Sampler.
    569 //  *
    570 //  * If no mapping is found, throws tcu::InternalError.
    571 //  *
    572 //  * \param wrapS S-component wrap mode
    573 //  * \param minFilter Minification filter mode
    574 //  * \param magFilter Magnification filter mode
    575 //  * \return Sampler description.
    576 //  *//*--------------------------------------------------------------------*/
    577 // /*tcu::Sampler mapGLSamplerWrapS (deUint32 wrapS, deUint32 minFilter, deUint32 magFilter)
    578 // {
    579 //     return mapGLSampler(wrapS, wrapS, wrapS, minFilter, magFilter);
    580 // }
    581 // */
    582 
    583 /**
    584 * Map GL sampler parameters to tcu::Sampler.
    585 *
    586 * If no mapping is found, throws tcu::InternalError.
    587 *
    588 * @param {number} wrapS S-component wrap mode
    589 * @param {number} wrapT T-component wrap mode
    590 * @param {number} minFilter Minification filter mode
    591 * @param {number} magFilter Magnification filter mode
    592 * @return {tcuTexture.Sampler}
    593 */
    594 gluTextureUtil.mapGLSamplerWrapST = function(wrapS, wrapT, minFilter, magFilter) {
    595    return gluTextureUtil.mapGLSampler(wrapS, wrapT, wrapS, minFilter, magFilter);
    596 };
    597 
    598 /**
    599 * Map GL sampler parameters to tcu::Sampler.
    600 *
    601 * If no mapping is found, throws tcu::InternalError.
    602 * @param {number} wrapS S-component wrap mode
    603 * @param {number} wrapT T-component wrap mode
    604 * @param {number} wrapR R-component wrap mode
    605 * @param {number} minFilter Minification filter mode
    606 * @param {number} magFilter Magnification filter mode
    607 * @return {tcuTexture.Sampler}
    608 */
    609 gluTextureUtil.mapGLSampler = function(wrapS, wrapT, wrapR, minFilter, magFilter) {
    610    return new tcuTexture.Sampler(
    611        gluTextureUtil.mapGLWrapMode(wrapS),
    612        gluTextureUtil.mapGLWrapMode(wrapT),
    613        gluTextureUtil.mapGLWrapMode(wrapR),
    614        gluTextureUtil.mapGLFilterMode(minFilter),
    615        gluTextureUtil.mapGLFilterMode(magFilter),
    616        0.0,
    617        true,
    618        tcuTexture.CompareMode.COMPAREMODE_NONE,
    619        0,
    620        [0.0, 0.0, 0.0, 0.0]);
    621 };
    622 
    623 // /*--------------------------------------------------------------------*//*!
    624 //  * \brief Map GL compare function to tcu::Sampler::CompareMode.
    625 //  *
    626 //  * If no mapping is found, throws tcu::InternalError.
    627 //  *
    628 //  * \param mode GL compare mode
    629 //  * \return Compare mode
    630 //  *//*--------------------------------------------------------------------*/
    631 /**
    632 * @param {number} mode
    633 */
    634 gluTextureUtil.mapGLCompareFunc = function(mode) {
    635     switch (mode) {
    636     case gl.LESS: return tcuTexture.CompareMode.COMPAREMODE_LESS;
    637         case gl.LEQUAL: return tcuTexture.CompareMode.COMPAREMODE_LESS_OR_EQUAL;
    638         case gl.GREATER: return tcuTexture.CompareMode.COMPAREMODE_GREATER;
    639         case gl.GEQUAL: return tcuTexture.CompareMode.COMPAREMODE_GREATER_OR_EQUAL;
    640         case gl.EQUAL: return tcuTexture.CompareMode.COMPAREMODE_EQUAL;
    641         case gl.NOTEQUAL: return tcuTexture.CompareMode.COMPAREMODE_NOT_EQUAL;
    642         case gl.ALWAYS: return tcuTexture.CompareMode.COMPAREMODE_ALWAYS;
    643         case gl.NEVER: return tcuTexture.CompareMode.COMPAREMODE_NEVER;
    644         default:
    645             throw new Error("Can't map GL compare mode " + mode);
    646     }
    647 };
    648 
    649 /**
    650 * Get GL wrap mode.
    651 *
    652 * If no mapping is found, throws tcu::InternalError.
    653 *
    654 * @param {tcuTexture.WrapMode} wrapMode
    655 * @return {number} GL wrap mode
    656 */
    657 gluTextureUtil.getGLWrapMode = function(wrapMode) {
    658    switch (wrapMode) {
    659        case tcuTexture.WrapMode.CLAMP_TO_EDGE: return gl.CLAMP_TO_EDGE;
    660        case tcuTexture.WrapMode.REPEAT_GL: return gl.REPEAT;
    661        case tcuTexture.WrapMode.MIRRORED_REPEAT_GL: return gl.MIRRORED_REPEAT;
    662        default:
    663            throw new Error("Can't map wrap mode");
    664    }
    665 };
    666 
    667 /**
    668 * Get GL filter mode.
    669 *
    670 * If no mapping is found, throws tcu::InternalError.
    671 *
    672 * @param {tcuTexture.FilterMode} filterMode Filter mode
    673 * @return {number} GL filter mode
    674 */
    675 gluTextureUtil.getGLFilterMode = function(filterMode) {
    676    switch (filterMode) {
    677        case tcuTexture.FilterMode.NEAREST: return gl.NEAREST;
    678        case tcuTexture.FilterMode.LINEAR: return gl.LINEAR;
    679        case tcuTexture.FilterMode.NEAREST_MIPMAP_NEAREST: return gl.NEAREST_MIPMAP_NEAREST;
    680        case tcuTexture.FilterMode.NEAREST_MIPMAP_LINEAR: return gl.NEAREST_MIPMAP_LINEAR;
    681        case tcuTexture.FilterMode.LINEAR_MIPMAP_NEAREST: return gl.LINEAR_MIPMAP_NEAREST;
    682        case tcuTexture.FilterMode.LINEAR_MIPMAP_LINEAR: return gl.LINEAR_MIPMAP_LINEAR;
    683        default:
    684            throw new Error("Can't map filter mode");
    685    }
    686 };
    687 
    688 /**
    689 * Get GL compare mode.
    690 *
    691 * If no mapping is found, throws tcu::InternalError.
    692 *
    693 * @param {tcuTexture.CompareMode} compareMode Compare mode
    694 * @return {number} GL compare mode
    695 */
    696 gluTextureUtil.getGLCompareFunc = function(compareMode) {
    697    switch (compareMode) {
    698        case tcuTexture.CompareMode.COMPAREMODE_NONE: return gl.NONE;
    699        case tcuTexture.CompareMode.COMPAREMODE_LESS: return gl.LESS;
    700        case tcuTexture.CompareMode.COMPAREMODE_LESS_OR_EQUAL: return gl.LEQUAL;
    701        case tcuTexture.CompareMode.COMPAREMODE_GREATER: return gl.GREATER;
    702        case tcuTexture.CompareMode.COMPAREMODE_GREATER_OR_EQUAL: return gl.GEQUAL;
    703        case tcuTexture.CompareMode.COMPAREMODE_EQUAL: return gl.EQUAL;
    704        case tcuTexture.CompareMode.COMPAREMODE_NOT_EQUAL: return gl.NOTEQUAL;
    705        case tcuTexture.CompareMode.COMPAREMODE_ALWAYS: return gl.ALWAYS;
    706        case tcuTexture.CompareMode.COMPAREMODE_NEVER: return gl.NEVER;
    707        default:
    708            throw new Error("Can't map compare mode");
    709    }
    710 };
    711 
    712 /**
    713 * Get GL cube face.
    714 *
    715 * If no mapping is found, throws tcu::InternalError.
    716 *
    717 * @param {tcuTexture.CubeFace} face Cube face
    718 * @return {number} GL cube face
    719 */
    720 gluTextureUtil.getGLCubeFace = function(face) {
    721    switch (face) {
    722        case tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X:
    723            return gl.TEXTURE_CUBE_MAP_NEGATIVE_X;
    724        case tcuTexture.CubeFace.CUBEFACE_POSITIVE_X:
    725            return gl.TEXTURE_CUBE_MAP_POSITIVE_X;
    726        case tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y:
    727            return gl.TEXTURE_CUBE_MAP_NEGATIVE_Y;
    728        case tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y:
    729            return gl.TEXTURE_CUBE_MAP_POSITIVE_Y;
    730        case tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z:
    731            return gl.TEXTURE_CUBE_MAP_NEGATIVE_Z;
    732        case tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z:
    733            return gl.TEXTURE_CUBE_MAP_POSITIVE_Z;
    734        default:
    735            throw Error("Can't map cube face");
    736    }
    737 };
    738 
    739 // /*--------------------------------------------------------------------*//*!
    740 //  * \brief Get GLSL sampler type for texture format.
    741 //  *
    742 //  * If no mapping is found, glu::TYPE_LAST is returned.
    743 //  *
    744 //  * \param format Texture format
    745 //  * \return GLSL 1D sampler type for format
    746 //  *//*--------------------------------------------------------------------*/
    747 // DataType getSampler1DType (tcu::TextureFormat format)
    748 // {
    749 //     using tcu::TextureFormat;
    750 
    751 //     if (format.order == tcuTexture.ChannelOrder.D || format.order == tcuTexture.ChannelOrder.DS)
    752 //         return TYPE_SAMPLER_1D;
    753 
    754 //     if (format.order == tcuTexture.ChannelOrder.S)
    755 //         return TYPE_LAST;
    756 
    757 //     switch (tcu::getTextureChannelClass(format.type))
    758 //     {
    759 //         case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
    760 //         case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
    761 //         case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
    762 //             return glu::TYPE_SAMPLER_1D;
    763 
    764 //         case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
    765 //             return glu::TYPE_INT_SAMPLER_1D;
    766 
    767 //         case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
    768 //             return glu::TYPE_UINT_SAMPLER_1D;
    769 
    770 //         default:
    771 //             return glu::TYPE_LAST;
    772 //     }
    773 // }
    774 
    775 /**
    776 * Get GLSL sampler type for texture format.
    777 * If no mapping is found, glu::TYPE_LAST is returned.
    778 *
    779 * @param {tcuTexture.TextureFormat} format
    780 * @return {gluShaderUtil.DataType} GLSL 2D sampler type for format
    781 */
    782 gluTextureUtil.getSampler2DType = function(format) {
    783    if (format.order == tcuTexture.ChannelOrder.D || format.order == tcuTexture.ChannelOrder.DS)
    784    return gluShaderUtil.DataType.SAMPLER_2D;
    785 
    786    if (format.order == tcuTexture.ChannelOrder.S)
    787    return /** @type {gluShaderUtil.DataType} */ (Object.keys(gluShaderUtil.DataType).length);
    788 
    789    switch (tcuTexture.getTextureChannelClass(format.type)) {
    790        case tcuTexture.TextureChannelClass.FLOATING_POINT:
    791        case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT:
    792        case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    793            return gluShaderUtil.DataType.SAMPLER_2D;
    794 
    795        case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    796            return gluShaderUtil.DataType.INT_SAMPLER_2D;
    797 
    798        case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    799            return gluShaderUtil.DataType.UINT_SAMPLER_2D;
    800 
    801        default:
    802            return /** @type {gluShaderUtil.DataType} */ (Object.keys(gluShaderUtil.DataType).length);
    803    }
    804 };
    805 
    806 /**
    807 *
    808 * @param {tcuTexture.TextureFormat} format
    809 * @return {gluShaderUtil.DataType} GLSL 2D sampler type for format
    810 */
    811 gluTextureUtil.getSampler3DType = function(format) {
    812    if (format.order === tcuTexture.ChannelOrder.D || format.order === tcuTexture.ChannelOrder.DS)
    813        return gluShaderUtil.DataType.SAMPLER_3D;
    814 
    815    if (format.order === tcuTexture.ChannelOrder.S)
    816        return /** @type {gluShaderUtil.DataType} */ (Object.keys(gluShaderUtil.DataType).length); // shouldn't we throw an error instead?
    817 
    818    switch (tcuTexture.getTextureChannelClass(format.type)) {
    819        case tcuTexture.TextureChannelClass.FLOATING_POINT:
    820        case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT:
    821        case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    822            return gluShaderUtil.DataType.SAMPLER_3D;
    823 
    824        case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    825            return gluShaderUtil.DataType.INT_SAMPLER_3D;
    826 
    827        case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    828            return gluShaderUtil.DataType.UINT_SAMPLER_3D;
    829 
    830        default:
    831            return /** @type {gluShaderUtil.DataType} */ (Object.keys(gluShaderUtil.DataType).length);
    832    }
    833 };
    834 
    835 /**
    836 * \brief Get GLSL sampler type for texture format.
    837 *
    838 * @param {tcuTexture.TextureFormat} format
    839 * @return {gluShaderUtil.DataType} GLSL 2D sampler type for format
    840 */
    841 gluTextureUtil.getSamplerCubeType = function(format) {
    842    if (format.order == tcuTexture.ChannelOrder.D || format.order == tcuTexture.ChannelOrder.DS)
    843        return gluShaderUtil.DataType.SAMPLER_CUBE;
    844 
    845    if (format.order == tcuTexture.ChannelOrder.S)
    846        throw new Error('No cube sampler');
    847 
    848    switch (tcuTexture.getTextureChannelClass(format.type)) {
    849        case tcuTexture.TextureChannelClass.FLOATING_POINT:
    850        case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT:
    851        case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    852            return gluShaderUtil.DataType.SAMPLER_CUBE;
    853 
    854        case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    855            return gluShaderUtil.DataType.INT_SAMPLER_CUBE;
    856 
    857        case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    858            return gluShaderUtil.DataType.UINT_SAMPLER_CUBE;
    859 
    860        default:
    861            throw new Error('No cube sampler');
    862    }
    863 };
    864 
    865 /**
    866 * \brief Get GLSL sampler type for texture format.
    867 *
    868 * If no mapping is found, glu::TYPE_LAST is returned.
    869 *
    870 * @param {tcuTexture.TextureFormat} format
    871 * @return {gluShaderUtil.DataType} GLSL 2D sampler type for format
    872 */
    873 gluTextureUtil.getSampler2DArrayType = function(format) {
    874 
    875    if (format.order == tcuTexture.ChannelOrder.D || format.order == tcuTexture.ChannelOrder.DS)
    876        return gluShaderUtil.DataType.SAMPLER_2D_ARRAY;
    877 
    878    if (format.order == tcuTexture.ChannelOrder.S)
    879        throw new Error('No 2d array sampler');
    880 
    881    switch (tcuTexture.getTextureChannelClass(format.type)) {
    882        case tcuTexture.TextureChannelClass.FLOATING_POINT:
    883        case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT:
    884        case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    885            return gluShaderUtil.DataType.SAMPLER_2D_ARRAY;
    886 
    887        case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    888            return gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY;
    889 
    890        case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    891            return gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY;
    892 
    893        default:
    894            throw new Error('No 2d array sampler');
    895    }
    896 };
    897 
    898 /**
    899 * \brief Get GLSL sampler type for texture format.
    900 *
    901 * If no mapping is found, glu::TYPE_LAST is returned.
    902 *
    903 * @param {tcuTexture.TextureFormat} format
    904 * @return {gluShaderUtil.DataType} GLSL 2D sampler type for format
    905 */
    906 gluTextureUtil.getSampler3D = function(format) {
    907    if (format.order == tcuTexture.ChannelOrder.D || format.order == tcuTexture.ChannelOrder.DS)
    908        return gluShaderUtil.DataType.SAMPLER_3D;
    909 
    910    if (format.order == tcuTexture.ChannelOrder.S)
    911        throw new Error('No 3d sampler');
    912 
    913    switch (tcuTexture.getTextureChannelClass(format.type)) {
    914        case tcuTexture.TextureChannelClass.FLOATING_POINT:
    915        case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT:
    916        case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    917            return gluShaderUtil.DataType.SAMPLER_3D;
    918 
    919        case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    920            return gluShaderUtil.DataType.INT_SAMPLER_3D;
    921 
    922        case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    923            return gluShaderUtil.DataType.UINT_SAMPLER_3D;
    924 
    925        default:
    926            throw new Error('No 3d sampler');
    927    }
    928 };
    929 
    930 gluTextureUtil.RenderableType = {
    931    RENDERABLE_COLOR: (1<<0),
    932    RENDERABLE_DEPTH: (1<<1),
    933    RENDERABLE_STENCIL: (1<<2)
    934 };
    935 
    936 /**
    937 * \brief Get renderable bits.
    938 * \note Works currently only on ES3 context.
    939 *
    940 * @param {number} internalFormat
    941 * @return {gluTextureUtil.RenderableType}
    942 */
    943 gluTextureUtil.getRenderableBitsES3 = function(internalFormat)
    944 {
    945   switch (internalFormat)
    946   {
    947       // Color-renderable formats
    948       case gl.RGBA32I:
    949       case gl.RGBA32UI:
    950       case gl.RGBA16I:
    951       case gl.RGBA16UI:
    952       case gl.RGBA8:
    953       case gl.RGBA8I:
    954       case gl.RGBA8UI:
    955       case gl.SRGB8_ALPHA8:
    956       case gl.RGB10_A2:
    957       case gl.RGB10_A2UI:
    958       case gl.RGBA4:
    959       case gl.RGB5_A1:
    960       case gl.RGB8:
    961       case gl.RGB565:
    962       case gl.RG32I:
    963       case gl.RG32UI:
    964       case gl.RG16I:
    965       case gl.RG16UI:
    966       case gl.RG8:
    967       case gl.RG8I:
    968       case gl.RG8UI:
    969       case gl.R32I:
    970       case gl.R32UI:
    971       case gl.R16I:
    972       case gl.R16UI:
    973       case gl.R8:
    974       case gl.R8I:
    975       case gl.R8UI:
    976           return gluTextureUtil.RenderableType.RENDERABLE_COLOR;
    977 
    978       // EXT_color_buffer_float
    979       case gl.RGBA32F:
    980       case gl.R11F_G11F_B10F:
    981       case gl.RG32F:
    982       case gl.R32F:
    983       case gl.RGBA16F:
    984       case gl.RG16F:
    985       case gl.R16F:
    986           if (gl.getExtension("EXT_color_buffer_float"))
    987               return gluTextureUtil.RenderableType.RENDERABLE_COLOR;
    988           else
    989               return 0;
    990 
    991       // Depth formats
    992       case gl.DEPTH_COMPONENT32F:
    993       case gl.DEPTH_COMPONENT24:
    994       case gl.DEPTH_COMPONENT16:
    995           return gluTextureUtil.RenderableType.RENDERABLE_DEPTH;
    996 
    997       // Depth+stencil formats
    998       case gl.DEPTH32F_STENCIL8:
    999       case gl.DEPTH24_STENCIL8:
   1000           return gluTextureUtil.RenderableType.RENDERABLE_DEPTH | gluTextureUtil.RenderableType.RENDERABLE_STENCIL;
   1001 
   1002       // Stencil formats
   1003       case gl.STENCIL_INDEX8:
   1004           return gluTextureUtil.RenderableType.RENDERABLE_STENCIL;
   1005 
   1006       default:
   1007           return 0;
   1008   }
   1009 }
   1010 
   1011 /**
   1012 * \brief Check if sized internal format is color-renderable.
   1013 * \note Works currently only on ES3 context.
   1014 *
   1015 * @param {number} sizedFormat
   1016 * @return {boolean}
   1017 */
   1018 gluTextureUtil.isSizedFormatColorRenderable = function(sizedFormat)
   1019 {
   1020    var renderable = 0;
   1021    renderable = gluTextureUtil.getRenderableBitsES3(sizedFormat);
   1022    return (renderable & gluTextureUtil.RenderableType.RENDERABLE_COLOR) != 0;
   1023 }
   1024 
   1025 });