pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 36.5 kB
Source Map (JSON)
{"version":3,"file":"GlTextureSystem.mjs","sources":["../../../../../src/rendering/renderers/gl/texture/GlTextureSystem.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { ExtensionType } from '../../../../extensions/Extensions';\nimport { GCManagedHash } from '../../../../utils/data/GCManagedHash';\nimport { Texture } from '../../shared/texture/Texture';\nimport { GlTexture } from './GlTexture';\nimport { glUploadBufferImageResource } from './uploaders/glUploadBufferImageResource';\nimport { glUploadCompressedTextureResource } from './uploaders/glUploadCompressedTextureResource';\nimport { createGlUploadCubeTextureResource } from './uploaders/glUploadCubeTextureResource';\nimport { glUploadImageResource } from './uploaders/glUploadImageResource';\nimport { glUploadVideoResource } from './uploaders/glUploadVideoResource';\nimport { applyStyleParams } from './utils/applyStyleParams';\nimport { mapFormatToGlFormat } from './utils/mapFormatToGlFormat';\nimport { mapFormatToGlInternalFormat } from './utils/mapFormatToGlInternalFormat';\nimport { mapFormatToGlType } from './utils/mapFormatToGlType';\nimport { mapViewDimensionToGlTarget } from './utils/mapViewDimensionToGlTarget';\nimport { unpremultiplyAlpha } from './utils/unpremultiplyAlpha';\n\nimport type { ICanvas } from '../../../../environment/canvas/ICanvas';\nimport type { System } from '../../shared/system/System';\nimport type { CanvasGenerator, GetPixelsOutput } from '../../shared/texture/GenerateCanvas';\nimport type { TextureSource } from '../../shared/texture/sources/TextureSource';\nimport type { BindableTexture } from '../../shared/texture/Texture';\nimport type { TextureStyle } from '../../shared/texture/TextureStyle';\nimport type { GlRenderingContext } from '../context/GlRenderingContext';\nimport type { WebGLRenderer } from '../WebGLRenderer';\nimport type { GLTextureUploader } from './uploaders/GLTextureUploader';\n\nconst BYTES_PER_PIXEL = 4;\n\n/**\n * The system for managing textures in WebGL.\n * @category rendering\n * @advanced\n */\nexport class GlTextureSystem implements System, CanvasGenerator\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ],\n name: 'texture',\n } as const;\n\n private readonly _renderer: WebGLRenderer;\n private readonly _managedTextures: GCManagedHash<TextureSource>;\n /**\n * @deprecated since 8.15.0\n */\n public get managedTextures(): Readonly<TextureSource[]> { return Object.values(this._managedTextures.items); }\n\n private _glSamplers: Record<string, WebGLSampler> = Object.create(null);\n\n private _boundTextures: TextureSource[] = [];\n private _activeTextureLocation = -1;\n\n private _boundSamplers: Record<number, WebGLSampler> = Object.create(null);\n\n private readonly _uploads: Record<string, GLTextureUploader>;\n\n private _gl: GlRenderingContext;\n private _mapFormatToInternalFormat: Record<string, number>;\n private _mapFormatToType: Record<string, number>;\n private _mapFormatToFormat: Record<string, number>;\n private _mapViewDimensionToGlTarget: Record<TextureSource['viewDimension'], number | null>;\n\n private _premultiplyAlpha = false;\n\n // TODO - separate samplers will be a cool thing to add, but not right now!\n private readonly _useSeparateSamplers = false;\n\n constructor(renderer: WebGLRenderer)\n {\n this._renderer = renderer;\n\n this._managedTextures = new GCManagedHash({\n renderer,\n type: 'resource',\n onUnload: this.onSourceUnload.bind(this),\n name: 'glTexture'\n });\n\n // our 2D uploaders..\n const baseUploaders = {\n image: glUploadImageResource,\n buffer: glUploadBufferImageResource,\n video: glUploadVideoResource,\n compressed: glUploadCompressedTextureResource,\n };\n\n this._uploads = {\n ...baseUploaders,\n cube: createGlUploadCubeTextureResource(baseUploaders),\n };\n }\n\n protected contextChange(gl: GlRenderingContext): void\n {\n this._gl = gl;\n\n if (!this._mapFormatToInternalFormat)\n {\n // rebuild all our maps if they don't exist yet\n this._mapFormatToInternalFormat = mapFormatToGlInternalFormat(gl, this._renderer.context.extensions);\n\n this._mapFormatToType = mapFormatToGlType(gl);\n this._mapFormatToFormat = mapFormatToGlFormat(gl);\n this._mapViewDimensionToGlTarget = mapViewDimensionToGlTarget(gl);\n }\n\n this._managedTextures.removeAll(true);\n\n this._glSamplers = Object.create(null);\n this._boundSamplers = Object.create(null);\n this._premultiplyAlpha = false;\n\n for (let i = 0; i < 16; i++)\n {\n this.bind(Texture.EMPTY, i);\n }\n }\n\n /**\n * Initializes a texture source, if it has already been initialized nothing will happen.\n * @param source - The texture source to initialize.\n * @returns The initialized texture source.\n */\n public initSource(source: TextureSource)\n {\n this.bind(source);\n }\n\n public bind(texture: BindableTexture, location = 0)\n {\n const source = texture.source;\n\n if (texture)\n {\n this.bindSource(source, location);\n\n if (this._useSeparateSamplers)\n {\n this._bindSampler(source.style, location);\n }\n }\n else\n {\n this.bindSource(null, location);\n\n if (this._useSeparateSamplers)\n {\n this._bindSampler(null, location);\n }\n }\n }\n\n public bindSource(source: TextureSource, location = 0): void\n {\n const gl = this._gl;\n\n source._gcLastUsed = this._renderer.gc.now;\n\n if (this._boundTextures[location] !== source)\n {\n this._boundTextures[location] = source;\n this._activateLocation(location);\n\n source ||= Texture.EMPTY.source;\n\n // bind texture and source!\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, glTexture.texture);\n }\n }\n\n private _bindSampler(style: TextureStyle, location = 0): void\n {\n const gl = this._gl;\n\n if (!style)\n {\n this._boundSamplers[location] = null;\n gl.bindSampler(location, null);\n\n return;\n }\n\n const sampler = this._getGlSampler(style);\n\n if (this._boundSamplers[location] !== sampler)\n {\n this._boundSamplers[location] = sampler;\n gl.bindSampler(location, sampler);\n }\n }\n\n public unbind(texture: BindableTexture): void\n {\n const source = texture.source;\n const boundTextures = this._boundTextures;\n const gl = this._gl;\n\n for (let i = 0; i < boundTextures.length; i++)\n {\n if (boundTextures[i] === source)\n {\n this._activateLocation(i);\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, null);\n boundTextures[i] = null;\n }\n }\n }\n\n private _activateLocation(location: number): void\n {\n if (this._activeTextureLocation !== location)\n {\n this._activeTextureLocation = location;\n this._gl.activeTexture(this._gl.TEXTURE0 + location);\n }\n }\n\n private _initSource(source: TextureSource): GlTexture\n {\n const gl = this._gl;\n\n const glTexture = new GlTexture(gl.createTexture());\n\n glTexture.type = this._mapFormatToType[source.format];\n glTexture.internalFormat = this._mapFormatToInternalFormat[source.format];\n glTexture.format = this._mapFormatToFormat[source.format];\n glTexture.target = this._mapViewDimensionToGlTarget[source.viewDimension];\n\n if (glTexture.target === null)\n {\n // eslint-disable-next-line max-len\n throw new Error(`Unsupported view dimension: ${source.viewDimension} with this webgl version: ${this._renderer.context.webGLVersion}`);\n }\n\n // Cube textures use a different GL target.\n if (source.uploadMethodId === 'cube')\n {\n glTexture.target = gl.TEXTURE_CUBE_MAP;\n }\n\n if (source.autoGenerateMipmaps && (this._renderer.context.supports.nonPowOf2mipmaps || source.isPowerOfTwo))\n {\n const biggestDimension = Math.max(source.width, source.height);\n\n source.mipLevelCount = Math.floor(Math.log2(biggestDimension)) + 1;\n }\n\n source._gpuData[this._renderer.uid] = glTexture;\n\n const added = this._managedTextures.add(source);\n\n if (added)\n {\n source.on('update', this.onSourceUpdate, this);\n source.on('resize', this.onSourceUpdate, this);\n source.on('styleChange', this.onStyleChange, this);\n source.on('updateMipmaps', this.onUpdateMipmaps, this);\n }\n\n this.onSourceUpdate(source);\n this.updateStyle(source, false);\n\n return glTexture;\n }\n\n protected onStyleChange(source: TextureSource): void\n {\n this.updateStyle(source, false);\n }\n\n protected updateStyle(source: TextureSource, firstCreation: boolean): void\n {\n const gl = this._gl;\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, glTexture.texture);\n\n this._boundTextures[this._activeTextureLocation] = source;\n\n applyStyleParams(\n source.style,\n gl,\n source.mipLevelCount > 1,\n this._renderer.context.extensions.anisotropicFiltering,\n 'texParameteri',\n glTexture.target,\n // will force a clamp to edge if the texture is not a power of two\n !this._renderer.context.supports.nonPowOf2wrapping && !source.isPowerOfTwo,\n firstCreation,\n );\n }\n\n protected onSourceUnload(source: TextureSource, contextLost = false): void\n {\n const glTexture = source._gpuData[this._renderer.uid] as GlTexture;\n\n if (!glTexture) return;\n\n if (!contextLost)\n {\n this.unbind(source);\n this._gl.deleteTexture(glTexture.texture);\n }\n source.off('update', this.onSourceUpdate, this);\n source.off('resize', this.onSourceUpdate, this);\n source.off('styleChange', this.onStyleChange, this);\n source.off('updateMipmaps', this.onUpdateMipmaps, this);\n }\n\n protected onSourceUpdate(source: TextureSource): void\n {\n const gl = this._gl;\n\n const glTexture = this.getGlSource(source);\n\n gl.bindTexture(glTexture.target, glTexture.texture);\n\n this._boundTextures[this._activeTextureLocation] = source;\n\n const premultipliedAlpha = source.alphaMode === 'premultiply-alpha-on-upload';\n\n if (this._premultiplyAlpha !== premultipliedAlpha)\n {\n this._premultiplyAlpha = premultipliedAlpha;\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha);\n }\n\n if (this._uploads[source.uploadMethodId])\n {\n this._uploads[source.uploadMethodId].upload(source, glTexture, gl, this._renderer.context.webGLVersion);\n }\n else if (glTexture.target === gl.TEXTURE_2D)\n {\n // Allocate an \"empty\" texture (typical for RenderTexture) for the appropriate target.\n // This allocates level 0 and, if needed, the full mip chain so any mip can be attached/rendered into (WebGL2).\n this._initEmptyTexture2D(glTexture, source);\n }\n else if (glTexture.target === (gl as any).TEXTURE_2D_ARRAY)\n {\n this._initEmptyTexture2DArray(glTexture, source);\n }\n else if (glTexture.target === gl.TEXTURE_CUBE_MAP)\n {\n this._initEmptyTextureCube(glTexture, source);\n }\n else\n {\n throw new Error('[GlTextureSystem] Unsupported texture target for empty allocation.');\n }\n\n // Keep the texture's mip range in sync with the declared mipLevelCount.\n // This is required in WebGL2 for FBO attachments at mipLevel > 0 when using partial mip chains.\n this._applyMipRange(glTexture, source);\n\n if (source.autoGenerateMipmaps && source.mipLevelCount > 1)\n {\n this.onUpdateMipmaps(source, false);\n }\n }\n\n protected onUpdateMipmaps(source: TextureSource, bind = true): void\n {\n if (bind) this.bindSource(source, 0);\n\n const glTexture = this.getGlSource(source);\n\n this._gl.generateMipmap(glTexture.target);\n }\n\n private _initEmptyTexture2D(glTexture: GlTexture, source: TextureSource): void\n {\n const gl = this._gl;\n\n // Level 0\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n glTexture.internalFormat,\n source.pixelWidth,\n source.pixelHeight,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n\n // Mips (if requested)\n let w = Math.max(source.pixelWidth >> 1, 1);\n let h = Math.max(source.pixelHeight >> 1, 1);\n\n for (let level = 1; level < source.mipLevelCount; level++)\n {\n gl.texImage2D(\n gl.TEXTURE_2D,\n level,\n glTexture.internalFormat,\n w,\n h,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n\n w = Math.max(w >> 1, 1);\n h = Math.max(h >> 1, 1);\n }\n }\n\n private _initEmptyTexture2DArray(glTexture: GlTexture, source: TextureSource): void\n {\n if (this._renderer.context.webGLVersion !== 2)\n {\n throw new Error('[GlTextureSystem] TEXTURE_2D_ARRAY requires WebGL2.');\n }\n\n const gl2 = this._gl as WebGL2RenderingContext;\n const depth = Math.max(source.arrayLayerCount | 0, 1);\n\n // Level 0\n gl2.texImage3D(\n gl2.TEXTURE_2D_ARRAY,\n 0,\n glTexture.internalFormat,\n source.pixelWidth,\n source.pixelHeight,\n depth,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n\n // Mips (if requested)\n let w = Math.max(source.pixelWidth >> 1, 1);\n let h = Math.max(source.pixelHeight >> 1, 1);\n\n for (let level = 1; level < source.mipLevelCount; level++)\n {\n gl2.texImage3D(\n gl2.TEXTURE_2D_ARRAY,\n level,\n glTexture.internalFormat,\n w,\n h,\n depth,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n\n w = Math.max(w >> 1, 1);\n h = Math.max(h >> 1, 1);\n }\n }\n\n private _initEmptyTextureCube(glTexture: GlTexture, source: TextureSource): void\n {\n const gl = this._gl;\n\n const totalCubeFaces = 6;\n\n // Level 0 (all faces)\n for (let face = 0; face < totalCubeFaces; face++)\n {\n gl.texImage2D(\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + face,\n 0,\n glTexture.internalFormat,\n source.pixelWidth,\n source.pixelHeight,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n }\n\n // Mips (if requested)\n let w = Math.max(source.pixelWidth >> 1, 1);\n let h = Math.max(source.pixelHeight >> 1, 1);\n\n for (let level = 1; level < source.mipLevelCount; level++)\n {\n for (let face = 0; face < totalCubeFaces; face++)\n {\n gl.texImage2D(\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + face,\n level,\n glTexture.internalFormat,\n w,\n h,\n 0,\n glTexture.format,\n glTexture.type,\n null,\n );\n }\n\n w = Math.max(w >> 1, 1);\n h = Math.max(h >> 1, 1);\n }\n }\n\n /**\n * Applies a mip range to the currently-bound texture so WebGL2 considers the texture \"mipmap complete\"\n * for the declared `mipLevelCount` (especially important for partial mip chains rendered via FBO).\n * @param glTexture - The GL texture wrapper.\n * @param source - The texture source describing mipLevelCount.\n */\n private _applyMipRange(glTexture: GlTexture, source: TextureSource): void\n {\n if (this._renderer.context.webGLVersion !== 2) return;\n\n const gl = this._gl as WebGL2RenderingContext;\n const maxLevel = Math.max((source.mipLevelCount | 0) - 1, 0);\n\n gl.texParameteri(glTexture.target, gl.TEXTURE_BASE_LEVEL, 0);\n gl.texParameteri(glTexture.target, gl.TEXTURE_MAX_LEVEL, maxLevel);\n }\n\n private _initSampler(style: TextureStyle): WebGLSampler\n {\n const gl = this._gl;\n\n const glSampler = this._gl.createSampler();\n\n this._glSamplers[style._resourceId] = glSampler;\n\n applyStyleParams(\n style,\n gl,\n this._boundTextures[this._activeTextureLocation].mipLevelCount > 1,\n this._renderer.context.extensions.anisotropicFiltering,\n 'samplerParameteri',\n glSampler,\n false,\n true,\n );\n\n return this._glSamplers[style._resourceId];\n }\n\n private _getGlSampler(sampler: TextureStyle): WebGLSampler\n {\n return this._glSamplers[sampler._resourceId] || this._initSampler(sampler);\n }\n\n public getGlSource(source: TextureSource): GlTexture\n {\n source._gcLastUsed = this._renderer.gc.now;\n\n return source._gpuData[this._renderer.uid] as GlTexture || this._initSource(source);\n }\n\n public generateCanvas(texture: Texture): ICanvas\n {\n const { pixels, width, height } = this.getPixels(texture);\n\n const canvas = DOMAdapter.get().createCanvas();\n\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n\n if (ctx)\n {\n const imageData = ctx.createImageData(width, height);\n\n imageData.data.set(pixels);\n ctx.putImageData(imageData, 0, 0);\n }\n\n return canvas;\n }\n\n public getPixels(texture: Texture): GetPixelsOutput\n {\n const resolution = texture.source.resolution;\n const frame = texture.frame;\n\n const width = Math.max(Math.round(frame.width * resolution), 1);\n const height = Math.max(Math.round(frame.height * resolution), 1);\n const pixels = new Uint8Array(BYTES_PER_PIXEL * width * height);\n\n const renderer = this._renderer;\n\n const renderTarget = renderer.renderTarget.getRenderTarget(texture);\n const glRenterTarget = renderer.renderTarget.getGpuRenderTarget(renderTarget);\n\n const gl = renderer.gl;\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, glRenterTarget.resolveTargetFramebuffer);\n\n gl.readPixels(\n Math.round(frame.x * resolution),\n Math.round(frame.y * resolution),\n width,\n height,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n pixels\n );\n\n // if (texture.source.premultiplyAlpha > 0)\n // TODO - premultiplied alpha does not exist right now, need to add that back in!\n // eslint-disable-next-line no-constant-condition\n if (false)\n {\n unpremultiplyAlpha(pixels);\n }\n\n return { pixels: new Uint8ClampedArray(pixels.buffer), width, height };\n }\n\n public destroy(): void\n {\n // we copy the array as the array with a slice as onSourceDestroy\n // will remove the source from the real managedTextures array\n this._managedTextures.destroy();\n this._glSamplers = null;\n this._boundTextures = null;\n this._boundSamplers = null;\n this._mapFormatToInternalFormat = null;\n this._mapFormatToType = null;\n this._mapFormatToFormat = null;\n (this._uploads as null) = null;\n (this._renderer as null) = null;\n }\n\n public resetState(): void\n {\n this._activeTextureLocation = -1;\n this._boundTextures.fill(Texture.EMPTY.source);\n this._boundSamplers = Object.create(null);\n\n const gl = this._gl;\n\n this._premultiplyAlpha = false;\n\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this._premultiplyAlpha);\n }\n}\n\n"],"names":[],"mappings":"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"}