@luma.gl/webgl 9.0.0-alpha.48 → 9.0.0-alpha.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/converters/sampler-parameters.d.ts +1 -1
- package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/sampler-parameters.js.map +1 -1
- package/dist/adapter/converters/texture-formats.js.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js.map +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js.map +1 -1
- package/dist/classic/accessor.js.map +1 -1
- package/dist/dist.dev.js +4 -4
- package/dist/index.cjs +18 -9
- package/dist.min.js +3 -3
- package/package.json +5 -5
- package/src/adapter/converters/sampler-parameters.ts +88 -39
- package/src/adapter/converters/texture-formats.ts +1 -1
- package/src/adapter/resources/webgl-framebuffer.ts +1 -1
- package/src/adapter/resources/webgl-render-pipeline.ts +2 -2
- package/src/adapter/resources/webgl-sampler.ts +1 -1
- package/src/adapter/resources/webgl-texture.ts +34 -24
- package/src/classic/accessor.ts +1 -1
|
@@ -14,6 +14,6 @@ export declare function convertSamplerParametersToWebGL(props: SamplerParameters
|
|
|
14
14
|
export declare function convertToSamplerParameters(params: GLSamplerParameters): SamplerParameters;
|
|
15
15
|
/**
|
|
16
16
|
* Override sampler settings that are not supported by Non-Power-of-Two textures in WebGL1.
|
|
17
|
-
*/
|
|
17
|
+
*/
|
|
18
18
|
export declare function updateSamplerParametersForNPOT(parameters: GLSamplerParameters): GLSamplerParameters;
|
|
19
19
|
//# sourceMappingURL=sampler-parameters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampler-parameters.d.ts","sourceRoot":"","sources":["../../../src/adapter/converters/sampler-parameters.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAK,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAK3D;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"sampler-parameters.d.ts","sourceRoot":"","sources":["../../../src/adapter/converters/sampler-parameters.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAK,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAK3D;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,mBAAmB,CAuC7F;AA4CD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,iBAAiB,CAwCzF;AA8ED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,mBAAmB,GAC9B,mBAAmB,CAUrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampler-parameters.js","names":["convertCompareFunction","convertToCompareFunction","convertSamplerParametersToWebGL","props","params","addressModeU","convertAddressMode","addressModeV","addressModeW","magFilter","convertMaxFilterMode","minFilter","mipmapFilter","convertMinFilterMode","lodMinClamp","undefined","lodMaxClamp","type","compare","maxAnisotropy","addressMode","maxFilter","convertToSamplerParameters","convertToAddressMode","convertToMaxFilterMode","convertToMinFilterMode","convertToMipmapFilterMode","Error","filterMode","updateSamplerParametersForNPOT","parameters","newParameters"],"sources":["../../../src/adapter/converters/sampler-parameters.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\n// SAMPLER FILTERS\nimport {SamplerParameters} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertCompareFunction, convertToCompareFunction} from './device-parameters';\n\n/* eslint-disable consistent-return */\n\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props: SamplerParameters): GLSamplerParameters {\n const params: Record<number, number> = {};\n if (props.addressModeU) {\n params[GL.TEXTURE_WRAP_S] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[GL.TEXTURE_WRAP_T] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[GL.TEXTURE_WRAP_R] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[GL.TEXTURE_MAG_FILTER] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[GL.TEXTURE_MIN_FILTER] = convertMinFilterMode(props.minFilter || 'linear', props.mipmapFilter);\n }\n if (props.lodMinClamp !== undefined) {\n params[GL.TEXTURE_MIN_LOD] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[GL.TEXTURE_MAX_LOD] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[GL.TEXTURE_COMPARE_MODE] = GL.COMPARE_REF_TO_TEXTURE;\n }\n if (props.compare) {\n params[GL.TEXTURE_COMPARE_FUNC] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[GL.TEXTURE_MAX_ANISOTROPY_EXT] = props.maxAnisotropy;\n }\n return params;\n}\n\n/** Convert address more */\nfunction convertAddressMode(addressMode: 'clamp-to-edge' | 'repeat' | 'mirror-repeat'): GL {\n switch (addressMode) {\n case 'clamp-to-edge': return GL.CLAMP_TO_EDGE;\n case 'repeat': return GL.REPEAT;\n case 'mirror-repeat': return GL.MIRRORED_REPEAT;\n }\n}\n\nfunction convertMaxFilterMode(maxFilter: 'nearest' | 'linear'): GL {\n switch (maxFilter) {\n case 'nearest': return GL.NEAREST;\n case 'linear': return GL.LINEAR;\n }\n}\n\n/** \n * WebGPU has separate min filter and mipmap filter, \n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(minFilter: 'nearest' | 'linear', mipmapFilter?: 'nearest' | 'linear'): GL {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (minFilter) {\n case 'nearest': return mipmapFilter === 'nearest' ? GL.NEAREST_MIPMAP_NEAREST : GL.NEAREST_MIPMAP_LINEAR;\n case 'linear': return mipmapFilter === 'nearest' ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR_MIPMAP_LINEAR;\n }\n}\n\n// Convert from WebGL to WebGPU\n\n/**\n * Convert WebGL-style sampler props to WebGPU\n * @param props\n * @returns\n */\nexport function convertToSamplerParameters(params: GLSamplerParameters): SamplerParameters {\n const props: SamplerParameters = {};\n if (params[GL.TEXTURE_WRAP_S]) {\n props.addressModeU = convertToAddressMode(params[GL.TEXTURE_WRAP_S]);\n }\n if (params[GL.TEXTURE_WRAP_T]) {\n props.addressModeV = convertToAddressMode(params[GL.TEXTURE_WRAP_T]);\n }\n if (params[GL.TEXTURE_WRAP_R]) {\n props.addressModeW = convertToAddressMode(params[GL.TEXTURE_WRAP_R]);\n }\n if (params[GL.TEXTURE_MAG_FILTER]) {\n props.magFilter = convertToMaxFilterMode(params[GL.TEXTURE_MAG_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_FILTER]) {\n props.minFilter = convertToMinFilterMode(params[GL.TEXTURE_MIN_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_FILTER]) {\n props.mipmapFilter = convertToMipmapFilterMode(params[GL.TEXTURE_MIN_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_LOD]) {\n props.lodMinClamp = params[GL.TEXTURE_MIN_LOD];\n }\n if (params[GL.TEXTURE_MAX_LOD]) {\n props.lodMaxClamp = params[GL.TEXTURE_MAX_LOD];\n }\n if (params[GL.TEXTURE_COMPARE_MODE]) {\n props.type = params[GL.TEXTURE_COMPARE_MODE] === GL.COMPARE_REF_TO_TEXTURE ? 'comparison-sampler' : 'color-sampler';\n }\n if (params[GL.TEXTURE_COMPARE_FUNC]) {\n props.compare = convertToCompareFunction('compare', params[GL.TEXTURE_COMPARE_FUNC]);\n }\n // NOTE depends on extension (very common)\n if (params[GL.TEXTURE_MAX_ANISOTROPY_EXT]) {\n props.maxAnisotropy = params[GL.TEXTURE_MAX_ANISOTROPY_EXT];\n }\n return props;\n}\n\n/** Convert address more */\nfunction convertToAddressMode(addressMode: number): 'clamp-to-edge' | 'repeat' | 'mirror-repeat' {\n switch (addressMode) {\n case GL.CLAMP_TO_EDGE: return 'clamp-to-edge';\n case GL.REPEAT: return 'repeat';\n case GL.MIRRORED_REPEAT: return 'mirror-repeat';\n default: throw new Error('address');\n }\n}\n\nfunction convertToMaxFilterMode(filterMode: number): 'nearest' | 'linear' {\n switch (filterMode) {\n case GL.NEAREST: return 'nearest';\n case GL.LINEAR: return 'linear';\n default: throw new Error('maxfilter');\n }\n}\n\n/** WebGPU has separate min filter and mipmap filter, WebGL is combined */\nfunction convertToMinFilterMode(filterMode: number): 'nearest' | 'linear' {\n switch (filterMode) {\n // TODO is this correct?\n case GL.NEAREST: return 'nearest';\n case GL.LINEAR: return 'linear';\n case GL.NEAREST_MIPMAP_NEAREST: return 'nearest';\n case GL.LINEAR_MIPMAP_NEAREST: return 'linear';\n case GL.NEAREST_MIPMAP_LINEAR: return 'nearest';\n case GL.LINEAR_MIPMAP_LINEAR: return 'linear';\n default: throw new Error('minfilter');\n }\n}\n\nfunction convertToMipmapFilterMode(filterMode: number): 'nearest' | 'linear' {\n switch (filterMode) {\n // TODO is this correct?\n case GL.NEAREST: return 'nearest';\n case GL.LINEAR: return 'linear';\n case GL.NEAREST_MIPMAP_NEAREST: return 'nearest';\n case GL.LINEAR_MIPMAP_NEAREST: return 'nearest';\n case GL.NEAREST_MIPMAP_LINEAR: return 'linear';\n case GL.LINEAR_MIPMAP_LINEAR: return 'linear';\n default: throw new Error('mipmap');\n }\n}\n\n/**\n * Override sampler settings that are not supported by Non-Power-of-Two textures in WebGL1.\n*/\nexport function updateSamplerParametersForNPOT(parameters: GLSamplerParameters): GLSamplerParameters {\n const newParameters = {...parameters};\n if (parameters[GL.TEXTURE_MIN_FILTER] !== GL.NEAREST) {\n // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_MIN_FILTER to LINEAR`)();\n newParameters[GL.TEXTURE_MIN_FILTER] = GL.LINEAR;\n }\n // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_WRAP_S to CLAMP_TO_EDGE`)();\n newParameters[GL.TEXTURE_WRAP_S] = GL.CLAMP_TO_EDGE;\n newParameters[GL.TEXTURE_WRAP_T] = GL.CLAMP_TO_EDGE;\n return newParameters;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sampler-parameters.js","names":["convertCompareFunction","convertToCompareFunction","convertSamplerParametersToWebGL","props","params","addressModeU","convertAddressMode","addressModeV","addressModeW","magFilter","convertMaxFilterMode","minFilter","mipmapFilter","convertMinFilterMode","lodMinClamp","undefined","lodMaxClamp","type","compare","maxAnisotropy","addressMode","maxFilter","convertToSamplerParameters","convertToAddressMode","convertToMaxFilterMode","convertToMinFilterMode","convertToMipmapFilterMode","Error","filterMode","updateSamplerParametersForNPOT","parameters","newParameters"],"sources":["../../../src/adapter/converters/sampler-parameters.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\n// SAMPLER FILTERS\nimport {SamplerParameters} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertCompareFunction, convertToCompareFunction} from './device-parameters';\n\n/* eslint-disable consistent-return */\n\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props: SamplerParameters): GLSamplerParameters {\n const params: Record<number, number> = {};\n if (props.addressModeU) {\n params[GL.TEXTURE_WRAP_S] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[GL.TEXTURE_WRAP_T] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[GL.TEXTURE_WRAP_R] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[GL.TEXTURE_MAG_FILTER] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[GL.TEXTURE_MIN_FILTER] = convertMinFilterMode(\n props.minFilter || 'linear',\n props.mipmapFilter\n );\n }\n if (props.lodMinClamp !== undefined) {\n params[GL.TEXTURE_MIN_LOD] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[GL.TEXTURE_MAX_LOD] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[GL.TEXTURE_COMPARE_MODE] = GL.COMPARE_REF_TO_TEXTURE;\n }\n if (props.compare) {\n params[GL.TEXTURE_COMPARE_FUNC] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[GL.TEXTURE_MAX_ANISOTROPY_EXT] = props.maxAnisotropy;\n }\n return params;\n}\n\n/** Convert address more */\nfunction convertAddressMode(addressMode: 'clamp-to-edge' | 'repeat' | 'mirror-repeat'): GL {\n switch (addressMode) {\n case 'clamp-to-edge':\n return GL.CLAMP_TO_EDGE;\n case 'repeat':\n return GL.REPEAT;\n case 'mirror-repeat':\n return GL.MIRRORED_REPEAT;\n }\n}\n\nfunction convertMaxFilterMode(maxFilter: 'nearest' | 'linear'): GL {\n switch (maxFilter) {\n case 'nearest':\n return GL.NEAREST;\n case 'linear':\n return GL.LINEAR;\n }\n}\n\n/**\n * WebGPU has separate min filter and mipmap filter,\n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(\n minFilter: 'nearest' | 'linear',\n mipmapFilter?: 'nearest' | 'linear'\n): GL {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (minFilter) {\n case 'nearest':\n return mipmapFilter === 'nearest' ? GL.NEAREST_MIPMAP_NEAREST : GL.NEAREST_MIPMAP_LINEAR;\n case 'linear':\n return mipmapFilter === 'nearest' ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR_MIPMAP_LINEAR;\n }\n}\n\n// Convert from WebGL to WebGPU\n\n/**\n * Convert WebGL-style sampler props to WebGPU\n * @param props\n * @returns\n */\nexport function convertToSamplerParameters(params: GLSamplerParameters): SamplerParameters {\n const props: SamplerParameters = {};\n if (params[GL.TEXTURE_WRAP_S]) {\n props.addressModeU = convertToAddressMode(params[GL.TEXTURE_WRAP_S]);\n }\n if (params[GL.TEXTURE_WRAP_T]) {\n props.addressModeV = convertToAddressMode(params[GL.TEXTURE_WRAP_T]);\n }\n if (params[GL.TEXTURE_WRAP_R]) {\n props.addressModeW = convertToAddressMode(params[GL.TEXTURE_WRAP_R]);\n }\n if (params[GL.TEXTURE_MAG_FILTER]) {\n props.magFilter = convertToMaxFilterMode(params[GL.TEXTURE_MAG_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_FILTER]) {\n props.minFilter = convertToMinFilterMode(params[GL.TEXTURE_MIN_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_FILTER]) {\n props.mipmapFilter = convertToMipmapFilterMode(params[GL.TEXTURE_MIN_FILTER]);\n }\n if (params[GL.TEXTURE_MIN_LOD]) {\n props.lodMinClamp = params[GL.TEXTURE_MIN_LOD];\n }\n if (params[GL.TEXTURE_MAX_LOD]) {\n props.lodMaxClamp = params[GL.TEXTURE_MAX_LOD];\n }\n if (params[GL.TEXTURE_COMPARE_MODE]) {\n props.type =\n params[GL.TEXTURE_COMPARE_MODE] === GL.COMPARE_REF_TO_TEXTURE\n ? 'comparison-sampler'\n : 'color-sampler';\n }\n if (params[GL.TEXTURE_COMPARE_FUNC]) {\n props.compare = convertToCompareFunction('compare', params[GL.TEXTURE_COMPARE_FUNC]);\n }\n // NOTE depends on extension (very common)\n if (params[GL.TEXTURE_MAX_ANISOTROPY_EXT]) {\n props.maxAnisotropy = params[GL.TEXTURE_MAX_ANISOTROPY_EXT];\n }\n return props;\n}\n\n/** Convert address more */\nfunction convertToAddressMode(\n addressMode: GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT\n): 'clamp-to-edge' | 'repeat' | 'mirror-repeat' {\n switch (addressMode) {\n case GL.CLAMP_TO_EDGE:\n return 'clamp-to-edge';\n case GL.REPEAT:\n return 'repeat';\n case GL.MIRRORED_REPEAT:\n return 'mirror-repeat';\n default:\n throw new Error('address');\n }\n}\n\nfunction convertToMaxFilterMode(filterMode: GL.NEAREST | GL.LINEAR): 'nearest' | 'linear' {\n switch (filterMode) {\n case GL.NEAREST:\n return 'nearest';\n case GL.LINEAR:\n return 'linear';\n default:\n throw new Error('maxfilter');\n }\n}\n\ntype GLMinFilter =\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR;\n\n/** WebGPU has separate min filter and mipmap filter, WebGL is combined */\nfunction convertToMinFilterMode(filterMode: GLMinFilter): 'nearest' | 'linear' {\n switch (filterMode) {\n // TODO is this correct?\n case GL.NEAREST:\n return 'nearest';\n case GL.LINEAR:\n return 'linear';\n case GL.NEAREST_MIPMAP_NEAREST:\n return 'nearest';\n case GL.LINEAR_MIPMAP_NEAREST:\n return 'linear';\n case GL.NEAREST_MIPMAP_LINEAR:\n return 'nearest';\n case GL.LINEAR_MIPMAP_LINEAR:\n return 'linear';\n default:\n throw new Error('minfilter');\n }\n}\n\nfunction convertToMipmapFilterMode(filterMode: GLMinFilter): 'nearest' | 'linear' {\n switch (filterMode) {\n // TODO is this correct?\n case GL.NEAREST:\n return 'nearest';\n case GL.LINEAR:\n return 'linear';\n case GL.NEAREST_MIPMAP_NEAREST:\n return 'nearest';\n case GL.LINEAR_MIPMAP_NEAREST:\n return 'nearest';\n case GL.NEAREST_MIPMAP_LINEAR:\n return 'linear';\n case GL.LINEAR_MIPMAP_LINEAR:\n return 'linear';\n default:\n throw new Error('mipmap');\n }\n}\n\n/**\n * Override sampler settings that are not supported by Non-Power-of-Two textures in WebGL1.\n */\nexport function updateSamplerParametersForNPOT(\n parameters: GLSamplerParameters\n): GLSamplerParameters {\n const newParameters = {...parameters};\n if (parameters[GL.TEXTURE_MIN_FILTER] !== GL.NEAREST) {\n // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_MIN_FILTER to LINEAR`)();\n newParameters[GL.TEXTURE_MIN_FILTER] = GL.LINEAR;\n }\n // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_WRAP_S to CLAMP_TO_EDGE`)();\n newParameters[GL.TEXTURE_WRAP_S] = GL.CLAMP_TO_EDGE;\n newParameters[GL.TEXTURE_WRAP_T] = GL.CLAMP_TO_EDGE;\n return newParameters;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texture-formats.js","names":["decodeTextureFormat","isWebGL2","getGLFromVertexType","texture_compression_bc","texture_compression_astc","texture_compression_etc2","texture_compression_etc1_webgl","texture_compression_pvrtc_webgl","texture_compression_atc_webgl","X_S3TC","X_S3TC_SRGB","X_RGTC","X_BPTC","X_ETC2","X_ASTC","X_ETC1","X_PVRTC","X_ATC","EXT_SRGB","EXT_TEXTURE_NORM16","EXT_FLOAT_WEBGL1","EXT_FLOAT_RENDER_WEBGL2","checkExtension","gl","extension","getExtension","checkExtensions","extensions","every","TEXTURE_FEATURE_CHECKS","checkTextureFeature","feature","_TEXTURE_FEATURE_CHEC","call","checkTextureFeatures","features","getTextureFeatures","textureFeatures","Object","keys","filter","TEXTURE_FORMATS","gl1","b","c","bpp","dataFormat","types","renderbuffer","render","f","x","wgpu","gl1ext","p","gl2ext","attachment","depthTexture","DATA_FORMAT_CHANNELS","TYPE_SIZES","isTextureFormatSupported","formatOrGL","format","convertGLToTextureFormat","info","undefined","Boolean","isRenderbufferFormatSupported","_TEXTURE_FORMATS$form","entry","entries","find","_ref","Error","convertTextureFormatToGL","formatInfo","webglFormat","getTextureFormatSupport","supported","renderable","filterable","blendable","storable","isTextureFormatFilterable","decoded","signed","endsWith","isTextureFormatRenderable","getWebGLTextureParameters","getWebGLPixelDataFormat","integer","normalized","type","dataType","compressed","getDepthStencilAttachmentWebGL","_checkFloat32ColorAttachment","internalFormat","arguments","length","srcFormat","srcType","texture","framebuffer","createTexture","bindTexture","level","width","height","border","pixel","Uint8Array","texImage2D","createFramebuffer","bindFramebuffer","framebufferTexture2D","status","checkFramebufferStatus","deleteTexture","deleteFramebuffer","getTextureFormatBytesPerPixel","params","channels","channelSize"],"sources":["../../../src/adapter/converters/texture-formats.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {TextureFormat, DeviceFeature} from '@luma.gl/core';\nimport {decodeTextureFormat} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {isWebGL2} from '../../context/context/webgl-checks';\nimport { getGLFromVertexType } from './vertex-formats';\n\n/* eslint-disable camelcase */\n\n// TEXTURE FEATURES\n\n// Define local device feature strings to optimize minification\nconst texture_compression_bc: DeviceFeature = 'texture-compression-bc';\nconst texture_compression_astc: DeviceFeature = 'texture-compression-astc';\nconst texture_compression_etc2: DeviceFeature = 'texture-compression-etc2';\nconst texture_compression_etc1_webgl: DeviceFeature = 'texture-compression-etc1-webgl';\nconst texture_compression_pvrtc_webgl: DeviceFeature = 'texture-compression-pvrtc-webgl';\nconst texture_compression_atc_webgl: DeviceFeature = 'texture-compression-atc-webgl';\n\n// Define local webgl extension strings to optimize minification\nconst X_S3TC = 'WEBGL_compressed_texture_s3tc'; // BC1, BC2, BC3\nconst X_S3TC_SRGB = 'WEBGL_compressed_texture_s3tc_srgb'; // BC1, BC2, BC3\nconst X_RGTC = 'EXT_texture_compression_rgtc'; // BC4, BC5\nconst X_BPTC = 'EXT_texture_compression_bptc'; // BC6, BC7\nconst X_ETC2 = 'WEBGL_compressed_texture_etc'; // Renamed from 'WEBGL_compressed_texture_es3'\nconst X_ASTC = 'WEBGL_compressed_texture_astc';\nconst X_ETC1 = 'WEBGL_compressed_texture_etc1';\nconst X_PVRTC = 'WEBGL_compressed_texture_pvrtc';\nconst X_ATC = 'WEBGL_compressed_texture_atc';\n\n// Define local webgl extension strings to optimize minification\nconst EXT_SRGB = 'EXT_sRGB'; // https://developer.mozilla.org/en-US/docs/Web/API/EXT_sRGB\nconst EXT_TEXTURE_NORM16 = 'EXT_texture_norm16';\nconst EXT_FLOAT_WEBGL1 = 'WEBGL_color_buffer_float';\nconst EXT_FLOAT_RENDER_WEBGL2 = 'EXT_color_buffer_float';\n// const EXT_HALF_FLOAT_WEBGL1 = 'EXT_color_buffer_half_float';\n// const DEPTH = 'WEBGL_depth_texture';\n\nconst checkExtension = (gl: WebGLRenderingContext, extension: string): boolean =>\n gl.getExtension(extension);\nconst checkExtensions = (gl: WebGLRenderingContext, extensions: string[]): boolean =>\n extensions.every(extension => gl.getExtension(extension));\n\n// prettier-ignore\nconst TEXTURE_FEATURE_CHECKS: Partial<Record<DeviceFeature, (gl: WebGLRenderingContext) => boolean> > = {\n 'texture-blend-float-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'EXT_float_blend'),\n 'texture-formats-srgb-webgl1': (gl) => (isWebGL2(gl) ? true : checkExtension(gl, EXT_SRGB)),\n 'texture-formats-depth-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'WEBGL_depth_texture'),\n 'texture-formats-float32-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_float'),\n 'texture-formats-float16-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_half_float'),\n 'texture-formats-norm16-webgl': (gl) => isWebGL2(gl) ? checkExtension(gl, EXT_TEXTURE_NORM16) : false,\n 'texture-filter-linear-float32-webgl': (gl) => checkExtension(gl, 'OES_texture_float_linear'),\n 'texture-filter-linear-float16-webgl': (gl) => checkExtension(gl, 'OES_texture_half_float_linear'),\n 'texture-filter-anisotropic-webgl': (gl) => checkExtension(gl, 'EXT_texture_filter_anisotropic'),\n 'texture-renderable-float32-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_float'), // [false, 'EXT_color_buffer_float'],\n 'texture-renderable-float16-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_half_float'),\n\n 'texture-compression-bc': (gl) => checkExtensions(gl, [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC]),\n 'texture-compression-bc5-webgl': (gl) => checkExtensions(gl, [X_RGTC]),\n // 'texture-compression-bc7-webgl': gl => checkExtensions(gl, [X_BPTC]),\n // 'texture-compression-bc3-srgb-webgl': gl => checkExtensions(gl, [X_S3TC_SRGB]),\n // 'texture-compression-bc3-webgl': gl => checkExtensions(gl, [X_S3TC]),\n 'texture-compression-etc2': (gl) => checkExtensions(gl, [X_ETC2]),\n 'texture-compression-astc': (gl) => checkExtensions(gl, [X_ASTC]),\n 'texture-compression-etc1-webgl': (gl) => checkExtensions(gl, [X_ETC1]),\n 'texture-compression-pvrtc-webgl': (gl) => checkExtensions(gl, [X_PVRTC]),\n 'texture-compression-atc-webgl': (gl) => checkExtensions(gl, [X_ATC])\n};\n\nexport function checkTextureFeature(gl: WebGLRenderingContext, feature: DeviceFeature): boolean {\n return TEXTURE_FEATURE_CHECKS[feature]?.(gl) || false;\n}\n\nconst checkTextureFeatures = (gl: WebGLRenderingContext, features: DeviceFeature[]): boolean =>\n features.every(feature => checkTextureFeature(gl, feature));\n\n/** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */\nexport function getTextureFeatures(gl: WebGLRenderingContext): DeviceFeature[] {\n const textureFeatures = Object.keys(TEXTURE_FEATURE_CHECKS) as DeviceFeature[];\n return textureFeatures.filter(feature => checkTextureFeature(gl, feature));\n}\n\n// TEXTURE FORMATS\n\n/** Map a format to webgl and constants */\ntype Format = {\n gl?: GL;\n /** If a different unsized format is needed in WebGL1 */\n gl1?: GL;\n gl1ext?: string;\n /** format requires WebGL2, when using a WebGL 1 context, color renderbuffer formats are limited */\n gl2ext?: string;\n\n /** (bytes per pixel), for memory usage calculations. */\n b?: number;\n /** channels */\n c?: number;\n bpp?: number;\n /** packed */\n p?: number;\n /** compressed */\n x?: string;\n /** for compressed texture formats */\n f?: DeviceFeature;\n /** renderable if feature is present */\n render?: DeviceFeature;\n /** filterable if feature is present */\n filter?: DeviceFeature;\n\n /** If not supported on WebGPU */\n wgpu?: false;\n\n types?: number[];\n\n dataFormat?: GL;\n /** Depth and stencil format attachment points. If set, needs to be a Renderbuffer unless depthTexture is set */\n attachment?: GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT;\n /** if depthTexture is set this is a depth/stencil format that can be set to a texture */\n depthTexture?: boolean;\n\n renderbuffer?: boolean\n};\n\n// TABLES\n\n/** \n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const TEXTURE_FORMATS: Record<TextureFormat, Format> = {\n // Unsized formats that leave the precision up to the driver.\n // TODO - Fix bpp constants\n // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},\n 'rgb8unorm-unsized': {gl: GL.RGB, gl1: GL.RGB, b: 4, c: 2, bpp: 4,\n dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5]},\n 'rgba8unorm-unsized': {gl: GL.RGBA, gl1: GL.RGBA, b: 4, c: 2, bpp: 4,\n dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4, GL.UNSIGNED_SHORT_5_5_5_1]},\n // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n\n // 8-bit formats\n 'r8unorm': {gl: GL.R8, b: 1, c: 1, renderbuffer: true},\n 'r8snorm': {gl: GL.R8_SNORM, b: 1, c: 1},\n 'r8uint': {gl: GL.R8UI, b: 1, c: 1, renderbuffer: true},\n 'r8sint': {gl: GL.R8I, b: 1, c: 1, renderbuffer: true},\n\n // 16-bit formats\n 'rg8unorm': {gl: GL.RG8, b: 2, c: 2, renderbuffer: true},\n 'rg8snorm': {gl: GL.RG8_SNORM, b: 2, c: 2},\n 'rg8uint': {gl: GL.RG8UI, b: 2, c: 2, renderbuffer: true},\n 'rg8sint': {gl: GL.RG8I, b: 2, c: 2, renderbuffer: true},\n\n 'r16uint': {gl: GL.R16UI, b: 2, c: 1, renderbuffer: true},\n 'r16sint': {gl: GL.R16I, b: 2, c: 1, renderbuffer: true},\n 'r16float': {gl: GL.R16F, b: 2, c: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},\n 'r16unorm-webgl': {gl: GL.R16_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},\n 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // Packed 16-bit formats\n 'rgba4unorm-webgl': {gl: GL.RGBA4, b: 2, c: 4, wgpu: false, renderbuffer: true},\n 'rgb565unorm-webgl': {gl: GL.RGB565, b: 2, c: 4, wgpu: false, renderbuffer: true},\n 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, b: 2, c: 4, wgpu: false, renderbuffer: true},\n\n // 24-bit formats\n 'rgb8unorm-webgl': {gl: GL.RGB8, b: 3, c: 3, wgpu: false},\n 'rgb8snorm-webgl': {gl: GL.RGB8_SNORM, b: 3, c: 3, wgpu: false},\n\n // 32-bit formats \n 'rgba8unorm': {gl: GL.RGBA8, gl1: GL.RGBA, b: 4, c: 2, bpp: 4},\n 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8, gl1: GL.SRGB_ALPHA_EXT, b: 4, c: 4, gl1ext: EXT_SRGB, bpp: 4},\n 'rgba8snorm': {gl: GL.RGBA8_SNORM, b: 4, c: 4},\n 'rgba8uint': {gl: GL.RGBA8UI, b: 4, c: 4, bpp: 4},\n 'rgba8sint': {gl: GL.RGBA8I, b: 4, c: 4, bpp: 4},\n // reverse colors, webgpu only\n 'bgra8unorm': {b: 4, c: 4},\n 'bgra8unorm-srgb': {b: 4, c: 4},\n\n 'rg16uint': {gl: GL.RG16UI, b: 4, c: 1, bpp: 4},\n 'rg16sint': {gl: GL.RG16I, b: 4, c: 2, bpp: 4},\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n 'rg16float': {gl: GL.RG16F, bpp: 4, b: 4, c: 2, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},\n 'rg16unorm-webgl': {gl: GL.RG16_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n 'r32uint': {gl: GL.R32UI, b: 4, c: 1, bpp: 4, renderbuffer: true},\n 'r32sint': {gl: GL.R32I, b: 4, c: 1, bpp: 4, renderbuffer: true},\n 'r32float': {gl: GL.R32F, bpp: 4, b: 4, c: 1, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl'},\n\n // Packed 32-bit formats\n 'rgb9e5ufloat': {gl: GL.RGB9_E5, b: 4, c: 3, p: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},\n 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, b: 4, c: 3, p: 1,render: 'texture-renderable-float32-webgl', renderbuffer: true},\n 'rgb10a2unorm': {gl: GL.RGB10_A2, b: 4, c: 4, p: 1, renderbuffer: true},\n // webgl2 only\n 'rgb10a2unorm-webgl': {b: 4, c: 4, gl: GL.RGB10_A2UI, p: 1, wgpu: false, bpp: 4, renderbuffer: true},\n\n // 48-bit formats\n 'rgb16unorm-webgl': {gl: GL.RGB16_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // 64-bit formats\n 'rg32uint': {gl: GL.RG32UI, b: 8, c: 2, renderbuffer: true},\n 'rg32sint': {gl: GL.RG32I, b: 8, c: 2, renderbuffer: true},\n 'rg32float': {gl: GL.RG32F, b: 8, c: 2, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},\n 'rgba16uint': {gl: GL.RGBA16UI, b: 8, c: 4, renderbuffer: true},\n 'rgba16sint': {gl: GL.RGBA16I, b: 8, c: 4, renderbuffer: true},\n 'rgba16float': {gl: GL.RGBA16F, gl1: GL.RGBA, b: 8, c: 4, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},\n 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},\n 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': {gl: GL.RGB32F, gl1: GL.RGB, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl',\n gl2ext: EXT_FLOAT_RENDER_WEBGL2, gl1ext: EXT_FLOAT_WEBGL1, // WebGL1 render buffers are supported with GL.RGB32F\n dataFormat: GL.RGB, types: [GL.FLOAT]},\n \n // 128-bit formats\n 'rgba32uint': {gl: GL.RGBA32UI, b: 16, c: 4, renderbuffer: true},\n 'rgba32sint': {gl: GL.RGBA32I, b: 16, c: 4, renderbuffer: true},\n 'rgba32float': {gl: GL.RGBA32F, b: 16, c: 4, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},\n\n // Depth and stencil formats\n 'stencil8': {gl: GL.STENCIL_INDEX8, gl1: GL.STENCIL_INDEX8, b: 1, c: 1, attachment: GL.STENCIL_ATTACHMENT, renderbuffer: true}, // 8 stencil bits\n\n 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, gl1: GL.DEPTH_COMPONENT16, b: 2, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true}, // 16 depth bits\n 'depth24plus': {gl: GL.DEPTH_COMPONENT24, b: 3, c: 1, attachment: GL.DEPTH_ATTACHMENT},\n 'depth32float': {gl: GL.DEPTH_COMPONENT32F, b: 4, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true},\n\n // The depth component of the \"depth24plus\" and \"depth24plus-stencil8\" formats may be implemented as either a 24-bit depth value or a \"depth32float\" value.\n 'depth24plus-stencil8': {gl: GL.DEPTH_STENCIL, gl1: GL.DEPTH_STENCIL, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true, depthTexture: true},\n // \"depth24unorm-stencil8\" feature\n 'depth24unorm-stencil8': {gl: GL.DEPTH24_STENCIL8, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},\n // \"depth32float-stencil8\" feature\n 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, b: 5, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},\n\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n\n 'bc1-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_S3TC_DXT1_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc1-rgb-unorm-srgb-webgl': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n\n 'bc1-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT1_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc1-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc2-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc2-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc3-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc3-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc4-r-unorm': {gl: GL.COMPRESSED_RED_RGTC1_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc4-r-snorm': {gl: GL.COMPRESSED_SIGNED_RED_RGTC1_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc5-rg-unorm': {gl: GL.COMPRESSED_RED_GREEN_RGTC2_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc5-rg-snorm': {gl: GL.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc6h-rgb-ufloat': {gl: GL.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc6h-rgb-float': {gl: GL.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc7-rgba-unorm': {gl: GL.COMPRESSED_RGBA_BPTC_UNORM_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc7-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, x: X_BPTC, f: texture_compression_bc},\n\n // WEBGL_compressed_texture_etc: device.features.has(\"texture-compression-etc2\")\n // Note: Supposedly guaranteed availability compressed formats in WebGL2, but through CPU decompression\n\n 'etc2-rgb8unorm': {gl: GL.COMPRESSED_RGB8_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8a1unorm': {gl: GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8a1unorm-srgb': {gl: GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, f: texture_compression_etc2},\n 'etc2-rgba8unorm': {gl: GL.COMPRESSED_RGBA8_ETC2_EAC, f: texture_compression_etc2},\n 'etc2-rgba8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, f: texture_compression_etc2},\n\n 'eac-r11unorm': {gl: GL.COMPRESSED_R11_EAC, f: texture_compression_etc2},\n 'eac-r11snorm': {gl: GL.COMPRESSED_SIGNED_R11_EAC, f: texture_compression_etc2},\n 'eac-rg11unorm': {gl: GL.COMPRESSED_RG11_EAC, f: texture_compression_etc2},\n 'eac-rg11snorm': {gl: GL.COMPRESSED_SIGNED_RG11_EAC, f: texture_compression_etc2},\n\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n\n 'astc-4x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_4x4_KHR, f: texture_compression_astc},\n 'astc-4x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, f: texture_compression_astc},\n 'astc-5x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x4_KHR, f: texture_compression_astc},\n 'astc-5x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, f: texture_compression_astc},\n 'astc-5x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x5_KHR, f: texture_compression_astc},\n 'astc-5x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, f: texture_compression_astc},\n 'astc-6x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x5_KHR, f: texture_compression_astc},\n 'astc-6x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, f: texture_compression_astc},\n 'astc-6x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x6_KHR, f: texture_compression_astc},\n 'astc-6x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, f: texture_compression_astc},\n 'astc-8x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x5_KHR, f: texture_compression_astc},\n 'astc-8x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, f: texture_compression_astc},\n 'astc-8x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x6_KHR, f: texture_compression_astc},\n 'astc-8x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, f: texture_compression_astc},\n 'astc-8x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x8_KHR, f: texture_compression_astc},\n 'astc-8x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, f: texture_compression_astc},\n 'astc-10x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x6_KHR, f: texture_compression_astc},\n 'astc-10x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, f: texture_compression_astc},\n 'astc-10x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x8_KHR, f: texture_compression_astc},\n 'astc-10x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, f: texture_compression_astc},\n 'astc-10x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-12x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x10_KHR, f: texture_compression_astc},\n 'astc-12x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, f: texture_compression_astc},\n 'astc-12x12-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x12_KHR, f: texture_compression_astc},\n 'astc-12x12-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, f: texture_compression_astc},\n\n // WEBGL_compressed_texture_pvrtc\n\n 'pvrtc-rgb4unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rgba4unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rbg2unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rgba2unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n\n // WEBGL_compressed_texture_etc1\n\n 'etc1-rbg-unorm-webgl': {gl: GL.COMPRESSED_RGB_ETC1_WEBGL, f: texture_compression_etc1_webgl},\n\n // WEBGL_compressed_texture_atc\n\n 'atc-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_ATC_WEBGL, f: texture_compression_atc_webgl},\n 'atc-rgba-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL, f: texture_compression_atc_webgl},\n 'atc-rgbai-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL, f: texture_compression_atc_webgl}\n};\n\n/** Legal combinations for internalFormat, format and type *\n// [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8], gl1ext: DEPTH},\n// [GL.DEPTH_STENCIL]: {gl1ext: DEPTH},\n// Sized texture format\n// R\n[GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.R16F]: {dataFormat: GL.RED, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.R8UI]: {dataFormat: GL.RED_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RG\n[GL.RG8]: {dataFormat: GL.RG, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RG16F]: {dataFormat: GL.RG, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGB\n[GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGBA\n\n[GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},\n[GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},\n[GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},\n[GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}\n*/\n\n/* This table is now baked into the above table\ntype RenderbufferFormat = {\n bpp: number;\n gl2?: boolean;\n ext?: string;\n};\n\nexport const RENDERBUFFER_FORMATS: Record<string, RenderbufferFormat> = {\n [GL.DEPTH_COMPONENT16]: {bpp: 2}, // 16 depth bits.\n // TODO - Not clear which webgpu value to map this to.\n // [GL.DEPTH_COMPONENT24]: {gl2: true, bpp: 3},\n [GL.DEPTH_COMPONENT32F]: {gl2: true, bpp: 4},\n\n [GL.STENCIL_INDEX8]: {bpp: 1}, // 8 stencil bits.\n\n [GL.DEPTH_STENCIL]: {bpp: 4},\n [GL.DEPTH24_STENCIL8]: {gl2: true, bpp: 4},\n [GL.DEPTH32F_STENCIL8]: {gl2: true, bpp: 5},\n\n // When using a WebGL 1 context, color renderbuffer formats are limited\n [GL.RGBA4]: {gl2: true, bpp: 2},\n [GL.RGB565]: {gl2: true, bpp: 2},\n [GL.RGB5_A1]: {gl2: true, bpp: 2},\n\n // When using a WebGL 2 context, the following values are available additionally:\n [GL.R8]: {gl2: true, bpp: 1},\n [GL.R8UI]: {gl2: true, bpp: 1},\n [GL.R8I]: {gl2: true, bpp: 1},\n [GL.R16UI]: {gl2: true, bpp: 2},\n [GL.R16I]: {gl2: true, bpp: 2},\n [GL.R32UI]: {gl2: true, bpp: 4},\n [GL.R32I]: {gl2: true, bpp: 4},\n [GL.RG8]: {gl2: true, bpp: 2},\n [GL.RG8UI]: {gl2: true, bpp: 2},\n [GL.RG8I]: {gl2: true, bpp: 2},\n [GL.RG16UI]: {gl2: true, bpp: 4},\n [GL.RG16I]: {gl2: true, bpp: 4},\n [GL.RG32UI]: {gl2: true, bpp: 8},\n [GL.RG32I]: {gl2: true, bpp: 8},\n [GL.RGB8]: {gl2: true, bpp: 3},\n [GL.RGBA8]: {gl2: true, bpp: 4},\n // [GL.SRGB8_ALPHA8]: {gl2: true, gl1: SRGB}, // When using the EXT_sRGB WebGL1 extension\n [GL.RGB10_A2]: {gl2: true, bpp: 4},\n [GL.RGBA8UI]: {gl2: true, bpp: 4},\n [GL.RGBA8I]: {gl2: true, bpp: 4},\n [GL.RGB10_A2UI]: {gl2: true, bpp: 4},\n [GL.RGBA16UI]: {gl2: true, bpp: 8},\n [GL.RGBA16I]: {gl2: true, bpp: 8},\n [GL.RGBA32I]: {gl2: true, bpp: 16},\n [GL.RGBA32UI]: {gl2: true, bpp: 16},\n\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n [GL.R16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 2},\n [GL.RG16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RGBA16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n [GL.R32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RG32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n // TODO - can't get WEBGL_color_buffer_float to work on renderbuffers\n [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 16},\n // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, gl1: EXT_FLOAT_WEBGL1},\n [GL.R11F_G11F_B10F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4}\n};\n*/\n\n/** @deprecated should be removed */\nconst DATA_FORMAT_CHANNELS = {\n [GL.RED]: 1,\n [GL.RED_INTEGER]: 1,\n [GL.RG]: 2,\n [GL.RG_INTEGER]: 2,\n [GL.RGB]: 3,\n [GL.RGB_INTEGER]: 3,\n [GL.RGBA]: 4,\n [GL.RGBA_INTEGER]: 4,\n [GL.DEPTH_COMPONENT]: 1,\n [GL.DEPTH_STENCIL]: 1,\n [GL.ALPHA]: 1,\n [GL.LUMINANCE]: 1,\n [GL.LUMINANCE_ALPHA]: 2\n};\n\n/** @deprecated should be removed */\nconst TYPE_SIZES = {\n [GL.FLOAT]: 4,\n [GL.UNSIGNED_INT]: 4,\n [GL.INT]: 4,\n [GL.UNSIGNED_SHORT]: 2,\n [GL.SHORT]: 2,\n [GL.HALF_FLOAT]: 2,\n [GL.BYTE]: 1,\n [GL.UNSIGNED_BYTE]: 1\n};\n\n// FUNCTIONS\n\n/** Checks if a texture format is supported */\nexport function isTextureFormatSupported(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return false;\n }\n // Check that we have a GL constant\n if (isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined) {\n return false;\n }\n // Check extensions\n const extension = info.x || (isWebGL2(gl) ? info.gl2ext || info.gl1ext : info.gl1ext);\n if (extension) {\n return Boolean(gl.getExtension(extension));\n }\n // if (info.gl1 === undefined && info.gl2 === undefined) {\n // // No info - always supported\n // }\n return true;\n}\n\nexport function isRenderbufferFormatSupported(gl: WebGLRenderingContext, format: TextureFormat): boolean {\n // Note: Order is important since the function call initializes extensions.\n return isTextureFormatSupported(gl, format) && TEXTURE_FORMATS[format]?.renderbuffer;\n}\n\n/**\n * Map WebGL texture formats (GL constants) to WebGPU-style TextureFormat strings\n */\nexport function convertGLToTextureFormat(format: GL | TextureFormat): TextureFormat {\n if (typeof format === 'string') {\n return format;\n }\n const entry = Object.entries(TEXTURE_FORMATS).find(\n ([, entry]) => entry.gl === format || entry.gl1 === format\n );\n if (!entry) {\n throw new Error(`Unknown texture format ${format}`);\n }\n return entry[0] as TextureFormat;\n}\n\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nexport function convertTextureFormatToGL(format: TextureFormat, isWebGL2: boolean): GL | undefined {\n const formatInfo = TEXTURE_FORMATS[format];\n const webglFormat = isWebGL2 ? formatInfo?.gl : formatInfo?.gl1;\n if (webglFormat === undefined) {\n throw new Error(`Unsupported texture format ${format}`);\n }\n return webglFormat;\n}\n\n/** Checks if a texture format is supported */\nexport function getTextureFormatSupport(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): {\n supported: boolean;\n filterable?: boolean;\n renderable?: boolean;\n blendable?: boolean;\n storable?: boolean;\n} {\n const format = convertGLToTextureFormat(formatOrGL);\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return {supported: false};\n }\n // let decoded;\n // try {\n // decoded = decodeTextureFormat(format);\n // } catch {}\n\n // Support Check that we have a GL constant\n let supported = isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined;\n supported = supported && checkTextureFeatures(gl, [info.f]);\n\n // Filtering\n // const filterable = info.filter\n // ? checkTextureFeatures(gl, [info.filter])\n // : decoded && !decoded.signed;\n // const renderable = info.filter\n // ? checkTextureFeatures(gl, [info.render])\n // : decoded && !decoded.signed;\n\n return {\n supported,\n renderable: supported && checkTextureFeatures(gl, [info.render]),\n filterable: supported && checkTextureFeatures(gl, [info.filter]),\n blendable: false, // tod,\n storable: false\n };\n}\n\n/** Checks whether linear filtering (interpolated sampling) is available for floating point textures */\nexport function isTextureFormatFilterable(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n if (!isTextureFormatSupported(gl, format)) {\n return false;\n }\n try {\n const decoded = decodeTextureFormat(format);\n if (decoded.signed) {\n return false;\n }\n } catch {\n return false;\n }\n if (format.endsWith('32float')) {\n return Boolean(gl.getExtension('OES_texture_float_linear'));\n }\n if (format.endsWith('16float')) {\n return Boolean(gl.getExtension('OES_texture_half_float_linear'));\n }\n // if (typeof format === 'string') {\n // if (format === 'rgba32float') {\n // return gl.device.features.has('texture-renderable-rgba32float-webgl');\n // }\n // if (format.endsWith('32float')) {\n // return gl.device.features.has('texture-renderable-float32-webgl');\n // }\n // if (format.endsWith('16float')) {\n // return gl.device.features.has('texture-renderable-float16-webgl');\n // }\n // }\n return true;\n}\n\nexport function isTextureFormatRenderable(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n if (!isTextureFormatSupported(gl, format)) {\n return false;\n }\n if (typeof format === 'number') {\n return false; // isTextureFormatFilterableWebGL(gl, format);\n }\n // TODO depends on device...\n return true;\n}\n\nexport function getWebGLTextureParameters(formatOrGL: TextureFormat | GL, isWebGL2: boolean) {\n const format = convertGLToTextureFormat(formatOrGL);\n const webglFormat = convertTextureFormatToGL(format, isWebGL2);\n const decoded = decodeTextureFormat(format);\n return {\n format: webglFormat,\n dataFormat: getWebGLPixelDataFormat(\n decoded.format,\n decoded.integer,\n decoded.normalized,\n webglFormat\n ),\n // depth formats don't have a type\n type: decoded.dataType ? getGLFromVertexType(decoded.dataType) : GL.UNSIGNED_BYTE,\n // @ts-expect-error\n compressed: decoded.compressed\n };\n}\n\nexport function getDepthStencilAttachmentWebGL(\n format: TextureFormat\n): GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT {\n const info = TEXTURE_FORMATS[format];\n if (!info?.attachment) {\n throw new Error(`${format} is not a depth stencil format`);\n }\n return info.attachment;\n}\n\n/**\n * function to test if Float 32 bit format texture can be bound as color attachment\n * @todo Generalize to check arbitrary formats?\n */\nexport function _checkFloat32ColorAttachment(\n gl: WebGLRenderingContext,\n internalFormat = gl.RGBA,\n srcFormat = GL.RGBA,\n srcType = GL.UNSIGNED_BYTE\n) {\n let texture: WebGLTexture | null = null;\n let framebuffer: WebGLFramebuffer | null = null;\n try {\n texture = gl.createTexture();\n gl.bindTexture(GL.TEXTURE_2D, texture);\n\n const level = 0;\n const width = 1;\n const height = 1;\n const border = 0;\n const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue\n gl.texImage2D(\n gl.TEXTURE_2D,\n level,\n internalFormat,\n width,\n height,\n border,\n srcFormat,\n srcType,\n pixel\n );\n\n framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(GL.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, texture, 0);\n const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER) === GL.FRAMEBUFFER_COMPLETE;\n\n gl.bindTexture(GL.TEXTURE_2D, null);\n return status;\n } finally {\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(framebuffer);\n }\n}\n\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(\n formatOrGL: TextureFormat | GL,\n isWebGL2: boolean\n): number {\n const format = convertGLToTextureFormat(formatOrGL);\n const params = getWebGLTextureParameters(format, isWebGL2);\n // NOTE(Tarek): Default to RGBA bytes\n const channels = DATA_FORMAT_CHANNELS[params.dataFormat] || 4;\n const channelSize = TYPE_SIZES[params.type] || 1;\n return channels * channelSize;\n}\n\n// DATA TYPE HELPERS\n\nfunction getWebGLPixelDataFormat(\n dataFormat: string,\n integer: boolean,\n normalized: boolean,\n format: GL\n): GL {\n // WebGL1 formats use same internalFormat\n if (format === GL.RGBA || format === GL.RGB) {\n return format;\n }\n // prettier-ignore\n switch (dataFormat) {\n case 'r': return integer && !normalized ? GL.RED_INTEGER : GL.RED;\n case 'rg': return integer && !normalized ? GL.RG_INTEGER : GL.RG;\n case 'rgb': return integer && !normalized ? GL.RGB_INTEGER : GL.RGB;\n case 'rgba': return integer && !normalized ? GL.RGBA_INTEGER : GL.RGBA;\n default: return GL.RGBA;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"texture-formats.js","names":["decodeTextureFormat","isWebGL2","getGLFromVertexType","texture_compression_bc","texture_compression_astc","texture_compression_etc2","texture_compression_etc1_webgl","texture_compression_pvrtc_webgl","texture_compression_atc_webgl","X_S3TC","X_S3TC_SRGB","X_RGTC","X_BPTC","X_ETC2","X_ASTC","X_ETC1","X_PVRTC","X_ATC","EXT_SRGB","EXT_TEXTURE_NORM16","EXT_FLOAT_WEBGL1","EXT_FLOAT_RENDER_WEBGL2","checkExtension","gl","extension","getExtension","checkExtensions","extensions","every","TEXTURE_FEATURE_CHECKS","checkTextureFeature","feature","_TEXTURE_FEATURE_CHEC","call","checkTextureFeatures","features","getTextureFeatures","textureFeatures","Object","keys","filter","TEXTURE_FORMATS","gl1","b","c","bpp","dataFormat","types","renderbuffer","render","f","x","wgpu","gl1ext","p","gl2ext","attachment","depthTexture","DATA_FORMAT_CHANNELS","TYPE_SIZES","isTextureFormatSupported","formatOrGL","format","convertGLToTextureFormat","info","undefined","Boolean","isRenderbufferFormatSupported","_TEXTURE_FORMATS$form","entry","entries","find","_ref","Error","convertTextureFormatToGL","formatInfo","webglFormat","getTextureFormatSupport","supported","renderable","filterable","blendable","storable","isTextureFormatFilterable","decoded","signed","endsWith","isTextureFormatRenderable","getWebGLTextureParameters","getWebGLPixelDataFormat","integer","normalized","type","dataType","compressed","getDepthStencilAttachmentWebGL","_checkFloat32ColorAttachment","internalFormat","arguments","length","srcFormat","srcType","texture","framebuffer","createTexture","bindTexture","level","width","height","border","pixel","Uint8Array","texImage2D","createFramebuffer","bindFramebuffer","framebufferTexture2D","status","checkFramebufferStatus","deleteTexture","deleteFramebuffer","getTextureFormatBytesPerPixel","params","channels","channelSize"],"sources":["../../../src/adapter/converters/texture-formats.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {TextureFormat, DeviceFeature} from '@luma.gl/core';\nimport {decodeTextureFormat} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {isWebGL2} from '../../context/context/webgl-checks';\nimport { getGLFromVertexType } from './vertex-formats';\n\n/* eslint-disable camelcase */\n\n// TEXTURE FEATURES\n\n// Define local device feature strings to optimize minification\nconst texture_compression_bc: DeviceFeature = 'texture-compression-bc';\nconst texture_compression_astc: DeviceFeature = 'texture-compression-astc';\nconst texture_compression_etc2: DeviceFeature = 'texture-compression-etc2';\nconst texture_compression_etc1_webgl: DeviceFeature = 'texture-compression-etc1-webgl';\nconst texture_compression_pvrtc_webgl: DeviceFeature = 'texture-compression-pvrtc-webgl';\nconst texture_compression_atc_webgl: DeviceFeature = 'texture-compression-atc-webgl';\n\n// Define local webgl extension strings to optimize minification\nconst X_S3TC = 'WEBGL_compressed_texture_s3tc'; // BC1, BC2, BC3\nconst X_S3TC_SRGB = 'WEBGL_compressed_texture_s3tc_srgb'; // BC1, BC2, BC3\nconst X_RGTC = 'EXT_texture_compression_rgtc'; // BC4, BC5\nconst X_BPTC = 'EXT_texture_compression_bptc'; // BC6, BC7\nconst X_ETC2 = 'WEBGL_compressed_texture_etc'; // Renamed from 'WEBGL_compressed_texture_es3'\nconst X_ASTC = 'WEBGL_compressed_texture_astc';\nconst X_ETC1 = 'WEBGL_compressed_texture_etc1';\nconst X_PVRTC = 'WEBGL_compressed_texture_pvrtc';\nconst X_ATC = 'WEBGL_compressed_texture_atc';\n\n// Define local webgl extension strings to optimize minification\nconst EXT_SRGB = 'EXT_sRGB'; // https://developer.mozilla.org/en-US/docs/Web/API/EXT_sRGB\nconst EXT_TEXTURE_NORM16 = 'EXT_texture_norm16';\nconst EXT_FLOAT_WEBGL1 = 'WEBGL_color_buffer_float';\nconst EXT_FLOAT_RENDER_WEBGL2 = 'EXT_color_buffer_float';\n// const EXT_HALF_FLOAT_WEBGL1 = 'EXT_color_buffer_half_float';\n// const DEPTH = 'WEBGL_depth_texture';\n\nconst checkExtension = (gl: WebGLRenderingContext, extension: string): boolean =>\n gl.getExtension(extension);\nconst checkExtensions = (gl: WebGLRenderingContext, extensions: string[]): boolean =>\n extensions.every(extension => gl.getExtension(extension));\n\n// prettier-ignore\nconst TEXTURE_FEATURE_CHECKS: Partial<Record<DeviceFeature, (gl: WebGLRenderingContext) => boolean> > = {\n 'texture-blend-float-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'EXT_float_blend'),\n 'texture-formats-srgb-webgl1': (gl) => (isWebGL2(gl) ? true : checkExtension(gl, EXT_SRGB)),\n 'texture-formats-depth-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'WEBGL_depth_texture'),\n 'texture-formats-float32-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_float'),\n 'texture-formats-float16-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_half_float'),\n 'texture-formats-norm16-webgl': (gl) => isWebGL2(gl) ? checkExtension(gl, EXT_TEXTURE_NORM16) : false,\n 'texture-filter-linear-float32-webgl': (gl) => checkExtension(gl, 'OES_texture_float_linear'),\n 'texture-filter-linear-float16-webgl': (gl) => checkExtension(gl, 'OES_texture_half_float_linear'),\n 'texture-filter-anisotropic-webgl': (gl) => checkExtension(gl, 'EXT_texture_filter_anisotropic'),\n 'texture-renderable-float32-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_float'), // [false, 'EXT_color_buffer_float'],\n 'texture-renderable-float16-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_half_float'),\n\n 'texture-compression-bc': (gl) => checkExtensions(gl, [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC]),\n 'texture-compression-bc5-webgl': (gl) => checkExtensions(gl, [X_RGTC]),\n // 'texture-compression-bc7-webgl': gl => checkExtensions(gl, [X_BPTC]),\n // 'texture-compression-bc3-srgb-webgl': gl => checkExtensions(gl, [X_S3TC_SRGB]),\n // 'texture-compression-bc3-webgl': gl => checkExtensions(gl, [X_S3TC]),\n 'texture-compression-etc2': (gl) => checkExtensions(gl, [X_ETC2]),\n 'texture-compression-astc': (gl) => checkExtensions(gl, [X_ASTC]),\n 'texture-compression-etc1-webgl': (gl) => checkExtensions(gl, [X_ETC1]),\n 'texture-compression-pvrtc-webgl': (gl) => checkExtensions(gl, [X_PVRTC]),\n 'texture-compression-atc-webgl': (gl) => checkExtensions(gl, [X_ATC])\n};\n\nexport function checkTextureFeature(gl: WebGLRenderingContext, feature: DeviceFeature): boolean {\n return TEXTURE_FEATURE_CHECKS[feature]?.(gl) || false;\n}\n\nconst checkTextureFeatures = (gl: WebGLRenderingContext, features: DeviceFeature[]): boolean =>\n features.every(feature => checkTextureFeature(gl, feature));\n\n/** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */\nexport function getTextureFeatures(gl: WebGLRenderingContext): DeviceFeature[] {\n const textureFeatures = Object.keys(TEXTURE_FEATURE_CHECKS) as DeviceFeature[];\n return textureFeatures.filter(feature => checkTextureFeature(gl, feature));\n}\n\n// TEXTURE FORMATS\n\n/** Map a format to webgl and constants */\ntype Format = {\n gl?: GL;\n /** If a different unsized format is needed in WebGL1 */\n gl1?: GL;\n gl1ext?: string;\n /** format requires WebGL2, when using a WebGL 1 context, color renderbuffer formats are limited */\n gl2ext?: string;\n\n /** (bytes per pixel), for memory usage calculations. */\n b?: number;\n /** channels */\n c?: number;\n bpp?: number;\n /** packed */\n p?: number;\n /** compressed */\n x?: string;\n /** for compressed texture formats */\n f?: DeviceFeature;\n /** renderable if feature is present */\n render?: DeviceFeature;\n /** filterable if feature is present */\n filter?: DeviceFeature;\n\n /** If not supported on WebGPU */\n wgpu?: false;\n\n types?: number[];\n\n dataFormat?: GL;\n /** Depth and stencil format attachment points. If set, needs to be a Renderbuffer unless depthTexture is set */\n attachment?: GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT;\n /** if depthTexture is set this is a depth/stencil format that can be set to a texture */\n depthTexture?: boolean;\n\n renderbuffer?: boolean\n};\n\n// TABLES\n\n/** \n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const TEXTURE_FORMATS: Record<TextureFormat, Format> = {\n // Unsized formats that leave the precision up to the driver.\n // TODO - Fix bpp constants\n // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},\n 'rgb8unorm-unsized': {gl: GL.RGB, gl1: GL.RGB, b: 4, c: 2, bpp: 4,\n dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5]},\n 'rgba8unorm-unsized': {gl: GL.RGBA, gl1: GL.RGBA, b: 4, c: 2, bpp: 4,\n dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4, GL.UNSIGNED_SHORT_5_5_5_1]},\n // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n\n // 8-bit formats\n 'r8unorm': {gl: GL.R8, b: 1, c: 1, renderbuffer: true},\n 'r8snorm': {gl: GL.R8_SNORM, b: 1, c: 1},\n 'r8uint': {gl: GL.R8UI, b: 1, c: 1, renderbuffer: true},\n 'r8sint': {gl: GL.R8I, b: 1, c: 1, renderbuffer: true},\n\n // 16-bit formats\n 'rg8unorm': {gl: GL.RG8, b: 2, c: 2, renderbuffer: true},\n 'rg8snorm': {gl: GL.RG8_SNORM, b: 2, c: 2},\n 'rg8uint': {gl: GL.RG8UI, b: 2, c: 2, renderbuffer: true},\n 'rg8sint': {gl: GL.RG8I, b: 2, c: 2, renderbuffer: true},\n\n 'r16uint': {gl: GL.R16UI, b: 2, c: 1, renderbuffer: true},\n 'r16sint': {gl: GL.R16I, b: 2, c: 1, renderbuffer: true},\n 'r16float': {gl: GL.R16F, b: 2, c: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},\n 'r16unorm-webgl': {gl: GL.R16_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},\n 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // Packed 16-bit formats\n 'rgba4unorm-webgl': {gl: GL.RGBA4, b: 2, c: 4, wgpu: false, renderbuffer: true},\n 'rgb565unorm-webgl': {gl: GL.RGB565, b: 2, c: 4, wgpu: false, renderbuffer: true},\n 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, b: 2, c: 4, wgpu: false, renderbuffer: true},\n\n // 24-bit formats\n 'rgb8unorm-webgl': {gl: GL.RGB8, b: 3, c: 3, wgpu: false},\n 'rgb8snorm-webgl': {gl: GL.RGB8_SNORM, b: 3, c: 3, wgpu: false},\n\n // 32-bit formats \n 'rgba8unorm': {gl: GL.RGBA8, gl1: GL.RGBA, b: 4, c: 2, bpp: 4},\n 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8, gl1: GL.SRGB_ALPHA_EXT, b: 4, c: 4, gl1ext: EXT_SRGB, bpp: 4},\n 'rgba8snorm': {gl: GL.RGBA8_SNORM, b: 4, c: 4},\n 'rgba8uint': {gl: GL.RGBA8UI, b: 4, c: 4, bpp: 4},\n 'rgba8sint': {gl: GL.RGBA8I, b: 4, c: 4, bpp: 4},\n // reverse colors, webgpu only\n 'bgra8unorm': {b: 4, c: 4},\n 'bgra8unorm-srgb': {b: 4, c: 4},\n\n 'rg16uint': {gl: GL.RG16UI, b: 4, c: 1, bpp: 4},\n 'rg16sint': {gl: GL.RG16I, b: 4, c: 2, bpp: 4},\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n 'rg16float': {gl: GL.RG16F, bpp: 4, b: 4, c: 2, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},\n 'rg16unorm-webgl': {gl: GL.RG16_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n 'r32uint': {gl: GL.R32UI, b: 4, c: 1, bpp: 4, renderbuffer: true},\n 'r32sint': {gl: GL.R32I, b: 4, c: 1, bpp: 4, renderbuffer: true},\n 'r32float': {gl: GL.R32F, bpp: 4, b: 4, c: 1, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl'},\n\n // Packed 32-bit formats\n 'rgb9e5ufloat': {gl: GL.RGB9_E5, b: 4, c: 3, p: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},\n 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, b: 4, c: 3, p: 1,render: 'texture-renderable-float32-webgl', renderbuffer: true},\n 'rgb10a2unorm': {gl: GL.RGB10_A2, b: 4, c: 4, p: 1, renderbuffer: true},\n // webgl2 only\n 'rgb10a2unorm-webgl': {b: 4, c: 4, gl: GL.RGB10_A2UI, p: 1, wgpu: false, bpp: 4, renderbuffer: true},\n\n // 48-bit formats\n 'rgb16unorm-webgl': {gl: GL.RGB16_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // 64-bit formats\n 'rg32uint': {gl: GL.RG32UI, b: 8, c: 2, renderbuffer: true},\n 'rg32sint': {gl: GL.RG32I, b: 8, c: 2, renderbuffer: true},\n 'rg32float': {gl: GL.RG32F, b: 8, c: 2, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},\n 'rgba16uint': {gl: GL.RGBA16UI, b: 8, c: 4, renderbuffer: true},\n 'rgba16sint': {gl: GL.RGBA16I, b: 8, c: 4, renderbuffer: true},\n 'rgba16float': {gl: GL.RGBA16F, gl1: GL.RGBA, b: 8, c: 4, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},\n 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},\n 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},\n\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': {gl: GL.RGB32F, gl1: GL.RGB, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl',\n gl2ext: EXT_FLOAT_RENDER_WEBGL2, gl1ext: EXT_FLOAT_WEBGL1, // WebGL1 render buffers are supported with GL.RGB32F\n dataFormat: GL.RGB, types: [GL.FLOAT]},\n \n // 128-bit formats\n 'rgba32uint': {gl: GL.RGBA32UI, b: 16, c: 4, renderbuffer: true},\n 'rgba32sint': {gl: GL.RGBA32I, b: 16, c: 4, renderbuffer: true},\n 'rgba32float': {gl: GL.RGBA32F, b: 16, c: 4, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},\n\n // Depth and stencil formats\n 'stencil8': {gl: GL.STENCIL_INDEX8, gl1: GL.STENCIL_INDEX8, b: 1, c: 1, attachment: GL.STENCIL_ATTACHMENT, renderbuffer: true}, // 8 stencil bits\n\n 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, gl1: GL.DEPTH_COMPONENT16, b: 2, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true}, // 16 depth bits\n 'depth24plus': {gl: GL.DEPTH_COMPONENT24, b: 3, c: 1, attachment: GL.DEPTH_ATTACHMENT},\n 'depth32float': {gl: GL.DEPTH_COMPONENT32F, b: 4, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true},\n\n // The depth component of the \"depth24plus\" and \"depth24plus-stencil8\" formats may be implemented as either a 24-bit depth value or a \"depth32float\" value.\n 'depth24plus-stencil8': {gl: GL.DEPTH_STENCIL, gl1: GL.DEPTH_STENCIL, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true, depthTexture: true},\n // \"depth24unorm-stencil8\" feature\n 'depth24unorm-stencil8': {gl: GL.DEPTH24_STENCIL8, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},\n // \"depth32float-stencil8\" feature\n 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, b: 5, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},\n\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n\n 'bc1-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_S3TC_DXT1_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc1-rgb-unorm-srgb-webgl': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n\n 'bc1-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT1_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc1-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc2-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc2-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc3-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT, x: X_S3TC, f: texture_compression_bc},\n 'bc3-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, x: X_S3TC_SRGB, f: texture_compression_bc},\n 'bc4-r-unorm': {gl: GL.COMPRESSED_RED_RGTC1_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc4-r-snorm': {gl: GL.COMPRESSED_SIGNED_RED_RGTC1_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc5-rg-unorm': {gl: GL.COMPRESSED_RED_GREEN_RGTC2_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc5-rg-snorm': {gl: GL.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, x: X_RGTC, f: texture_compression_bc},\n 'bc6h-rgb-ufloat': {gl: GL.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc6h-rgb-float': {gl: GL.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc7-rgba-unorm': {gl: GL.COMPRESSED_RGBA_BPTC_UNORM_EXT, x: X_BPTC, f: texture_compression_bc},\n 'bc7-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, x: X_BPTC, f: texture_compression_bc},\n\n // WEBGL_compressed_texture_etc: device.features.has(\"texture-compression-etc2\")\n // Note: Supposedly guaranteed availability compressed formats in WebGL2, but through CPU decompression\n\n 'etc2-rgb8unorm': {gl: GL.COMPRESSED_RGB8_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8a1unorm': {gl: GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, f: texture_compression_etc2},\n 'etc2-rgb8a1unorm-srgb': {gl: GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, f: texture_compression_etc2},\n 'etc2-rgba8unorm': {gl: GL.COMPRESSED_RGBA8_ETC2_EAC, f: texture_compression_etc2},\n 'etc2-rgba8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, f: texture_compression_etc2},\n\n 'eac-r11unorm': {gl: GL.COMPRESSED_R11_EAC, f: texture_compression_etc2},\n 'eac-r11snorm': {gl: GL.COMPRESSED_SIGNED_R11_EAC, f: texture_compression_etc2},\n 'eac-rg11unorm': {gl: GL.COMPRESSED_RG11_EAC, f: texture_compression_etc2},\n 'eac-rg11snorm': {gl: GL.COMPRESSED_SIGNED_RG11_EAC, f: texture_compression_etc2},\n\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n\n 'astc-4x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_4x4_KHR, f: texture_compression_astc},\n 'astc-4x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, f: texture_compression_astc},\n 'astc-5x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x4_KHR, f: texture_compression_astc},\n 'astc-5x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, f: texture_compression_astc},\n 'astc-5x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x5_KHR, f: texture_compression_astc},\n 'astc-5x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, f: texture_compression_astc},\n 'astc-6x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x5_KHR, f: texture_compression_astc},\n 'astc-6x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, f: texture_compression_astc},\n 'astc-6x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x6_KHR, f: texture_compression_astc},\n 'astc-6x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, f: texture_compression_astc},\n 'astc-8x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x5_KHR, f: texture_compression_astc},\n 'astc-8x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, f: texture_compression_astc},\n 'astc-8x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x6_KHR, f: texture_compression_astc},\n 'astc-8x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, f: texture_compression_astc},\n 'astc-8x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x8_KHR, f: texture_compression_astc},\n 'astc-8x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, f: texture_compression_astc},\n 'astc-10x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x6_KHR, f: texture_compression_astc},\n 'astc-10x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, f: texture_compression_astc},\n 'astc-10x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x8_KHR, f: texture_compression_astc},\n 'astc-10x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, f: texture_compression_astc},\n 'astc-10x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-10x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, f: texture_compression_astc},\n 'astc-12x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x10_KHR, f: texture_compression_astc},\n 'astc-12x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, f: texture_compression_astc},\n 'astc-12x12-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x12_KHR, f: texture_compression_astc},\n 'astc-12x12-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, f: texture_compression_astc},\n\n // WEBGL_compressed_texture_pvrtc\n\n 'pvrtc-rgb4unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rgba4unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rbg2unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n 'pvrtc-rgba2unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, f: texture_compression_pvrtc_webgl},\n\n // WEBGL_compressed_texture_etc1\n\n 'etc1-rbg-unorm-webgl': {gl: GL.COMPRESSED_RGB_ETC1_WEBGL, f: texture_compression_etc1_webgl},\n\n // WEBGL_compressed_texture_atc\n\n 'atc-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_ATC_WEBGL, f: texture_compression_atc_webgl},\n 'atc-rgba-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL, f: texture_compression_atc_webgl},\n 'atc-rgbai-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL, f: texture_compression_atc_webgl}\n};\n\n/** Legal combinations for internalFormat, format and type *\n// [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8], gl1ext: DEPTH},\n// [GL.DEPTH_STENCIL]: {gl1ext: DEPTH},\n// Sized texture format\n// R\n[GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.R16F]: {dataFormat: GL.RED, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.R8UI]: {dataFormat: GL.RED_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RG\n[GL.RG8]: {dataFormat: GL.RG, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RG16F]: {dataFormat: GL.RG, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGB\n[GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGBA\n\n[GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},\n[GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},\n[GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},\n[GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},\n[GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}\n*/\n\n/* This table is now baked into the above table\ntype RenderbufferFormat = {\n bpp: number;\n gl2?: boolean;\n ext?: string;\n};\n\nexport const RENDERBUFFER_FORMATS: Record<string, RenderbufferFormat> = {\n [GL.DEPTH_COMPONENT16]: {bpp: 2}, // 16 depth bits.\n // TODO - Not clear which webgpu value to map this to.\n // [GL.DEPTH_COMPONENT24]: {gl2: true, bpp: 3},\n [GL.DEPTH_COMPONENT32F]: {gl2: true, bpp: 4},\n\n [GL.STENCIL_INDEX8]: {bpp: 1}, // 8 stencil bits.\n\n [GL.DEPTH_STENCIL]: {bpp: 4},\n [GL.DEPTH24_STENCIL8]: {gl2: true, bpp: 4},\n [GL.DEPTH32F_STENCIL8]: {gl2: true, bpp: 5},\n\n // When using a WebGL 1 context, color renderbuffer formats are limited\n [GL.RGBA4]: {gl2: true, bpp: 2},\n [GL.RGB565]: {gl2: true, bpp: 2},\n [GL.RGB5_A1]: {gl2: true, bpp: 2},\n\n // When using a WebGL 2 context, the following values are available additionally:\n [GL.R8]: {gl2: true, bpp: 1},\n [GL.R8UI]: {gl2: true, bpp: 1},\n [GL.R8I]: {gl2: true, bpp: 1},\n [GL.R16UI]: {gl2: true, bpp: 2},\n [GL.R16I]: {gl2: true, bpp: 2},\n [GL.R32UI]: {gl2: true, bpp: 4},\n [GL.R32I]: {gl2: true, bpp: 4},\n [GL.RG8]: {gl2: true, bpp: 2},\n [GL.RG8UI]: {gl2: true, bpp: 2},\n [GL.RG8I]: {gl2: true, bpp: 2},\n [GL.RG16UI]: {gl2: true, bpp: 4},\n [GL.RG16I]: {gl2: true, bpp: 4},\n [GL.RG32UI]: {gl2: true, bpp: 8},\n [GL.RG32I]: {gl2: true, bpp: 8},\n [GL.RGB8]: {gl2: true, bpp: 3},\n [GL.RGBA8]: {gl2: true, bpp: 4},\n // [GL.SRGB8_ALPHA8]: {gl2: true, gl1: SRGB}, // When using the EXT_sRGB WebGL1 extension\n [GL.RGB10_A2]: {gl2: true, bpp: 4},\n [GL.RGBA8UI]: {gl2: true, bpp: 4},\n [GL.RGBA8I]: {gl2: true, bpp: 4},\n [GL.RGB10_A2UI]: {gl2: true, bpp: 4},\n [GL.RGBA16UI]: {gl2: true, bpp: 8},\n [GL.RGBA16I]: {gl2: true, bpp: 8},\n [GL.RGBA32I]: {gl2: true, bpp: 16},\n [GL.RGBA32UI]: {gl2: true, bpp: 16},\n\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n [GL.R16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 2},\n [GL.RG16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RGBA16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n [GL.R32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RG32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n // TODO - can't get WEBGL_color_buffer_float to work on renderbuffers\n [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 16},\n // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, gl1: EXT_FLOAT_WEBGL1},\n [GL.R11F_G11F_B10F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4}\n};\n*/\n\n/** @deprecated should be removed */\nconst DATA_FORMAT_CHANNELS = {\n [GL.RED]: 1,\n [GL.RED_INTEGER]: 1,\n [GL.RG]: 2,\n [GL.RG_INTEGER]: 2,\n [GL.RGB]: 3,\n [GL.RGB_INTEGER]: 3,\n [GL.RGBA]: 4,\n [GL.RGBA_INTEGER]: 4,\n [GL.DEPTH_COMPONENT]: 1,\n [GL.DEPTH_STENCIL]: 1,\n [GL.ALPHA]: 1,\n [GL.LUMINANCE]: 1,\n [GL.LUMINANCE_ALPHA]: 2\n};\n\n/** @deprecated should be removed */\nconst TYPE_SIZES = {\n [GL.FLOAT]: 4,\n [GL.UNSIGNED_INT]: 4,\n [GL.INT]: 4,\n [GL.UNSIGNED_SHORT]: 2,\n [GL.SHORT]: 2,\n [GL.HALF_FLOAT]: 2,\n [GL.BYTE]: 1,\n [GL.UNSIGNED_BYTE]: 1\n};\n\n// FUNCTIONS\n\n/** Checks if a texture format is supported */\nexport function isTextureFormatSupported(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return false;\n }\n // Check that we have a GL constant\n if (isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined) {\n return false;\n }\n // Check extensions\n const extension = info.x || (isWebGL2(gl) ? info.gl2ext || info.gl1ext : info.gl1ext);\n if (extension) {\n return Boolean(gl.getExtension(extension));\n }\n // if (info.gl1 === undefined && info.gl2 === undefined) {\n // // No info - always supported\n // }\n return true;\n}\n\nexport function isRenderbufferFormatSupported(gl: WebGLRenderingContext, format: TextureFormat): boolean {\n // Note: Order is important since the function call initializes extensions.\n return isTextureFormatSupported(gl, format) && TEXTURE_FORMATS[format]?.renderbuffer;\n}\n\n/**\n * Map WebGL texture formats (GL constants) to WebGPU-style TextureFormat strings\n */\nexport function convertGLToTextureFormat(format: GL | TextureFormat): TextureFormat {\n if (typeof format === 'string') {\n return format;\n }\n const entry = Object.entries(TEXTURE_FORMATS).find(\n ([, entry]) => entry.gl === format || entry.gl1 === format\n );\n if (!entry) {\n throw new Error(`Unknown texture format ${format}`);\n }\n return entry[0] as TextureFormat;\n}\n\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nexport function convertTextureFormatToGL(format: TextureFormat, isWebGL2: boolean): GL | undefined {\n const formatInfo = TEXTURE_FORMATS[format];\n const webglFormat = isWebGL2 ? formatInfo?.gl : formatInfo?.gl1;\n if (webglFormat === undefined) {\n throw new Error(`Unsupported texture format ${format}`);\n }\n return webglFormat;\n}\n\n/** Checks if a texture format is supported */\nexport function getTextureFormatSupport(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): {\n supported: boolean;\n filterable?: boolean;\n renderable?: boolean;\n blendable?: boolean;\n storable?: boolean;\n} {\n const format = convertGLToTextureFormat(formatOrGL);\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return {supported: false};\n }\n // let decoded;\n // try {\n // decoded = decodeTextureFormat(format);\n // } catch {}\n\n // Support Check that we have a GL constant\n let supported = isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined;\n supported = supported && checkTextureFeatures(gl, [info.f]);\n\n // Filtering\n // const filterable = info.filter\n // ? checkTextureFeatures(gl, [info.filter])\n // : decoded && !decoded.signed;\n // const renderable = info.filter\n // ? checkTextureFeatures(gl, [info.render])\n // : decoded && !decoded.signed;\n\n return {\n supported,\n renderable: supported && checkTextureFeatures(gl, [info.render]),\n filterable: supported && checkTextureFeatures(gl, [info.filter]),\n blendable: false, // tod,\n storable: false\n };\n}\n\n/** Checks whether linear filtering (interpolated sampling) is available for floating point textures */\nexport function isTextureFormatFilterable(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n if (!isTextureFormatSupported(gl, format)) {\n return false;\n }\n try {\n const decoded = decodeTextureFormat(format);\n if (decoded.signed) {\n return false;\n }\n } catch {\n return false;\n }\n if (format.endsWith('32float')) {\n return Boolean(gl.getExtension('OES_texture_float_linear'));\n }\n if (format.endsWith('16float')) {\n return Boolean(gl.getExtension('OES_texture_half_float_linear'));\n }\n // if (typeof format === 'string') {\n // if (format === 'rgba32float') {\n // return gl.device.features.has('texture-renderable-rgba32float-webgl');\n // }\n // if (format.endsWith('32float')) {\n // return gl.device.features.has('texture-renderable-float32-webgl');\n // }\n // if (format.endsWith('16float')) {\n // return gl.device.features.has('texture-renderable-float16-webgl');\n // }\n // }\n return true;\n}\n\nexport function isTextureFormatRenderable(\n gl: WebGLRenderingContext,\n formatOrGL: TextureFormat | GL\n): boolean {\n const format = convertGLToTextureFormat(formatOrGL);\n if (!isTextureFormatSupported(gl, format)) {\n return false;\n }\n if (typeof format === 'number') {\n return false; // isTextureFormatFilterableWebGL(gl, format);\n }\n // TODO depends on device...\n return true;\n}\n\nexport function getWebGLTextureParameters(formatOrGL: TextureFormat | GL, isWebGL2: boolean) {\n const format = convertGLToTextureFormat(formatOrGL);\n const webglFormat = convertTextureFormatToGL(format, isWebGL2);\n const decoded = decodeTextureFormat(format);\n return {\n format: webglFormat,\n dataFormat: getWebGLPixelDataFormat(\n decoded.format,\n decoded.integer,\n decoded.normalized,\n webglFormat\n ),\n // depth formats don't have a type\n type: decoded.dataType ? getGLFromVertexType(decoded.dataType) : GL.UNSIGNED_BYTE,\n // @ts-expect-error\n compressed: decoded.compressed\n };\n}\n\nexport function getDepthStencilAttachmentWebGL(\n format: TextureFormat\n): GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT {\n const info = TEXTURE_FORMATS[format];\n if (!info?.attachment) {\n throw new Error(`${format} is not a depth stencil format`);\n }\n return info.attachment;\n}\n\n/**\n * function to test if Float 32 bit format texture can be bound as color attachment\n * @todo Generalize to check arbitrary formats?\n */\nexport function _checkFloat32ColorAttachment(\n gl: WebGLRenderingContext,\n internalFormat = gl.RGBA,\n srcFormat = GL.RGBA,\n srcType = GL.UNSIGNED_BYTE\n) {\n let texture: WebGLTexture | null = null;\n let framebuffer: WebGLFramebuffer | null = null;\n try {\n texture = gl.createTexture();\n gl.bindTexture(GL.TEXTURE_2D, texture);\n\n const level = 0;\n const width = 1;\n const height = 1;\n const border = 0;\n const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue\n gl.texImage2D(\n gl.TEXTURE_2D,\n level,\n internalFormat,\n width,\n height,\n border,\n srcFormat,\n srcType,\n pixel\n );\n\n framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(GL.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, texture, 0);\n const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL === GL.FRAMEBUFFER_COMPLETE;\n\n gl.bindTexture(GL.TEXTURE_2D, null);\n return status;\n } finally {\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(framebuffer);\n }\n}\n\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(\n formatOrGL: TextureFormat | GL,\n isWebGL2: boolean\n): number {\n const format = convertGLToTextureFormat(formatOrGL);\n const params = getWebGLTextureParameters(format, isWebGL2);\n // NOTE(Tarek): Default to RGBA bytes\n const channels = DATA_FORMAT_CHANNELS[params.dataFormat] || 4;\n const channelSize = TYPE_SIZES[params.type] || 1;\n return channels * channelSize;\n}\n\n// DATA TYPE HELPERS\n\nfunction getWebGLPixelDataFormat(\n dataFormat: string,\n integer: boolean,\n normalized: boolean,\n format: GL\n): GL {\n // WebGL1 formats use same internalFormat\n if (format === GL.RGBA || format === GL.RGB) {\n return format;\n }\n // prettier-ignore\n switch (dataFormat) {\n case 'r': return integer && !normalized ? GL.RED_INTEGER : GL.RED;\n case 'rg': return integer && !normalized ? GL.RG_INTEGER : GL.RG;\n case 'rgb': return integer && !normalized ? GL.RGB_INTEGER : GL.RGB;\n case 'rgba': return integer && !normalized ? GL.RGBA_INTEGER : GL.RGBA;\n default: return GL.RGBA;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-framebuffer.js","names":["Framebuffer","assert","WEBGLTexture","WEBGLRenderbuffer","getDepthStencilAttachmentWebGL","WEBGLFramebuffer","texture","colorAttachments","constructor","device","props","gl","handle","isDefaultFramebuffer","createFramebuffer","setSpectorMetadata","id","autoCreateAttachmentTextures","bindFramebuffer","i","length","attachment","attachmentPoint","_attachOne","depthStencilAttachment","format","check","_checkStatus","destroy","destroyed","deleteFramebuffer","prevHandle","status","checkFramebufferStatus","Error","_getFrameBufferStatus","createDepthStencilTexture","width","height","resizeAttachments","drawingBufferWidth","drawingBufferHeight","undefined","colorAttachment","resize","_attachWEBGLRenderbuffer","Array","isArray","layer","level","_attachTexture","renderbuffer","framebufferRenderbuffer","gl2","bindTexture","target","assertWebGL2","framebufferTextureLayer","face","mapIndexToCubeMapFace","framebufferTexture2D"],"sources":["../../../src/adapter/resources/webgl-framebuffer.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {FramebufferProps, TextureFormat} from '@luma.gl/core';\nimport {Framebuffer, Texture, assert} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';\nimport {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';\n\nexport type TextureAttachment = [Texture, number?, number?];\nexport type Attachment = WEBGLTexture | WEBGLRenderbuffer | TextureAttachment;\n\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device: WebGLDevice;\n gl: WebGLRenderingContext;\n handle: WebGLFramebuffer;\n\n get texture() {\n return this.colorAttachments[0];\n }\n\n constructor(device: WebGLDevice, props: FramebufferProps) {\n super(device, props);\n\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\n\n if (!isDefaultFramebuffer) {\n // default framebuffer handle is null, so we can't set spector metadata...\n device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});\n\n // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n\n /** Attach from a map of attachments */\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);\n\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;\n if (attachment) {\n this._attachOne(attachmentPoint, attachment as WEBGLTexture);\n }\n }\n\n if (this.depthStencilAttachment) {\n this._attachOne(\n getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),\n this.depthStencilAttachment as WEBGLTexture\n );\n }\n\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);\n }\n\n // @ts-expect-error\n if (props.check !== false) {\n this._checkStatus();\n }\n }\n\n /** destroys any auto created resources etc. */\n override destroy(): void {\n super.destroy(); // destroys owned resources etc.\n if (!this.destroyed && this.handle !== null) {\n this.gl.deleteFramebuffer(this.handle);\n // this.handle = null;\n }\n }\n\n // PRIVATE\n\n /** Check the status */\n protected _checkStatus(): void {\n const {gl} = this;\n // TODO - should we really rely on this trick? \n const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle) as unknown as WebGLFramebuffer;\n const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);\n gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n if (status !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n protected override createDepthStencilTexture(format: TextureFormat): Texture {\n return new WEBGLRenderbuffer(this.device, {\n id: `${this.id}-depth-stencil`, // TODO misleading if not depth and stencil?\n format,\n // dataFormat: GL.DEPTH_STENCIL,\n // type: GL.UNSIGNED_INT_24_8,\n width: this.width,\n height: this.height\n }) as unknown as WEBGLTexture;\n }\n\n /** \n * Attachment resize is expected to be a noop if size is same \n */\n protected override resizeAttachments(width: number, height: number): this {\n // for default framebuffer, just update the stored size\n if (this.handle === null) {\n // assert(width === undefined && height === undefined);\n this.width = this.gl.drawingBufferWidth;\n this.height = this.gl.drawingBufferHeight;\n return this;\n }\n\n if (width === undefined) {\n width = this.gl.drawingBufferWidth;\n }\n if (height === undefined) {\n height = this.gl.drawingBufferHeight;\n }\n\n // TODO Not clear that this is better than default destroy/create implementation\n\n for (const colorAttachment of this.colorAttachments) {\n (colorAttachment as WEBGLTexture).resize({width, height});\n }\n if (this.depthStencilAttachment) {\n (this.depthStencilAttachment as WEBGLTexture).resize({width, height});\n }\n return this;\n }\n\n /** Attach one attachment */\n protected _attachOne(\n attachmentPoint: GL,\n attachment: Attachment\n ): WEBGLTexture | WEBGLRenderbuffer {\n if (attachment instanceof WEBGLRenderbuffer) {\n this._attachWEBGLRenderbuffer(attachmentPoint, attachment);\n return attachment;\n } else if (Array.isArray(attachment)) {\n const [texture, layer = 0, level = 0] = attachment;\n this._attachTexture(attachmentPoint, texture as unknown as WEBGLTexture, layer, level);\n return texture as unknown as WEBGLTexture;\n } else if (attachment instanceof WEBGLTexture) {\n this._attachTexture(attachmentPoint, attachment, 0, 0);\n return attachment;\n }\n throw new Error('attach');\n }\n\n protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {\n this.gl.framebufferRenderbuffer(\n GL.FRAMEBUFFER,\n attachment,\n GL.RENDERBUFFER,\n renderbuffer.handle\n );\n }\n\n /**\n * @param attachment\n * @param texture\n * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`\n * @param level = 0 - mipmapLevel (must be 0 in WebGL1)\n */\n protected _attachTexture(\n attachment: GL,\n texture: WEBGLTexture,\n layer: number,\n level: number\n ): void {\n const {gl, gl2} = this.device;\n gl.bindTexture(texture.target, texture.handle);\n\n switch (texture.target) {\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n this.device.assertWebGL2();\n gl2?.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);\n break;\n\n case GL.TEXTURE_CUBE_MAP:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, face, texture.handle, level);\n break;\n\n case GL.TEXTURE_2D:\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, GL.TEXTURE_2D, texture.handle, level);\n break;\n\n default:\n assert(false, 'Illegal texture type');\n }\n\n gl.bindTexture(texture.target, null);\n }\n}\n\n// Helper functions\n\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer: number | GL): GL {\n // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)\n // if smaller assume layer is index, otherwise assume it is already a cube map face constant\n return layer < GL.TEXTURE_CUBE_MAP_POSITIVE_X ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X : layer;\n}\n\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status: GL) {\n switch (status) {\n case GL.FRAMEBUFFER_COMPLETE:\n return 'success';\n case GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n return 'Mismatched attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n return 'No attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n return 'Height/width mismatch';\n case GL.FRAMEBUFFER_UNSUPPORTED:\n return 'Unsupported or split attachments';\n // WebGL2\n case GL.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:\n return 'Samples mismatch';\n // OVR_multiview2 extension\n // case GL.FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: return 'baseViewIndex mismatch';\n default:\n return `${status}`;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-framebuffer.js","names":["Framebuffer","assert","WEBGLTexture","WEBGLRenderbuffer","getDepthStencilAttachmentWebGL","WEBGLFramebuffer","texture","colorAttachments","constructor","device","props","gl","handle","isDefaultFramebuffer","createFramebuffer","setSpectorMetadata","id","autoCreateAttachmentTextures","bindFramebuffer","i","length","attachment","attachmentPoint","_attachOne","depthStencilAttachment","format","check","_checkStatus","destroy","destroyed","deleteFramebuffer","prevHandle","status","checkFramebufferStatus","Error","_getFrameBufferStatus","createDepthStencilTexture","width","height","resizeAttachments","drawingBufferWidth","drawingBufferHeight","undefined","colorAttachment","resize","_attachWEBGLRenderbuffer","Array","isArray","layer","level","_attachTexture","renderbuffer","framebufferRenderbuffer","gl2","bindTexture","target","assertWebGL2","framebufferTextureLayer","face","mapIndexToCubeMapFace","framebufferTexture2D"],"sources":["../../../src/adapter/resources/webgl-framebuffer.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {FramebufferProps, TextureFormat} from '@luma.gl/core';\nimport {Framebuffer, Texture, assert} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';\nimport {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';\n\nexport type TextureAttachment = [Texture, number?, number?];\nexport type Attachment = WEBGLTexture | WEBGLRenderbuffer | TextureAttachment;\n\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device: WebGLDevice;\n gl: WebGLRenderingContext;\n handle: WebGLFramebuffer;\n\n get texture() {\n return this.colorAttachments[0];\n }\n\n constructor(device: WebGLDevice, props: FramebufferProps) {\n super(device, props);\n\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\n\n if (!isDefaultFramebuffer) {\n // default framebuffer handle is null, so we can't set spector metadata...\n device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});\n\n // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n\n /** Attach from a map of attachments */\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);\n\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;\n if (attachment) {\n this._attachOne(attachmentPoint, attachment as WEBGLTexture);\n }\n }\n\n if (this.depthStencilAttachment) {\n this._attachOne(\n getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),\n this.depthStencilAttachment as WEBGLTexture\n );\n }\n\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);\n }\n\n // @ts-expect-error\n if (props.check !== false) {\n this._checkStatus();\n }\n }\n\n /** destroys any auto created resources etc. */\n override destroy(): void {\n super.destroy(); // destroys owned resources etc.\n if (!this.destroyed && this.handle !== null) {\n this.gl.deleteFramebuffer(this.handle);\n // this.handle = null;\n }\n }\n\n // PRIVATE\n\n /** Check the status */\n protected _checkStatus(): void {\n const {gl} = this;\n // TODO - should we really rely on this trick? \n const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle) as unknown as WebGLFramebuffer;\n const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);\n gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n if (status !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n protected override createDepthStencilTexture(format: TextureFormat): Texture {\n return new WEBGLRenderbuffer(this.device, {\n id: `${this.id}-depth-stencil`, // TODO misleading if not depth and stencil?\n format,\n // dataFormat: GL.DEPTH_STENCIL,\n // type: GL.UNSIGNED_INT_24_8,\n width: this.width,\n height: this.height\n }) as unknown as WEBGLTexture;\n }\n\n /** \n * Attachment resize is expected to be a noop if size is same \n */\n protected override resizeAttachments(width: number, height: number): this {\n // for default framebuffer, just update the stored size\n if (this.handle === null) {\n // assert(width === undefined && height === undefined);\n this.width = this.gl.drawingBufferWidth;\n this.height = this.gl.drawingBufferHeight;\n return this;\n }\n\n if (width === undefined) {\n width = this.gl.drawingBufferWidth;\n }\n if (height === undefined) {\n height = this.gl.drawingBufferHeight;\n }\n\n // TODO Not clear that this is better than default destroy/create implementation\n\n for (const colorAttachment of this.colorAttachments) {\n (colorAttachment as WEBGLTexture).resize({width, height});\n }\n if (this.depthStencilAttachment) {\n (this.depthStencilAttachment as WEBGLTexture).resize({width, height});\n }\n return this;\n }\n\n /** Attach one attachment */\n protected _attachOne(\n attachmentPoint: GL,\n attachment: Attachment\n ): WEBGLTexture | WEBGLRenderbuffer {\n if (attachment instanceof WEBGLRenderbuffer) {\n this._attachWEBGLRenderbuffer(attachmentPoint, attachment);\n return attachment;\n } else if (Array.isArray(attachment)) {\n const [texture, layer = 0, level = 0] = attachment;\n this._attachTexture(attachmentPoint, texture as unknown as WEBGLTexture, layer, level);\n return texture as unknown as WEBGLTexture;\n } else if (attachment instanceof WEBGLTexture) {\n this._attachTexture(attachmentPoint, attachment, 0, 0);\n return attachment;\n }\n throw new Error('attach');\n }\n\n protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {\n this.gl.framebufferRenderbuffer(\n GL.FRAMEBUFFER,\n attachment,\n GL.RENDERBUFFER,\n renderbuffer.handle\n );\n }\n\n /**\n * @param attachment\n * @param texture\n * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`\n * @param level = 0 - mipmapLevel (must be 0 in WebGL1)\n */\n protected _attachTexture(\n attachment: GL,\n texture: WEBGLTexture,\n layer: number,\n level: number\n ): void {\n const {gl, gl2} = this.device;\n gl.bindTexture(texture.target, texture.handle);\n\n switch (texture.target) {\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n this.device.assertWebGL2();\n gl2?.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);\n break;\n\n case GL.TEXTURE_CUBE_MAP:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, face, texture.handle, level);\n break;\n\n case GL.TEXTURE_2D:\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, GL.TEXTURE_2D, texture.handle, level);\n break;\n\n default:\n assert(false, 'Illegal texture type');\n }\n\n gl.bindTexture(texture.target, null);\n }\n}\n\n// Helper functions\n\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer: number | GL): GL {\n // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)\n // if smaller assume layer is index, otherwise assume it is already a cube map face constant\n return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number) ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X : layer;\n}\n\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status: GL) {\n switch (status) {\n case GL.FRAMEBUFFER_COMPLETE:\n return 'success';\n case GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n return 'Mismatched attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n return 'No attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n return 'Height/width mismatch';\n case GL.FRAMEBUFFER_UNSUPPORTED:\n return 'Unsupported or split attachments';\n // WebGL2\n case GL.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:\n return 'Samples mismatch';\n // OVR_multiview2 extension\n // case GL.FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: return 'baseViewIndex mismatch';\n default:\n return `${status}`;\n }\n}\n"],"mappings":"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"}
|
|
@@ -84,7 +84,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
84
84
|
bindings
|
|
85
85
|
} = splitUniformsAndBindings(uniforms);
|
|
86
86
|
Object.keys(bindings).forEach(name => {
|
|
87
|
-
log.warn(`Unsupported value "${bindings[name]}" used in setUniforms() for key ${name}. Use setBindings() instead?`)();
|
|
87
|
+
log.warn(`Unsupported value "${JSON.stringify(bindings[name])}" used in setUniforms() for key ${name}. Use setBindings() instead?`)();
|
|
88
88
|
});
|
|
89
89
|
Object.assign(this.uniforms, uniforms);
|
|
90
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","splitUniformsAndBindings","log","mergeShaderLayout","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","getGLDrawMode","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","validBindings","map","join","warn","type","buffer","Error","setUniforms","keys","forEach","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","transformFeedback","glDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","begin","_applyBindings","_applyUniforms","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","unbindAfterRender","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","getProgramInfoLog","validateProgram","validated","texturesRenderable","texture","update","loaded","textureUnit","uniformBufferIndex","replace","location","getUniformBlockIndex","uniformBlockBinding","bindBufferBase","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","bindTexture","target","uniformLayout","_this$uniforms$name","undefined"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, splitUniformsAndBindings, log} from '@luma.gl/core';\nimport {mergeShaderLayout} from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\nimport {WEBGLTransformFeedback} from './webgl-transform-feedback';\nimport {getGLDrawMode} from '../helpers/webgl-topology-utils';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n\n /** Uniforms set on this model */\n uniforms: Record<string, UniformValue> = {};\n /** Bindings set on this model */\n bindings: Record<string, Binding> = {};\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n // this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n // setIndexBuffer(indexBuffer: Buffer): void {\n // const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n // this.vertexArrayObject.setElementBuffer(webglBuffer);\n // this._indexBuffer = indexBuffer;\n // }\n\n // /** @todo needed for portable model */\n // setAttributes(attributes: Record<string, Buffer>): void {\n // for (const [name, buffer] of Object.entries(attributes)) {\n // const webglBuffer = cast<WEBGLBuffer>(buffer);\n // const attribute = getAttributeLayout(this.layout, name);\n // if (!attribute) {\n // log.warn(\n // `Ignoring buffer supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\" (buffer \"${buffer.id}\")`\n // )();\n // continue;\n // }\n // const decoded = decodeVertexFormat(attribute.format);\n // const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;\n // const divisor = attribute.stepMode === 'instance' ? 1 : 0;\n // const type = getWebGLDataType(typeString);\n // this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {\n // size,\n // type,\n // stride,\n // offset: 0,\n // normalized,\n // integer,\n // divisor\n // });\n // }\n // }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`\n // and reference them as `app` from both GLSL and JS.\n // TODO - this is rather hacky - we could also remap the name directly in the shader layout.\n const binding =\n this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${bindings[name]}\" used in setUniforms() for key ${name}. Use setBindings() instead?`\n )();\n });\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n /** vertex attributes */\n vertexArray: VertexArray;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n transformFeedback?: WEBGLTransformFeedback;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\n } = options;\n\n const glDrawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n const isInstanced: boolean = Number(instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n\n if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n // if (isIndexed && isInstanced) {\n // // ANGLE_instanced_arrays extension\n // this.device.gl2?.drawElementsInstanced(\n // drawMode,\n // vertexCount || 0, // indexCount?\n // indexType,\n // firstVertex,\n // instanceCount || 0\n // );\n // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n // } else if (isIndexed) {\n // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n // } else if (isInstanced) {\n // this.device.gl2?.drawArraysInstanced(\n // drawMode,\n // firstVertex,\n // vertexCount || 0,\n // instanceCount || 0\n // );\n // } else {\n // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n // }\n // });\n\n withDeviceAndGLParameters(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n glDrawMode,\n vertexCount || 0, // indexCount?\n glIndexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n glDrawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n }\n );\n\n vertexArray.unbindAfterRender(renderPass);\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (!gl.debug && log.level === 0) {\n // return;\n }\n\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n *\n _applyConstantAttributes(vertexArray: WEBGLVertexArray): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n vertexArray.setConstant(attributeInfo.location, value);\n vertexArray.enable(attributeInfo.location, false);\n }\n }\n */\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n const value =\n this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n // @ts-expect-error\n value.buffer.handle,\n // @ts-expect-error\n value.offset || 0,\n // @ts-expect-error\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","splitUniformsAndBindings","log","mergeShaderLayout","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","getGLDrawMode","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","validBindings","map","join","warn","type","buffer","Error","setUniforms","keys","forEach","JSON","stringify","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","transformFeedback","glDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","begin","_applyBindings","_applyUniforms","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","unbindAfterRender","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","getProgramInfoLog","validateProgram","validated","texturesRenderable","texture","update","loaded","textureUnit","uniformBufferIndex","replace","location","getUniformBlockIndex","uniformBlockBinding","bindBufferBase","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","bindTexture","target","uniformLayout","_this$uniforms$name","undefined"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, splitUniformsAndBindings, log} from '@luma.gl/core';\nimport {mergeShaderLayout} from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\nimport {WEBGLTransformFeedback} from './webgl-transform-feedback';\nimport {getGLDrawMode} from '../helpers/webgl-topology-utils';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n\n /** Uniforms set on this model */\n uniforms: Record<string, UniformValue> = {};\n /** Bindings set on this model */\n bindings: Record<string, Binding> = {};\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n // this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n // setIndexBuffer(indexBuffer: Buffer): void {\n // const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n // this.vertexArrayObject.setElementBuffer(webglBuffer);\n // this._indexBuffer = indexBuffer;\n // }\n\n // /** @todo needed for portable model */\n // setAttributes(attributes: Record<string, Buffer>): void {\n // for (const [name, buffer] of Object.entries(attributes)) {\n // const webglBuffer = cast<WEBGLBuffer>(buffer);\n // const attribute = getAttributeLayout(this.layout, name);\n // if (!attribute) {\n // log.warn(\n // `Ignoring buffer supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\" (buffer \"${buffer.id}\")`\n // )();\n // continue;\n // }\n // const decoded = decodeVertexFormat(attribute.format);\n // const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;\n // const divisor = attribute.stepMode === 'instance' ? 1 : 0;\n // const type = getWebGLDataType(typeString);\n // this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {\n // size,\n // type,\n // stride,\n // offset: 0,\n // normalized,\n // integer,\n // divisor\n // });\n // }\n // }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`\n // and reference them as `app` from both GLSL and JS.\n // TODO - this is rather hacky - we could also remap the name directly in the shader layout.\n const binding =\n this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${JSON.stringify(bindings[name])}\" used in setUniforms() for key ${name}. Use setBindings() instead?`\n )();\n });\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n /** vertex attributes */\n vertexArray: VertexArray;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n transformFeedback?: WEBGLTransformFeedback;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\n } = options;\n\n const glDrawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n const isInstanced: boolean = Number(instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n\n if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n // if (isIndexed && isInstanced) {\n // // ANGLE_instanced_arrays extension\n // this.device.gl2?.drawElementsInstanced(\n // drawMode,\n // vertexCount || 0, // indexCount?\n // indexType,\n // firstVertex,\n // instanceCount || 0\n // );\n // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n // } else if (isIndexed) {\n // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n // } else if (isInstanced) {\n // this.device.gl2?.drawArraysInstanced(\n // drawMode,\n // firstVertex,\n // vertexCount || 0,\n // instanceCount || 0\n // );\n // } else {\n // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n // }\n // });\n\n withDeviceAndGLParameters(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n glDrawMode,\n vertexCount || 0, // indexCount?\n glIndexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n glDrawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n }\n );\n\n vertexArray.unbindAfterRender(renderPass);\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (!gl.debug && log.level === 0) {\n // return;\n }\n\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n *\n _applyConstantAttributes(vertexArray: WEBGLVertexArray): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n vertexArray.setConstant(attributeInfo.location, value);\n vertexArray.enable(attributeInfo.location, false);\n }\n }\n */\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n const value =\n this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location as GL === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n // @ts-expect-error\n value.buffer.handle,\n // @ts-expect-error\n value.offset || 0,\n // @ts-expect-error\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n"],"mappings":"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"}
|