remotion-dev/remotion · critical · Error
Failed to create WebGL program
Error message
Failed to create WebGL program
What it means
In `linkProgram`, `gl.createProgram()` returned `null`. Per the WebGL2 spec this happens on context loss or severe resource exhaustion. The vertex and fragment shaders compiled successfully beforehand, so this is an environment/resource failure, not a shader bug.
Source
Thrown at packages/brand/src/effects/metallic-swirl-effect.ts:485
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const log = gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
throw new Error(
`Metallic swirl shader compile failed: ${log ?? '(no log)'}`,
);
}
return shader;
};
const linkProgram = (
gl: WebGL2RenderingContext,
vs: WebGLShader,
fs: WebGLShader,
): WebGLProgram => {
const program = gl.createProgram();
if (!program) {
throw new Error('Failed to create WebGL program');
}
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
const log = gl.getProgramInfoLog(program);
gl.deleteProgram(program);
throw new Error(`Metallic swirl program link failed: ${log ?? '(no log)'}`);
}
return program;
};
export const metallicSwirl = createEffect<
MetallicSwirlParams,
MetallicSwirlState
>({View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Reduce the number of live effects/contexts to free GPU object slots.
- Verify the WebGL2 context is stable (listen for 'webglcontextlost').
- Update GPU drivers / use a hardware-accelerated browser.
- For batch rendering, ensure contexts are disposed between compositions.
Defensive patterns
Strategy: try-catch
Validate before calling
const supportsWebGL2 = (): boolean => {
try {
const c = document.createElement('canvas');
return !!c.getContext('webgl2');
} catch {
return false;
}
}; Type guard
const hasHealthyWebGL2 = (canvas: HTMLCanvasElement): boolean => {
const gl = canvas.getContext('webgl2');
return !!gl && !gl.isContextLost();
}; Try / catch
try {
metallicSwirl({speed: 1})(...);
} catch (err) {
if (err instanceof Error && /Failed to create WebGL program/.test(err.message)) {
// reduce effect count or fall back
} else {
throw err;
}
} Prevention
- Limit simultaneous WebGL2 effects to avoid exhausting program object slots.
- Dispose/unmount effects to free GL objects between compositions.
- Listen for 'webglcontextlost' on the canvas and recover gracefully.
- Use a hardware-accelerated browser with current GPU drivers.
When it happens
Trigger: WebGL2 context lost between shader compile and program creation; GPU memory/object limit reached after creating many effects; broken context on virtual GPUs or headless software renderers.
Common situations: Many metallic-swirl effects mounted at once; long sessions leaking programs; rendering on under-resourced or virtualized GPUs; driver instability.
Related errors
- Failed to create WebGL shader
- Failed to create WebGL vertex array
- Failed to create WebGL buffer
- Metallic swirl shader compile failed: ${log ?? '(no log)'}
- Metallic swirl program link failed: ${log ?? '(no log)'}
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/c5d209ac68d5f104.
Report an issue: GitHub.