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 });