Explorar o código

Defer the release of buffers

Popov72 %!s(int64=4) %!d(string=hai) anos
pai
achega
9e59cab760
Modificáronse 1 ficheiros con 8 adicións e 1 borrados
  1. 8 1
      src/Engines/webgpuEngine.ts

+ 8 - 1
src/Engines/webgpuEngine.ts

@@ -155,6 +155,7 @@ export class WebGPUEngine extends Engine {
     private _textureHelper: WebGPUTextureHelper;
     private _bufferManager: WebGPUBufferManager;
     private _deferredReleaseTextures: Array<[InternalTexture, Nullable<HardwareTextureWrapper>, Nullable<BaseTexture>, Nullable<InternalTexture>]> = [];
+    private _deferredReleaseBuffers: Array<GPUBuffer> = [];
 
     // Some of the internal state might change during the render pass.
     // This happens mainly during clear for the state
@@ -748,7 +749,7 @@ export class WebGPUEngine extends Engine {
         buffer.references--;
 
         if (buffer.references === 0) {
-            (buffer.underlyingResource as GPUBuffer).destroy();
+            this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);
             return true;
         }
 
@@ -2048,6 +2049,12 @@ export class WebGPUEngine extends Engine {
 
         this._deferredReleaseTextures.length = 0;
 
+        for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {
+            this._deferredReleaseBuffers[i].destroy();
+        }
+
+        this._deferredReleaseBuffers.length = 0;
+
         this._uploadEncoder = this._device.createCommandEncoder(this._uploadEncoderDescriptor);
         this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor);
         this._renderTargetEncoder = this._device.createCommandEncoder(this._renderTargetEncoderDescriptor);