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

  1. Render on a current Chromium build with a capable GPU (or SwiftShader in CI).
  2. Update GPU drivers.
  3. Handle context loss and retry initialization on restore.
  4. 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

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


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/d8785cedbc38b47e. Report an issue: GitHub.