{"record":{"id":"3b64097bd8fd2183","repo":"remotion-dev/remotion","slug":"failed-to-link-program-log","errorCode":null,"errorMessage":"Failed to link program: ${log}","messagePattern":"Failed to link program: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/transitions/src/presentations/blur-slide.tsx","lineNumber":136,"sourceCode":"\nconst createProgram = (\n\tgl: WebGL2RenderingContext,\n\tfragmentShader: string,\n): WebGLProgram => {\n\tconst program = gl.createProgram();\n\tif (!program) {\n\t\tthrow new Error('Failed to create WebGL program');\n\t}\n\n\tconst vs = compileShader(gl, VERTEX_SHADER, gl.VERTEX_SHADER);\n\tconst fs = compileShader(gl, fragmentShader, gl.FRAGMENT_SHADER);\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(`Failed to link program: ${log}`);\n\t}\n\n\treturn program;\n};\n\nconst createTexture = (gl: WebGL2RenderingContext): WebGLTexture => {\n\tconst tex = gl.createTexture();\n\tif (!tex) {\n\t\tthrow new Error('Failed to create texture');\n\t}\n\n\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\tgl.texImage2D(\n\t\tgl.TEXTURE_2D,","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/remotion-dev/remotion/blob/b2f4e34732f3c6c222ea029413e22dc402218cd7/packages/transitions/src/presentations/blur-slide.tsx#L118-L154","documentation":"Thrown when gl.linkProgram() fails, i.e. the vertex and fragment shaders compiled but could not be linked together (e.g. varying mismatch, uniform conflicts, or driver limits). The program is deleted before throwing. The shader log from getProgramInfoLog() is included in the message.","triggerScenarios":"Calling blurSlide() where the VERTEX_SHADER and SLIDE/BLUR fragment shaders disagree on varyings/precision, or the GPU driver refuses to link due to limits or a driver bug.","commonSituations":"Driver-specific linking bugs (especially software renderers or older ANGLE builds); editing the shader source and introducing mismatched varyings; GPU with low uniform/varying limits.","solutions":["Read the ${log} in the message for the GLSL linker's exact complaint","Update GPU drivers / enable hardware acceleration so a capable WebGL2 driver is used","If shader sources were customized, verify varyings (names, types, precision) match between vertex and fragment shaders","Try a different browser/device to rule out a driver-specific linker bug"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"null","typeGuard":null,"tryCatchPattern":"try {\n  const slide = blurSlide(props);\n} catch (err) {\n  if (String(err).startsWith('Failed to link program')) {\n    // log full GLSL linker log, try alternate device/browser or fallback presentation\n  }\n}","preventionTips":["Do not modify the built-in shader sources unless varying declarations stay consistent","Keep GPU drivers up to date; enable hardware acceleration","Test transitions in target browsers early","Provide a DOM-based fallback presentation"],"tags":["webgl","glsl","shader"],"backgroundTag":"module-init-failed","analyzedSha":"b2f4e34732f3c6c222ea029413e22dc402218cd7","analyzedAt":"2026-09-09T13:27:51.281Z","contentChangedAt":"2026-09-09T13:27:51.281Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}