{"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 { type GPUData } from '../../../../scene/view/ViewContainer';\nimport { GCManagedHash } from '../../../../utils/data/GCManagedHash';\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 { createGpuUploadCubeTextureResource } from './uploaders/gpuUploadCubeTextureResource';\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 * Stores GPU-specific data for a Texture instance in WebGL context.\n * @internal\n */\nexport class GPUTextureGpuData implements GPUData\n{\n    public gpuTexture: GPUTexture;\n    public textureView: GPUTextureView = null;\n\n    constructor(gpuTexture: GPUTexture)\n    {\n        this.gpuTexture = gpuTexture;\n    }\n\n    /** Destroys this GPU data instance. */\n    public destroy(): void\n    {\n        this.gpuTexture.destroy();\n        this.textureView = null;\n        this.gpuTexture = null;\n    }\n}\n\n/**\n * The system that handles textures for the GPU.\n * @category rendering\n * @advanced\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    protected CONTEXT_UID: number;\n    private _gpuSamplers: Record<string, GPUSampler> = Object.create(null);\n    private _bindGroupHash: Record<string, BindGroup> = Object.create(null);\n\n    private readonly _uploads: Record<string, GpuTextureUploader>;\n\n    private _gpu: GPU;\n    private _mipmapGenerator?: GpuMipmapGenerator;\n\n    private readonly _renderer: WebGPURenderer;\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    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n        renderer.gc.addCollection(this, '_bindGroupHash', 'hash');\n\n        this._managedTextures = new GCManagedHash({\n            renderer,\n            type: 'resource',\n            onUnload: this.onSourceUnload.bind(this),\n            name: 'gpuTextureSource'\n        });\n\n        const baseUploaders = {\n            image: gpuUploadImageResource,\n            buffer: gpuUploadBufferImageResource,\n            video: gpuUploadVideoResource,\n            compressed: gpuUploadCompressedTextureResource,\n        };\n\n        this._uploads = {\n            ...baseUploaders,\n            cube: createGpuUploadCubeTextureResource(baseUploaders),\n        };\n    }\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\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): GPUTexture\n    {\n        return (source._gpuData[this._renderer.uid] as GPUTextureGpuData)?.gpuTexture || this._initSource(source);\n    }\n\n    private _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, depthOrArrayLayers: source.arrayLayerCount },\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        source._gpuData[this._renderer.uid] = new GPUTextureGpuData(gpuTexture);\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.onSourceResize, this);\n            source.on('updateMipmaps', this.onUpdateMipmaps, this);\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 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 onSourceUnload(source: TextureSource): void\n    {\n        source.off('update', this.onSourceUpdate, this);\n        source.off('resize', this.onSourceResize, this);\n        source.off('updateMipmaps', this.onUpdateMipmaps, this);\n    }\n\n    protected onSourceResize(source: TextureSource): void\n    {\n        source._gcLastUsed = this._renderer.gc.now;\n\n        const gpuData = source._gpuData[this._renderer.uid] as GPUTextureGpuData;\n        const gpuTexture = gpuData?.gpuTexture;\n\n        if (!gpuTexture)\n        {\n            this.initSource(source);\n        }\n        else if (gpuTexture.width !== source.pixelWidth || gpuTexture.height !== source.pixelHeight)\n        {\n            gpuData.destroy();\n            this._bindGroupHash[source.uid] = null;\n            source._gpuData[this._renderer.uid] = null;\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        source._gcLastUsed = this._renderer.gc.now;\n\n        return (source._gpuData[this._renderer.uid] as GPUTextureGpuData)?.gpuTexture || 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        source._gcLastUsed = this._renderer.gc.now;\n        let gpuData = source._gpuData[this._renderer.uid] as GPUTextureGpuData;\n\n        if (!gpuData)\n        {\n            this.initSource(source);\n            gpuData = source._gpuData[this._renderer.uid] as GPUTextureGpuData;\n        }\n\n        gpuData.textureView ||= gpuData.gpuTexture.createView({ dimension: source.viewDimension });\n\n        return gpuData.textureView;\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\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        this._managedTextures.destroy();\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        }\n\n        (this._renderer as null) = null;\n        this._gpu = null;\n        this._mipmapGenerator = null;\n        this._gpuSamplers = null;\n        this._bindGroupHash = null;\n    }\n}\n"],"names":[],"mappings":"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"}