playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
70 lines (69 loc) • 2.44 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
import { TRACEID_RENDER_QUEUE } from "../../../core/constants.js";
import { Debug, DebugHelper } from "../../../core/debug.js";
class WebgpuBuffer {
constructor(usageFlags = 0) {
/**
* @type {GPUBuffer|null}
* @private
*/
__publicField(this, "buffer", null);
__publicField(this, "usageFlags", 0);
this.usageFlags = usageFlags;
}
destroy(device) {
if (this.buffer) {
device.deferDestroy(this.buffer);
this.buffer = null;
}
}
get initialized() {
return !!this.buffer;
}
loseContext() {
this.buffer = null;
}
allocate(device, size) {
Debug.assert(!this.buffer, "Buffer already allocated");
this.buffer = device.wgpu.createBuffer({
size,
usage: this.usageFlags
});
DebugHelper.setLabel(
this.buffer,
this.usageFlags & GPUBufferUsage.VERTEX ? "VertexBuffer" : this.usageFlags & GPUBufferUsage.INDEX ? "IndexBuffer" : this.usageFlags & GPUBufferUsage.UNIFORM ? "UniformBuffer" : this.usageFlags & GPUBufferUsage.STORAGE ? "StorageBuffer" : ""
);
}
/**
* @param {WebgpuGraphicsDevice} device - Graphics device.
* @param {*} storage -
*/
unlock(device, storage) {
const wgpu = device.wgpu;
if (!this.buffer) {
const size = storage.byteLength + 3 & ~3;
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);
Debug.trace(TRACEID_RENDER_QUEUE, `writeBuffer: ${this.buffer.label}`);
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
};