Files
hyperframes/packages/cli/src/browser/gpuPolicy.ts
T
James Russo 3a6b7f0612 fix: align local WebGPU capture behavior (#2907)
* fix: align local WebGPU capture behavior

* fix: address WebGPU capture review feedback

* fix: retain overlapping GPU seek work

* fix: satisfy runtime seek completion types

* fix: drain concurrent GPU seek work

* fix: prevent WebGPU capture barrier starvation

* fix: keep WebGPU presentation active during render seeks
2026-07-30 21:52:30 -07:00

44 lines
1.7 KiB
TypeScript

export type BrowserGpuMode = "auto" | "hardware" | "software";
export type ResolvedBrowserGpuMode = Exclude<BrowserGpuMode, "auto">;
export function resolveLocalBrowserGpuMode(
browserGpuArg?: boolean,
envMode = process.env.PRODUCER_BROWSER_GPU_MODE,
): BrowserGpuMode {
if (browserGpuArg === true) return "hardware";
if (browserGpuArg === false) return "software";
if (envMode === "hardware" || envMode === "software" || envMode === "auto") return envMode;
return "auto";
}
export async function resolveCaptureBrowserGpuMode(
requestedMode: BrowserGpuMode,
chromePath?: string,
): Promise<ResolvedBrowserGpuMode> {
const { resolveBrowserGpuMode } = await import("@hyperframes/engine");
return resolveBrowserGpuMode(requestedMode, { chromePath });
}
export function compositionRequiresWebGpu(html: string): boolean {
const compositionRoot = html.match(
/<[^>]*\bdata-composition-id(?:\s*=\s*("[^"]*"|'[^']*'|[^\s>]+))?[^>]*>/i,
);
return compositionRoot ? /\bdata-requires-webgpu(?:\s|=|>)/i.test(compositionRoot[0]) : false;
}
export function assertWebGpuRequirement(
html: string,
requestedMode: BrowserGpuMode,
resolvedMode: ResolvedBrowserGpuMode,
): void {
if (requestedMode !== "auto" || resolvedMode !== "software" || !compositionRequiresWebGpu(html)) {
return;
}
throw new Error(
"This composition declares data-requires-webgpu, but browser GPU auto-detection found no hardware GPU. " +
"Run on a WebGPU-capable host or set PRODUCER_BROWSER_GPU_MODE=hardware " +
"(or pass --browser-gpu on commands that support it) to require hardware explicitly; " +
"use --no-browser-gpu only when intentionally testing the composition's software fallback.",
);
}