{"record":{"id":"00d692d1ca5512c8","repo":"remotion-dev/remotion","slug":"pixelate-program-link-failed-log-no-log","errorCode":null,"errorMessage":"Pixelate program link failed: ${log ?? '(no log)'}","messagePattern":"Pixelate program link failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/effects/src/pixelate.ts","lineNumber":117,"sourceCode":"};\n\nconst linkProgram = (\n\tgl: WebGL2RenderingContext,\n\tvs: WebGLShader,\n\tfs: WebGLShader,\n): WebGLProgram => {\n\tconst program = gl.createProgram();\n\tif (!program) {\n\t\tthrow new Error('Failed to create WebGL program');\n\t}\n\n\tgl.attachShader(program, vs);\n\tgl.attachShader(program, fs);\n\tgl.linkProgram(program);\n\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\tconst log = gl.getProgramInfoLog(program);\n\t\tgl.deleteProgram(program);\n\t\tthrow new Error(`Pixelate program link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nconst createPixelateState = (gl: WebGL2RenderingContext): PixelateState => {\n\tconst vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);\n\tconst fs = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\tconst program = linkProgram(gl, vs, fs);\n\tgl.deleteShader(vs);\n\tgl.deleteShader(fs);\n\n\tconst vao = gl.createVertexArray();\n\tif (!vao) {\n\t\tthrow new Error('Failed to create WebGL vertex array');\n\t}\n\n\tgl.bindVertexArray(vao);","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/pixelate.ts#L99-L135","documentation":"Thrown by linkProgram in pixelate.ts when gl.getProgramParameter(program, gl.LINK_STATUS) is false after gl.linkProgram. Both shaders compiled (otherwise 805 would have fired), so a link failure means the vertex and fragment shaders are mutually incompatible at the linker step on this driver, or the driver's linker is buggy. The program's info log is captured before deletion and included in the message.","triggerScenarios":"pixelate setup: vertex and fragment shaders both compiled, gl.linkProgram ran, LINK_STATUS is false. The thrown message includes gl.getProgramInfoLog output.","commonSituations":"Driver bug in the program linker (more common on older mobile GPUs and some virtualized GPUs); a Chrome for Testing build with a stripped or buggy GLSL linker; very rarely, a library change that introduced a vertex/fragment attribute or varying mismatch.","solutions":["Read the interpolated info log in the error — linker errors typically name unmatched varyings or unsupported precision.","Reproduce on stable desktop Chrome; success there points to the render environment.","On Lambda use the published Chrome for Testing layer; avoid custom Chromium builds.","Update or roll back the GPU driver on the failing machine.","If the linker log shows a genuine mismatch, file a Remotion issue with the log and version."],"exampleFix":"// before\nimport {pixelate} from '@remotion/effects';\nconst effect = pixelate(); // 'Pixelate program link failed: ...'\n\n// after — log driver identity for triage\ntry {\n  pixelate();\n} catch (err) {\n  const msg = (err as Error).message;\n  if (msg.includes('program link failed')) {\n    const dbg = document.createElement('canvas').getContext('webgl2')?.getExtension('WEBGL_debug_renderer_info');\n    console.error(msg, 'renderer:', dbg && document.createElement('canvas').getContext('webgl2')?.getParameter(dbg.UNMASKED_RENDERER_WEBGL));\n  }\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  pixelate();\n} catch (err) {\n  const msg = (err as Error).message;\n  if (msg.startsWith('Pixelate program link failed')) {\n    // log renderer and info log; this is a driver/library defect, not user error\n    console.error(msg);\n  }\n  throw err;\n}","preventionTips":["Capture and read the program info log from the message before any other action.","Reproduce on stable desktop Chrome to determine if the environment is at fault.","Avoid custom Chromium builds in headless rendering pipelines.","Update or roll back the GPU driver when a single machine reproduces.","Report genuine linker mismatches to Remotion with the log and version."],"tags":["webgl","glsl","pixelate","program","driver","diagnostics"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}