@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.03 kB
JavaScript
import{DynamicBuffers as e}from"../dynamic-buffers.js";import{WebgpuDynamicBuffer as f}from"./webgpu-dynamic-buffer.js";class s extends e{constructor(...e){super(...e),this.pendingStagingBuffers=[]}createBuffer(e,s,t){return new f(e,s,t)}submit(){super.submit();const e=this.usedBuffers.length;if(e){const f=this.device,s=this.gpuBuffers,t=f.wgpu.createCommandEncoder();for(let f=e-1;f>=0;f--){const e=this.usedBuffers[f],{stagingBuffer:n,gpuBuffer:u,offset:r,size:i}=e,g=n.buffer;g.unmap(),t.copyBufferToBuffer(g,r,u.buffer,r,i),s.push(u)}const n=t.finish();f.addCommandBuffer(n,!0);for(let f=0;f<e;f++){const e=this.usedBuffers[f].stagingBuffer;this.pendingStagingBuffers.push(e)}this.usedBuffers.length=0}}onCommandBuffersSubmitted(){const e=this.pendingStagingBuffers.length;if(e){for(let f=0;f<e;f++){const e=this.pendingStagingBuffers[f];e.buffer.mapAsync(GPUMapMode.WRITE).then((()=>{this.stagingBuffers&&(e.onAvailable(),this.stagingBuffers.push(e))}))}this.pendingStagingBuffers.length=0}}}export{s as WebgpuDynamicBuffers};