Files
workinf_Blender_Wasm/web/app/src/platform/capabilities.ts
mes123456 7c16b279ae
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance M7 workflows and release operations
2026-08-15 17:43:53 -04:00

60 lines
2.1 KiB
TypeScript

import {
type WasmThreadingCapabilities,
} from "../../../protocol/engine-variant";
export { gateWasmThreadingCapability, selectWebEngineVariant } from "../../../protocol/engine-variant";
export type { WasmThreadingCapabilities } from "../../../protocol/engine-variant";
export interface BrowserCapabilities extends WasmThreadingCapabilities {
webgl2: boolean;
offscreenCanvas: boolean;
opfs: boolean;
wasm: boolean;
wasmSimd: boolean;
wasmThreads: boolean;
storageEstimate: boolean;
indexedDb: boolean;
}
function supportsWasmFeature(feature: "simd" | "threads"): boolean {
if (typeof WebAssembly === "undefined") return false;
const modules: Record<typeof feature, Uint8Array> = {
simd: new Uint8Array([
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x0a, 0x0b, 0x01, 0x09, 0x00, 0xfd,
0x00, 0x00, 0x0b,
]),
threads: new Uint8Array([
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
0x00, 0x00, 0x05, 0x04, 0x01, 0x01, 0x01, 0x00, 0x0a, 0x04, 0x01, 0x02,
0x00, 0x0b,
]),
};
try {
return WebAssembly.validate(modules[feature] as BufferSource);
} catch {
return false;
}
}
export function detectBrowserCapabilities(): BrowserCapabilities {
const canvas = typeof document === "undefined" ? undefined : document.createElement("canvas");
const webgl2 = Boolean(canvas?.getContext("webgl2"));
const storage = typeof navigator === "undefined" ? undefined : navigator.storage;
return {
crossOriginIsolated: globalThis.crossOriginIsolated === true,
webgl2,
offscreenCanvas: typeof OffscreenCanvas !== "undefined",
opfs: Boolean(storage?.getDirectory),
sharedArrayBuffer: typeof SharedArrayBuffer !== "undefined",
worker: typeof Worker !== "undefined",
wasm: typeof WebAssembly !== "undefined",
wasmSimd: supportsWasmFeature("simd"),
wasmThreads: supportsWasmFeature("threads"),
storageEstimate: Boolean(storage?.estimate),
indexedDb: typeof indexedDB !== "undefined",
};
}