{"version":3,"file":"GpuTextureSystem.mjs","sources":["../../../../../src/rendering/renderers/gpu/texture/GpuTextureSystem.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { ExtensionType } from '../../../../extensions/Extensions';\nimport { UniformGroup } from '../../shared/shader/UniformGroup';\nimport { CanvasPool } from '../../shared/texture/CanvasPool';\nimport { BindGroup } from '../shader/BindGroup';\nimport { gpuUploadBufferImageResource } from './uploaders/gpuUploadBufferImageResource';\nimport { blockDataMap, gpuUploadCompressedTextureResource } from './uploaders/gpuUploadCompressedTextureResource';\nimport { gpuUploadImageResource } from './uploaders/gpuUploadImageSource';\nimport { gpuUploadVideoResource } from './uploaders/gpuUploadVideoSource';\nimport { GpuMipmapGenerator } from './utils/GpuMipmapGenerator';\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, Texture } from '../../shared/texture/Texture';\nimport type { TextureStyle } from '../../shared/texture/TextureStyle';\nimport type { GPU } from '../GpuDeviceSystem';\nimport type { WebGPURenderer } from '../WebGPURenderer';\nimport type { GpuTextureUploader } from './uploaders/GpuTextureUploader';\n\n/**\n * The system that handles textures for the GPU.\n * @memberof rendering\n */\nexport class GpuTextureSystem implements System, CanvasGenerator\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'texture',\n    } as const;\n\n    public readonly managedTextures: TextureSource[] = [];\n\n    protected CONTEXT_UID: number;\n    private _gpuSources: Record<number, GPUTexture> = Object.create(null);\n    private _gpuSamplers: Record<string, GPUSampler> = Object.create(null);\n    private _bindGroupHash: Record<string, BindGroup> = Object.create(null);\n    private _textureViewHash: Record<string, GPUTextureView> = Object.create(null);\n\n    private readonly _uploads: Record<string, GpuTextureUploader> = {\n        image: gpuUploadImageResource,\n        buffer: gpuUploadBufferImageResource,\n        video: gpuUploadVideoResource,\n        compressed: gpuUploadCompressedTextureResource\n    };\n\n    private _gpu: GPU;\n    private _mipmapGenerator?: GpuMipmapGenerator;\n\n    private readonly _renderer: WebGPURenderer;\n\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n    }\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\n    }\n\n    public initSource(source: TextureSource): GPUTexture\n    {\n        if (source.autoGenerateMipmaps)\n        {\n            const biggestDimension = Math.max(source.pixelWidth, source.pixelHeight);\n\n            source.mipLevelCount = Math.floor(Math.log2(biggestDimension)) + 1;\n        }\n\n        let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;\n\n        if (source.uploadMethodId !== 'compressed')\n        {\n            usage |= GPUTextureUsage.RENDER_ATTACHMENT;\n            usage |= GPUTextureUsage.COPY_SRC;\n        }\n\n        const blockData = blockDataMap[source.format] || { blockBytes: 4, blockWidth: 1, blockHeight: 1 };\n\n        const width = Math.ceil(source.pixelWidth / blockData.blockWidth) * blockData.blockWidth;\n        const height = Math.ceil(source.pixelHeight / blockData.blockHeight) * blockData.blockHeight;\n\n        const textureDescriptor: GPUTextureDescriptor = {\n            label: source.label,\n            size: { width, height },\n            format: source.format,\n            sampleCount: source.sampleCount,\n            mipLevelCount: source.mipLevelCount,\n            dimension: source.dimension,\n            usage\n        };\n\n        const gpuTexture = this._gpu.device.createTexture(textureDescriptor);\n\n        this._gpuSources[source.uid] = gpuTexture;\n\n        if (!this.managedTextures.includes(source))\n        {\n            source.on('update', this.onSourceUpdate, this);\n            source.on('resize', this.onSourceResize, this);\n            source.on('destroy', this.onSourceDestroy, this);\n            source.on('unload', this.onSourceUnload, this);\n            source.on('updateMipmaps', this.onUpdateMipmaps, this);\n\n            this.managedTextures.push(source);\n        }\n\n        this.onSourceUpdate(source);\n\n        return gpuTexture;\n    }\n\n    protected onSourceUpdate(source: TextureSource): void\n    {\n        const gpuTexture = this.getGpuSource(source);\n\n        // destroyed!\n        if (!gpuTexture) return;\n\n        if (this._uploads[source.uploadMethodId])\n        {\n            this._uploads[source.uploadMethodId].upload(source, gpuTexture, this._gpu);\n        }\n\n        if (source.autoGenerateMipmaps && source.mipLevelCount > 1)\n        {\n            this.onUpdateMipmaps(source);\n        }\n    }\n\n    protected onSourceUnload(source: TextureSource): void\n    {\n        const gpuTexture = this._gpuSources[source.uid];\n\n        if (gpuTexture)\n        {\n            this._gpuSources[source.uid] = null;\n\n            gpuTexture.destroy();\n        }\n    }\n\n    protected onUpdateMipmaps(source: TextureSource): void\n    {\n        if (!this._mipmapGenerator)\n        {\n            this._mipmapGenerator = new GpuMipmapGenerator(this._gpu.device);\n        }\n\n        const gpuTexture = this.getGpuSource(source);\n\n        this._mipmapGenerator.generateMipmap(gpuTexture);\n    }\n\n    protected onSourceDestroy(source: TextureSource): void\n    {\n        source.off('update', this.onSourceUpdate, this);\n        source.off('unload', this.onSourceUnload, this);\n        source.off('destroy', this.onSourceDestroy, this);\n        source.off('resize', this.onSourceResize, this);\n        source.off('updateMipmaps', this.onUpdateMipmaps, this);\n\n        this.managedTextures.splice(this.managedTextures.indexOf(source), 1);\n\n        this.onSourceUnload(source);\n    }\n\n    protected onSourceResize(source: TextureSource): void\n    {\n        const gpuTexture = this._gpuSources[source.uid];\n\n        if (!gpuTexture)\n        {\n            this.initSource(source);\n        }\n        else if (gpuTexture.width !== source.pixelWidth || gpuTexture.height !== source.pixelHeight)\n        {\n            this._textureViewHash[source.uid] = null;\n            this._bindGroupHash[source.uid] = null;\n\n            this.onSourceUnload(source);\n            this.initSource(source);\n        }\n    }\n\n    private _initSampler(sampler: TextureStyle): GPUSampler\n    {\n        this._gpuSamplers[sampler._resourceId] = this._gpu.device.createSampler(sampler);\n\n        return this._gpuSamplers[sampler._resourceId];\n    }\n\n    public getGpuSampler(sampler: TextureStyle): GPUSampler\n    {\n        return this._gpuSamplers[sampler._resourceId] || this._initSampler(sampler);\n    }\n\n    public getGpuSource(source: TextureSource): GPUTexture\n    {\n        return this._gpuSources[source.uid] || this.initSource(source);\n    }\n\n    /**\n     * this returns s bind group for a specific texture, the bind group contains\n     * - the texture source\n     * - the texture style\n     * - the texture matrix\n     * This is cached so the bind group should only be created once per texture\n     * @param texture - the texture you want the bindgroup for\n     * @returns the bind group for the texture\n     */\n    public getTextureBindGroup(texture: Texture)\n    {\n        return this._bindGroupHash[texture.uid] ?? this._createTextureBindGroup(texture);\n    }\n\n    private _createTextureBindGroup(texture: Texture)\n    {\n        const source = texture.source;\n\n        this._bindGroupHash[texture.uid] = new BindGroup({\n            0: source,\n            1: source.style,\n            2: new UniformGroup({\n                uTextureMatrix: { type: 'mat3x3<f32>', value: texture.textureMatrix.mapCoord },\n            })\n        });\n\n        return this._bindGroupHash[texture.uid];\n    }\n\n    public getTextureView(texture: BindableTexture)\n    {\n        const source = texture.source;\n\n        return this._textureViewHash[source.uid] ?? this._createTextureView(source);\n    }\n\n    private _createTextureView(texture: TextureSource)\n    {\n        this._textureViewHash[texture.uid] = this.getGpuSource(texture).createView();\n\n        return this._textureViewHash[texture.uid];\n    }\n\n    public generateCanvas(texture: Texture): ICanvas\n    {\n        const renderer = this._renderer;\n\n        const commandEncoder = renderer.gpu.device.createCommandEncoder();\n\n        // create canvas\n        const canvas = DOMAdapter.get().createCanvas();\n\n        canvas.width = texture.source.pixelWidth;\n        canvas.height = texture.source.pixelHeight;\n\n        const context = canvas.getContext('webgpu') as unknown as GPUCanvasContext;\n\n        context.configure({\n            device: renderer.gpu.device,\n            // eslint-disable-next-line max-len\n            usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,\n            format: DOMAdapter.get().getNavigator().gpu.getPreferredCanvasFormat(),\n            alphaMode: 'premultiplied',\n        });\n\n        commandEncoder.copyTextureToTexture({\n            texture: renderer.texture.getGpuSource(texture.source),\n            origin: {\n                x: 0,\n                y: 0,\n            },\n        }, {\n            texture: context.getCurrentTexture(),\n        }, {\n            width: canvas.width,\n            height: canvas.height,\n        });\n\n        renderer.gpu.device.queue.submit([commandEncoder.finish()]);\n\n        return canvas;\n    }\n\n    public getPixels(texture: Texture): GetPixelsOutput\n    {\n        const webGPUCanvas = this.generateCanvas(texture);\n\n        const canvasAndContext = CanvasPool.getOptimalCanvasAndContext(webGPUCanvas.width, webGPUCanvas.height);\n\n        const context = canvasAndContext.context;\n\n        context.drawImage(webGPUCanvas, 0, 0);\n\n        const { width, height } = webGPUCanvas;\n\n        const imageData = context.getImageData(0, 0, width, height);\n\n        const pixels = new Uint8ClampedArray(imageData.data.buffer);\n\n        CanvasPool.returnCanvasAndContext(canvasAndContext);\n\n        return { pixels, width, height };\n    }\n\n    public destroy(): void\n    {\n        // we copy the array as the aarry with a slice as onSourceDestroy\n        // will remove the source from the real managedTextures array\n        this.managedTextures\n            .slice()\n            .forEach((source) => this.onSourceDestroy(source));\n\n        (this.managedTextures as null) = null;\n\n        for (const k of Object.keys(this._bindGroupHash))\n        {\n            const key = Number(k);\n            const bindGroup = this._bindGroupHash[key];\n\n            bindGroup?.destroy();\n            this._bindGroupHash[key] = null;\n        }\n\n        this._gpu = null;\n        this._mipmapGenerator = null;\n        this._gpuSources = null;\n        this._bindGroupHash = null;\n        this._textureViewHash = null;\n        this._gpuSamplers = null;\n    }\n}\n"],"names":[],"mappings":"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"}