liteTranscoder.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { Transcoder, sourceTextureFormat, transcodeTarget } from '../transcoder';
  2. import { WASMMemoryManager } from '../wasmMemoryManager';
  3. import { KTX2FileReader, IKTX2_ImageDesc } from '../ktx2FileReader';
  4. /**
  5. * @hidden
  6. */
  7. export class LiteTranscoder extends Transcoder {
  8. private _modulePath: string;
  9. private _modulePromise: Promise<{ module: any }>;
  10. private _memoryManager: WASMMemoryManager;
  11. protected _loadModule(): Promise<{ module: any }> {
  12. if (this._modulePromise) {
  13. return this._modulePromise;
  14. }
  15. this._modulePromise = WASMMemoryManager.LoadWASM(this._modulePath).then((wasmBinary) => {
  16. return new Promise((resolve) => {
  17. WebAssembly.instantiate(wasmBinary as ArrayBuffer, { env: { memory: this._memoryManager.wasmMemory } }).then((moduleWrapper) => {
  18. resolve({ module: moduleWrapper.instance.exports });
  19. });
  20. });
  21. });
  22. return this._modulePromise;
  23. }
  24. protected get memoryManager(): WASMMemoryManager {
  25. return this._memoryManager;
  26. }
  27. protected setModulePath(modulePath: string): void {
  28. this._modulePath = modulePath;
  29. }
  30. public needMemoryManager(): boolean {
  31. return true;
  32. }
  33. public setMemoryManager(memoryMgr: WASMMemoryManager): void {
  34. this._memoryManager = memoryMgr;
  35. }
  36. public transcode(src: sourceTextureFormat, dst: transcodeTarget, level: number, width: number, height: number, uncompressedByteLength: number, ktx2Reader: KTX2FileReader, imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array): Promise<Uint8Array | null> {
  37. return this._loadModule().then((moduleWrapper: any) => {
  38. const transcoder: any = moduleWrapper.module;
  39. const nBlocks = ((width + 3) >> 2) * ((height + 3) >> 2);
  40. const texMemoryPages = ((nBlocks * 16 + 65535) >> 16) + 1;
  41. const textureView = this.memoryManager.getMemoryView(texMemoryPages, 65536, nBlocks * 16);
  42. textureView.set(encodedData);
  43. return transcoder.transcode(nBlocks) === 0 ? textureView.slice() : null;
  44. });
  45. }
  46. }