@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.49 kB
JavaScript
class e{constructor(e,t,s){this.querySet=void 0,this.stagingBuffers=[],this.activeStagingBuffer=null,this.bytesPerSlot=void 0,this.device=e,this.capacity=s,this.bytesPerSlot=t?8:4;const r=e.wgpu;this.querySet=r.createQuerySet({type:t?"timestamp":"occlusion",count:s}),this.queryBuffer=r.createBuffer({size:this.bytesPerSlot*s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST})}destroy(){var e,t;null==(e=this.querySet)||e.destroy(),this.querySet=null,null==(t=this.queryBuffer)||t.destroy(),this.queryBuffer=null,this.activeStagingBuffer=null,this.stagingBuffers.forEach((e=>{e.destroy()})),this.stagingBuffers=null}getStagingBuffer(){let e=this.stagingBuffers.pop();return e||(e=this.device.wgpu.createBuffer({size:this.queryBuffer.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})),e}resolve(e){const t=this.device,s=t.wgpu.createCommandEncoder();s.resolveQuerySet(this.querySet,0,e,this.queryBuffer,0);const r=this.getStagingBuffer();this.activeStagingBuffer=r,s.copyBufferToBuffer(this.queryBuffer,0,r,0,this.bytesPerSlot*e);const u=s.finish();t.addCommandBuffer(u)}request(e,t){const s=this.activeStagingBuffer;return this.activeStagingBuffer=null,s.mapAsync(GPUMapMode.READ).then((()=>{var r;const u=new BigInt64Array(s.getMappedRange()),i=[];for(let t=0;t<e;t++)i.push(1e-6*Number(u[2*t+1]-u[2*t]));return s.unmap(),null==(r=this.stagingBuffers)||r.push(s),{renderVersion:t,timings:i}}))}}export{e as WebgpuQuerySet};