{"version":3,"file":"GpuUniformBatchPipe.mjs","sources":["../../../../src/rendering/renderers/gpu/GpuUniformBatchPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { Buffer } from '../shared/buffer/Buffer';\nimport { BufferResource } from '../shared/buffer/BufferResource';\nimport { BufferUsage } from '../shared/buffer/const';\nimport { UboBatch } from './buffer/UboBatch';\nimport { BindGroup } from './shader/BindGroup';\n\nimport type { UniformGroup } from '../shared/shader/UniformGroup';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\nconst minUniformOffsetAlignment = 128;// 256 / 2;\n\n// TODO renderStart and renderFinish - perhaps just make them instructions to fit the architecture of the\n// rest of the system\nexport class GpuUniformBatchPipe\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUPipes,\n        ],\n        name: 'uniformBatch',\n    } as const;\n\n    private _renderer: WebGPURenderer;\n\n    private _bindGroupHash: Record<number, BindGroup> = Object.create(null);\n    private readonly _batchBuffer: UboBatch;\n\n    // number of buffers..\n    private _buffers: Buffer[] = [];\n\n    private _bindGroups: BindGroup[] = [];\n    private _bufferResources: BufferResource[] = [];\n\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n\n        this._batchBuffer = new UboBatch({ minUniformOffsetAlignment });\n\n        const totalBuffers = (256 / minUniformOffsetAlignment);\n\n        for (let i = 0; i < totalBuffers; i++)\n        {\n            let usage = BufferUsage.UNIFORM | BufferUsage.COPY_DST;\n\n            if (i === 0) usage |= BufferUsage.COPY_SRC;\n\n            this._buffers.push(new Buffer({\n                data: this._batchBuffer.data,\n                usage\n            }));\n        }\n    }\n\n    public renderEnd()\n    {\n        this._uploadBindGroups();\n        this._resetBindGroups();\n    }\n\n    private _resetBindGroups()\n    {\n        for (const i in this._bindGroupHash)\n        {\n            this._bindGroupHash[i] = null;\n        }\n\n        this._batchBuffer.clear();\n    }\n\n    // just works for single bind groups for now\n    public getUniformBindGroup(group: UniformGroup<any>, duplicate: boolean): BindGroup\n    {\n        if (!duplicate && this._bindGroupHash[group.uid])\n        {\n            return this._bindGroupHash[group.uid];\n        }\n\n        this._renderer.ubo.ensureUniformGroup(group);\n\n        const data = group.buffer.data as Float32Array;\n\n        const offset = this._batchBuffer.addEmptyGroup(data.length);\n\n        this._renderer.ubo.syncUniformGroup(group, this._batchBuffer.data, offset / 4);\n\n        this._bindGroupHash[group.uid] = this._getBindGroup(offset / minUniformOffsetAlignment);\n\n        return this._bindGroupHash[group.uid];\n    }\n\n    public getUboResource(group: UniformGroup<any>): BufferResource\n    {\n        this._renderer.ubo.updateUniformGroup(group);\n\n        const data = group.buffer.data as Float32Array;\n\n        const offset = this._batchBuffer.addGroup(data);\n\n        return this._getBufferResource(offset / minUniformOffsetAlignment);\n    }\n\n    public getArrayBindGroup(data: Float32Array): BindGroup\n    {\n        const offset = this._batchBuffer.addGroup(data);\n\n        return this._getBindGroup(offset / minUniformOffsetAlignment);\n    }\n\n    public getArrayBufferResource(data: Float32Array): BufferResource\n    {\n        const offset = this._batchBuffer.addGroup(data);\n\n        const index = offset / minUniformOffsetAlignment;\n\n        return this._getBufferResource(index);\n    }\n\n    private _getBufferResource(index: number): BufferResource\n    {\n        if (!this._bufferResources[index])\n        {\n            const buffer = this._buffers[index % 2];\n\n            this._bufferResources[index] = new BufferResource({\n                buffer,\n                offset: ((index / 2) | 0) * 256,\n                size: minUniformOffsetAlignment\n            });\n        }\n\n        return this._bufferResources[index];\n    }\n\n    private _getBindGroup(index: number): BindGroup\n    {\n        if (!this._bindGroups[index])\n        {\n            // even!\n            const bindGroup = new BindGroup({\n                0: this._getBufferResource(index),\n            });\n\n            this._bindGroups[index] = bindGroup;\n        }\n\n        return this._bindGroups[index];\n    }\n\n    private _uploadBindGroups()\n    {\n        const bufferSystem = this._renderer.buffer;\n\n        const firstBuffer = this._buffers[0];\n\n        firstBuffer.update(this._batchBuffer.byteIndex);\n\n        bufferSystem.updateBuffer(firstBuffer);\n\n        const commandEncoder = this._renderer.gpu.device.createCommandEncoder();\n\n        for (let i = 1; i < this._buffers.length; i++)\n        {\n            const buffer = this._buffers[i];\n\n            commandEncoder.copyBufferToBuffer(\n                bufferSystem.getGPUBuffer(firstBuffer),\n                minUniformOffsetAlignment,\n                bufferSystem.getGPUBuffer(buffer),\n                0,\n                this._batchBuffer.byteIndex\n            );\n        }\n\n        // TODO make a system that will que up all commands in to one array?\n        this._renderer.gpu.device.queue.submit([commandEncoder.finish()]);\n    }\n\n    public destroy()\n    {\n        for (let i = 0; i < this._bindGroups.length; i++)\n        {\n            this._bindGroups[i].destroy();\n        }\n\n        this._bindGroups = null;\n        this._bindGroupHash = null;\n\n        for (let i = 0; i < this._buffers.length; i++)\n        {\n            this._buffers[i].destroy();\n        }\n        this._buffers = null;\n\n        for (let i = 0; i < this._bufferResources.length; i++)\n        {\n            this._bufferResources[i].destroy();\n        }\n\n        this._bufferResources = null;\n\n        this._batchBuffer.destroy();\n        this._bindGroupHash = null;\n\n        this._renderer = null;\n    }\n}\n"],"names":[],"mappings":";;;;;;;;AAUA,MAAM,yBAA4B,GAAA,GAAA,CAAA;AAI3B,MAAM,mBACb,CAAA;AAAA,EAoBI,YAAY,QACZ,EAAA;AAVA,IAAQ,IAAA,CAAA,cAAA,mBAAmD,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAItE;AAAA,IAAA,IAAA,CAAQ,WAAqB,EAAC,CAAA;AAE9B,IAAA,IAAA,CAAQ,cAA2B,EAAC,CAAA;AACpC,IAAA,IAAA,CAAQ,mBAAqC,EAAC,CAAA;AAI1C,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,YAAe,GAAA,IAAI,QAAS,CAAA,EAAE,2BAA2B,CAAA,CAAA;AAE9D,IAAA,MAAM,eAAgB,GAAM,GAAA,yBAAA,CAAA;AAE5B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,YAAA,EAAc,CAClC,EAAA,EAAA;AACI,MAAI,IAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,GAAU,WAAY,CAAA,QAAA,CAAA;AAE9C,MAAA,IAAI,CAAM,KAAA,CAAA;AAAG,QAAA,KAAA,IAAS,WAAY,CAAA,QAAA,CAAA;AAElC,MAAK,IAAA,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,MAAO,CAAA;AAAA,QAC1B,IAAA,EAAM,KAAK,YAAa,CAAA,IAAA;AAAA,QACxB,KAAA;AAAA,OACH,CAAC,CAAA,CAAA;AAAA,KACN;AAAA,GACJ;AAAA,EAEO,SACP,GAAA;AACI,IAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,IAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,GAC1B;AAAA,EAEQ,gBACR,GAAA;AACI,IAAW,KAAA,MAAA,CAAA,IAAK,KAAK,cACrB,EAAA;AACI,MAAK,IAAA,CAAA,cAAA,CAAe,CAAC,CAAI,GAAA,IAAA,CAAA;AAAA,KAC7B;AAEA,IAAA,IAAA,CAAK,aAAa,KAAM,EAAA,CAAA;AAAA,GAC5B;AAAA;AAAA,EAGO,mBAAA,CAAoB,OAA0B,SACrD,EAAA;AACI,IAAA,IAAI,CAAC,SAAa,IAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,GAAG,CAC/C,EAAA;AACI,MAAO,OAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,KACxC;AAEA,IAAK,IAAA,CAAA,SAAA,CAAU,GAAI,CAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAE3C,IAAM,MAAA,IAAA,GAAO,MAAM,MAAO,CAAA,IAAA,CAAA;AAE1B,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,aAAA,CAAc,KAAK,MAAM,CAAA,CAAA;AAE1D,IAAK,IAAA,CAAA,SAAA,CAAU,IAAI,gBAAiB,CAAA,KAAA,EAAO,KAAK,YAAa,CAAA,IAAA,EAAM,SAAS,CAAC,CAAA,CAAA;AAE7E,IAAA,IAAA,CAAK,eAAe,KAAM,CAAA,GAAG,IAAI,IAAK,CAAA,aAAA,CAAc,SAAS,yBAAyB,CAAA,CAAA;AAEtF,IAAO,OAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,GACxC;AAAA,EAEO,eAAe,KACtB,EAAA;AACI,IAAK,IAAA,CAAA,SAAA,CAAU,GAAI,CAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAE3C,IAAM,MAAA,IAAA,GAAO,MAAM,MAAO,CAAA,IAAA,CAAA;AAE1B,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAE9C,IAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,GAAS,yBAAyB,CAAA,CAAA;AAAA,GACrE;AAAA,EAEO,kBAAkB,IACzB,EAAA;AACI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAE9C,IAAO,OAAA,IAAA,CAAK,aAAc,CAAA,MAAA,GAAS,yBAAyB,CAAA,CAAA;AAAA,GAChE;AAAA,EAEO,uBAAuB,IAC9B,EAAA;AACI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAE9C,IAAA,MAAM,QAAQ,MAAS,GAAA,yBAAA,CAAA;AAEvB,IAAO,OAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA,CAAA;AAAA,GACxC;AAAA,EAEQ,mBAAmB,KAC3B,EAAA;AACI,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAiB,CAAA,KAAK,CAChC,EAAA;AACI,MAAA,MAAM,MAAS,GAAA,IAAA,CAAK,QAAS,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AAEtC,MAAA,IAAA,CAAK,gBAAiB,CAAA,KAAK,CAAI,GAAA,IAAI,cAAe,CAAA;AAAA,QAC9C,MAAA;AAAA,QACA,MAAA,EAAA,CAAU,KAAQ,GAAA,CAAA,GAAK,CAAK,IAAA,GAAA;AAAA,QAC5B,IAAM,EAAA,yBAAA;AAAA,OACT,CAAA,CAAA;AAAA,KACL;AAEA,IAAO,OAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA,CAAA;AAAA,GACtC;AAAA,EAEQ,cAAc,KACtB,EAAA;AACI,IAAA,IAAI,CAAC,IAAA,CAAK,WAAY,CAAA,KAAK,CAC3B,EAAA;AAEI,MAAM,MAAA,SAAA,GAAY,IAAI,SAAU,CAAA;AAAA,QAC5B,CAAA,EAAG,IAAK,CAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,OACnC,CAAA,CAAA;AAED,MAAK,IAAA,CAAA,WAAA,CAAY,KAAK,CAAI,GAAA,SAAA,CAAA;AAAA,KAC9B;AAEA,IAAO,OAAA,IAAA,CAAK,YAAY,KAAK,CAAA,CAAA;AAAA,GACjC;AAAA,EAEQ,iBACR,GAAA;AACI,IAAM,MAAA,YAAA,GAAe,KAAK,SAAU,CAAA,MAAA,CAAA;AAEpC,IAAM,MAAA,WAAA,GAAc,IAAK,CAAA,QAAA,CAAS,CAAC,CAAA,CAAA;AAEnC,IAAY,WAAA,CAAA,MAAA,CAAO,IAAK,CAAA,YAAA,CAAa,SAAS,CAAA,CAAA;AAE9C,IAAA,YAAA,CAAa,aAAa,WAAW,CAAA,CAAA;AAErC,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,OAAO,oBAAqB,EAAA,CAAA;AAEtE,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,QAAA,CAAS,QAAQ,CAC1C,EAAA,EAAA;AACI,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,QAAA,CAAS,CAAC,CAAA,CAAA;AAE9B,MAAe,cAAA,CAAA,kBAAA;AAAA,QACX,YAAA,CAAa,aAAa,WAAW,CAAA;AAAA,QACrC,yBAAA;AAAA,QACA,YAAA,CAAa,aAAa,MAAM,CAAA;AAAA,QAChC,CAAA;AAAA,QACA,KAAK,YAAa,CAAA,SAAA;AAAA,OACtB,CAAA;AAAA,KACJ;AAGA,IAAK,IAAA,CAAA,SAAA,CAAU,IAAI,MAAO,CAAA,KAAA,CAAM,OAAO,CAAC,cAAA,CAAe,MAAO,EAAC,CAAC,CAAA,CAAA;AAAA,GACpE;AAAA,EAEO,OACP,GAAA;AACI,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,WAAA,CAAY,QAAQ,CAC7C,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,WAAA,CAAY,CAAC,CAAA,CAAE,OAAQ,EAAA,CAAA;AAAA,KAChC;AAEA,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAEtB,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,QAAA,CAAS,QAAQ,CAC1C,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,QAAA,CAAS,CAAC,CAAA,CAAE,OAAQ,EAAA,CAAA;AAAA,KAC7B;AACA,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,gBAAA,CAAiB,QAAQ,CAClD,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,gBAAA,CAAiB,CAAC,CAAA,CAAE,OAAQ,EAAA,CAAA;AAAA,KACrC;AAEA,IAAA,IAAA,CAAK,gBAAmB,GAAA,IAAA,CAAA;AAExB,IAAA,IAAA,CAAK,aAAa,OAAQ,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAEtB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,GACrB;AACJ,CAAA;AAAA;AAlMa,mBAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,WAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,cAAA;AACV,CAAA;;;;"}