{"version":3,"file":"FramebufferSystem.mjs","sources":["../../src/framebuffer/FramebufferSystem.ts"],"sourcesContent":["import { BUFFER_BITS, ENV, MSAA_QUALITY } from 'pixijs/constants';\nimport { extensions, ExtensionType } from 'pixijs/extensions';\nimport { Rectangle } from 'pixijs/math';\nimport { settings } from 'pixijs/settings';\nimport { Framebuffer } from './Framebuffer';\nimport { GLFramebuffer } from './GLFramebuffer';\n\nimport type { ExtensionMetadata } from 'pixijs/extensions';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { ISystem } from '../system/ISystem';\n\nconst tempRectangle = new Rectangle();\n\n/**\n * System plugin to the renderer to manage framebuffers.\n * @memberof PIXI\n */\nexport class FramebufferSystem implements ISystem\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        type: ExtensionType.RendererSystem,\n        name: 'framebuffer',\n    };\n\n    /** A list of managed framebuffers. */\n    public readonly managedFramebuffers: Array<Framebuffer>;\n    public current: Framebuffer;\n    public viewport: Rectangle;\n    public hasMRT: boolean;\n    public writeDepthTexture: boolean;\n    protected CONTEXT_UID: number;\n    protected gl: IRenderingContext;\n\n    /** Framebuffer value that shows that we don't know what is bound. */\n    protected unknownFramebuffer: Framebuffer;\n    protected msaaSamples: Array<number>;\n    public renderer: Renderer;\n\n    /**\n     * @param renderer - The renderer this System works for.\n     */\n    constructor(renderer: Renderer)\n    {\n        this.renderer = renderer;\n        this.managedFramebuffers = [];\n        this.unknownFramebuffer = new Framebuffer(10, 10);\n\n        this.msaaSamples = null;\n    }\n\n    /** Sets up the renderer context and necessary buffers. */\n    protected contextChange(): void\n    {\n        this.disposeAll(true);\n\n        const gl = this.gl = this.renderer.gl;\n\n        this.CONTEXT_UID = this.renderer.CONTEXT_UID;\n        this.current = this.unknownFramebuffer;\n        this.viewport = new Rectangle();\n        this.hasMRT = true;\n        this.writeDepthTexture = true;\n\n        // webgl2\n        if (this.renderer.context.webGLVersion === 1)\n        {\n            // webgl 1!\n            let nativeDrawBuffersExtension = this.renderer.context.extensions.drawBuffers;\n            let nativeDepthTextureExtension = this.renderer.context.extensions.depthTexture;\n\n            if (settings.PREFER_ENV === ENV.WEBGL_LEGACY)\n            {\n                nativeDrawBuffersExtension = null;\n                nativeDepthTextureExtension = null;\n            }\n\n            if (nativeDrawBuffersExtension)\n            {\n                gl.drawBuffers = (activeTextures: number[]): void =>\n                    nativeDrawBuffersExtension.drawBuffersWEBGL(activeTextures);\n            }\n            else\n            {\n                this.hasMRT = false;\n                gl.drawBuffers = (): void =>\n                {\n                    // empty\n                };\n            }\n\n            if (!nativeDepthTextureExtension)\n            {\n                this.writeDepthTexture = false;\n            }\n        }\n        else\n        {\n            // WebGL2\n            // cache possible MSAA samples\n            this.msaaSamples = gl.getInternalformatParameter(gl.RENDERBUFFER, gl.RGBA8, gl.SAMPLES);\n        }\n    }\n\n    /**\n     * Bind a framebuffer.\n     * @param framebuffer\n     * @param frame - frame, default is framebuffer size\n     * @param mipLevel - optional mip level to set on the framebuffer - defaults to 0\n     */\n    bind(framebuffer?: Framebuffer, frame?: Rectangle, mipLevel = 0): void\n    {\n        const { gl } = this;\n\n        if (framebuffer)\n        {\n            // TODO caching layer!\n\n            const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID] || this.initFramebuffer(framebuffer);\n\n            if (this.current !== framebuffer)\n            {\n                this.current = framebuffer;\n                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.framebuffer);\n            }\n            // make sure all textures are unbound..\n\n            if (fbo.mipLevel !== mipLevel)\n            {\n                framebuffer.dirtyId++;\n                framebuffer.dirtyFormat++;\n                fbo.mipLevel = mipLevel;\n            }\n\n            // now check for updates...\n            if (fbo.dirtyId !== framebuffer.dirtyId)\n            {\n                fbo.dirtyId = framebuffer.dirtyId;\n\n                if (fbo.dirtyFormat !== framebuffer.dirtyFormat)\n                {\n                    fbo.dirtyFormat = framebuffer.dirtyFormat;\n                    fbo.dirtySize = framebuffer.dirtySize;\n                    this.updateFramebuffer(framebuffer, mipLevel);\n                }\n                else if (fbo.dirtySize !== framebuffer.dirtySize)\n                {\n                    fbo.dirtySize = framebuffer.dirtySize;\n                    this.resizeFramebuffer(framebuffer);\n                }\n            }\n\n            for (let i = 0; i < framebuffer.colorTextures.length; i++)\n            {\n                const tex = framebuffer.colorTextures[i];\n\n                this.renderer.texture.unbind(tex.parentTextureArray || tex);\n            }\n\n            if (framebuffer.depthTexture)\n            {\n                this.renderer.texture.unbind(framebuffer.depthTexture);\n            }\n\n            if (frame)\n            {\n                const mipWidth = (frame.width >> mipLevel);\n                const mipHeight = (frame.height >> mipLevel);\n\n                const scale = mipWidth / frame.width;\n\n                this.setViewport(\n                    frame.x * scale,\n                    frame.y * scale,\n                    mipWidth,\n                    mipHeight\n                );\n            }\n            else\n            {\n                const mipWidth = (framebuffer.width >> mipLevel);\n                const mipHeight = (framebuffer.height >> mipLevel);\n\n                this.setViewport(0, 0, mipWidth, mipHeight);\n            }\n        }\n        else\n        {\n            if (this.current)\n            {\n                this.current = null;\n                gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n            }\n\n            if (frame)\n            {\n                this.setViewport(frame.x, frame.y, frame.width, frame.height);\n            }\n            else\n            {\n                this.setViewport(0, 0, this.renderer.width, this.renderer.height);\n            }\n        }\n    }\n\n    /**\n     * Set the WebGLRenderingContext's viewport.\n     * @param x - X position of viewport\n     * @param y - Y position of viewport\n     * @param width - Width of viewport\n     * @param height - Height of viewport\n     */\n    setViewport(x: number, y: number, width: number, height: number): void\n    {\n        const v = this.viewport;\n\n        x = Math.round(x);\n        y = Math.round(y);\n        width = Math.round(width);\n        height = Math.round(height);\n\n        if (v.width !== width || v.height !== height || v.x !== x || v.y !== y)\n        {\n            v.x = x;\n            v.y = y;\n            v.width = width;\n            v.height = height;\n\n            this.gl.viewport(x, y, width, height);\n        }\n    }\n\n    /**\n     * Get the size of the current width and height. Returns object with `width` and `height` values.\n     * @readonly\n     */\n    get size(): { x: number; y: number; width: number; height: number }\n    {\n        if (this.current)\n        {\n            // TODO store temp\n            return { x: 0, y: 0, width: this.current.width, height: this.current.height };\n        }\n\n        return { x: 0, y: 0, width: this.renderer.width, height: this.renderer.height };\n    }\n\n    /**\n     * Clear the color of the context\n     * @param r - Red value from 0 to 1\n     * @param g - Green value from 0 to 1\n     * @param b - Blue value from 0 to 1\n     * @param a - Alpha value from 0 to 1\n     * @param {PIXI.BUFFER_BITS} [mask=BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH] - Bitwise OR of masks\n     *  that indicate the buffers to be cleared, by default COLOR and DEPTH buffers.\n     */\n    clear(r: number, g: number, b: number, a: number, mask: BUFFER_BITS = BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH): void\n    {\n        const { gl } = this;\n\n        // TODO clear color can be set only one right?\n        gl.clearColor(r, g, b, a);\n        gl.clear(mask);\n    }\n\n    /**\n     * Initialize framebuffer for this context\n     * @protected\n     * @param framebuffer\n     * @returns - created GLFramebuffer\n     */\n    initFramebuffer(framebuffer: Framebuffer): GLFramebuffer\n    {\n        const { gl } = this;\n        const fbo = new GLFramebuffer(gl.createFramebuffer());\n\n        fbo.multisample = this.detectSamples(framebuffer.multisample);\n        framebuffer.glFramebuffers[this.CONTEXT_UID] = fbo;\n\n        this.managedFramebuffers.push(framebuffer);\n        framebuffer.disposeRunner.add(this);\n\n        return fbo;\n    }\n\n    /**\n     * Resize the framebuffer\n     * @param framebuffer\n     * @protected\n     */\n    resizeFramebuffer(framebuffer: Framebuffer): void\n    {\n        const { gl } = this;\n\n        const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n        if (fbo.stencil)\n        {\n            gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil);\n\n            if (fbo.msaaBuffer)\n            {\n                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n                    gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height);\n            }\n            else\n            {\n                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height);\n            }\n        }\n\n        const colorTextures = framebuffer.colorTextures;\n\n        let count = colorTextures.length;\n\n        if (!gl.drawBuffers)\n        {\n            count = Math.min(count, 1);\n        }\n\n        for (let i = 0; i < count; i++)\n        {\n            const texture = colorTextures[i];\n            const parentTexture = texture.parentTextureArray || texture;\n\n            this.renderer.texture.bind(parentTexture, 0);\n\n            if (i === 0 && fbo.msaaBuffer)\n            {\n                gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer);\n                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n                    parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height);\n            }\n        }\n\n        if (framebuffer.depthTexture && this.writeDepthTexture)\n        {\n            this.renderer.texture.bind(framebuffer.depthTexture, 0);\n        }\n    }\n\n    /**\n     * Update the framebuffer\n     * @param framebuffer\n     * @param mipLevel\n     * @protected\n     */\n    updateFramebuffer(framebuffer: Framebuffer, mipLevel: number): void\n    {\n        const { gl } = this;\n\n        const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n        // bind the color texture\n        const colorTextures = framebuffer.colorTextures;\n\n        let count = colorTextures.length;\n\n        if (!gl.drawBuffers)\n        {\n            count = Math.min(count, 1);\n        }\n\n        if (fbo.multisample > 1 && this.canMultisampleFramebuffer(framebuffer))\n        {\n            fbo.msaaBuffer = fbo.msaaBuffer || gl.createRenderbuffer();\n        }\n        else if (fbo.msaaBuffer)\n        {\n            gl.deleteRenderbuffer(fbo.msaaBuffer);\n            fbo.msaaBuffer = null;\n\n            if (fbo.blitFramebuffer)\n            {\n                fbo.blitFramebuffer.dispose();\n                fbo.blitFramebuffer = null;\n            }\n        }\n\n        const activeTextures = [];\n\n        for (let i = 0; i < count; i++)\n        {\n            const texture = colorTextures[i];\n            const parentTexture = texture.parentTextureArray || texture;\n\n            this.renderer.texture.bind(parentTexture, 0);\n\n            if (i === 0 && fbo.msaaBuffer)\n            {\n                gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer);\n                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n                    parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height);\n                gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, fbo.msaaBuffer);\n            }\n            else\n            {\n                gl.framebufferTexture2D(gl.FRAMEBUFFER,\n                    gl.COLOR_ATTACHMENT0 + i,\n                    texture.target,\n                    parentTexture._glTextures[this.CONTEXT_UID].texture,\n                    mipLevel);\n\n                activeTextures.push(gl.COLOR_ATTACHMENT0 + i);\n            }\n        }\n\n        if (activeTextures.length > 1)\n        {\n            gl.drawBuffers(activeTextures);\n        }\n\n        if (framebuffer.depthTexture)\n        {\n            const writeDepthTexture = this.writeDepthTexture;\n\n            if (writeDepthTexture)\n            {\n                const depthTexture = framebuffer.depthTexture;\n\n                this.renderer.texture.bind(depthTexture, 0);\n\n                gl.framebufferTexture2D(gl.FRAMEBUFFER,\n                    gl.DEPTH_ATTACHMENT,\n                    gl.TEXTURE_2D,\n                    depthTexture._glTextures[this.CONTEXT_UID].texture,\n                    mipLevel);\n            }\n        }\n\n        if ((framebuffer.stencil || framebuffer.depth) && !(framebuffer.depthTexture && this.writeDepthTexture))\n        {\n            fbo.stencil = fbo.stencil || gl.createRenderbuffer();\n\n            gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil);\n\n            if (fbo.msaaBuffer)\n            {\n                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n                    gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height);\n            }\n            else\n            {\n                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height);\n            }\n\n            gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, fbo.stencil);\n        }\n        else if (fbo.stencil)\n        {\n            gl.deleteRenderbuffer(fbo.stencil);\n            fbo.stencil = null;\n        }\n    }\n\n    /**\n     * Returns true if the frame buffer can be multisampled.\n     * @param framebuffer\n     */\n    protected canMultisampleFramebuffer(framebuffer: Framebuffer): boolean\n    {\n        return this.renderer.context.webGLVersion !== 1\n            && framebuffer.colorTextures.length <= 1 && !framebuffer.depthTexture;\n    }\n\n    /**\n     * Detects number of samples that is not more than a param but as close to it as possible\n     * @param samples - number of samples\n     * @returns - recommended number of samples\n     */\n    protected detectSamples(samples: MSAA_QUALITY): MSAA_QUALITY\n    {\n        const { msaaSamples } = this;\n        let res: number = MSAA_QUALITY.NONE;\n\n        if (samples <= 1 || msaaSamples === null)\n        {\n            return res;\n        }\n        for (let i = 0; i < msaaSamples.length; i++)\n        {\n            if (msaaSamples[i] <= samples)\n            {\n                res = msaaSamples[i];\n                break;\n            }\n        }\n\n        if (res === 1)\n        {\n            res = MSAA_QUALITY.NONE;\n        }\n\n        return res;\n    }\n\n    /**\n     * Only works with WebGL2\n     *\n     * blits framebuffer to another of the same or bigger size\n     * after that target framebuffer is bound\n     *\n     * Fails with WebGL warning if blits multisample framebuffer to different size\n     * @param framebuffer - by default it blits \"into itself\", from renderBuffer to texture.\n     * @param sourcePixels - source rectangle in pixels\n     * @param destPixels - dest rectangle in pixels, assumed to be the same as sourcePixels\n     */\n    public blit(framebuffer?: Framebuffer, sourcePixels?: Rectangle, destPixels?: Rectangle): void\n    {\n        const { current, renderer, gl, CONTEXT_UID } = this;\n\n        if (renderer.context.webGLVersion !== 2)\n        {\n            return;\n        }\n\n        if (!current)\n        {\n            return;\n        }\n        const fbo = current.glFramebuffers[CONTEXT_UID];\n\n        if (!fbo)\n        {\n            return;\n        }\n        if (!framebuffer)\n        {\n            if (!fbo.msaaBuffer)\n            {\n                return;\n            }\n\n            const colorTexture = current.colorTextures[0];\n\n            if (!colorTexture)\n            {\n                return;\n            }\n\n            if (!fbo.blitFramebuffer)\n            {\n                fbo.blitFramebuffer = new Framebuffer(current.width, current.height);\n                fbo.blitFramebuffer.addColorTexture(0, colorTexture);\n            }\n\n            framebuffer = fbo.blitFramebuffer;\n\n            if (framebuffer.colorTextures[0] !== colorTexture)\n            {\n                framebuffer.colorTextures[0] = colorTexture;\n                framebuffer.dirtyId++;\n                framebuffer.dirtyFormat++;\n            }\n\n            if (framebuffer.width !== current.width || framebuffer.height !== current.height)\n            {\n                framebuffer.width = current.width;\n                framebuffer.height = current.height;\n                framebuffer.dirtyId++;\n                framebuffer.dirtySize++;\n            }\n        }\n\n        if (!sourcePixels)\n        {\n            sourcePixels = tempRectangle;\n            sourcePixels.width = current.width;\n            sourcePixels.height = current.height;\n        }\n        if (!destPixels)\n        {\n            destPixels = sourcePixels;\n        }\n\n        const sameSize = sourcePixels.width === destPixels.width && sourcePixels.height === destPixels.height;\n\n        this.bind(framebuffer);\n        gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo.framebuffer);\n        gl.blitFramebuffer(\n            sourcePixels.left, sourcePixels.top, sourcePixels.right, sourcePixels.bottom,\n            destPixels.left, destPixels.top, destPixels.right, destPixels.bottom,\n            gl.COLOR_BUFFER_BIT, sameSize ? gl.NEAREST : gl.LINEAR\n        );\n    }\n\n    /**\n     * Disposes framebuffer.\n     * @param framebuffer - framebuffer that has to be disposed of\n     * @param contextLost - If context was lost, we suppress all delete function calls\n     */\n    disposeFramebuffer(framebuffer: Framebuffer, contextLost?: boolean): void\n    {\n        const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n        const gl = this.gl;\n\n        if (!fbo)\n        {\n            return;\n        }\n\n        delete framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n        const index = this.managedFramebuffers.indexOf(framebuffer);\n\n        if (index >= 0)\n        {\n            this.managedFramebuffers.splice(index, 1);\n        }\n\n        framebuffer.disposeRunner.remove(this);\n\n        if (!contextLost)\n        {\n            gl.deleteFramebuffer(fbo.framebuffer);\n\n            if (fbo.msaaBuffer)\n            {\n                gl.deleteRenderbuffer(fbo.msaaBuffer);\n            }\n\n            if (fbo.stencil)\n            {\n                gl.deleteRenderbuffer(fbo.stencil);\n            }\n        }\n\n        if (fbo.blitFramebuffer)\n        {\n            fbo.blitFramebuffer.dispose();\n        }\n    }\n\n    /**\n     * Disposes all framebuffers, but not textures bound to them.\n     * @param [contextLost=false] - If context was lost, we suppress all delete function calls\n     */\n    disposeAll(contextLost?: boolean): void\n    {\n        const list = this.managedFramebuffers;\n\n        (this.managedFramebuffers as any) = [];\n\n        for (let i = 0; i < list.length; i++)\n        {\n            this.disposeFramebuffer(list[i], contextLost);\n        }\n    }\n\n    /**\n     * Forcing creation of stencil buffer for current framebuffer, if it wasn't done before.\n     * Used by MaskSystem, when its time to use stencil mask for Graphics element.\n     *\n     * Its an alternative for public lazy `framebuffer.enableStencil`, in case we need stencil without rebind.\n     * @private\n     */\n    forceStencil(): void\n    {\n        const framebuffer = this.current;\n\n        if (!framebuffer)\n        {\n            return;\n        }\n\n        const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n        if (!fbo || fbo.stencil)\n        {\n            return;\n        }\n\n        framebuffer.stencil = true;\n\n        const w = framebuffer.width;\n        const h = framebuffer.height;\n        const gl = this.gl;\n        const stencil = gl.createRenderbuffer();\n\n        gl.bindRenderbuffer(gl.RENDERBUFFER, stencil);\n\n        if (fbo.msaaBuffer)\n        {\n            gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, gl.DEPTH24_STENCIL8, w, h);\n        }\n        else\n        {\n            gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, w, h);\n        }\n\n        fbo.stencil = stencil;\n        gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencil);\n    }\n\n    /** Resets framebuffer stored state, binds screen framebuffer. Should be called before renderTexture reset(). */\n    reset(): void\n    {\n        this.current = this.unknownFramebuffer;\n        this.viewport = new Rectangle();\n    }\n\n    destroy(): void\n    {\n        this.renderer = null;\n    }\n}\n\nextensions.add(FramebufferSystem);\n"],"names":[],"mappings":"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"}