{"version":3,"file":"UboSystem.js","sources":["../../../../../src/rendering/renderers/shared/shader/UboSystem.ts"],"sourcesContent":["import { unsafeEvalSupported } from '../../../../utils/browser/unsafeEvalSupported';\nimport { Buffer } from '../buffer/Buffer';\nimport { BufferUsage } from '../buffer/const';\n\nimport type { System } from '../system/System';\nimport type { UboElement, UboLayout, UniformData, UniformsSyncCallback } from './types';\nimport type { UniformGroup } from './UniformGroup';\n\n/** @internal */\nexport interface UboAdaptor\n{\n    createUboElements: (uniformData: UniformData[]) => UboLayout;\n    generateUboSync: (uboElements: UboElement[]) => UniformsSyncCallback;\n}\n\n/**\n * System plugin to the renderer to manage uniform buffers.\n * @category rendering\n * @advanced\n */\nexport class UboSystem implements System\n{\n    /** Cache of uniform buffer layouts and sync functions, so we don't have to re-create them */\n    private _syncFunctionHash: Record<string, {\n        layout: UboLayout,\n        syncFunction: (uniforms: Record<string, any>, data: Float32Array, dataInt32: Int32Array, offset: number) => void\n    }> = Object.create(null);\n\n    private readonly _adaptor: UboAdaptor;\n\n    constructor(adaptor: UboAdaptor)\n    {\n        this._adaptor = adaptor;\n\n        // Validation check that this environment support `new Function`\n        this._systemCheck();\n    }\n\n    /**\n     * Overridable function by `pixi.js/unsafe-eval` to silence\n     * throwing an error if platform doesn't support unsafe-evals.\n     * @private\n     */\n    private _systemCheck(): void\n    {\n        if (!unsafeEvalSupported())\n        {\n            throw new Error('Current environment does not allow unsafe-eval, '\n                 + 'please use pixi.js/unsafe-eval module to enable support.');\n        }\n    }\n\n    public ensureUniformGroup(uniformGroup: UniformGroup): void\n    {\n        const uniformData = this.getUniformGroupData(uniformGroup);\n\n        uniformGroup.buffer ||= new Buffer({\n            data: new Float32Array(uniformData.layout.size / 4),\n            usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,\n        });\n    }\n\n    public getUniformGroupData(uniformGroup: UniformGroup)\n    {\n        return this._syncFunctionHash[uniformGroup._signature] || this._initUniformGroup(uniformGroup);\n    }\n\n    private _initUniformGroup(uniformGroup: UniformGroup)\n    {\n        const uniformGroupSignature = uniformGroup._signature;\n\n        let uniformData = this._syncFunctionHash[uniformGroupSignature];\n\n        if (!uniformData)\n        {\n            const elements = Object.keys(uniformGroup.uniformStructures).map((i) => uniformGroup.uniformStructures[i]);\n\n            const layout = this._adaptor.createUboElements(elements);\n\n            const syncFunction = this._generateUboSync(layout.uboElements);\n\n            uniformData = this._syncFunctionHash[uniformGroupSignature] = {\n                layout,\n                syncFunction\n            };\n        }\n\n        return this._syncFunctionHash[uniformGroupSignature];\n    }\n\n    private _generateUboSync(\n        uboElements: UboElement[],\n    ): UniformsSyncCallback\n    {\n        return this._adaptor.generateUboSync(uboElements);\n    }\n\n    public syncUniformGroup(uniformGroup: UniformGroup, data?: Float32Array, offset?: number): boolean\n    {\n        const uniformGroupData = this.getUniformGroupData(uniformGroup);\n\n        uniformGroup.buffer ||= new Buffer({\n            data: new Float32Array(uniformGroupData.layout.size / 4),\n            usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,\n        });\n\n        let dataInt32: Int32Array = null;\n\n        if (!data)\n        {\n            data = uniformGroup.buffer.data as Float32Array;\n            dataInt32 = uniformGroup.buffer.dataInt32;\n        }\n        offset ||= 0;\n\n        uniformGroupData.syncFunction(uniformGroup.uniforms, data, dataInt32, offset);\n\n        return true;\n    }\n\n    public updateUniformGroup(uniformGroup: UniformGroup): boolean\n    {\n        if (uniformGroup.isStatic && !uniformGroup._dirtyId) return false;\n        uniformGroup._dirtyId = 0;\n\n        const synced = this.syncUniformGroup(uniformGroup);\n\n        uniformGroup.buffer.update();\n\n        return synced;\n    }\n\n    public destroy(): void\n    {\n        this._syncFunctionHash = null;\n    }\n}\n"],"names":["unsafeEvalSupported","Buffer","BufferUsage"],"mappings":"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"}