remotion-dev/remotion · error · Error

Progressive pixelate program link failed: ${log ?? '(no log)

Error message

Progressive pixelate program link failed: ${log ?? '(no log)'}

What it means

Thrown by linkProgram in progressive-pixelate-runtime.ts when gl.getProgramParameter(program, gl.LINK_STATUS) is false. Both shaders compiled (812 would have fired otherwise), so this is a linker-stage rejection of the progressive-pixelate program on the current driver. The program info log is captured before deletion and embedded in the message.

Source

Thrown at packages/effects/src/progressive-pixelate-runtime.ts:159

};

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(
			`Progressive pixelate program link failed: ${log ?? '(no log)'}`,
		);
	}

	return program;
};

export const setupProgressivePixelate = (
	target: HTMLCanvasElement,
): ProgressivePixelateState => {
	const gl = target.getContext('webgl2', {
		premultipliedAlpha: true,
		alpha: true,
		preserveDrawingBuffer: true,
	});
	if (!gl) {
		throw createWebGL2ContextError('progressive pixelate effect');
	}

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Read the interpolated info log — linker errors cite unmatched varyings, unsupported precision, or uniform count limits.
  2. Reproduce on stable desktop Chrome; success there points to the render environment.
  3. On Lambda use the published Chrome for Testing layer.
  4. Update or roll back the GPU driver on the failing machine.
  5. If the log shows a genuine link error, file a Remotion issue with the log and version.

Example fix

// before
setupProgressivePixelate(canvas); // 'Progressive pixelate program link failed: ...'

// after — surface renderer identity alongside the link log
try {
  setupProgressivePixelate(canvas);
} catch (err) {
  const gl = canvas.getContext('webgl2');
  const dbg = gl?.getExtension('WEBGL_debug_renderer_info');
  console.error((err as Error).message, 'renderer:', dbg && gl?.getParameter(dbg.UNMASKED_RENDERER_WEBGL));
}
Defensive patterns

Strategy: try-catch

Try / catch

try {
  setupProgressivePixelate(canvas);
} catch (err) {
  const msg = (err as Error).message;
  if (msg.startsWith('Progressive pixelate program link failed')) {
    const gl = canvas.getContext('webgl2');
    const dbg = gl?.getExtension('WEBGL_debug_renderer_info');
    console.error(msg, 'renderer:', dbg && gl?.getParameter(dbg.UNMASKED_RENDERER_WEBGL));
  }
  throw err;
}

Prevention

When it happens

Trigger: setupProgressivePixelate: shaders compiled, gl.linkProgram ran, LINK_STATUS is false. The driver's linker info log is in the thrown message.

Common situations: Driver linker bug; Chrome for Testing with a stripped GLSL linker; very rarely, a library regression that introduced a varying/uniform mismatch between vertex and fragment shaders.

Related errors


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