{"version":3,"file":"GlGeometrySystem.mjs","sources":["../../../../../src/rendering/renderers/gl/geometry/GlGeometrySystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\nimport { type GPUData } from '../../../../scene/view/ViewContainer';\nimport { GCManagedHash } from '../../../../utils/data/GCManagedHash';\nimport { getAttributeInfoFromFormat } from '../../shared/geometry/utils/getAttributeInfoFromFormat';\nimport { ensureAttributes } from '../shader/program/ensureAttributes';\nimport { getGlTypeFromFormat } from './utils/getGlTypeFromFormat';\n\nimport type { Topology } from '../../shared/geometry/const';\nimport type { Geometry } from '../../shared/geometry/Geometry';\nimport type { System } from '../../shared/system/System';\nimport type { GlRenderingContext } from '../context/GlRenderingContext';\nimport type { GlProgram } from '../shader/GlProgram';\nimport type { WebGLRenderer } from '../WebGLRenderer';\n\nconst topologyToGlMap = {\n    'point-list': 0x0000,\n    'line-list': 0x0001,\n    'line-strip': 0x0003,\n    'triangle-list': 0x0004,\n    'triangle-strip': 0x0005\n};\n\n/**\n * Stores GPU-specific data for a Geometry instance in WebGL context.\n *\n * This class manages Vertex Array Object (VAO) caching for geometries,\n * allowing efficient reuse of VAOs across different shader programs.\n * Each geometry can have multiple VAOs cached, one for each unique\n * shader program signature it's used with.\n * @internal\n */\nexport class GlGeometryGpuData implements GPUData\n{\n    public vaoCache: Record<string, WebGLVertexArrayObject>;\n\n    constructor()\n    {\n        this.vaoCache = Object.create(null);\n    }\n\n    public destroy(): void\n    {\n        this.vaoCache = Object.create(null);\n    }\n}\n\n/**\n * System plugin to the renderer to manage geometry.\n * @category rendering\n * @advanced\n */\nexport class GlGeometrySystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n        ],\n        name: 'geometry',\n    } as const;\n\n    /**\n     * `true` if we has `*_vertex_array_object` extension.\n     * @readonly\n     */\n    public hasVao: boolean;\n\n    /**\n     * `true` if has `ANGLE_instanced_arrays` extension.\n     * @readonly\n     */\n    public hasInstance: boolean;\n\n    protected gl: GlRenderingContext;\n    protected _activeGeometry: Geometry;\n    /** @internal */\n    public _activeVao: WebGLVertexArrayObject;\n    /** @internal */\n    public _managedGeometries: GCManagedHash<Geometry>;\n\n    /** Renderer that owns this {@link GeometrySystem}. */\n    private _renderer: WebGLRenderer;\n\n    /** @param renderer - The renderer this System works for. */\n    constructor(renderer: WebGLRenderer)\n    {\n        this._renderer = renderer;\n        this._activeGeometry = null;\n        this._activeVao = null;\n\n        this.hasVao = true;\n        this.hasInstance = true;\n\n        this._managedGeometries = new GCManagedHash({\n            renderer,\n            type: 'resource',\n            onUnload: this.onGeometryUnload.bind(this),\n            name: 'glGeometry'\n        });\n    }\n\n    /** Sets up the renderer context and necessary buffers. */\n    protected contextChange(): void\n    {\n        const gl = this.gl = this._renderer.gl;\n\n        if (!this._renderer.context.supports.vertexArrayObject)\n        {\n            throw new Error('[PixiJS] Vertex Array Objects are not supported on this device');\n        }\n\n        this.destroyAll(true);\n        const nativeVaoExtension = this._renderer.context.extensions.vertexArrayObject;\n\n        if (nativeVaoExtension)\n        {\n            gl.createVertexArray = (): WebGLVertexArrayObject =>\n                nativeVaoExtension.createVertexArrayOES();\n\n            gl.bindVertexArray = (vao): void =>\n                nativeVaoExtension.bindVertexArrayOES(vao);\n\n            gl.deleteVertexArray = (vao): void =>\n                nativeVaoExtension.deleteVertexArrayOES(vao);\n        }\n\n        const nativeInstancedExtension = this._renderer.context.extensions.vertexAttribDivisorANGLE;\n\n        if (nativeInstancedExtension)\n        {\n            gl.drawArraysInstanced = (a, b, c, d): void =>\n            {\n                nativeInstancedExtension.drawArraysInstancedANGLE(a, b, c, d);\n            };\n\n            gl.drawElementsInstanced = (a, b, c, d, e): void =>\n            {\n                nativeInstancedExtension.drawElementsInstancedANGLE(a, b, c, d, e);\n            };\n\n            gl.vertexAttribDivisor = (a, b): void =>\n                nativeInstancedExtension.vertexAttribDivisorANGLE(a, b);\n        }\n\n        this._activeGeometry = null;\n        this._activeVao = null;\n    }\n\n    /**\n     * Binds geometry so that is can be drawn. Creating a Vao if required\n     * @param geometry - Instance of geometry to bind.\n     * @param program - Instance of program to use vao for.\n     */\n    public bind(geometry?: Geometry, program?: GlProgram): void\n    {\n        // shader ||= this.renderer.shader.shader;\n\n        const gl = this.gl;\n\n        this._activeGeometry = geometry;\n\n        const vao = this.getVao(geometry, program);\n\n        if (this._activeVao !== vao)\n        {\n            this._activeVao = vao;\n\n            gl.bindVertexArray(vao);\n        }\n\n        this.updateBuffers();\n    }\n\n    /** Reset and unbind any active VAO and geometry. */\n    public resetState(): void\n    {\n        this.unbind();\n    }\n\n    /** Update buffers of the currently bound geometry. */\n    public updateBuffers(): void\n    {\n        const geometry = this._activeGeometry;\n\n        const bufferSystem = this._renderer.buffer;\n\n        for (let i = 0; i < geometry.buffers.length; i++)\n        {\n            const buffer = geometry.buffers[i];\n\n            bufferSystem.updateBuffer(buffer);\n        }\n\n        geometry._gcLastUsed = this._renderer.gc.now;\n    }\n\n    /**\n     * Check compatibility between a geometry and a program\n     * @param geometry - Geometry instance.\n     * @param program - Program instance.\n     */\n    protected checkCompatibility(geometry: Geometry, program: GlProgram): void\n    {\n        // geometry must have at least all the attributes that the shader requires.\n        const geometryAttributes = geometry.attributes;\n        const shaderAttributes = program._attributeData;\n\n        for (const j in shaderAttributes)\n        {\n            if (!geometryAttributes[j])\n            {\n                throw new Error(`shader and geometry incompatible, geometry missing the \"${j}\" attribute`);\n            }\n        }\n    }\n\n    /**\n     * Takes a geometry and program and generates a unique signature for them.\n     * @param geometry - To get signature from.\n     * @param program - To test geometry against.\n     * @returns - Unique signature of the geometry and program\n     */\n    protected getSignature(geometry: Geometry, program: GlProgram): string\n    {\n        const attribs = geometry.attributes;\n        const shaderAttributes = program._attributeData;\n\n        const strings = ['g', geometry.uid];\n\n        for (const i in attribs)\n        {\n            if (shaderAttributes[i])\n            {\n                strings.push(i, shaderAttributes[i].location);\n            }\n        }\n\n        return strings.join('-');\n    }\n\n    protected getVao(geometry: Geometry, program: GlProgram): WebGLVertexArrayObject\n    {\n        return geometry._gpuData[this._renderer.uid]?.vaoCache[program._key] || this.initGeometryVao(geometry, program);\n    }\n\n    /**\n     * Creates or gets Vao with the same structure as the geometry and stores it on the geometry.\n     * If vao is created, it is bound automatically. We use a shader to infer what and how to set up the\n     * attribute locations.\n     * @param geometry - Instance of geometry to to generate Vao for.\n     * @param program\n     * @param _incRefCount - Increment refCount of all geometry buffers.\n     */\n    protected initGeometryVao(geometry: Geometry, program: GlProgram, _incRefCount = true): WebGLVertexArrayObject\n    {\n        const gl = this._renderer.gl;\n        // const CONTEXT_UID = this.CONTEXT_UID;\n        const bufferSystem = this._renderer.buffer;\n\n        this._renderer.shader._getProgramData(program);\n\n        this.checkCompatibility(geometry, program);\n\n        const signature = this.getSignature(geometry, program);\n\n        let gpuData = geometry._gpuData[this._renderer.uid];\n\n        if (!gpuData)\n        {\n            gpuData = new GlGeometryGpuData();\n            geometry._gpuData[this._renderer.uid] = gpuData;\n            this._managedGeometries.add(geometry);\n        }\n\n        const vaoObjectHash = gpuData.vaoCache;\n        let vao = vaoObjectHash[signature];\n\n        if (vao)\n        {\n            // this will give us easy access to the vao\n            vaoObjectHash[program._key] = vao;\n\n            return vao;\n        }\n\n        ensureAttributes(geometry, program._attributeData);\n\n        const buffers = geometry.buffers;\n\n        // @TODO: We don't know if VAO is supported.\n        vao = gl.createVertexArray();\n\n        gl.bindVertexArray(vao);\n\n        // first update - and create the buffers!\n        // only create a gl buffer if it actually gets\n        for (let i = 0; i < buffers.length; i++)\n        {\n            const buffer = buffers[i];\n\n            bufferSystem.bind(buffer);\n        }\n\n        // TODO - maybe make this a data object?\n        // lets wait to see if we need to first!\n\n        this.activateVao(geometry, program);\n\n        // add it to the cache!\n        vaoObjectHash[program._key] = vao;\n        vaoObjectHash[signature] = vao;\n\n        gl.bindVertexArray(null);\n\n        return vao;\n    }\n\n    protected onGeometryUnload(geometry: Geometry, contextLost = false): void\n    {\n        const gpuData = geometry._gpuData[this._renderer.uid];\n\n        if (!gpuData) return;\n\n        const vaoCache = gpuData.vaoCache;\n\n        if (!contextLost)\n        {\n            for (const i in vaoCache)\n            {\n                if (this._activeVao !== vaoCache[i])\n                {\n                    this.resetState();\n                }\n                this.gl.deleteVertexArray(vaoCache[i]);\n            }\n        }\n    }\n\n    /**\n     * Dispose all WebGL resources of all managed geometries.\n     * @param [contextLost=false] - If context was lost, we suppress `gl.delete` calls\n     */\n    public destroyAll(contextLost = false): void\n    {\n        this._managedGeometries.removeAll(contextLost);\n    }\n\n    /**\n     * Activate vertex array object.\n     * @param geometry - Geometry instance.\n     * @param program - Shader program instance.\n     */\n    protected activateVao(geometry: Geometry, program: GlProgram): void\n    {\n        const gl = this._renderer.gl;\n\n        const bufferSystem = this._renderer.buffer;\n        const attributes = geometry.attributes;\n\n        if (geometry.indexBuffer)\n        {\n            // first update the index buffer if we have one..\n            bufferSystem.bind(geometry.indexBuffer);\n        }\n\n        let lastBuffer = null;\n\n        // add a new one!\n        for (const j in attributes)\n        {\n            const attribute = attributes[j];\n            const buffer = attribute.buffer;\n            const glBuffer = bufferSystem.getGlBuffer(buffer);\n            const programAttrib = program._attributeData[j];\n\n            if (programAttrib)\n            {\n                if (lastBuffer !== glBuffer)\n                {\n                    bufferSystem.bind(buffer);\n\n                    lastBuffer = glBuffer;\n                }\n\n                const location = programAttrib.location;\n\n                // TODO introduce state again\n                // we can optimise this for older devices that have no VAOs\n                gl.enableVertexAttribArray(location);\n\n                const attributeInfo = getAttributeInfoFromFormat(attribute.format);\n\n                const type = getGlTypeFromFormat(attribute.format);\n\n                if (programAttrib.format?.substring(1, 4) === 'int')\n                {\n                    gl.vertexAttribIPointer(location,\n                        attributeInfo.size,\n                        type,\n                        attribute.stride,\n                        attribute.offset);\n                }\n                else\n                {\n                    gl.vertexAttribPointer(location,\n                        attributeInfo.size,\n                        type,\n                        attributeInfo.normalised,\n                        attribute.stride,\n                        attribute.offset);\n                }\n\n                if (attribute.instance)\n                {\n                    // TODO calculate instance count based of this...\n                    if (this.hasInstance)\n                    {\n                        // Can't use truthiness check to determine if divisor is set,\n                        // since 0 is a valid value for divisor\n                        const divisor = attribute.divisor ?? 1;\n\n                        gl.vertexAttribDivisor(location, divisor);\n                    }\n                    else\n                    {\n                        throw new Error('geometry error, GPU Instancing is not supported on this device');\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Draws the currently bound geometry.\n     * @param topology - The type primitive to render.\n     * @param size - The number of elements to be rendered. If not specified, all vertices after the\n     *  starting vertex will be drawn.\n     * @param start - The starting vertex in the geometry to start drawing from. If not specified,\n     *  drawing will start from the first vertex.\n     * @param instanceCount - The number of instances of the set of elements to execute. If not specified,\n     *  all instances will be drawn.\n     * @returns This instance of the geometry system.\n     */\n    public draw(topology?: Topology, size?: number, start?: number, instanceCount?: number): this\n    {\n        const { gl } = this._renderer;\n        const geometry = this._activeGeometry;\n\n        const glTopology = topologyToGlMap[topology || geometry.topology];\n\n        instanceCount ??= geometry.instanceCount;\n\n        if (geometry.indexBuffer)\n        {\n            const byteSize = geometry.indexBuffer.data.BYTES_PER_ELEMENT;\n            const glType = byteSize === 2 ? gl.UNSIGNED_SHORT : gl.UNSIGNED_INT;\n\n            if (instanceCount !== 1)\n            {\n                /* eslint-disable max-len */\n                gl.drawElementsInstanced(glTopology, size || geometry.indexBuffer.data.length, glType, (start || 0) * byteSize, instanceCount);\n                /* eslint-enable max-len */\n            }\n            else\n            {\n                gl.drawElements(glTopology, size || geometry.indexBuffer.data.length, glType, (start || 0) * byteSize);\n            }\n        }\n        else if (instanceCount !== 1)\n        {\n            // TODO need a better way to calculate size..\n            gl.drawArraysInstanced(glTopology, start || 0, size || geometry.getSize(), instanceCount);\n        }\n        else\n        {\n            gl.drawArrays(glTopology, start || 0, size || geometry.getSize());\n        }\n\n        return this;\n    }\n\n    /** Unbind/reset everything. */\n    protected unbind(): void\n    {\n        this.gl.bindVertexArray(null);\n        this._activeVao = null;\n        this._activeGeometry = null;\n    }\n\n    public destroy(): void\n    {\n        this._managedGeometries.destroy();\n        this._renderer = null;\n        this.gl = null;\n        this._activeVao = null;\n        this._activeGeometry = null;\n    }\n}\n"],"names":[],"mappings":"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"}