{"record":{"id":"af7717f49188b4f5","repo":"BabylonJS/Babylon.js","slug":"unable-to-create-transform-feedback","errorCode":null,"errorMessage":"Unable to create Transform Feedback","messagePattern":"Unable to create Transform Feedback","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/core/src/Engines/Extensions/engine.transformFeedback.pure.ts","lineNumber":25,"sourceCode":"/** @internal */\r\n// eslint-disable-next-line no-var, @typescript-eslint/naming-convention\r\nexport var _forceTransformFeedbackToBundle = true;\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for engineTransformFeedback.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterEngineTransformFeedback(): void {\r\n    if (_Registered) {\r\n        return;\r\n    }\r\n    _Registered = true;\r\n\r\n    Engine.prototype.createTransformFeedback = function (): WebGLTransformFeedback {\r\n        const transformFeedback = this._gl.createTransformFeedback();\r\n        if (!transformFeedback) {\r\n            throw new Error(\"Unable to create Transform Feedback\");\r\n        }\r\n        return transformFeedback;\r\n    };\r\n\r\n    Engine.prototype.deleteTransformFeedback = function (value: WebGLTransformFeedback): void {\r\n        this._gl.deleteTransformFeedback(value);\r\n    };\r\n\r\n    Engine.prototype.bindTransformFeedback = function (value: Nullable<WebGLTransformFeedback>): void {\r\n        this._gl.bindTransformFeedback(this._gl.TRANSFORM_FEEDBACK, value);\r\n    };\r\n\r\n    Engine.prototype.beginTransformFeedback = function (usePoints: boolean = true): void {\r\n        this._gl.beginTransformFeedback(usePoints ? this._gl.POINTS : this._gl.TRIANGLES);\r\n    };\r\n\r\n    Engine.prototype.endTransformFeedback = function (): void {\r\n        this._gl.endTransformFeedback();\r","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/core/src/Engines/Extensions/engine.transformFeedback.pure.ts#L7-L43","documentation":"Engine.createTransformFeedback wraps gl.createTransformFeedback() to allocate a WebGL2 transform feedback object used by GPU particle/compute-style pipelines. If the GL call returns null (context lost or non-compliant driver), Babylon throws this error rather than returning an invalid handle.","triggerScenarios":"Calling engine.createTransformFeedback() (directly, or indirectly via transform-feedback-based features such as GPU-driven workflows) when gl.createTransformFeedback() returns null.","commonSituations":"WebGL2 context loss during heavy GPU particle usage; drivers returning null transform feedback objects; running after a GPU reset; engines downgraded to WebGL1 where the API path is invalid.","solutions":["Handle webglcontextlost and re-create the engine before retrying","Wrap createTransformFeedback in try-catch and fall back to non-transform-feedback paths","Ensure the page uses WebGL2 (check engine.webGLVersion === 2)","Update GPU drivers/browser","Reduce GPU load that may be triggering resets"],"exampleFix":"// before\nconst tf = engine.createTransformFeedback();\n// after\nlet tf = null;\ntry {\n  tf = engine.createTransformFeedback();\n} catch (e) {\n  // degrade to CPU path\n}","handlingStrategy":"try-catch","validationCode":"function canUseTransformFeedback(engine) {\n  return !engine.isDisposed && engine.webGLVersion >= 2 && !!(engine as any)._gl && typeof (engine as any)._gl.createTransformFeedback === 'function';\n}","typeGuard":"function isWebGL2Engine(engine): boolean {\n  return !engine.isDisposed && (engine as any).webGLVersion >= 2;\n}","tryCatchPattern":"let tf: WebGLTransformFeedback | null = null;\ntry {\n  tf = engine.createTransformFeedback();\n} catch (e) {\n  if (String(e?.message).includes('Transform Feedback')) {\n    // fall back to CPU-side path\n  } else { throw e; }\n}","preventionTips":["Require WebGL2 before using transform feedback features","Re-create the engine after webglcontextlost/restored cycles","Wrap transform feedback setup in try-catch with CPU fallback","Avoid heavy GPU loads that trigger resets mid-frame","Keep drivers/browsers current"],"tags":["webgl","webgl2","transform-feedback","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"}