docs(render): S3 chunk 3 fix round 2 — the soak shows ~500 terrain submissions/frame; opaque stream marks stop splitting terrain batches

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-03 10:16:34 +02:00
parent 4ec59d727a
commit 38b5adc523
2 changed files with 51 additions and 1 deletions

File diff suppressed because one or more lines are too long

View file

@ -601,6 +601,56 @@ same worktree on top of `671eb3ad`; this is round 1 of the two the plan allows.
count for the terrace-edge cell sequence if it can be driven cheaply, else count for the terrace-edge cell sequence if it can be driven cheaply, else
the reasoning. the reasoning.
### 9.7 Chunk 3 fix round 2 (lead, 2026-09-03 — the perf gate of §9.5 FAILED at `e10765aa`; round 2 of the two the plan allows)
**Measured.** Connected R6 soak `logs/connected-r6-soak-20260903-100400` at
`e10765aa` versus the S2-final baseline `…-010403` (same runner, both
`Uncapped=false`, both graceful with zero failures): CPU p50 = 31.2 ms at EVERY
outdoor destination (baseline 2.015.5 ms), FPS 32 flat (baseline 51452),
GPU p50 24× (Holtburg 1.8→4.6 ms, Caul return 2.9→12.2, Aerlinthe 1.4→3.0,
Rynthid 0.7→2.2, Sawato 0.2→0.8). The cost is flat because the admitted land
cell count (~500600) is the same at every outdoor stop; nearly every cell
carries scenery statics, so a `StreamMark` follows almost every `LandCell` and
splits the pending batch → ~500 terrain submissions per frame, each running
`TerrainModernRenderer.DrawRhi`'s full bind sequence (pipeline, push
constants, vertex/index buffers, tiling table, scene-lighting and terrain-clip
sections, the shadow uniform) plus one ring allocation and one MDI.
- **F10 — an opaque ordered-stream flush is NOT a terrain flush point.** The
ordered stream holds ONLY `IsOpaque` batches (`WalkStaticStreamPopulator`
routes translucent batches to the alpha list; `WbDrawDispatcher.DrawOrderedRange`
draws them with the `Opaque` / `OpaqueAlphaToCoverage` pipeline, depth test
AND write on, no blending). Opaque terrain and opaque statics are therefore
depth-resolved in either order — pixel-identical except exact z-ties — so a
`StreamMark` no longer flushes the pending terrain batch. The flush points
that REMAIN are exactly the events whose GPU order against terrain is
observable: `PunchFan` (depth ALWAYS + write — the ordering chunk 3 exists
for), `AlphaBarrier` and `LandscapeFlush` (translucent drains),
`ClearInteriorDepth`, `ExitSeals`, `Sky`, `CellShell`, a particle turn whose
cell has a renderable emitter, and the end of Replay. Consequence: batches
split only at buildings and punches (terrace-edge: 14 buildings → tens of
batches per frame), and the punch ordering is preserved because every punch
flushes the terrain drawn before it and the terrain after it starts a new
batch. The implementer CITES the ordered stream's pipeline state (file:line
of the pipeline selection and the depth/blend state) in the Replay comment;
if any ordered-stream stage blends or disables depth write, that stage's
mark stays a flush point and the contract is amended, not bent.
- **F11 — no per-batch bind latch.** With tens of batches per frame the full
bind sequence per batch is acceptable; do not add state tracking.
- **F12 — tests.** F4(c) updated: a `StreamMark` between two land cells no
longer splits (one batch); a `PunchFan`, an `AlphaBarrier`, and a
has-emitter particle turn each split. New punch-order pin: `LandCell(far)`,
building turn with a `PunchFan`, `LandCell(near)` → the leaf log reads
`LANDCELL(far)`, `PUNCH`, `LANDCELL(near)` — the far terrain is flushed
BEFORE the punch and the near terrain drawn AFTER it. Every other pin
unchanged.
- **Gate.** Re-run the SAME soak at the fix commit: CPU p50 per destination
≤ 1.3× the baseline and GPU p50 ≤ 1.3× the baseline (Sawato's sub-ms
values compare by absolute ≤ +0.5 ms); the four-pose self-gate: the
Holtburg fragments still gone, Facility/cathedral/house structurally
unchanged. Both recorded in the ledger. If this round does not meet the
gate, chunk 3 STOPS and is written up (plan rule §5).
## 10. Chunk 4 contract — deletions (lead draft, 2026-09-03; re-locate every owner at chunk time, after chunks 2 and 3 land) ## 10. Chunk 4 contract — deletions (lead draft, 2026-09-03; re-locate every owner at chunk time, after chunks 2 and 3 land)
### 10.1 What retail clips, and what it does not (verified) ### 10.1 What retail clips, and what it does not (verified)