Преглед изворни кода

Defer the release of buffers

Popov72 пре 4 година
родитељ
комит
9e59cab760
1 измењених фајлова са 8 додато и 1 уклоњено
  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 _textureHelper: WebGPUTextureHelper;
     private _bufferManager: WebGPUBufferManager;
     private _bufferManager: WebGPUBufferManager;
     private _deferredReleaseTextures: Array<[InternalTexture, Nullable<HardwareTextureWrapper>, Nullable<BaseTexture>, Nullable<InternalTexture>]> = [];
     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.
     // Some of the internal state might change during the render pass.
     // This happens mainly during clear for the state
     // This happens mainly during clear for the state
@@ -748,7 +749,7 @@ export class WebGPUEngine extends Engine {
         buffer.references--;
         buffer.references--;
 
 
         if (buffer.references === 0) {
         if (buffer.references === 0) {
-            (buffer.underlyingResource as GPUBuffer).destroy();
+            this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);
             return true;
             return true;
         }
         }
 
 
@@ -2048,6 +2049,12 @@ export class WebGPUEngine extends Engine {
 
 
         this._deferredReleaseTextures.length = 0;
         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._uploadEncoder = this._device.createCommandEncoder(this._uploadEncoderDescriptor);
         this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor);
         this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor);
         this._renderTargetEncoder = this._device.createCommandEncoder(this._renderTargetEncoderDescriptor);
         this._renderTargetEncoder = this._device.createCommandEncoder(this._renderTargetEncoderDescriptor);