Browse Source

Add a transcoder manager class

Popov72 5 years ago
parent
commit
f9a1ce531e
1 changed files with 44 additions and 0 deletions
  1. 44 0
      src/Misc/KTX2/transcoderManager.ts

+ 44 - 0
src/Misc/KTX2/transcoderManager.ts

@@ -0,0 +1,44 @@
+import { transcodeTarget, sourceTextureFormat, Transcoder } from './transcoder';
+import { Nullable } from '../../types';
+import { WASMMemoryManager } from './wasmMemoryManager';
+
+/**
+ * @hidden
+ */
+export class TranscoderManager {
+
+    public static _Transcoders: Array<typeof Transcoder> = [];
+
+    public static registerTranscoder(transcoder: typeof Transcoder) {
+        TranscoderManager._Transcoders.push(transcoder);
+    }
+
+    private static _transcoderInstances: { [key: string]: Transcoder } = {};
+
+    private _wasmMemoryManager: WASMMemoryManager;
+
+    public findTranscoder(src: sourceTextureFormat, dst: transcodeTarget): Nullable<Transcoder> {
+        let transcoder: Nullable<Transcoder> = null;
+
+        for (let i = 0; i < TranscoderManager._Transcoders.length; ++i) {
+            if (TranscoderManager._Transcoders[i].CanTranscode(src, dst)) {
+                const key = sourceTextureFormat[src] + "_" + transcodeTarget[dst];
+                transcoder = TranscoderManager._transcoderInstances[key];
+                if (!transcoder) {
+                    transcoder = new TranscoderManager._Transcoders[i]();
+                    transcoder!.initialize();
+                    if (transcoder!.needMemoryManager()) {
+                        if (!this._wasmMemoryManager) {
+                            this._wasmMemoryManager = new WASMMemoryManager();
+                        }
+                        transcoder!.setMemoryManager(this._wasmMemoryManager);
+                    }
+                    TranscoderManager._transcoderInstances[key] = transcoder;
+                }
+                break;
+            }
+        }
+
+        return transcoder;
+    }
+}