UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

70 lines (69 loc) 2.44 kB
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 };