forge is Morph's hybrid retained compositor — a renderer that keeps pixels on the GPU between frames and repaints only what changed. It is beta: shipped and toggleable in dev, but flash remains the recommended production renderer until forge matures.
Instead of clearing every frame, forge keeps a persistent FBO surface of the window and computes a damage set — the rectangles that actually changed:
DamageSet is built each frame from:glBlitFramebuffer; idle frames only blitConservative 1px expansion past rounded-clip boundaries guarantees no stale edges; stale prev-rects are pruned as nodes disappear.
| Piece | State |
|---|---|
| Flash/Forge seam + dev toggle | Shipped |
DamageSet + retained FBO + damage-limited present |
Shipped (beta) |
| Content-keyed tile pool | Planned |
| Per-node retained layers | Planned |
| Scroll-shift tile remap | Planned |
Known bugs: damage-rect edges, scroll-shift paths, some compositor-animation paths. Test it from DevTools → Rendering → RENDERER (Flash | Forge toggle).
The goal is large stable desktop UIs — 5,000–20,000+ node editors, dashboards, timelines — where full-clear redraws waste most of their bandwidth repainting identical pixels. Forge targets repainting only changed regions, with design targets like scrub present bandwidth under 1 MB/s where flash measures ~498 MB/s at 5k nodes.
Retention isn't free: one window's worth of pixels must persist to repaint partially (~8.3 MB @1080p). Hello-world floor is ≈30 MB @1080p vs ~22 MB for flash. A hard budget cap bounds worst case.
The remaining phases turn forge into the production renderer: a content-keyed tile pool with LRU + budget, per-node retained layers for animated leaves, and scroll-shift tile reuse. See Forge Renderer roadmap.