{"record":{"id":"40cdfc1871bf9807","repo":"remotion-dev/remotion","slug":"failed-to-create-lut-shader-program","errorCode":null,"errorMessage":"Failed to create LUT shader program","messagePattern":"Failed to create LUT shader program","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/effects/src/lut/lut-runtime.ts","lineNumber":54,"sourceCode":"\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\tconst log = gl.getShaderInfoLog(shader);\n\t\tgl.deleteShader(shader);\n\t\tthrow new Error(`LUT shader compile failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn shader;\n};\n\nconst createProgram = (gl: WebGL2RenderingContext): WebGLProgram => {\n\tconst vertexShader = compileShader(gl, gl.VERTEX_SHADER, LUT_VERTEX_SHADER);\n\tconst fragmentShader = compileShader(\n\t\tgl,\n\t\tgl.FRAGMENT_SHADER,\n\t\tLUT_FRAGMENT_SHADER,\n\t);\n\tconst program = gl.createProgram();\n\tif (!program) {\n\t\tthrow new Error('Failed to create LUT shader program');\n\t}\n\n\tgl.attachShader(program, vertexShader);\n\tgl.attachShader(program, fragmentShader);\n\tgl.linkProgram(program);\n\tgl.deleteShader(vertexShader);\n\tgl.deleteShader(fragmentShader);\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(`LUT shader link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nconst createSourceTexture = (gl: WebGL2RenderingContext): WebGLTexture => {","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/remotion-dev/remotion/blob/46a3a6bf13ca367376ff18bbb06dae2e87e0d068/packages/effects/src/lut/lut-runtime.ts#L36-L72","documentation":"gl.createProgram() returned null while setting up the LUT effect's WebGL program, after both shaders compiled. The browser could not allocate a program object, typically due to a lost or resource-exhausted WebGL2 context. This is distinct from a link failure (which produces the 'LUT shader link failed' message).","triggerScenarios":"setupLut -> createProgram calls gl.createProgram() and receives null: the context is lost, the program-object limit is reached, or the driver fails the allocation. Any lut() effect initialization under these conditions.","commonSituations":"Pages exceeding the browser's live WebGL context limit (commonly ~16 in Chrome); long-running Studio sessions leaking contexts; headless CI renderers running out of GPU/memory resources; GPU process crashes.","solutions":["Check canvas' 'webglcontextlost' event and reload/retry the render after 'webglcontextrestored'.","Reduce concurrent WebGL contexts on the page; close other effects/canvases before rendering.","Restart the render, browser, or the machine's GPU process to recover resources.","Ensure hardware acceleration is available (not forced software rendering) in the rendering environment."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"const gl = canvas.getContext('webgl2');\nif (!gl) throw new Error('WebGL2 unavailable');\nif (gl.isContextLost()) throw new Error('WebGL2 context already lost — retry later');","typeGuard":null,"tryCatchPattern":"try {\n  setupEffectWithLut(canvas);\n} catch (e) {\n  if (e instanceof Error && e.message === 'Failed to create LUT shader program') {\n    // release contexts / wait for webglcontextrestored, then retry once\n  } else throw e;\n}","preventionTips":["Track and close WebGL contexts to stay under the browser limit","Avoid leaking canvases in long-running Studio sessions","Ensure the CI/headless renderer has adequate GPU or software-GL memory","Check gl.isContextLost() before setting up effects and reinitialize after restore"],"tags":["webgl","gpu","context-loss","resource-exhaustion"],"backgroundTag":"module-init-failed","analyzedSha":"46a3a6bf13ca367376ff18bbb06dae2e87e0d068","analyzedAt":"2026-09-18T00:12:20.256Z","contentChangedAt":"2026-09-18T00:12:20.256Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}