playcanvas
Version:
PlayCanvas WebGL game engine
43 lines (40 loc) • 1.42 kB
JavaScript
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 };