UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 10.4 kB
{"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/** @internal */\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 this._bindGroupHash = Object.create(null);\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\n this._renderer = null;\n }\n}\n"],"names":[],"mappings":"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"}