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. in.
**#18 `split/18-position-chain`** is open and finished apart from one decision: **#18 `split/18-position-chain`** is open and finished apart from one decision:
worktree `/home/bob/repos/iris-pr18`, head `77bb75e`, twenty-two commits, worktree `/home/bob/repos/iris-pr18`, head `3f7cd82`, twenty-four commits,
workspace tests passing, fmt and clippy clean. The last four are the text workspace tests passing, fmt and clippy clean. It is LAYOUT.md §2's position
shaping work, three retained-layout details that claimed something they did chain, generalised to boxes. The last six are a performance pass that changes
not do, and the many-widgets-dirty cases. It is LAYOUT.md §2's position chain, generalised no layout: the two halves of the text fix (`e5f8b6b`, `2525637`), three
to boxes. `/home/bob/repos/ai-app-2` is on `rustify`, worktree clean. 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 **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 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 to stop rescanning, which changes the order widgets settle in and is hers to
agree first. 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: The remaining costs after this are:
- **Writing a glyph instance per glyph per draw.** With shaping and placement - **Writing a glyph instance per glyph per draw.** With shaping and placement