remotion-dev/remotion · error · Error
Failed to create WebGL program
Error message
Failed to create WebGL program
What it means
pixelDissolve() links its compiled vertex and fragment shaders into a program. gl.createProgram() returns null only when the GL context is lost or the driver refuses allocation. This guard fails fast instead of calling attachShader/linkProgram on null.
Source
Thrown at packages/effects/src/pixel-dissolve.ts:224
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
const log = gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
throw new Error(
`Pixel Dissolve 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(`Pixel Dissolve program link failed: ${log ?? '(no log)'}`);
}
return program;
};
const createFullscreenQuad = (
gl: WebGL2RenderingContext,
): {
readonly vao: WebGLVertexArrayObject;View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Maintain a live WebGL2 context (webglcontextlost/restored handling).
- Reduce concurrent GPU effects per composition.
- Use a stable GPU or SwiftShader backend in headless rendering.
- Update GPU drivers.
Defensive patterns
Strategy: try-catch
Try / catch
try {
initPixelDissolve(canvas); // links the pixelDissolve program
} catch (err) {
if (isContextLost(canvas)) waitForRestore(canvas).then(initPixelDissolve);
else throw err;
} Prevention
- Maintain a live WebGL2 context (handle webglcontextlost/restored).
- Limit concurrent GPU effects per composition to stay under driver limits.
- Render with a stable GPU or SwiftShader backend.
- Keep GPU drivers current.
When it happens
Trigger: Reached in linkProgram() after both shaders compiled. createProgram returns null because the context was lost between compilation and program creation, during pixelDissolve setup.
Common situations: Context loss mid-setup; driver resource exhaustion on heavy compositions; GPU reset during a render batch.
Related errors
- Failed to create WebGL program
- Failed to create WebGL shader
- Failed to create WebGL texture
- Failed to create WebGL program
- Checkerboard program link failed: ${log ?? '(no log)'}
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/5a66b3c0b09b048d.
Report an issue: GitHub.