{"record":{"id":"e75e6a3e9dc3109a","repo":"remotion-dev/remotion","slug":"failed-to-create-white-balance-shader-program","errorCode":null,"errorMessage":"Failed to create white balance shader program","messagePattern":"Failed to create white balance shader program","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/white-balance.ts","lineNumber":149,"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(\n\t\t\t`White balance shader compile failed: ${log ?? '(no log)'}`,\n\t\t);\n\t}\n\n\treturn shader;\n};\n\nconst createProgram = (gl: WebGL2RenderingContext): WebGLProgram => {\n\tconst vertexShader = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);\n\tconst fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n\tconst program = gl.createProgram();\n\tif (!program) {\n\t\tthrow new Error('Failed to create white balance 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(`White balance shader link failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn program;\n};\n\nconst createTexture = (gl: WebGL2RenderingContext): WebGLTexture => {","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/white-balance.ts#L131-L167","documentation":"Thrown by createProgram() in the white balance effect when gl.createProgram() returns null. WebGL's createProgram returns null on context loss, context destruction, or resource exhaustion. The program is needed to link the compiled vertex and fragment shaders into an executable.","triggerScenarios":"Called from setupWhiteBalance() at packages/effects/src/white-balance.ts:194 via createProgram(gl) after both shaders compiled successfully. Fires when the GL context cannot allocate a program object — typically context loss or resource exhaustion after shader compilation already succeeded.","commonSituations":"Context loss mid-setup; many concurrent white balance effect instances exhausting program object slots; GPU process instability; constrained rendering environments (mobile, VM).","solutions":["Handle 'webglcontextlost'/'webglcontextrestored' and recreate the effect on a new canvas.","Reduce concurrent effects and ensure cleanup of old states (cleanup deletes the program).","Update GPU drivers or switch render backends.","Recycle render worker processes in long-running server-side rendering."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"const gl = canvas.getContext('webgl2');\nif (!gl || gl.isContextLost()) {\n  return;\n}\ntry {\n  const state = setupWhiteBalance(canvas);\n} catch (e) {\n  if ((e as Error).message === 'Failed to create white balance shader program') {\n    console.warn('White balance program allocation failed:', (e as Error).message);\n  }\n}","preventionTips":["Handle context loss/restoration events.","Clean up old white balance effect states before creating new ones.","Recycle render worker processes in long-running sessions."],"tags":["webgl","gpu","program","resource-exhaustion","white-balance-effect"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}