瀏覽代碼

Add some helper functions

Popov72 4 年之前
父節點
當前提交
28e4b03e77
共有 1 個文件被更改,包括 27 次插入5 次删除
  1. 27 5
      src/Engines/WebGPU/webgpuBufferManager.ts

+ 27 - 5
src/Engines/WebGPU/webgpuBufferManager.ts

@@ -10,18 +10,26 @@ export class WebGPUBufferManager {
         this._device = device;
     }
 
-    public createBuffer(view: ArrayBufferView, flags: GPUBufferUsageFlags): DataBuffer {
-        const alignedLength = (view.byteLength + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)
+    public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags): GPUBuffer {
+        const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)
         const verticesBufferDescriptor = {
             size: alignedLength,
             usage: flags
         };
-        const buffer = this._device.createBuffer(verticesBufferDescriptor);
+
+        return this._device.createBuffer(verticesBufferDescriptor);
+    }
+
+    public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags): DataBuffer {
+        const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;
+        const buffer = this.createRawBuffer(viewOrSize, flags);
         const dataBuffer = new WebGPUDataBuffer(buffer);
         dataBuffer.references = 1;
-        dataBuffer.capacity = view.byteLength;
+        dataBuffer.capacity = isView ? (viewOrSize as ArrayBufferView).byteLength : viewOrSize as number;
 
-        this.setSubData(dataBuffer, 0, view);
+        if (isView) {
+            this.setSubData(dataBuffer, 0, viewOrSize as ArrayBufferView);
+        }
 
         return dataBuffer;
     }
@@ -61,4 +69,18 @@ export class WebGPUBufferManager {
         this._device.defaultQueue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, byteLength - offset);
     }
 
+    public readDataFromBuffer(buffer: GPUBuffer, size: number, offset = 0, destroyBuffer = true): Promise<Uint8Array> {
+        return new Promise((resolve, reject) => {
+            buffer.mapAsync(GPUMapMode.READ, offset, size).then(() => {
+                const copyArrayBuffer = buffer.getMappedRange(offset, size);
+                const data = new Uint8Array(size);
+                data.set(new Uint8Array(copyArrayBuffer));
+                buffer.unmap();
+                if (destroyBuffer) {
+                    buffer.destroy();
+                }
+                resolve(data);
+            }, (reason) => reject(reason));
+        });
+    }
 }