Bring the state of #18 and what a frame is made of up to date

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
iris-aiandClaude Opus 5 committed 2026-09-14 20:29:55 -04:00
1 parent cb2942bf58
commit f486f00ec9
1 file changed
+16 -5
+16 -5
View File
@@ -9,11 +9,15 @@ Canonical `main` is **`ca2b4b2`** (#17, the headless rig). Sixteen slices are
in.
**#18 `split/18-position-chain`** is open and finished apart from one decision:
worktree `/home/bob/repos/iris-pr18`, head `77bb75e`, twenty-two commits,
workspace tests passing, fmt and clippy clean. The last four are the text
shaping work, three retained-layout details that claimed something they did
not do, and the many-widgets-dirty cases. It is LAYOUT.md §2's position chain, generalised
to boxes. `/home/bob/repos/ai-app-2` is on `rustify`, worktree clean.
worktree `/home/bob/repos/iris-pr18`, head `3f7cd82`, twenty-four commits,
workspace tests passing, fmt and clippy clean. It is LAYOUT.md §2's position
chain, generalised to boxes. The last six are a performance pass that changes
no layout: the two halves of the text fix (`e5f8b6b`, `2525637`), three
retained-layout details that claimed something they did not do (`f1a47e9`),
the many-widgets-dirty cases (`77bb75e`), what the settle order is holding up
(`bf94380`), and carrying a widget's depth rather than walking for it
(`3f7cd82`). Every one of them keeps the five reference renders and the resize
render byte-identical, and the hundred-seed sweep passes. `/home/bob/repos/ai-app-2` is on `rustify`, worktree clean.
**The one thing waiting on the owner.** `tabs` at 1920x1200 is no longer
byte-identical to `upstream/main`: 1,283 pixels of 2.3M (0.06%), two
@@ -464,6 +468,13 @@ rather than by length. Memoizing the depth walk within one scan does not pay
to stop rescanning, which changes the order widgets settle in and is hers to
agree first.
**What a frame is made of now**, `perf record` on the `many` phase at 130 of
260 dirty, which is the heaviest thing the rig has: `Layers::write` 16%,
parley's `break_all_lines` 15%, `Painter::glyphs` 14%, `InstanceList::push` 7%,
`LayerDraws::free` 6%, `draw_inner` 5.5%, choosing the next dirty widget 4.7%.
Four fifths of it is primitive bookkeeping, and none of that has had a pass.
That is where to look next rather than at the settle loop.
The remaining costs after this are:
- **Writing a glyph instance per glyph per draw.** With shaping and placement