UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

43 lines (40 loc) 1.42 kB
import { DebugHelper } from '../../../core/debug.js'; import { DynamicBuffer } from '../dynamic-buffer.js'; class WebgpuDynamicBuffer extends DynamicBuffer { constructor(device, size, isStaging){ super(device), /** * @type {GPUBuffer} * @private */ this.buffer = null, /** * CPU access over the whole buffer. * * @type {ArrayBuffer} */ this.mappedRange = null; this.buffer = device.wgpu.createBuffer({ size: size, usage: isStaging ? GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC : GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST, mappedAtCreation: isStaging }); if (isStaging) { this.onAvailable(); } // staging buffers are not stored in vram, but add them for tracking purposes anyways device._vram.ub += size; DebugHelper.setLabel(this.buffer, `DynamicBuffer-${isStaging ? 'Staging' : 'Gpu'}`); } destroy(device) { device._vram.ub -= this.buffer.size; this.buffer.destroy(); this.buffer = null; } /** * Called when the staging buffer is mapped for writing. */ onAvailable() { // map the whole buffer this.mappedRange = this.buffer.getMappedRange(); } alloc(offset, size) { return new Int32Array(this.mappedRange, offset, size / 4); } } export { WebgpuDynamicBuffer };