remotion-dev/remotion · error · Error
Failed to create program
Error message
Failed to create program
What it means
Thrown by the tv-signal-off effect's createProgram helper when gl.createProgram() returns null after both vertex and fragment shaders compiled successfully. createProgram returns null only when the GL context is lost or has exhausted its internal object table. The library aborts immediately since linking requires a valid program handle.
Source
Thrown at packages/effects/src/tv-signal-off.ts:158
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const info = gl.getShaderInfoLog(shader) ?? 'Unknown shader compile error';
gl.deleteShader(shader);
throw new Error(info);
}
return shader;
};
const createProgram = (
gl: WebGL2RenderingContext,
vertexSource: string,
fragmentSource: string,
): WebGLProgram => {
const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
const program = gl.createProgram();
if (!program) {
throw new Error('Failed to create program');
}
gl.attachShader(program, vertex);
gl.attachShader(program, fragment);
gl.linkProgram(program);
gl.deleteShader(vertex);
gl.deleteShader(fragment);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
const info = gl.getProgramInfoLog(program) ?? 'Unknown program link error';
gl.deleteProgram(program);
throw new Error(info);
}
return program;
};
const createTvSignalOffState = (View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Reduce concurrent render load to keep GL context object counts within driver limits
- Register a webglcontextlost listener and re-run the render after the context is restored
- Ensure GPU drivers are up to date and the rendering environment provides a stable GL implementation
- If rendering server-side, increase available GPU memory or switch to a GPU instance with more VRAM
Defensive patterns
Strategy: try-catch
Try / catch
try {
renderWithEffect(canvas, tvSignalOff({amount: 1}));
} catch (err) {
if (err instanceof Error && err.message === 'Failed to create program') {
// GL context lost after shader compilation — context is unrecoverable here.
// Restart the render process or browser instance.
await restartRenderProcess();
} else {
throw err;
}
} Prevention
- Listen for webglcontextlost on the rendering canvas to detect context degradation early
- Limit the number of simultaneously active WebGL2 effects to stay within driver program-object limits
- Restart browser instances periodically in long-running render workers to avoid GL state degradation
When it happens
Trigger: Both shaders in createProgram compiled without error, but gl.createProgram() returns null. This happens when the WebGL2 context transitions to a lost state between shader compilation and program creation, or when the driver refuses to allocate another program object due to resource limits.
Common situations: GPU driver crash or context loss mid-setup during a long render; headless rendering environments with SwiftShader that enforce strict object limits; running dozens of effects concurrently on a single GPU.
Related errors
- Failed to create shader
- Failed to create WebGL resources
- Failed to create WebGL shader
- Failed to create WebGL program
- Failed to create WebGL vertex array
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/fb0b2fa34560c5d3.
Report an issue: GitHub.