Просмотр исходного кода

Move the gpu buffer destroy management to the buffer manager class

Popov72 4 лет назад
Родитель
Сommit
e06b453a57
2 измененных файлов с 32 добавлено и 14 удалено
  1. 30 0
      src/Engines/WebGPU/webgpuBufferManager.ts
  2. 2 14
      src/Engines/webgpuEngine.ts

+ 30 - 0
src/Engines/WebGPU/webgpuBufferManager.ts

@@ -1,10 +1,16 @@
 import { DataBuffer } from '../../Meshes/dataBuffer';
 import { WebGPUDataBuffer } from '../../Meshes/WebGPU/webgpuDataBuffer';
+import { Nullable } from '../../types';
 
 /** @hidden */
 export class WebGPUBufferManager {
 
     private _device: GPUDevice;
+    private _deferredReleaseBuffers: Array<GPUBuffer> = [];
+
+    private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {
+        return (buffer as DataBuffer).underlyingResource === undefined;
+    }
 
     constructor(device: GPUDevice) {
         this._device = device;
@@ -84,4 +90,28 @@ export class WebGPUBufferManager {
             }, (reason) => reject(reason));
         });
     }
+
+    public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {
+        if (WebGPUBufferManager._IsGPUBuffer(buffer)) {
+            this._deferredReleaseBuffers.push(buffer);
+            return true;
+        }
+
+        buffer.references--;
+
+        if (buffer.references === 0) {
+            this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);
+            return true;
+        }
+
+        return false;
+    }
+
+    public destroyDeferredBuffers(): void {
+        for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {
+            this._deferredReleaseBuffers[i].destroy();
+        }
+
+        this._deferredReleaseBuffers.length = 0;
+   }
 }

+ 2 - 14
src/Engines/webgpuEngine.ts

@@ -163,7 +163,6 @@ 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> = [];
     private _counters: {
         numPipelineDescriptorCreation: number;
         numBindGroupsCreation: number;
@@ -808,14 +807,7 @@ export class WebGPUEngine extends Engine {
 
     /** @hidden */
     public _releaseBuffer(buffer: DataBuffer): boolean {
-        buffer.references--;
-
-        if (buffer.references === 0) {
-            this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);
-            return true;
-        }
-
-        return false;
+        return this._bufferManager.releaseBuffer(buffer);
     }
 
     //------------------------------------------------------------------------------
@@ -2428,11 +2420,7 @@ 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._bufferManager.destroyDeferredBuffers();
 
         this._uploadEncoder = this._device.createCommandEncoder(this._uploadEncoderDescriptor);
         this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor);