feat(image-pipeline): add wasm simd fallback backend scaffold

This commit is contained in:
Matthias
2026-04-04 22:51:26 +02:00
parent 46b7aeb26e
commit 198090b6c0
5 changed files with 279 additions and 6 deletions

View File

@@ -0,0 +1,37 @@
import type {
BackendPipelineRequest,
BackendStepRequest,
ImagePipelineBackend,
} from "@/lib/image-pipeline/backend/backend-types";
import {
loadWasmKernelModule,
type WasmKernelModule,
} from "@/lib/image-pipeline/backend/wasm/wasm-loader";
type WasmBackendOptions = {
loadModule?: () => WasmKernelModule;
};
export function createWasmSimdBackend(options?: WasmBackendOptions): ImagePipelineBackend {
const loadModule = options?.loadModule ?? loadWasmKernelModule;
let kernelModule: WasmKernelModule | null = null;
function ensureModule(): WasmKernelModule {
if (kernelModule) {
return kernelModule;
}
kernelModule = loadModule();
return kernelModule;
}
return {
id: "wasm",
runPreviewStep(request: BackendStepRequest): void {
ensureModule().applyPreviewStep(request);
},
runFullPipeline(request: BackendPipelineRequest): void {
ensureModule().applyFullPipeline(request);
},
};
}

View File

@@ -0,0 +1,65 @@
import type {
BackendPipelineRequest,
BackendStepRequest,
} from "@/lib/image-pipeline/backend/backend-types";
import { WASM_SIMD_PROBE_MODULE } from "@/lib/image-pipeline/backend/capabilities";
import { applyPipelineStep, applyPipelineSteps } from "@/lib/image-pipeline/render-core";
export type WasmKernelModule = {
applyPreviewStep: (request: BackendStepRequest) => void;
applyFullPipeline: (request: BackendPipelineRequest) => void;
};
let cachedModule: WasmKernelModule | null = null;
function assertWasmSimdRuntimeSupport(): void {
if (typeof WebAssembly === "undefined") {
throw new Error("WebAssembly runtime is unavailable.");
}
if (typeof WebAssembly.validate !== "function") {
throw new Error("WebAssembly validation API is unavailable.");
}
if (!WebAssembly.validate(WASM_SIMD_PROBE_MODULE)) {
throw new Error("WebAssembly SIMD is unavailable.");
}
const module = new WebAssembly.Module(WASM_SIMD_PROBE_MODULE);
void new WebAssembly.Instance(module);
}
export function loadWasmKernelModule(): WasmKernelModule {
if (cachedModule) {
return cachedModule;
}
assertWasmSimdRuntimeSupport();
cachedModule = {
applyPreviewStep(request): void {
applyPipelineStep(
request.pixels,
request.step,
request.width,
request.height,
request.executionOptions,
);
},
applyFullPipeline(request): void {
applyPipelineSteps(
request.pixels,
request.steps,
request.width,
request.height,
request.executionOptions,
);
},
};
return cachedModule;
}
export function resetWasmKernelModuleCache(): void {
cachedModule = null;
}