{"version":3,"file":"GpuRenderTargetAdaptor.mjs","sources":["../../../../../src/rendering/renderers/gpu/renderTarget/GpuRenderTargetAdaptor.ts"],"sourcesContent":["import { CLEAR } from '../../gl/const';\nimport { CanvasSource } from '../../shared/texture/sources/CanvasSource';\nimport { TextureSource } from '../../shared/texture/sources/TextureSource';\nimport { GpuRenderTarget } from './GpuRenderTarget';\n\nimport type { RgbaArray } from '../../../../color/Color';\nimport type { Rectangle } from '../../../../maths/shapes/Rectangle';\nimport type { CLEAR_OR_BOOL } from '../../gl/const';\nimport type { RenderTarget } from '../../shared/renderTarget/RenderTarget';\nimport type { RenderTargetAdaptor, RenderTargetSystem } from '../../shared/renderTarget/RenderTargetSystem';\nimport type { Texture } from '../../shared/texture/Texture';\nimport type { WebGPURenderer } from '../WebGPURenderer';\n\n/**\n * The WebGPU adaptor for the render target system. Allows the Render Target System to\n * be used with the WebGPU renderer\n * @category rendering\n * @ignore\n */\nexport class GpuRenderTargetAdaptor implements RenderTargetAdaptor<GpuRenderTarget>\n{\n    private _renderTargetSystem: RenderTargetSystem<GpuRenderTarget>;\n    private _renderer: WebGPURenderer<HTMLCanvasElement>;\n\n    public init(renderer: WebGPURenderer, renderTargetSystem: RenderTargetSystem<GpuRenderTarget>): void\n    {\n        this._renderer = renderer;\n        this._renderTargetSystem = renderTargetSystem;\n    }\n\n    public copyToTexture(\n        sourceRenderSurfaceTexture: RenderTarget,\n        destinationTexture: Texture,\n        originSrc: { x: number; y: number; },\n        size: { width: number; height: number; },\n        originDest: { x: number; y: number; },\n    )\n    {\n        const renderer = this._renderer;\n\n        const baseGpuTexture = this._getGpuColorTexture(\n            sourceRenderSurfaceTexture\n        );\n\n        const backGpuTexture = renderer.texture.getGpuSource(\n            destinationTexture.source\n        );\n\n        renderer.encoder.commandEncoder.copyTextureToTexture(\n            {\n                texture: baseGpuTexture,\n                origin: originSrc,\n            },\n            {\n                texture: backGpuTexture,\n                origin: originDest,\n            },\n            size\n        );\n\n        return destinationTexture;\n    }\n\n    public startRenderPass(\n        renderTarget: RenderTarget,\n        clear: CLEAR_OR_BOOL = true,\n        clearColor?: RgbaArray,\n        viewport?: Rectangle,\n        mipLevel = 0,\n        layer = 0\n    )\n    {\n        const renderTargetSystem = this._renderTargetSystem;\n\n        const gpuRenderTarget = renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        if (layer !== 0 && gpuRenderTarget.msaaTextures?.length)\n        {\n            throw new Error('[RenderTargetSystem] Rendering to array layers is not supported with MSAA render targets.');\n        }\n\n        if (mipLevel > 0 && gpuRenderTarget.msaaTextures?.length)\n        {\n            throw new Error('[RenderTargetSystem] Rendering to mip levels is not supported with MSAA render targets.');\n        }\n\n        const descriptor = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);\n\n        gpuRenderTarget.descriptor = descriptor;\n\n        // TODO we should not finish a render pass each time we bind\n        // for example filters - we would want to push / pop render targets\n        this._renderer.pipeline.setRenderTarget(gpuRenderTarget);\n        this._renderer.encoder.beginRenderPass(gpuRenderTarget);\n        this._renderer.encoder.setViewport(viewport);\n    }\n\n    public finishRenderPass()\n    {\n        this._renderer.encoder.endRenderPass();\n    }\n\n    /**\n     * returns the gpu texture for the first color texture in the render target\n     * mainly used by the filter manager to get copy the texture for blending\n     * @param renderTarget\n     * @returns a gpu texture\n     */\n    private _getGpuColorTexture(renderTarget: RenderTarget): GPUTexture\n    {\n        const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        if (gpuRenderTarget.contexts[0])\n        {\n            return gpuRenderTarget.contexts[0].getCurrentTexture();\n        }\n\n        return this._renderer.texture.getGpuSource(\n            renderTarget.colorTextures[0].source\n        );\n    }\n\n    public getDescriptor(\n        renderTarget: RenderTarget,\n        clear: CLEAR_OR_BOOL,\n        clearValue: RgbaArray,\n        mipLevel = 0,\n        layer = 0\n    ): GPURenderPassDescriptor\n    {\n        if (typeof clear === 'boolean')\n        {\n            clear = clear ? CLEAR.ALL : CLEAR.NONE;\n        }\n\n        const renderTargetSystem = this._renderTargetSystem;\n\n        const gpuRenderTarget = renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        const colorAttachments = renderTarget.colorTextures.map(\n            (texture, i) =>\n            {\n                const context = gpuRenderTarget.contexts[i];\n\n                let view: GPUTextureView;\n                let resolveTarget: GPUTextureView;\n\n                if (context)\n                {\n                    if (layer !== 0)\n                    {\n                        // eslint-disable-next-line max-len\n                        throw new Error('[RenderTargetSystem] Rendering to array layers is not supported for canvas targets.');\n                    }\n\n                    const currentTexture = context.getCurrentTexture();\n\n                    const canvasTextureView = currentTexture.createView();\n\n                    view = canvasTextureView;\n                }\n                else\n                {\n                    view = this._renderer.texture.getGpuSource(texture).createView({\n                        // Render attachments must be 2d views; for array/cube textures we select a single layer.\n                        dimension: '2d',\n                        baseMipLevel: mipLevel,\n                        mipLevelCount: 1,\n                        baseArrayLayer: layer,\n                        arrayLayerCount: 1,\n                    });\n                }\n\n                if (gpuRenderTarget.msaaTextures[i])\n                {\n                    resolveTarget = view;\n                    view = this._renderer.texture.getTextureView(\n                        gpuRenderTarget.msaaTextures[i]\n                    );\n                }\n\n                const loadOp = ((clear as CLEAR) & CLEAR.COLOR ? 'clear' : 'load') as GPULoadOp;\n\n                clearValue ??= renderTargetSystem.defaultClearColor;\n\n                return {\n                    view,\n                    resolveTarget,\n                    clearValue,\n                    storeOp: 'store',\n                    loadOp\n                };\n            }\n        ) as GPURenderPassColorAttachment[];\n\n        let depthStencilAttachment: GPURenderPassDepthStencilAttachment;\n\n        // if we have a depth or stencil buffer, we need to ensure we have a texture for it\n        // this is WebGPU specific - as WebGL does not require textures to run a depth / stencil buffer\n        if ((renderTarget.stencil || renderTarget.depth) && !renderTarget.depthStencilTexture)\n        {\n            renderTarget.ensureDepthStencilTexture();\n            renderTarget.depthStencilTexture.source.sampleCount = gpuRenderTarget.msaa ? 4 : 1;\n        }\n\n        if (renderTarget.depthStencilTexture)\n        {\n            const stencilLoadOp = (clear & CLEAR.STENCIL ? 'clear' : 'load') as GPULoadOp;\n            const depthLoadOp = (clear & CLEAR.DEPTH ? 'clear' : 'load') as GPULoadOp;\n\n            depthStencilAttachment = {\n                view: this._renderer.texture\n                    .getGpuSource(renderTarget.depthStencilTexture.source)\n                    .createView({\n                        dimension: '2d',\n                        baseMipLevel: mipLevel,\n                        mipLevelCount: 1,\n                        baseArrayLayer: layer,\n                        arrayLayerCount: 1,\n                    }),\n                stencilStoreOp: 'store',\n                stencilLoadOp,\n                depthClearValue: 1.0,\n                depthLoadOp,\n                depthStoreOp: 'store',\n            };\n        }\n\n        const descriptor: GPURenderPassDescriptor = {\n            colorAttachments,\n            depthStencilAttachment,\n        };\n\n        return descriptor;\n    }\n\n    public clear(\n        renderTarget: RenderTarget,\n        clear: CLEAR_OR_BOOL = true,\n        clearColor?: RgbaArray,\n        viewport?: Rectangle,\n        mipLevel = 0,\n        layer = 0\n    )\n    {\n        if (!clear) return;\n\n        const { gpu, encoder } = this._renderer;\n\n        const device = gpu.device;\n\n        const standAlone = encoder.commandEncoder === null;\n\n        if (standAlone)\n        {\n            const commandEncoder = device.createCommandEncoder();\n            const renderPassDescriptor = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);\n\n            const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);\n\n            passEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n\n            passEncoder.end();\n\n            const gpuCommands = commandEncoder.finish();\n\n            device.queue.submit([gpuCommands]);\n        }\n        else\n        {\n            this.startRenderPass(renderTarget, clear, clearColor, viewport, mipLevel, layer);\n        }\n    }\n\n    public initGpuRenderTarget(renderTarget: RenderTarget): GpuRenderTarget\n    {\n        // always true for WebGPU\n        renderTarget.isRoot = true;\n\n        const gpuRenderTarget = new GpuRenderTarget();\n\n        gpuRenderTarget.colorTargetCount = renderTarget.colorTextures.length;\n\n        // create a context...\n        // is a canvas...\n        renderTarget.colorTextures.forEach((colorTexture, i) =>\n        {\n            if (colorTexture instanceof CanvasSource)\n            {\n                const context = colorTexture.resource.getContext(\n                    'webgpu'\n                ) as unknown as GPUCanvasContext;\n\n                const alphaMode = (colorTexture as CanvasSource).transparent ? 'premultiplied' : 'opaque';\n\n                try\n                {\n                    context.configure({\n                        device: this._renderer.gpu.device,\n                        usage: GPUTextureUsage.TEXTURE_BINDING\n                            | GPUTextureUsage.COPY_DST\n                            | GPUTextureUsage.RENDER_ATTACHMENT\n                            | GPUTextureUsage.COPY_SRC,\n                        format: 'bgra8unorm',\n                        alphaMode,\n                    });\n                }\n                catch (e)\n                {\n                    console.error(e);\n                }\n\n                gpuRenderTarget.contexts[i] = context;\n            }\n\n            gpuRenderTarget.msaa = colorTexture.source.antialias;\n\n            if (colorTexture.source.antialias)\n            {\n                const msaaTexture = new TextureSource({\n                    width: 0,\n                    height: 0,\n                    sampleCount: 4,\n                    arrayLayerCount: colorTexture.source.arrayLayerCount,\n                });\n\n                gpuRenderTarget.msaaTextures[i] = msaaTexture;\n            }\n        });\n\n        if (gpuRenderTarget.msaa)\n        {\n            gpuRenderTarget.msaaSamples = 4;\n\n            if (renderTarget.depthStencilTexture)\n            {\n                renderTarget.depthStencilTexture.source.sampleCount = 4;\n            }\n        }\n\n        return gpuRenderTarget;\n    }\n\n    public destroyGpuRenderTarget(gpuRenderTarget: GpuRenderTarget)\n    {\n        gpuRenderTarget.contexts.forEach((context) =>\n        {\n            context.unconfigure();\n        });\n\n        gpuRenderTarget.msaaTextures.forEach((texture) =>\n        {\n            texture.destroy();\n        });\n\n        gpuRenderTarget.msaaTextures.length = 0;\n        gpuRenderTarget.contexts.length = 0;\n    }\n\n    public ensureDepthStencilTexture(renderTarget: RenderTarget)\n    {\n        // TODO This function will be more useful once we cache the descriptors\n        const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        if (renderTarget.depthStencilTexture && gpuRenderTarget.msaa)\n        {\n            renderTarget.depthStencilTexture.source.sampleCount = 4;\n        }\n    }\n\n    public resizeGpuRenderTarget(renderTarget: RenderTarget)\n    {\n        const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        gpuRenderTarget.width = renderTarget.width;\n        gpuRenderTarget.height = renderTarget.height;\n\n        if (gpuRenderTarget.msaa)\n        {\n            renderTarget.colorTextures.forEach((colorTexture, i) =>\n            {\n                const msaaTexture = gpuRenderTarget.msaaTextures[i];\n\n                msaaTexture?.resize(\n                    colorTexture.source.width,\n                    colorTexture.source.height,\n                    colorTexture.source._resolution\n                );\n            });\n        }\n    }\n}\n"],"names":[],"mappings":"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"}