{"record":{"id":"03816d992d1ef940","repo":"remotion-dev/remotion","slug":"failed-to-create-webgl-texture-03816d","errorCode":null,"errorMessage":"Failed to create WebGL texture","messagePattern":"Failed to create WebGL texture","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/linear-gradient-tint.ts","lineNumber":255,"sourceCode":"\tgl.linkProgram(program);\n\tgl.deleteShader(vs);\n\tgl.deleteShader(fs);\n\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 gradient tint program link failed: ${log ?? '(no log)'}`,\n\t\t);\n\t}\n\n\treturn program;\n};\n\nconst createRgbaTexture = (gl: WebGL2RenderingContext): WebGLTexture => {\n\tconst texture = gl.createTexture();\n\tif (!texture) {\n\t\tthrow new Error('Failed to create WebGL texture');\n\t}\n\n\tgl.bindTexture(gl.TEXTURE_2D, texture);\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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\tgl.bindTexture(gl.TEXTURE_2D, null);\n\treturn texture;\n};\n\nconst setupLinearGradientTint = (\n\ttarget: HTMLCanvasElement,\n): LinearGradientTintState => {\n\tconst gl = target.getContext('webgl2', {\n\t\tpremultipliedAlpha: true,\n\t\talpha: true,\n\t\tpreserveDrawingBuffer: true,","sourceCodeStart":237,"sourceCodeEnd":273,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/linear-gradient-tint.ts#L237-L273","documentation":"Thrown when `gl.createTexture()` returns null while creating the source texture for linearGradientTint. Per-spec failure means context loss, OUT_OF_MEMORY, or texture-handle exhaustion — most often caused by leaking textures across repeated setups.","triggerScenarios":"Repeated setup without matching cleanup; setup on a lost context; many effects each leaking a texture.","commonSituations":"Hot-reload loops in Studio that re-setup; long Lambda sessions accumulating textures; forgetting cleanup in a custom hook.","solutions":["Always pair setup with the effect's cleanup function so textures are freed.","Cache setup keyed by params and reuse it.","Recover on `webglcontextlost`; rebuild on restore.","Cap concurrent WebGL effects per worker."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"useEffect(() => {\n  let state = null;\n  try { state = setupLinearGradientTint(canvas); } catch { state = null; }\n  return () => { if (state) cleanupLinearGradientTint(state); };\n}, []);","preventionTips":["Always call the cleanup function in useEffect teardown.","Cache setup by params; never re-allocate per frame.","Recover on context loss/restore."],"tags":["webgl","linear-gradient-tint","effects","gpu","resource-leak"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}