fix: don't crash when GPU isn't available

This commit is contained in:
Maze Winther
2026-04-01 18:13:27 +02:00
parent 8a1d37cf3e
commit 93cc5d50f3
+23 -9
View File
@@ -5,17 +5,27 @@ import {
} from "opencut-wasm"; } from "opencut-wasm";
import type { EffectPass, EffectUniformValue } from "@/lib/effects/types"; import type { EffectPass, EffectUniformValue } from "@/lib/effects/types";
let initializeGpuRendererPromise: Promise<void> | null = null; let gpuAvailable = false;
let initPromise: Promise<void> | null = null;
export function initializeGpuRenderer(): Promise<void> { export function initializeGpuRenderer(): Promise<void> {
if (!initializeGpuRendererPromise) { if (!initPromise) {
initializeGpuRendererPromise = initializeGpu(); initPromise = initializeGpu()
.then(() => {
gpuAvailable = true;
})
.catch((error: unknown) => {
gpuAvailable = false;
const message =
error instanceof Error ? error.message : String(error);
console.warn(`GPU renderer unavailable: ${message}`);
});
} }
const promise = initializeGpuRendererPromise; return initPromise;
if (!promise) { }
throw new Error("GPU renderer initialization promise was not created");
} export function isGpuAvailable(): boolean {
return promise; return gpuAvailable;
} }
export const gpuRenderer = { export const gpuRenderer = {
@@ -30,7 +40,7 @@ export const gpuRenderer = {
height: number; height: number;
passes: EffectPass[]; passes: EffectPass[];
}): CanvasImageSource { }): CanvasImageSource {
if (passes.length === 0) { if (passes.length === 0 || !gpuAvailable) {
return source; return source;
} }
@@ -59,6 +69,10 @@ export const gpuRenderer = {
height: number; height: number;
feather: number; feather: number;
}): CanvasImageSource { }): CanvasImageSource {
if (!gpuAvailable) {
return maskCanvas;
}
const sourceCanvas = ensureOffscreenCanvas({ const sourceCanvas = ensureOffscreenCanvas({
source: maskCanvas, source: maskCanvas,
width, width,