{"record":{"id":"c6f27602b600bbcb","repo":"remotion-dev/remotion","slug":"glow-framebuffer-incomplete-0x-status-tostring-1","errorCode":null,"errorMessage":"Glow framebuffer incomplete: 0x${status.toString(16)}","messagePattern":"Glow framebuffer incomplete: 0x(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/effects/src/glow/glow-runtime.ts","lineNumber":287,"sourceCode":"\t);\n};\n\nconst setFramebufferTexture = (\n\tgl: WebGL2RenderingContext,\n\tframebuffer: WebGLFramebuffer,\n\ttexture: WebGLTexture,\n): void => {\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\ttexture,\n\t\t0,\n\t);\n\tconst status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\tif (status !== gl.FRAMEBUFFER_COMPLETE) {\n\t\tthrow new Error(`Glow framebuffer incomplete: 0x${status.toString(16)}`);\n\t}\n};\n\nconst setBlurUniforms = ({\n\tgl,\n\tuniforms,\n\tradius,\n\twidth,\n\theight,\n}: {\n\treadonly gl: WebGL2RenderingContext;\n\treadonly uniforms: GlowState['horizontal'];\n\treadonly radius: number;\n\treadonly width: number;\n\treadonly height: number;\n}): void => {\n\tif (uniforms.uSource) gl.uniform1i(uniforms.uSource, 0);\n\tif (uniforms.uRadius) gl.uniform1f(uniforms.uRadius, radius);","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/glow/glow-runtime.ts#L269-L305","documentation":"Thrown by the Glow effect after attaching a texture to a framebuffer and calling checkFramebufferStatus, when the status is not FRAMEBUFFER_COMPLETE. The hex code in the message (e.g. 0x8cd6, 0x8cdd, 0x8cd9) identifies the specific incompleteness reason per the WebGL spec. The library throws because rendering into an incomplete framebuffer would silently produce no output, so it fails fast.","triggerScenarios":"Called during Glow effect setup/apply when the glow ping-pong textures (textureSource/textureGlowA/textureGlowB) are sized via setTextureSize with dimensions the implementation rejects. Concretely: width or height of 0, dimensions exceeding GL_MAX_TEXTURE_SIZE/ MAX_RENDERBUFFER_SIZE, an RGBA/UNSIGNED_BYTE format unsupported on the driver (FRAMEBUFFER_UNSUPPORTED = 0x8cdd), or a lost context.","commonSituations":"Rendering at 0x0 dimensions, a composition sized larger than the GPU's max texture size (common on integrated GPUs / older mobile), a context-loss event mid-render, or a driver/GPU that refuses the RGBA+UNSIGNED_BYTE combo for render targets. Headless Chrome with SwiftShader may also report 0x8cdd for large buffers.","solutions":["Read the hex: 0x8cd6 = INCOMPLETE_ATTACHMENT (check texture format/dims), 0x8cd9 = DIMENSIONS_MISMATCH, 0x8cdd = UNSUPPORTED (driver rejects format), 0x8cd5 = INCOMPLETE_MISSING_ATTACHMENT (null texture).","Ensure the composition/video width and height are positive and within gl.getParameter(gl.MAX_TEXTURE_SIZE); clamp very large frames.","If running headless, confirm the GPU/angle backend initialized (check for earlier WebGL errors); switch to a GPU-enabled headless shell.","On suspected transient context loss, recreate the effect state and retry the frame."],"exampleFix":"// before: composition too large for the GPU\n<Sequence durationInFrames={...} compositionWidth={7680} compositionHeight={4320} />\n\n// after: stay under MAX_TEXTURE_SIZE, or render in tiles\n<Sequence durationInFrames={...} compositionWidth={3840} compositionHeight={2160} />","handlingStrategy":"try-catch","validationCode":"// Before rendering, probe max texture size and current dims\nconst max = gl.getParameter(gl.MAX_TEXTURE_SIZE);\nif (width <= 0 || height <= 0 || width > max || height > max) {\n  throw new Error(`frame dims ${width}x${height} exceed MAX_TEXTURE_SIZE ${max}`);\n}","typeGuard":"null","tryCatchPattern":"try {\n  glowEffect.apply(...);\n} catch (e) {\n  if (e instanceof Error && e.message.startsWith('Glow framebuffer incomplete')) {\n    // 0x8cdd = UNSUPPORTED: switch backend / lower resolution\n    // 0x8cd6 = INCOMPLETE_ATTACHMENT: verify texture format/dims\n    logger.error('glow framebuffer', e.message);\n  }\n  throw e;\n}","preventionTips":["Keep composition dimensions within gl.MAX_TEXTURE_SIZE.","Register webglcontextlost so transient incompleteness is handled, not fatal.","Validate width/height > 0 before applying glow.","Free glow textures on cleanup to avoid context pressure."],"tags":["webgl","glow-effect","framebuffer","gpu","rendering"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}