Skip to content

Enterprise Render Pipeline — Layer Tree, O(1) dirty, multi-rect damage (v0.1.20)#97

Merged
kolkov merged 6 commits into
mainfrom
release/v0.1.20
May 11, 2026
Merged

Enterprise Render Pipeline — Layer Tree, O(1) dirty, multi-rect damage (v0.1.20)#97
kolkov merged 6 commits into
mainfrom
release/v0.1.20

Conversation

@kolkov
Copy link
Copy Markdown
Contributor

@kolkov kolkov commented May 11, 2026

Summary

Enterprise Render Pipeline — Layer Tree compositor, O(1) dirty tracking, damage-aware multi-rect blit.

Architecture (ADR-007 Phase D + ADR-028 + ADR-030)

  • Layer Tree in productioncompositor/ package drives render loop (OffsetLayer, PictureLayer, ClipRectLayer, OpacityLayer)
  • Persistent Layer TreeUpdateLayerTree() reuses layer objects across frames (97.9% fewer allocations for 200 boundaries)
  • O(1) frame skip — flat dirty boundary set replaces O(n) NeedsRedrawInTreeNonBoundary tree walk (45× faster)
  • Multi-rect damage — per-draw dynamic scissor for multiple dirty rects, zero pixel waste (ADR-030)
  • Damage-aware blitLoadOpLoad + scissor proven 48×48 at HAL level via software backend Stats
  • Overlay boundary pipeline — dropdown/dialog content in same Layer Tree as main widgets
  • Overlay hover blocking — background widgets don't receive hover when overlay open

Tests

  • ~120 new tests, 7,200+ total across 56 packages
  • Software backend e2e — pixel-exact damage verification + HAL RenderPassStats scissor proof
  • 6 benchmarks — frame skip O(1) vs O(n), persistent tree vs per-frame rebuild

Fixes

  • Dropdown black background (overlay IsRoot isolation)
  • Child boundary dirty ≠ root needsRedraw (Flutter markNeedsPaint pattern)
  • Dropdown menu ctx.InvalidateRect leak (RepaintBoundary isolation)
  • Debug overlay + LoadOpLoad green residue

Dependencies

  • gg v0.46.7 (multi-rect damage API)
  • gogpu v0.34.3
  • wgpu v0.27.3 (software backend Stats + slog.Debug)

Research

  • Enterprise Layer Tree patterns (Flutter, Chrome, Qt6, Android, Skia)
  • Multi-rect damage (Vulkan, DX12, GLES specs + 5 frameworks)
  • ListView recycling (5 frameworks)

Test plan

  • go build ./... — PASS
  • go test ./... -count=1 — 56 packages, 0 FAIL
  • golangci-lint run --timeout=5m — 0 issues
  • Visual: gallery, IDE, spinner_perf examples
  • Visual: dropdown open/close, hover, selection
  • Visual: GOGPU_DEBUG_DAMAGE=1 green overlay (spinner only)
  • Visual: GOGPU_DEBUG_DIRTY=1 cyan overlay (per-widget)
  • CI: Ubuntu, macOS, Windows

kolkov added 6 commits May 11, 2026 17:32
…istent tree

Rewrite render loop to Layer Tree walk with per-boundary GPU textures.
Add DirtyBoundaryRegistrar interface for O(1) boundary tracking,
persistent Layer Tree with incremental updates, damage-aware blit
with multi-rect support, and overlay-aware hit testing.
Overlay container now returns content as Children() and wires AddChild
in constructor. Dropdown menu removes redundant ctx.InvalidateRect
calls (RepaintBoundary isolation handles repainting). Dropdown widget
overlay push adapted for new boundary pipeline.
ADR-028 Phase 2: convert 54 ctx.Invalidate() calls to granular
SetNeedsRedraw(true) + InvalidateRect(Bounds()) for visual-only state
changes (hover, press, selection highlight). Widgets no longer trigger
full window layout+redraw for paint-only mutations. Deprecate
state.Bind in favor of direct signal subscription with SetNeedsRedraw.
Add comprehensive test coverage for retained-mode render pipeline:
flat dirty list O(1) operations, Layer Tree construction and overlay
append, boundary visibility culling, overlay damage tracking and hover
blocking, damage-aware blit with multi-rect scissor, GPU work
verification, and end-to-end software backend rendering. Includes
state binding regression test for deprecated Bind path.
Update core ecosystem dependencies for v0.1.20 release.
Update public documentation for v0.1.20 release: retained-mode render
pipeline with Layer Tree compositor, damage-aware blit, granular
invalidation (ADR-028), and per-boundary GPU textures.
@codecov
Copy link
Copy Markdown

codecov Bot commented May 11, 2026

@kolkov kolkov merged commit 2a5ca7e into main May 11, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant