From 64d8042f52aab024e08e14be92882a15b50e6dc9 Mon Sep 17 00:00:00 2001 From: iris <2+iris@noreply.localhost> Date: Sun, 13 Sep 2026 18:30:52 -0400 Subject: [PATCH] Record the primitive render dispatch and how it was measured Co-Authored-By: Claude Opus 5 --- docs/IRIS_EXTRACTION_HANDOFF.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/IRIS_EXTRACTION_HANDOFF.md b/docs/IRIS_EXTRACTION_HANDOFF.md index d375fdf..2c3fc0e 100644 --- a/docs/IRIS_EXTRACTION_HANDOFF.md +++ b/docs/IRIS_EXTRACTION_HANDOFF.md @@ -5,8 +5,8 @@ Not a decisions log; delete it when the extraction is done. ## Read this first -**Pull request #11 has been reviewed seven times; the seventh is answered in -`79dcc15` and an eighth has not arrived.** Check for one before doing anything +**Pull request #11 has been reviewed seven times; the last answer is `b9c4856` +and an eighth review has not arrived.** Check for one before doing anything else: ```sh @@ -39,7 +39,7 @@ packing images into arrays like atlas pages, and a bindless `binding_array` - Agent fork: `git@git.arirex.me:iris-ai/iris.git`. The bot cannot push canonical; work in the fork and open PRs into `iris/iris:main`. - **#11** `split/11-texture-bindings`, worktree `/home/bob/repos/iris-pr11`, - head `79dcc15`, fourteen commits on top of `0f6a28b`. Reviewed seven times, + head `b9c4856`, fifteen commits on top of `0f6a28b`. Reviewed seven times, all answered. - **#12** `split/12-pointer-routing`, worktree `/home/bob/repos/iris-pr12`, head `028521b`. A scroll falling through a hovered button. Not reviewed as @@ -67,10 +67,14 @@ shape: for a trait object. - **The shared group is what every pipeline gets**: the window and the masks. A mask texture would go here too. -- **`Primitive::SAMPLES` says what a primitive samples and how often it binds** - -- `Atlas` once for a list, `Image(fn)` for one instance alone, defaulted to - nothing. That is group 2, so a rect's pipeline has no texture or sampler in - its layout. Both cases share one layout builder and one group builder. +- **Each primitive records its own draws.** `Primitive::render` makes a + `PrimitiveRender` that states the layout its shader reads, uploads what it + owns, and records its draws: `GlyphRender` owns the atlas and binds it once + per list, `ImageRender` owns the images and binds one per instance, the + default owns nothing. The renderer knows nothing about textures. + **Measured**, because dispatch per list was the objection: 6 instructions + per list, 0.1% of a frame at 256 and at 1024 layers, against the ~5,400 + wgpu spends recording one. `tests/draw_cost.rs` is that measurement. - **`shader.wgsl` became `shader/prelude.wgsl` plus one file per primitive**, because one module cannot declare two types at the same binding. The prelude carries only what every primitive uses -- window, masks, vertex shader,