{"record":{"id":"9f9e3f39d990343d","repo":"BabylonJS/Babylon.js","slug":"unable-to-create-uniform-buffer","errorCode":null,"errorMessage":"Unable to create uniform buffer","messagePattern":"Unable to create uniform buffer","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/core/src/Engines/Extensions/engine.uniformBuffer.pure.ts","lineNumber":25,"sourceCode":"import { type WebGLPipelineContext } from \"../WebGL/webGLPipelineContext\";\r\nimport { ThinEngine } from \"../../Engines/thinEngine.pure\";\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for engineUniformBuffer.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterEngineUniformBuffer(): void {\r\n    if (_Registered) {\r\n        return;\r\n    }\r\n    _Registered = true;\r\n\r\n    ThinEngine.prototype.createUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r\n        const ubo = this._gl.createBuffer();\r\n\r\n        if (!ubo) {\r\n            throw new Error(\"Unable to create uniform buffer\");\r\n        }\r\n        const result = new WebGLDataBuffer(ubo);\r\n\r\n        this.bindUniformBuffer(result);\r\n\r\n        if (elements instanceof Float32Array) {\r\n            this._gl.bufferData(this._gl.UNIFORM_BUFFER, <Float32Array>elements, this._gl.STATIC_DRAW);\r\n        } else {\r\n            this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(elements), this._gl.STATIC_DRAW);\r\n        }\r\n\r\n        this.bindUniformBuffer(null);\r\n\r\n        result.references = 1;\r\n        return result;\r\n    };\r\n\r\n    ThinEngine.prototype.createDynamicUniformBuffer = function (elements: FloatArray, _label?: string): DataBuffer {\r","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/core/src/Engines/Extensions/engine.uniformBuffer.pure.ts#L7-L43","documentation":"ThinEngine.createUniformBuffer allocates a WebGL buffer object (gl.createBuffer) to back a uniform buffer object (UBO). If the call returns null, Babylon throws this error. UBOs are used by many materials/shaders, so this failure typically surfaces when the GL context can no longer allocate buffer objects.","triggerScenarios":"Any uniform buffer creation — engine.createUniformBuffer() directly, or via UniformBuffer objects created by materials/shaders on a WebGL2 context — when gl.createBuffer() returns null (context lost or out of GPU resources).","commonSituations":"Context loss after tab backgrounding; too many UBOs/buffers allocated (memory exhaustion); calling code after engine.dispose(); drivers failing buffer allocation under memory pressure.","solutions":["Verify the context is alive (engine._gl, webglcontextlost handler) and re-create the engine if lost","Dispose unused uniform buffers/materials to free buffer objects","Wrap buffer creation in try-catch and fall back to non-UBO shader paths (disable uniform buffers)","Reduce number of simultaneous UBO-heavy materials","Update GPU drivers/browser"],"exampleFix":"// before\nconst ubo = engine.createUniformBuffer(data);\n// after\nlet ubo;\ntry {\n  ubo = engine.createUniformBuffer(data);\n} catch (e) {\n  scene.getEngine().disableUniformBuffers = true; // rebuild pipeline without UBOs\n  ubo = engine.createUniformBuffer(data);\n}","handlingStrategy":"try-catch","validationCode":"function canCreateUbo(engine) {\n  return !engine.isDisposed && !!(engine as any)._gl && typeof (engine as any)._gl.createBuffer === 'function';\n}","typeGuard":"function hasLiveContext(engine): boolean {\n  return !engine.isDisposed && !!(engine as any)._gl;\n}","tryCatchPattern":"let ubo: BABYLON.DataBuffer | null = null;\ntry {\n  ubo = engine.createUniformBuffer(data);\n} catch (e) {\n  if (String(e?.message).includes('uniform buffer')) {\n    scene.getEngine().disableUniformBuffers = true; // degrade to standard uniforms\n  } else { throw e; }\n}","preventionTips":["Listen for webglcontextlost/restored and rebuild UBO-dependent pipelines","Dispose unused materials/uniform buffers to limit buffer count","Fall back to disableUniformBuffers=true on constrained devices","Never create buffers after engine.dispose()","Profile UBO-heavy scenes on low-memory devices"],"tags":["webgl","uniform-buffer","webgl2","context-loss"],"backgroundTag":"webgl-object-creation-failed","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}