remotion-dev/remotion · error · Error
Pixel Dissolve program link failed: ${log ?? '(no log)'}
Error message
Pixel Dissolve program link failed: ${log ?? '(no log)'} What it means
After pixelDissolve()'s shaders are attached and gl.linkProgram runs, the driver reports LINK_STATUS=false. With fixed, separately-compiled shaders this means the program failed to link on this driver (rejected varying/precision matching) or the context is failing operations due to loss. The program info log is interpolated for diagnostics.
Source
Thrown at packages/effects/src/pixel-dissolve.ts:233
};
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;
readonly vbo: WebGLBuffer;
} => {
const vao = gl.createVertexArray();
if (!vao) {
throw new Error('Failed to create WebGL vertex array');
}
gl.bindVertexArray(vao);
View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Render on a current Chromium build with a capable GPU (or SwiftShader in CI).
- Update GPU drivers.
- Handle context loss and retry initialization on restore.
- Capture and report the interpolated info log if it reproduces on supported hardware.
Defensive patterns
Strategy: try-catch
Validate before calling
// Probe program linking capability on this GPU once at startup.
function canLinkPixelDissolveProgram(gl: WebGL2RenderingContext): boolean {
const vs = buildShader(gl, gl.VERTEX_SHADER, PIXEL_DISSOLVE_VS);
const fs = buildShader(gl, gl.FRAGMENT_SHADER, PIXEL_DISSOLVE_FS);
if (!vs || !fs) return false;
const p = gl.createProgram();
gl.attachShader(p, vs); gl.attachShader(p, fs); gl.linkProgram(p);
const ok = gl.getProgramParameter(p, gl.LINK_STATUS);
gl.deleteProgram(p);
return Boolean(ok);
} Try / catch
try {
initPixelDissolve(canvas);
} catch (err) {
if (String(err.message).startsWith('Pixel Dissolve program link failed')) {
logLinkIssue(err.message);
useNonGpuFallback();
} else throw err;
} Prevention
- Render on a current Chromium build with a capable GPU (or SwiftShader in CI).
- Update GPU drivers on render machines.
- Handle context loss and retry setup on restore.
- Report the interpolated info log if it reproduces on supported hardware.
When it happens
Trigger: linkProgram() calls gl.getProgramParameter(program, LINK_STATUS) which returns false; gl.getProgramInfoLog yields the driver's link error. Occurs during pixelDissolve effect setup.
Common situations: Driver quirk rejecting the shader pair; lost context causing link to fail; outdated mobile/virtual GPU drivers; browser GPU blacklist degrading WebGL2.
Related errors
- Pattern program link failed: ${log ?? '(no log)'}
- Noise program link failed: ${log ?? '(no log)'}
- Paper program link failed: ${log ?? '(no log)'}
- Pixel Dissolve shader compile failed: ${log ?? '(no log)'}
- Failed to create WebGL program
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/d8785cedbc38b47e.
Report an issue: GitHub.