{"version":3,"file":"GpuBufferSystem.mjs","sources":["../../../../../src/rendering/renderers/gpu/buffer/GpuBufferSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\nimport { fastCopy } from '../../shared/buffer/utils/fastCopy';\n\nimport type { Buffer } from '../../shared/buffer/Buffer';\nimport type { System } from '../../shared/system/System';\nimport type { GPU } from '../GpuDeviceSystem';\n\n/**\n * System plugin to the renderer to manage buffers.\n * @memberof rendering\n */\nexport class GpuBufferSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'buffer',\n    } as const;\n\n    protected CONTEXT_UID: number;\n    private _gpuBuffers: { [key: number]: GPUBuffer } = Object.create(null);\n    private readonly _managedBuffers: Buffer[] = [];\n\n    private _gpu: GPU;\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\n    }\n\n    public getGPUBuffer(buffer: Buffer): GPUBuffer\n    {\n        return this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);\n    }\n\n    public updateBuffer(buffer: Buffer): GPUBuffer\n    {\n        const gpuBuffer = this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);\n\n        const data = buffer.data;\n\n        // TODO this can be better...\n        if (buffer._updateID && data)\n        {\n            buffer._updateID = 0;\n\n            // make sure\n            this._gpu.device.queue.writeBuffer(\n                gpuBuffer, 0, data.buffer, 0,\n                // round to the nearest 4 bytes\n                ((buffer._updateSize || data.byteLength) + 3) & ~3\n            );\n        }\n\n        return gpuBuffer;\n    }\n\n    /** dispose all WebGL resources of all managed buffers */\n    public destroyAll(): void\n    {\n        for (const id in this._gpuBuffers)\n        {\n            this._gpuBuffers[id].destroy();\n        }\n\n        this._gpuBuffers = {};\n    }\n\n    public createGPUBuffer(buffer: Buffer): GPUBuffer\n    {\n        if (!this._gpuBuffers[buffer.uid])\n        {\n            buffer.on('update', this.updateBuffer, this);\n            buffer.on('change', this.onBufferChange, this);\n            buffer.on('destroy', this.onBufferDestroy, this);\n\n            this._managedBuffers.push(buffer);\n        }\n\n        const gpuBuffer = this._gpu.device.createBuffer(buffer.descriptor);\n\n        buffer._updateID = 0;\n\n        if (buffer.data)\n        {\n            // TODO if data is static, this can be mapped at creation\n            fastCopy(buffer.data.buffer, gpuBuffer.getMappedRange());\n\n            gpuBuffer.unmap();\n        }\n\n        this._gpuBuffers[buffer.uid] = gpuBuffer;\n\n        return gpuBuffer;\n    }\n\n    protected onBufferChange(buffer: Buffer)\n    {\n        const gpuBuffer = this._gpuBuffers[buffer.uid];\n\n        gpuBuffer.destroy();\n        buffer._updateID = 0;\n        this._gpuBuffers[buffer.uid] = this.createGPUBuffer(buffer);\n    }\n\n    /**\n     * Disposes buffer\n     * @param buffer - buffer with data\n     */\n    protected onBufferDestroy(buffer: Buffer): void\n    {\n        this._managedBuffers.splice(this._managedBuffers.indexOf(buffer), 1);\n\n        this._destroyBuffer(buffer);\n    }\n\n    public destroy(): void\n    {\n        this._managedBuffers.forEach((buffer) => this._destroyBuffer(buffer));\n\n        (this._managedBuffers as null) = null;\n\n        this._gpuBuffers = null;\n    }\n\n    private _destroyBuffer(buffer: Buffer): void\n    {\n        const gpuBuffer = this._gpuBuffers[buffer.uid];\n\n        gpuBuffer.destroy();\n\n        buffer.off('update', this.updateBuffer, this);\n        buffer.off('change', this.onBufferChange, this);\n        buffer.off('destroy', this.onBufferDestroy, this);\n\n        this._gpuBuffers[buffer.uid] = null;\n    }\n}\n\n"],"names":[],"mappings":"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"}