diff --git a/packages/loader/src/ktx2/KTX2Loader.ts b/packages/loader/src/ktx2/KTX2Loader.ts index f9baae5a27..9c9b48ddf8 100644 --- a/packages/loader/src/ktx2/KTX2Loader.ts +++ b/packages/loader/src/ktx2/KTX2Loader.ts @@ -24,6 +24,7 @@ import { KhronosTranscoder } from "./transcoder/KhronosTranscoder"; @resourceLoader(AssetType.KTX, ["ktx2"]) export class KTX2Loader extends Loader { + private static _isBinomialInit: boolean = false; private static _binomialLLCTranscoder: BinomialLLCTranscoder; private static _khronosTranscoder: KhronosTranscoder; private static _supportedMap = { @@ -92,6 +93,7 @@ export class KTX2Loader extends Loader { } private static _getBinomialLLCTranscoder(workerCount: number = 4) { + KTX2Loader._isBinomialInit = true; return (this._binomialLLCTranscoder ??= new BinomialLLCTranscoder(workerCount)); } @@ -102,21 +104,7 @@ export class KTX2Loader extends Loader { override initialize(engine: Engine, configuration: EngineConfiguration): Promise { if (configuration.ktx2Loader) { const options = configuration.ktx2Loader; - const priorityFormats = options.priorityFormats; - const supportedList = new Array(); - if (Array.isArray(priorityFormats[0])) { - for (let i = 0; i < priorityFormats.length; i++) { - supportedList.push( - KTX2Loader._detectSupportedFormat((engine as any)._hardwareRenderer, priorityFormats[i]) - ); - } - } else { - supportedList.push( - KTX2Loader._detectSupportedFormat((engine as any)._hardwareRenderer, priorityFormats) - ); - } - - if (supportedList.every((format) => KhronosTranscoder.transcoderMap[format])) { + if (this._isKhronosSupported(options.priorityFormats, engine)) { return KTX2Loader._getKhronosTranscoder(options.workerCount).init(); } else { return KTX2Loader._getBinomialLLCTranscoder(options.workerCount).init(); @@ -136,12 +124,12 @@ export class KTX2Loader extends Loader { const formatPriorities = item.params?.priorityFormats; const targetFormat = KTX2Loader._decideTargetFormat(resourceManager.engine, ktx2Container, formatPriorities); let transcodeResultPromise: Promise; - if (targetFormat === KTX2TargetFormat.ASTC && ktx2Container.isUASTC) { - const khronosWorker = KTX2Loader._getKhronosTranscoder(); - transcodeResultPromise = khronosWorker.init().then(() => khronosWorker.transcode(ktx2Container)); - } else { + if (KTX2Loader._isBinomialInit || !KhronosTranscoder.transcoderMap[targetFormat] || !ktx2Container.isUASTC) { const binomialLLCWorker = KTX2Loader._getBinomialLLCTranscoder(); transcodeResultPromise = binomialLLCWorker.init().then(() => binomialLLCWorker.transcode(buffer, targetFormat)); + } else { + const khronosWorker = KTX2Loader._getKhronosTranscoder(); + transcodeResultPromise = khronosWorker.init().then(() => khronosWorker.transcode(ktx2Container)); } return transcodeResultPromise.then((result) => { const { width, height, faces } = result; @@ -177,7 +165,7 @@ export class KTX2Loader extends Loader { }); } - private _getEngineTextureFormat(basisFormat: KTX2TargetFormat, transcodeResult: TranscodeResult) { + private _getEngineTextureFormat(basisFormat: KTX2TargetFormat, transcodeResult: TranscodeResult): TextureFormat { const { hasAlpha } = transcodeResult; switch (basisFormat) { case KTX2TargetFormat.ASTC: @@ -194,6 +182,32 @@ export class KTX2Loader extends Loader { return TextureFormat.R8G8B8A8; } } + + private _isKhronosSupported( + priorityFormats: KTX2TargetFormat[] | KTX2TargetFormat[][] = [ + KTX2TargetFormat.ASTC, + KTX2TargetFormat.ETC, + KTX2TargetFormat.BC7, + KTX2TargetFormat.BC1_BC3, + KTX2TargetFormat.PVRTC, + KTX2TargetFormat.R8G8B8A8 + ], + engine: any + ): boolean { + const supportedList = new Array(); + if (Array.isArray(priorityFormats[0])) { + for (let i = 0; i < priorityFormats.length; i++) { + supportedList.push( + KTX2Loader._detectSupportedFormat(engine._hardwareRenderer, priorityFormats[i]) + ); + } + } else { + supportedList.push( + KTX2Loader._detectSupportedFormat(engine._hardwareRenderer, priorityFormats) + ); + } + return supportedList.every((format) => KhronosTranscoder.transcoderMap[format]); + } } /**