{"record":{"id":"68ed021ad5817044","repo":"remotion-dev/remotion","slug":"blur-framebuffer-incomplete-0x-status-tostring-1","errorCode":null,"errorMessage":"Blur framebuffer incomplete: 0x${status.toString(16)}","messagePattern":"Blur framebuffer incomplete: 0x(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/blur/blur-runtime.ts","lineNumber":187,"sourceCode":"\t\t0,\n\t\tgl.RGBA,\n\t\tgl.UNSIGNED_BYTE,\n\t\tnull,\n\t);\n\tgl.bindTexture(gl.TEXTURE_2D, null);\n\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\tgl.framebufferTexture2D(\n\t\tgl.FRAMEBUFFER,\n\t\tgl.COLOR_ATTACHMENT0,\n\t\tgl.TEXTURE_2D,\n\t\ttextureIntermediate,\n\t\t0,\n\t);\n\tconst status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\tif (status !== gl.FRAMEBUFFER_COMPLETE) {\n\t\tthrow new Error(`Blur framebuffer incomplete: 0x${status.toString(16)}`);\n\t}\n\n\treturn {\n\t\tgl,\n\t\tprogramHorizontal,\n\t\tprogramVertical,\n\t\tvao,\n\t\tvbo,\n\t\ttextureSource,\n\t\ttextureIntermediate,\n\t\tframebuffer,\n\t\thorizontal: getBlurUniforms(gl, programHorizontal),\n\t\tvertical: getBlurUniforms(gl, programVertical),\n\t};\n};\n\nexport const cleanupBlur = (state: BlurState): void => {\n\tconst {","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/blur/blur-runtime.ts#L169-L205","documentation":"Thrown by `setupBlur` after the intermediate framebuffer is assembled and `gl.checkFramebufferStatus(gl.FRAMEBUFFER)` returns a value other than FRAMEBUFFER_COMPLETE. The hex status code is embedded (e.g. 0x8cd6 = FRAMEBUFFER_INCOMPLETE_ATTACHMENT). This is a format/config incompatibility between the intermediate texture and the framebuffer attachment, not a resource exhaustion error.","triggerScenarios":"Fires at line 186-187 when `status !== gl.FRAMEBUFFER_COMPLETE`. The FBO attaches an RGBA/UNSIGNED_BYTE texture sized to `target.width`/`target.height` (clamped to >=1).","commonSituations":"Zero-sized canvas (`width`/`height` were 0 and clamped to 1, but the attachment still fails on some drivers); driver does not support the chosen internalformat/format combo for render-to-texture; context in a degraded state; the canvas was resized to 0 before setup.","solutions":["Decode the hex status in the message (0x8cd6 incomplete attachment, 0x8cdb unsupported, 0x8cd9 dimensions mismatch) to find the cause.","Ensure the target canvas has non-zero width/height before `setupBlur`.","Update GPU drivers; FBO completeness bugs are driver-specific.","Report the status code and GL_RENDERER upstream if it persists on compliant hardware.","Reduce frame resolution to rule out max-texture-size limits."],"exampleFix":"// before: setup on an unsized canvas\nconst state = setupBlur(canvas); // canvas.width === 0\n\n// after: ensure a real size first\ncanvas.width = Math.max(1, canvas.width);\ncanvas.height = Math.max(1, canvas.height);\nconst state = setupBlur(canvas);","handlingStrategy":"validation","validationCode":"// Ensure the canvas has real dimensions before setup.\nconst w = Math.max(1, target.width | 0);\nconst h = Math.max(1, target.height | 0);\ntarget.width = w; target.height = h;\n// Optionally probe FBO completeness on a throwaway texture before committing.","typeGuard":null,"tryCatchPattern":"try {\n  const state = setupBlur(canvas);\n} catch (err) {\n  if (/framebuffer incomplete/i.test(err.message)) {\n    // decode status hex, adjust canvas size / resolution, retry\n  } else { throw err; }\n}","preventionTips":["Never call setupBlur on a zero-width/zero-height canvas.","Keep frame dimensions within the GPU's max texture size.","Log the hex status code and GL_RENDERER to triage driver-specific FBO issues."],"tags":["webgl2","framebuffer","fbo","blur","driver","completeness"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}