{"record":{"id":"c3bc252da6ddc78d","repo":"remotion-dev/remotion","slug":"failed-to-create-webgl-program-c3bc25","errorCode":null,"errorMessage":"Failed to create WebGL program","messagePattern":"Failed to create WebGL program","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/effects/src/light-leak.ts","lineNumber":212,"sourceCode":"\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\tconst log = gl.getShaderInfoLog(shader);\n\t\tgl.deleteShader(shader);\n\t\tthrow new Error(`Light leak shader compile failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn shader;\n};\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(`Light leak program link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nexport const lightLeak = createEffect<LightLeakEffectParams, LightLeakGlState>({\n\ttype: 'remotion/light-leak',\n\tlabel: 'lightLeak()',\n\tdocumentationLink: 'https://www.remotion.dev/docs/effects/light-leak',","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/light-leak.ts#L194-L230","documentation":"Thrown by `linkProgram()` in the light-leak effect when `gl.createProgram()` returns `null`. Both shaders compiled, but the program object could not be allocated — context loss or resource/object-slot exhaustion.","triggerScenarios":"Context lost between shader compile and program creation; excessive concurrent program objects; GPU memory pressure.","commonSituations":"Highly concurrent renders; long-running sessions leaking programs; memory-constrained CI/Lambda.","solutions":["Lower concurrency and reduce the number of effects per frame.","Handle `webglcontextlost` and rebuild on restore.","Restart Chrome/GPU to flush leaked GL objects.","Free unrelated WebGL contexts in the same process."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  lightLeak({...})(...);\n} catch (err) {\n  if (/Failed to create WebGL program/.test(String(err))) {\n    console.warn('lightLeak() program unavailable', err);\n  } else {\n    throw err;\n  }\n}","preventionTips":["Dispose WebGL programs between renders to prevent leaks.","Lower concurrency and effect count per frame.","Handle context-loss events before retrying."],"tags":["light-leak","webgl2","gpu","context-loss","resource-exhaustion"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}