{"version":3,"file":"TransformFeedbackSystem.mjs","sources":["../../src/transformFeedback/TransformFeedbackSystem.ts"],"sourcesContent":["import { extensions, ExtensionType } from 'pixijs/extensions';\n\nimport type { DRAW_MODES } from 'pixijs/constants';\nimport type { ExtensionMetadata } from 'pixijs/extensions';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { Shader } from '../shader/Shader';\nimport type { ISystem } from '../system/ISystem';\nimport type { TransformFeedback } from './TransformFeedback';\n\n/**\n * TransformFeedbackSystem provides TransformFeedback of WebGL2\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLTransformFeedback\n *\n * For example, you can use TransformFeedbackSystem to implement GPU Particle or\n * general purpose computing on GPU (aka GPGPU).\n *\n * It also manages a lifetime of GLTransformFeedback object\n * @memberof PIXI\n */\nexport class TransformFeedbackSystem implements ISystem\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        type:  ExtensionType.RendererSystem,\n        name: 'transformFeedback',\n    };\n\n    CONTEXT_UID: number;\n    gl: IRenderingContext;\n\n    private renderer: Renderer;\n\n    /**\n     * @param renderer - The renderer this System works for.\n     */\n    constructor(renderer: Renderer)\n    {\n        this.renderer = renderer;\n    }\n\n    /** Sets up the renderer context and necessary buffers. */\n    protected contextChange(): void\n    {\n        this.gl = this.renderer.gl;\n\n        // TODO fill out...\n        this.CONTEXT_UID = this.renderer.CONTEXT_UID;\n    }\n\n    /**\n     * Bind TransformFeedback and buffers\n     * @param transformFeedback - TransformFeedback to bind\n     */\n    bind(transformFeedback: TransformFeedback)\n    {\n        const { gl, CONTEXT_UID } = this;\n\n        const glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID]\n          || this.createGLTransformFeedback(transformFeedback);\n\n        gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);\n    }\n\n    /** Unbind TransformFeedback */\n    unbind()\n    {\n        const { gl } = this;\n\n        gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n    }\n\n    /**\n     * Begin TransformFeedback\n     * @param drawMode - DrawMode for TransformFeedback\n     * @param shader - A Shader used by TransformFeedback. Current bound shader will be used if not provided.\n     */\n    beginTransformFeedback(drawMode: DRAW_MODES, shader?: Shader)\n    {\n        const { gl, renderer } = this;\n\n        if (shader)\n        {\n            renderer.shader.bind(shader);\n        }\n\n        gl.beginTransformFeedback(drawMode);\n    }\n\n    /** End TransformFeedback */\n    endTransformFeedback()\n    {\n        const { gl } = this;\n\n        gl.endTransformFeedback();\n    }\n\n    /**\n     * Create TransformFeedback and bind buffers\n     * @param tf - TransformFeedback\n     * @returns WebGLTransformFeedback\n     */\n    protected createGLTransformFeedback(tf: TransformFeedback)\n    {\n        const { gl, renderer, CONTEXT_UID } = this;\n\n        const glTransformFeedback = gl.createTransformFeedback();\n\n        tf._glTransformFeedbacks[CONTEXT_UID] = glTransformFeedback;\n        gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);\n        for (let i = 0; i < tf.buffers.length; i++)\n        {\n            const buffer = tf.buffers[i];\n\n            if (!buffer) continue;\n\n            renderer.buffer.update(buffer);\n            buffer._glBuffers[CONTEXT_UID].refCount++;\n\n            gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null);\n        }\n        gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n\n        tf.disposeRunner.add(this);\n\n        return glTransformFeedback;\n    }\n\n    /**\n     * Disposes TransfromFeedback\n     * @param {PIXI.TransformFeedback} tf - TransformFeedback\n     * @param {boolean} [contextLost=false] - If context was lost, we suppress delete TransformFeedback\n     */\n    disposeTransformFeedback(tf: TransformFeedback, contextLost?: boolean): void\n    {\n        const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID];\n        const gl = this.gl;\n\n        tf.disposeRunner.remove(this);\n\n        const bufferSystem = this.renderer.buffer;\n\n        // bufferSystem may have already been destroyed..\n        // if this is the case, there is no need to destroy the geometry buffers...\n        // they already have been!\n        if (bufferSystem)\n        {\n            for (let i = 0; i < tf.buffers.length; i++)\n            {\n                const buffer = tf.buffers[i];\n\n                if (!buffer) continue;\n\n                const buf = buffer._glBuffers[this.CONTEXT_UID];\n\n                // my be null as context may have changed right before the dispose is called\n                if (buf)\n                {\n                    buf.refCount--;\n                    if (buf.refCount === 0 && !contextLost)\n                    {\n                        bufferSystem.dispose(buffer, contextLost);\n                    }\n                }\n            }\n        }\n\n        if (!glTF)\n        {\n            return;\n        }\n\n        if (!contextLost)\n        {\n            gl.deleteTransformFeedback(glTF);\n        }\n\n        delete tf._glTransformFeedbacks[this.CONTEXT_UID];\n    }\n\n    destroy(): void\n    {\n        // @TODO: Destroy managed TransformFeedbacks\n        this.renderer = null;\n    }\n}\n\nextensions.add(TransformFeedbackSystem);\n"],"names":[],"mappings":"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"}