remotion-dev/remotion · error · Error

Failed to create WebGL program

Error message

Failed to create WebGL program

What it means

Thrown by linkProgram in progressive-pixelate-runtime.ts when gl.createProgram() returns null after both shaders compiled. Same allocation-failure pattern as the pixelate equivalent, specific to the progressive-pixelate effect.

Source

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

	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		const log = gl.getShaderInfoLog(shader);
		gl.deleteShader(shader);
		throw new Error(
			`Progressive pixelate 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(
			`Progressive pixelate program link failed: ${log ?? '(no log)'}`,
		);
	}

	return program;
};

export const setupProgressivePixelate = (
	target: HTMLCanvasElement,

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Check `gl.isContextLost()` before mounting; remount on restore.
  2. Reduce concurrent WebGL2 effects.
  3. Use the correct Remotion Lambda Chrome layer and adequate function memory.
  4. Reproduce on stable desktop Chrome to isolate environment.
  5. Free other GPU resources before applying the effect.

Example fix

// before
setupProgressivePixelate(canvas);

// after — probe program creation
function glCanCreateProgram(gl: WebGL2RenderingContext): boolean {
  if (gl.isContextLost()) return false;
  const p = gl.createProgram();
  if (p) gl.deleteProgram(p);
  return p !== null;
}
Defensive patterns

Strategy: try-catch

Validate before calling

function glCanCreateProgram(gl: WebGL2RenderingContext): boolean {
  if (gl.isContextLost()) return false;
  const p = gl.createProgram();
  if (p) gl.deleteProgram(p);
  return p !== null;
}

Try / catch

try {
  setupProgressivePixelate(canvas);
} catch (err) {
  if (/Failed to create WebGL program/.test((err as Error).message)) {
    // remount on context restore or reduce concurrent effects
  }
  throw err;
}

Prevention

When it happens

Trigger: setupProgressivePixelate: both shaders compiled, then gl.createProgram() returns null.

Common situations: Context lost between shader compile and program creation; program-object cap reached; SwiftShader under load; many effects holding programs.

Related errors


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