diff --git a/src/features/encoders/jxl/worker/jxlEncode.ts b/src/features/encoders/jxl/worker/jxlEncode.ts index 40d71680..0378c2a7 100644 --- a/src/features/encoders/jxl/worker/jxlEncode.ts +++ b/src/features/encoders/jxl/worker/jxlEncode.ts @@ -14,17 +14,28 @@ import type { JXLModule } from 'codecs/jxl/enc/jxl_enc'; import type { EncodeOptions } from '../shared/meta'; import { initEmscriptenModule } from 'features/worker-utils'; -import { threads } from 'wasm-feature-detect'; +import { threads, simd } from 'wasm-feature-detect'; import wasmUrl from 'url:codecs/jxl/enc/jxl_enc.wasm'; import wasmUrlWithMT from 'url:codecs/jxl/enc/jxl_enc_mt.wasm'; import workerUrl from 'omt:codecs/jxl/enc/jxl_enc_mt.worker.js'; +import wasmUrlWithMTAndSIMD from 'url:codecs/jxl/enc/jxl_enc_mt_simd.wasm'; +import workerUrlWithSIMD from 'omt:codecs/jxl/enc/jxl_enc_mt_simd.worker.js'; + let emscriptenModule: Promise; async function init() { if (await threads()) { + if (await simd()) { + const jxlEncoder = await import('codecs/jxl/enc/jxl_enc_mt_simd'); + return initEmscriptenModule( + jxlEncoder.default, + wasmUrlWithMTAndSIMD, + workerUrlWithSIMD, + ); + } const jxlEncoder = await import('codecs/jxl/enc/jxl_enc_mt'); return initEmscriptenModule(jxlEncoder.default, wasmUrlWithMT, workerUrl); } diff --git a/src/features/encoders/webP/worker/webpEncode.ts b/src/features/encoders/webP/worker/webpEncode.ts index 1b026dd9..035c166d 100644 --- a/src/features/encoders/webP/worker/webpEncode.ts +++ b/src/features/encoders/webP/worker/webpEncode.ts @@ -14,12 +14,18 @@ import type { WebPModule } from 'codecs/webp/enc/webp_enc'; import type { EncodeOptions } from '../shared/meta'; import { initEmscriptenModule } from 'features/worker-utils'; +import { simd } from 'wasm-feature-detect'; import wasmUrl from 'url:codecs/webp/enc/webp_enc.wasm'; +import wasmUrlWithSIMD from 'url:codecs/webp/enc/webp_enc_simd.wasm'; let emscriptenModule: Promise; async function init() { + if (await simd()) { + const webpEncoder = await import('codecs/webp/enc/webp_enc_simd'); + return initEmscriptenModule(webpEncoder.default, wasmUrlWithSIMD); + } const webpEncoder = await import('codecs/webp/enc/webp_enc'); return initEmscriptenModule(webpEncoder.default, wasmUrl); } diff --git a/src/features/encoders/wp2/worker/wp2Encode.ts b/src/features/encoders/wp2/worker/wp2Encode.ts index f59478b1..1c12573b 100644 --- a/src/features/encoders/wp2/worker/wp2Encode.ts +++ b/src/features/encoders/wp2/worker/wp2Encode.ts @@ -14,17 +14,28 @@ import type { WP2Module } from 'codecs/wp2/enc/wp2_enc'; import type { EncodeOptions } from '../shared/meta'; import { initEmscriptenModule } from 'features/worker-utils'; -import { threads } from 'wasm-feature-detect'; +import { threads, simd } from 'wasm-feature-detect'; import wasmUrl from 'url:codecs/wp2/enc/wp2_enc.wasm'; import wasmUrlWithMT from 'url:codecs/wp2/enc/wp2_enc_mt.wasm'; import workerUrl from 'omt:codecs/wp2/enc/wp2_enc_mt.worker.js'; +import wasmUrlWithMTAndSIMD from 'url:codecs/wp2/enc/wp2_enc_mt_simd.wasm'; +import workerUrlWithSIMD from 'omt:codecs/wp2/enc/wp2_enc_mt_simd.worker.js'; + let emscriptenModule: Promise; async function init() { if (await threads()) { + if (await simd()) { + const wp2Encoder = await import('codecs/wp2/enc/wp2_enc_mt_simd'); + return initEmscriptenModule( + wp2Encoder.default, + wasmUrlWithMTAndSIMD, + workerUrlWithSIMD, + ); + } const wp2Encoder = await import('codecs/wp2/enc/wp2_enc_mt'); return initEmscriptenModule(wp2Encoder.default, wasmUrlWithMT, workerUrl); } diff --git a/src/sw/to-cache.ts b/src/sw/to-cache.ts index dace22e2..cbc922f5 100644 --- a/src/sw/to-cache.ts +++ b/src/sw/to-cache.ts @@ -1,4 +1,4 @@ -import { threads } from 'wasm-feature-detect'; +import { threads, simd } from 'wasm-feature-detect'; import webpDataUrl from 'data-url:./tiny.webp'; import avifDataUrl from 'data-url:./tiny.avif'; @@ -75,6 +75,9 @@ import avifEncWasm from 'url:codecs/avif/enc/avif_enc.wasm'; import * as avifEnc from 'entry-data:codecs/avif/enc/avif_enc.js'; // JXL +import * as jxlEncMtSimdWorker from 'entry-data:codecs/jxl/enc/jxl_enc_mt_simd.worker.js'; +import * as jxlEncMtSimd from 'entry-data:codecs/jxl/enc/jxl_enc_mt_simd'; +import jxlEncMtSimdWasm from 'url:codecs/jxl/enc/jxl_enc_mt_simd.wasm'; import * as jxlEncMtWorker from 'entry-data:codecs/jxl/enc/jxl_enc_mt.worker.js'; import * as jxlEncMt from 'entry-data:codecs/jxl/enc/jxl_enc_mt'; import jxlEncMtWasm from 'url:codecs/jxl/enc/jxl_enc_mt.wasm'; @@ -86,10 +89,15 @@ import oxiMtWasm from 'url:codecs/oxipng/pkg-parallel/squoosh_oxipng_bg.wasm'; import oxiWasm from 'url:codecs/oxipng/pkg/squoosh_oxipng_bg.wasm'; // WebP +import * as webpEncSimd from 'entry-data:codecs/webp/enc/webp_enc_simd'; +import webpEncSimdWasm from 'url:codecs/webp/enc/webp_enc_simd.wasm'; import * as webpEnc from 'entry-data:codecs/webp/enc/webp_enc'; import webpEncWasm from 'url:codecs/webp/enc/webp_enc.wasm'; // WP2 +import * as wp2EncMtSimdWorker from 'entry-data:codecs/wp2/enc/wp2_enc_mt_simd.worker.js'; +import * as wp2EncMtSimd from 'entry-data:codecs/wp2/enc/wp2_enc_mt_simd'; +import wp2EncMtSimdWasm from 'url:codecs/wp2/enc/wp2_enc_mt_simd.wasm'; import * as wp2EncMtWorker from 'entry-data:codecs/wp2/enc/wp2_enc_mt.worker.js'; import * as wp2EncMt from 'entry-data:codecs/wp2/enc/wp2_enc_mt'; import wp2EncMtWasm from 'url:codecs/wp2/enc/wp2_enc_mt.wasm'; @@ -97,8 +105,14 @@ import * as wp2Enc from 'entry-data:codecs/wp2/enc/wp2_enc'; import wp2EncWasm from 'url:codecs/wp2/enc/wp2_enc.wasm'; export const theRest = (async () => { - const [supportsThreads, supportsWebP, supportsAvif] = await Promise.all([ + const [ + supportsThreads, + supportsSimd, + supportsWebP, + supportsAvif, + ] = await Promise.all([ threads(), + simd(), ...[webpDataUrl, avifDataUrl].map(async (dataUrl) => { if (!self.createImageBitmap) return false; const response = await fetch(dataUrl); @@ -139,7 +153,15 @@ export const theRest = (async () => { } // JXL - if (supportsThreads) { + if (supportsThreads && supportsSimd) { + items.push( + jxlEncMtSimdWorker.main, + ...jxlEncMtSimdWorker.deps, + jxlEncMtSimd.main, + ...jxlEncMtSimd.deps, + jxlEncMtSimdWasm, + ); + } else if (supportsThreads) { items.push( jxlEncMtWorker.main, ...jxlEncMtWorker.deps, @@ -159,10 +181,22 @@ export const theRest = (async () => { } // WebP - items.push(webpEnc.main, ...webpEnc.deps, webpEncWasm); + if (supportsSimd) { + items.push(webpEncSimd.main, ...webpEncSimd.deps, webpEncSimdWasm); + } else { + items.push(webpEnc.main, ...webpEnc.deps, webpEncWasm); + } // WP2 - if (supportsThreads) { + if (supportsThreads && supportsSimd) { + items.push( + wp2EncMtSimdWorker.main, + ...wp2EncMtSimdWorker.deps, + wp2EncMtSimd.main, + ...wp2EncMtSimd.deps, + wp2EncMtSimdWasm, + ); + } else if (supportsThreads) { items.push( wp2EncMtWorker.main, ...wp2EncMtWorker.deps,