{"record":{"id":"91ea1f6335593494","repo":"remotion-dev/remotion","slug":"burlap-program-link-failed-log-no-log","errorCode":null,"errorMessage":"Burlap program link failed: ${log ?? '(no log)'}","messagePattern":"Burlap program link failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/burlap.ts","lineNumber":269,"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(`Burlap program link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nconst setupBurlap = (target: HTMLCanvasElement): BurlapState => {\n\tconst gl = target.getContext('webgl2', {\n\t\tpremultipliedAlpha: true,\n\t\talpha: true,\n\t\tpreserveDrawingBuffer: true,\n\t});\n\tif (!gl) {\n\t\tthrow createWebGL2ContextError('burlap effect');\n\t}\n\n\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n\n\tconst vs = compileShader(gl, gl.VERTEX_SHADER, BURLAP_VS);","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/burlap.ts#L251-L287","documentation":"Thrown by burlap's `linkProgram` when both shaders compiled but `gl.linkProgram` produced a falsy LINK_STATUS; the info log is embedded. BURLAP_VS and BURLAP_FS use a named-attribute interface (`aPos`, `aUv`) read back via `getAttribLocation`, so a link failure typically traces to a vertex/fragment in-out mismatch, an inactive attribute, or a driver limitation.","triggerScenarios":"Fires at line 269 when `gl.getProgramParameter(program, gl.LINK_STATUS)` is falsy after `gl.linkProgram` in `setupBurlap`.","commonSituations":"Shipped shader revision with an interface mismatch (in/out names, varyings); driver rejecting uniform/attribute layout; software rasterizer with stricter linking; corrupted shader constants.","solutions":["Read the embedded info log for the precise linker diagnostic.","Update @remotion/effects — link regressions are fixed upstream.","Reproduce on another GPU/browser to detect driver-specific linking bugs.","For headless rendering, confirm hardware-backed WebGL2 and report GL_RENDERER."],"exampleFix":"// Library shader issue; capture the info log and report upstream.\nconsole.error(gl.getParameter(gl.RENDERER));","handlingStrategy":"fallback","validationCode":"// Probe linking with a minimal program before setup.\nconst p = gl.createProgram();\nif (!p) { /* skip */ }\n// attach minimal compiled vs/fs, link, check LINK_STATUS, then delete","typeGuard":null,"tryCatchPattern":"try {\n  burlap.setup(canvas);\n} catch (err) {\n  if (/Burlap program link failed/.test(err.message)) {\n    // fall back to a non-WebGL effect; report info log upstream\n  } else { throw err; }\n}","preventionTips":["Pin a known-good @remotion/effects version.","Log GL_RENDERER with errors for driver triage.","Provide a fallback effect when linking fails."],"tags":["webgl2","shader","glsl","burlap","driver","link"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}