playcanvas
Version:
PlayCanvas WebGL game engine
48 lines (46 loc) • 1.32 kB
JavaScript
class WebgpuBuffer {
constructor(usageFlags = 0){
this.buffer = null;
this.usageFlags = 0;
this.usageFlags = usageFlags;
}
destroy(device) {
if (this.buffer) {
this.buffer.destroy();
this.buffer = null;
}
}
get initialized() {
return !!this.buffer;
}
loseContext() {}
allocate(device, size) {
this.buffer = device.wgpu.createBuffer({
size,
usage: this.usageFlags
});
}
unlock(device, storage) {
const wgpu = device.wgpu;
if (!this.buffer) {
const size = storage.byteLength + 3 & -4;
this.usageFlags |= GPUBufferUsage.COPY_DST;
this.allocate(device, size);
}
const srcOffset = storage.byteOffset ?? 0;
const srcData = new Uint8Array(storage.buffer ?? storage, srcOffset, storage.byteLength);
const data = new Uint8Array(this.buffer.size);
data.set(srcData);
wgpu.queue.writeBuffer(this.buffer, 0, data, 0, data.length);
}
read(device, offset, size, data, immediate) {
return device.readStorageBuffer(this, offset, size, data, immediate);
}
write(device, bufferOffset, data, dataOffset, size) {
device.writeStorageBuffer(this, bufferOffset, data, dataOffset, size);
}
clear(device, offset, size) {
device.clearStorageBuffer(this, offset, size);
}
}
export { WebgpuBuffer };