{"record":{"id":"1ef644450ff1ff03","repo":"remotion-dev/remotion","slug":"rings-program-link-failed-log-no-log","errorCode":null,"errorMessage":"Rings program link failed: ${log ?? '(no log)'}","messagePattern":"Rings program link failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/effects/src/rings.ts","lineNumber":308,"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(`Rings program link failed: ${log ?? '(no log)'}`);\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;\n};\n","sourceCodeStart":290,"sourceCodeEnd":326,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/rings.ts#L290-L326","documentation":"The `rings()` effect's vertex and fragment shaders compiled but `gl.linkProgram()` failed. Because both shader stages are static constants shipped together, a link failure means the WebGL2 driver produced incompatible machine code — almost always a driver/GPU bug, a non-conformant GLSL ES 3.00 implementation, or link-time resource limits (e.g. too many varyings/uniforms) being hit on constrained hardware.","triggerScenarios":"Running on a non-conformant GPU/driver (older mobile, virtualized, or software rasterizer); rendering after a GPU process crash that left the context half-alive; a patched effects package whose shader source was edited so the VS/FS varyings no longer match.","commonSituations":"Mobile WebViews; headless render servers; remote desktop; forks of `@remotion/effects` with mismatched VS/FS edits.","solutions":["Use a conformant desktop GPU with up-to-date drivers.","Reinstall `@remotion/effects` to rule out a patched shader source.","Handle context loss/restore so the program is relinked cleanly.","Report the `getProgramInfoLog` text plus renderer string (`WEBGL_debug_renderer_info`) to Remotion."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  rings()({...});\n} catch (err) {\n  if (err instanceof Error && /Rings program link failed/.test(err.message)) {\n    // log err.message (program info log) and render a fallback without the effect\n  } else {\n    throw err;\n  }\n}","preventionTips":["Use a conformant desktop GPU with current drivers.","Keep the bundled `@remotion/effects` shaders unmodified.","Handle context loss so a stale program is not re-linked.","Report persistent link failures with the renderer string."],"tags":["webgl2","rings-effect","effects","glsl","gpu","shader","linker"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}