浏览代码

Merge pull request #8050 from ottoville/WebGPU

replace buffer.setSubData with BufferMapped
sebavan 5 年之前
父节点
当前提交
abc5a3e4d4
共有 1 个文件被更改,包括 18 次插入9 次删除
  1. 18 9
      src/Engines/webgpuEngine.ts

+ 18 - 9
src/Engines/webgpuEngine.ts

@@ -560,16 +560,25 @@ export class WebGPUEngine extends Engine {
 
         // Chunk
         const maxChunk = 1024 * 1024 * 15;
-        let offset = 0;
-        while ((chunkEnd - (chunkStart + offset)) > maxChunk) {
-            // TODO WEBGPU. Deprecated soon to be removed... replace by mappedBuffers
-            buffer.setSubData(dstByteOffset + offset, src, srcByteOffset + offset, maxChunk);
-            offset += maxChunk;
-
+        const commandEncoder = this._device.createCommandEncoder();
+        const tempBuffers: GPUBuffer[] = [];
+        for (let offset = 0; offset < src.byteLength; offset += maxChunk) {
+            const uploadCount = Math.min(src.byteLength - offset, maxChunk);
+
+            const [uploadBuffer, uploadMapping] = this._device.createBufferMapped({
+                usage: WebGPUConstants.GPUBufferUsage_TRANSFER_SRC,
+                size: uploadCount,
+            });
+            tempBuffers.push(uploadBuffer);
+            new Uint8Array(uploadMapping).set(new Uint8Array(src.buffer, srcByteOffset + offset, uploadCount ));
+            uploadBuffer.unmap();
+            commandEncoder.copyBufferToBuffer(
+                uploadBuffer, 0,
+                buffer, dstByteOffset + offset,
+                uploadCount);
         }
-
-        // TODO WEBGPU. Deprecated soon to be removed... replace by mappedBuffers
-        buffer.setSubData(dstByteOffset + offset, src, srcByteOffset + offset, byteLength - offset);
+        this._device.defaultQueue.submit([commandEncoder.finish()]);
+        tempBuffers.forEach(buff => buff.destroy());
     }
 
     //------------------------------------------------------------------------------