UNPKG

@loaders.gl/textures

Version:

Framework-independent loaders for compressed and super compressed (basis) textures

197 lines 5.97 kB
// loaders.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors const BROWSER_PREFIXES = ['', 'WEBKIT_', 'MOZ_']; const WEBGL_TEXTURE_FORMATS = { /* eslint-disable camelcase */ WEBGL_compressed_texture_s3tc: [ 'bc1-rgb-unorm-webgl', 'bc1-rgba-unorm', 'bc2-rgba-unorm', 'bc3-rgba-unorm' ], WEBGL_compressed_texture_s3tc_srgb: [ 'bc1-rgb-unorm-srgb-webgl', 'bc1-rgba-unorm-srgb', 'bc2-rgba-unorm-srgb', 'bc3-rgba-unorm-srgb' ], EXT_texture_compression_rgtc: ['bc4-r-unorm', 'bc4-r-snorm', 'bc5-rg-unorm', 'bc5-rg-snorm'], EXT_texture_compression_bptc: [ 'bc6h-rgb-ufloat', 'bc6h-rgb-float', 'bc7-rgba-unorm', 'bc7-rgba-unorm-srgb' ], WEBGL_compressed_texture_etc1: ['etc1-rgb-unorm-webgl'], WEBGL_compressed_texture_etc: [ 'etc2-rgb8unorm', 'etc2-rgb8unorm-srgb', 'etc2-rgb8a1unorm', 'etc2-rgb8a1unorm-srgb', 'etc2-rgba8unorm', 'etc2-rgba8unorm-srgb', 'eac-r11unorm', 'eac-r11snorm', 'eac-rg11unorm', 'eac-rg11snorm' ], WEBGL_compressed_texture_pvrtc: [ 'pvrtc-rgb4unorm-webgl', 'pvrtc-rgba4unorm-webgl', 'pvrtc-rgb2unorm-webgl', 'pvrtc-rgba2unorm-webgl' ], WEBGL_compressed_texture_atc: [ 'atc-rgb-unorm-webgl', 'atc-rgba-unorm-webgl', 'atc-rgbai-unorm-webgl' ], WEBGL_compressed_texture_astc: [ 'astc-4x4-unorm', 'astc-4x4-unorm-srgb', 'astc-5x4-unorm', 'astc-5x4-unorm-srgb', 'astc-5x5-unorm', 'astc-5x5-unorm-srgb', 'astc-6x5-unorm', 'astc-6x5-unorm-srgb', 'astc-6x6-unorm', 'astc-6x6-unorm-srgb', 'astc-8x5-unorm', 'astc-8x5-unorm-srgb', 'astc-8x6-unorm', 'astc-8x6-unorm-srgb', 'astc-8x8-unorm', 'astc-8x8-unorm-srgb', 'astc-10x5-unorm', 'astc-10x5-unorm-srgb', 'astc-10x6-unorm', 'astc-10x6-unorm-srgb', 'astc-10x8-unorm', 'astc-10x8-unorm-srgb', 'astc-10x10-unorm', 'astc-10x10-unorm-srgb', 'astc-12x10-unorm', 'astc-12x10-unorm-srgb', 'astc-12x12-unorm', 'astc-12x12-unorm-srgb' ] /* eslint-enable camelcase */ }; const GPU_TEXTURE_FORMATS = { dxt: ['bc1-rgb-unorm-webgl', 'bc1-rgba-unorm', 'bc2-rgba-unorm', 'bc3-rgba-unorm'], 'dxt-srgb': [ 'bc1-rgb-unorm-srgb-webgl', 'bc1-rgba-unorm-srgb', 'bc2-rgba-unorm-srgb', 'bc3-rgba-unorm-srgb' ], etc1: ['etc1-rgb-unorm-webgl'], etc2: [ 'etc2-rgb8unorm', 'etc2-rgb8unorm-srgb', 'etc2-rgb8a1unorm', 'etc2-rgb8a1unorm-srgb', 'etc2-rgba8unorm', 'etc2-rgba8unorm-srgb', 'eac-r11unorm', 'eac-r11snorm', 'eac-rg11unorm', 'eac-rg11snorm' ], pvrtc: [ 'pvrtc-rgb4unorm-webgl', 'pvrtc-rgba4unorm-webgl', 'pvrtc-rgb2unorm-webgl', 'pvrtc-rgba2unorm-webgl' ], atc: ['atc-rgb-unorm-webgl', 'atc-rgba-unorm-webgl', 'atc-rgbai-unorm-webgl'], astc: [ 'astc-4x4-unorm', 'astc-4x4-unorm-srgb', 'astc-5x4-unorm', 'astc-5x4-unorm-srgb', 'astc-5x5-unorm', 'astc-5x5-unorm-srgb', 'astc-6x5-unorm', 'astc-6x5-unorm-srgb', 'astc-6x6-unorm', 'astc-6x6-unorm-srgb', 'astc-8x5-unorm', 'astc-8x5-unorm-srgb', 'astc-8x6-unorm', 'astc-8x6-unorm-srgb', 'astc-8x8-unorm', 'astc-8x8-unorm-srgb', 'astc-10x5-unorm', 'astc-10x5-unorm-srgb', 'astc-10x6-unorm', 'astc-10x6-unorm-srgb', 'astc-10x8-unorm', 'astc-10x8-unorm-srgb', 'astc-10x10-unorm', 'astc-10x10-unorm-srgb', 'astc-12x10-unorm', 'astc-12x10-unorm-srgb', 'astc-12x12-unorm', 'astc-12x12-unorm-srgb' ], rgtc: ['bc4-r-unorm', 'bc4-r-snorm', 'bc5-rg-unorm', 'bc5-rg-snorm'] }; let formats = null; let textureFormats = null; // DEPRECATED /** * @deprecated Pass `basis.supportedTextureFormats` to Basis loaders instead of relying on global detection. */ export function detectSupportedTextureFormats(gl) { if (!textureFormats) { gl = gl || getWebGLContext() || undefined; textureFormats = new Set(); for (const prefix of BROWSER_PREFIXES) { for (const extension in WEBGL_TEXTURE_FORMATS) { if (gl && gl.getExtension(`${prefix}${extension}`)) { for (const textureFormat of WEBGL_TEXTURE_FORMATS[extension]) { textureFormats.add(textureFormat); } } } } } return textureFormats; } // DEPRECATED /** * Returns a list of formats. * Creates a temporary WebGLRenderingContext if none is provided. * * @deprecated Pass `basis.supportedTextureFormats` to Basis loaders instead of relying on global detection. * @param gl - Optional context. */ export function detectSupportedGPUTextureFormats(gl) { if (!formats) { formats = new Set(); const supportedTextureFormats = detectSupportedTextureFormats(gl); for (const gpuTextureFormat in GPU_TEXTURE_FORMATS) { const textureFormatsForGroup = GPU_TEXTURE_FORMATS[gpuTextureFormat]; if (textureFormatsForGroup.some((textureFormat) => supportedTextureFormats.has(textureFormat))) { formats.add(gpuTextureFormat); } } } return formats; } /** * @returns {WebGLRenderingContext?} */ function getWebGLContext() { try { const canvas = document.createElement('canvas'); return canvas.getContext('webgl'); } catch (error) { return null; } } //# sourceMappingURL=detect-supported-texture-formats.js.map