Sfoglia il codice sorgente

Improve error handling

Popov72 5 anni fa
parent
commit
885a8a85f4

+ 13 - 5
ktx2Decoder/src/Transcoders/liteTranscoder.ts

@@ -17,12 +17,18 @@ export class LiteTranscoder extends Transcoder {
             return this._modulePromise;
         }
 
-        this._modulePromise = new Promise((resolve) => {
-            WASMMemoryManager.LoadWASM(this._modulePath).then((wasmBinary) => {
-                WebAssembly.instantiate(wasmBinary as ArrayBuffer, { env: { memory: this._memoryManager.wasmMemory } }).then((moduleWrapper) => {
-                    resolve({ module: moduleWrapper.instance.exports });
+        this._modulePromise = new Promise((resolve, reject) => {
+            WASMMemoryManager.LoadWASM(this._modulePath)
+                .then((wasmBinary) => {
+                    WebAssembly.instantiate(wasmBinary as ArrayBuffer, { env: { memory: this._memoryManager.wasmMemory } }).then((moduleWrapper) => {
+                        resolve({ module: moduleWrapper.instance.exports });
+                    });
+                }, (reason) => {
+                    reject(reason);
+                })
+                .catch((reason) => {
+                    reject(reason);
                 });
-            });
         });
 
         return this._modulePromise;
@@ -57,6 +63,8 @@ export class LiteTranscoder extends Transcoder {
             textureView.set(encodedData);
 
             return transcoder.transcode(nBlocks) === 0 ? textureView.slice() : null;
+        }, (reason) => {
+            throw new Error(reason);
         });
     }
 }

+ 13 - 7
ktx2Decoder/src/Transcoders/mscTranscoder.ts

@@ -30,17 +30,21 @@ export class MSCTranscoder extends Transcoder {
             return this._mscBasisTranscoderPromise;
         }
 
-        this._mscBasisTranscoderPromise = new Promise((resolve) => {
+        this._mscBasisTranscoderPromise = new Promise((resolve, reject) => {
             if (MSCTranscoder.UseFromWorkerThread) {
                 importScripts(MSCTranscoder.JSModuleURL);
             }
-            WASMMemoryManager.LoadWASM(MSCTranscoder.WasmModuleURL).then((wasmBinary) => {
-                MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => {
-                    basisModule.initTranscoders();
-                    this._mscBasisModule = basisModule;
-                    resolve();
+            WASMMemoryManager.LoadWASM(MSCTranscoder.WasmModuleURL)
+                .then((wasmBinary) => {
+                    MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => {
+                        basisModule.initTranscoders();
+                        this._mscBasisModule = basisModule;
+                        resolve();
+                    });
+                })
+                .catch((reason) => {
+                    reject(reason);
                 });
-            });
         });
 
         return this._mscBasisTranscoderPromise;
@@ -103,6 +107,8 @@ export class MSCTranscoder extends Transcoder {
             }
 
             return null;
+        }, (reason) => {
+            throw new Error(reason);
         });
     }
 }

+ 1 - 0
ktx2Decoder/src/index.ts

@@ -3,5 +3,6 @@ export * from "./ktx2FileReader";
 export * from "./transcoder";
 export * from "./transcoderManager";
 export * from "./wasmMemoryManager";
+export * from "./zstddec";
 export * from "./Misc/index";
 export * from "./Transcoders/index";

+ 15 - 10
ktx2Decoder/src/ktx2Decoder.ts

@@ -32,6 +32,7 @@ export interface IDecodedData {
     height: number;
     transcodedFormat: number;
     mipmaps: Array<IMipmap>;
+    errors?: string;
 }
 
 export interface IMipmap {
@@ -179,19 +180,23 @@ export class KTX2Decoder {
                     height: levelHeight,
                 };
 
-                const transcodedData = transcoder.transcode(srcTexFormat, targetFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData).
-                        then((data) => {
-                            mipmap.data = data;
-                            if (data) {
-                                mipmapBuffers.push(data.buffer);
-                            }
-                            return data;
+                const transcodedData = transcoder.transcode(srcTexFormat, targetFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData)
+                    .then((data) => {
+                        mipmap.data = data;
+                        if (data) {
+                            mipmapBuffers.push(data.buffer);
                         }
-                      );
-
-                mipmaps.push(mipmap);
+                        return data;
+                    })
+                    .catch((reason) => {
+                        decodedData.errors = decodedData.errors ?? "";
+                        decodedData.errors += reason + "\n";
+                        return null;
+                    });
 
                 dataPromises.push(transcodedData);
+
+                mipmaps.push(mipmap);
             }
         }
 

+ 2 - 10
ktx2Decoder/src/ktx2FileReader.ts

@@ -335,16 +335,8 @@ export class KTX2FileReader {
         return false;
     }
 
-    public needZSTDDecoder(): boolean {
-        let needZSTDDecoder = false;
-
-        for (let level = 0; level < this._header.levelCount && !needZSTDDecoder; level ++) {
-            if (this._header.supercompressionScheme === supercompressionScheme.ZStandard) {
-                needZSTDDecoder = true;
-            }
-        }
-
-        return needZSTDDecoder;
+    public get needZSTDDecoder(): boolean {
+        return this._header.supercompressionScheme === supercompressionScheme.ZStandard;
     }
 
     public static IsValid(data: ArrayBufferView): boolean {

+ 11 - 3
ktx2Decoder/src/wasmMemoryManager.ts

@@ -12,10 +12,18 @@ export class WASMMemoryManager {
 
     public static LoadWASM(path: string): Promise<ArrayBuffer> {
         if (this.LoadBinariesFromCurrentThread) {
-            return new Promise((resolve) => {
+            return new Promise((resolve, reject) => {
                 fetch(path)
-                .then((response) => response.arrayBuffer())
-                .then((wasmBinary) => resolve(wasmBinary));
+                .then((response) => {
+                    if (response.ok) {
+                        return response.arrayBuffer();
+                    }
+                    throw new Error(`Could not fetch the wasm component from "${path}": ${response.status} - ${response.statusText}`);
+                })
+                .then((wasmBinary) => resolve(wasmBinary))
+                .catch((reason) => {
+                    reject(reason);
+                });
             });
         }
 

+ 6 - 1
ktx2Decoder/src/zstddec.ts

@@ -44,7 +44,12 @@ export class ZSTDDecoder {
             // Web.
 
             init = fetch(ZSTDDecoder.WasmModuleURL)
-                .then((response) => response.arrayBuffer())
+                .then((response) => {
+                    if (response.ok) {
+                        return response.arrayBuffer();
+                    }
+                    throw new Error(`Could not fetch the wasm component for the Zstandard decompression lib: ${response.status} - ${response.statusText}`);
+                })
                 .then((arrayBuffer) => WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT))
                 .then(this._init);
 

+ 11 - 3
src/Misc/khronosTextureContainer2.ts

@@ -123,8 +123,12 @@ export class KhronosTextureContainer2 {
                                 if (!message.data.success) {
                                     reject({ message: message.data.msg });
                                 } else {
-                                    this._createTexture(message.data.decodedData, internalTexture);
-                                    resolve();
+                                    try {
+                                        this._createTexture(message.data.decodedData, internalTexture);
+                                        resolve();
+                                    } catch (err) {
+                                        reject({ message: err });
+                                    }
                                 }
                                 onComplete();
                             }
@@ -187,6 +191,10 @@ export class KhronosTextureContainer2 {
             internalTexture.format = data.transcodedFormat;
         }
 
+        if (data.errors) {
+            throw new Error("KTX2 container - could not transcode the data. " + data.errors);
+        }
+
         for (let t = 0; t < data.mipmaps.length; ++t) {
             let mipmap = data.mipmaps[t];
 
@@ -253,7 +261,7 @@ export function workerFunc(): void {
                         const buffers = [];
                         for (let mip = 0; mip < data.mipmaps.length; ++mip) {
                             const mipmap = data.mipmaps[mip];
-                            if (mipmap) {
+                            if (mipmap && mipmap.data) {
                                 buffers.push(mipmap.data.buffer);
                             }
                         }