{"record":{"id":"a79eab5f958e4096","repo":"remotion-dev/remotion","slug":"linear-progressive-blur-program-link-failed-log","errorCode":null,"errorMessage":"Linear progressive blur program link failed: ${log ?? '(no log)'}","messagePattern":"Linear progressive blur program link failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/effects/src/linear-progressive-blur/linear-progressive-blur-runtime.ts","lineNumber":71,"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(\n\t\t\t`Linear progressive blur program link failed: ${log ?? '(no log)'}`,\n\t\t);\n\t}\n\n\treturn program;\n};\n\nconst createProgram = (\n\tgl: WebGL2RenderingContext,\n\tvertexSource: string,\n\tfragmentSource: string,\n): WebGLProgram => {\n\tconst vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n\tconst fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n\tconst program = linkProgram(gl, vs, fs);\n\tgl.deleteShader(vs);\n\tgl.deleteShader(fs);\n\treturn program;","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/linear-progressive-blur/linear-progressive-blur-runtime.ts#L53-L89","documentation":"Thrown by linkProgram() in the linear-progressive-blur runtime when gl.linkProgram() reports non-LINK_STATUS. The driver's linker log is interpolated. Since the shipped vertex/fragment shaders compiled cleanly, a link failure indicates a driver-side linking defect (e.g. varying/uniform reconciliation) rather than user input.","triggerScenarios":"Both shaders compiled but the driver's linker rejected the combined horizontal or vertical blur program — a class of WebGL2 driver bug, or a GPU-process crash that left linking in a bad state.","commonSituations":"Buggy integrated/mobile GPU drivers, headless Linux with stripped GL, remote-render hosts with thin stacks, Chrome GPU-process crash mid-session.","solutions":["Inspect the interpolated linker log for the exact mismatch.","Restart Chrome / the worker to clear stale state and retry.","Use a software GL backend (`--gl=angle --angle-backend=swiftshader`) with deterministic linking.","Update Chrome and GPU drivers; on serverless use a Remotion Chrome layer.","If reproducible on a specific driver, file an issue with the driver string and log."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  renderWithLinearProgressiveBlur();\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Linear progressive blur program link failed')) {\n    console.error(err.message); // driver linker log\n    await withGlBackend('swiftshader', () => renderWithLinearProgressiveBlur());\n  } else throw err;\n}","preventionTips":["Use SwiftShader/ANGLE on CI/Lambda for deterministic linking.","Restart the worker after GPU-process crashes to clear stale state.","Capture the linker log when this fires.","Report reproducible driver-specific link failures to @remotion/effects."],"tags":["webgl","gpu","glsl","linker","driver"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}