docs(render): §12 — S3 review fix round 1 (punch-fan view alignment, seal pin through the producer, dead clip routing, EC/OC transcript exactness) and the chunk-3 perf evidence correction
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
5bc4b36879
commit
174f30f176
1 changed files with 119 additions and 0 deletions
|
|
@ -1056,6 +1056,125 @@ with `ScissorNdcAabb|UseScissorFallback|TerrainClipMode.Scissor|
|
||||||
ndcClipAabb|terrainUploadCount` returns nothing under `src`/`tests`; no
|
ndcClipAabb|terrainUploadCount` returns nothing under `src`/`tests`; no
|
||||||
register row (AD-17's correction is the lead's, in the same landing).
|
register row (AD-17's correction is the lead's, in the same landing).
|
||||||
|
|
||||||
|
## 12. S3 review fix round 1 (lead, 2026-09-03 evening — after the two-lens slice review of `51d532320..e6f5a156b`, both FAIL)
|
||||||
|
|
||||||
|
**Verdicts.** Retail lens FAIL: one BLOCKING (F1), one major (F2), one minor
|
||||||
|
(F3), three notes (F4a/F4b, and the weather-gate/print cell mismatch, logged
|
||||||
|
below as an open question). Shader/perf lens FAIL: one BLOCKING on the
|
||||||
|
ledger's chunk-3 perf evidence (E1, the LEAD's item), two majors (F5, F3),
|
||||||
|
two minors (perf reductions available — S5 candidates, logged), one note
|
||||||
|
(the two KEEP clips' >8-edge overflow branches lack equivalence pins — folded
|
||||||
|
into F2).
|
||||||
|
|
||||||
|
**F1 (BLOCKING) — punch fans clipped by the wrong view.** `RetailFrameWalk.
|
||||||
|
DrawBuilding` pins `ActiveViewIndex = v` over the walk's views (retail
|
||||||
|
`building_view = portal_view_num` @0x0059f3bf); the leaf indexes
|
||||||
|
`clipAssembly.OutsideViewSlices[activeViewIndex]` — but
|
||||||
|
`ReassembleOutsideViewFromWalk` skips a view whose polygon collapses
|
||||||
|
(`AppendOutsideSlice` returns false on `IsNothingVisible`), so the slice array
|
||||||
|
can be SHORTER than the view list: every later fan takes view v+1's planes
|
||||||
|
and the last takes `default` = UNCLIPPED. Fix: the reassembly keeps ONE slice
|
||||||
|
per walk view, index-aligned (a collapsed view yields a slice flagged
|
||||||
|
nothing-visible: `ClipViewSlice.NothingVisible`, slot 0, empty planes, empty
|
||||||
|
AABB); `DrawWalkPunchFan` draws NOTHING for a nothing-visible slice (retail:
|
||||||
|
`polyClipFinish` under a degenerate view leaves <3 vertices → no fan,
|
||||||
|
`0x59BDBC–0x59BDBF`) and FAILS LOUD (exception, fail-loud rule) when
|
||||||
|
`activeViewIndex >= OutsideViewSlices.Length` instead of drawing unclipped.
|
||||||
|
`OutsidePlaneCount`/`ScissorFallbacks` bookkeeping unchanged. Tests: a
|
||||||
|
synthetic two-view `WalkPortalView` whose FIRST polygon collapses (area under
|
||||||
|
`MinPolygonArea`) → `OutsideViewSlices.Length == 2`, `[0].NothingVisible`,
|
||||||
|
`[1].Planes` equal the second polygon's edge planes (through
|
||||||
|
`BeginWalkFrame` + `ReassembleOutsideViewFromWalk`); the punch leaf with
|
||||||
|
`activeViewIndex = 1` uses `[1]` (recording surface: the fan submitted with
|
||||||
|
those planes); with `activeViewIndex = 0` submits nothing; with index 2
|
||||||
|
throws. MUTATION: revert the skip (append nothing) → the index test fails;
|
||||||
|
restore the `: default` fallback → the throw test fails.
|
||||||
|
|
||||||
|
**F2 (major) — the exit-seal equivalence pin through the producer that
|
||||||
|
runs, and both overflow branches.** Production seal planes come from
|
||||||
|
`WalkFrameDriver.AppendClipSlot` (pixel→NDC, winding selection, normalize,
|
||||||
|
the >8-vertex NDC-AABB branch) read back by `InteriorFloodViewClipPlanesAt`
|
||||||
|
→ `ClipFrame.GetSlotPlanes`; the current pin drives
|
||||||
|
`ClipFrame.AppendSlot(ClipPlaneSet)`, which has zero production callers.
|
||||||
|
Rewrite it to drive `CaptureViews`/`AppendClipSlot` on a synthetic
|
||||||
|
`WalkPortalView` (the K6 pin's construction) and read back through
|
||||||
|
`InteriorFloodViewClipPlanesAt`; add the two overflow cases: a 9-vertex
|
||||||
|
view → the seal slot carries exactly the 4 AABB planes that contain every
|
||||||
|
vertex (over-include); a 9-vertex outside view → the punch slice has zero
|
||||||
|
planes and the fan draws unclipped. Mutations: flip `ccw`, drop the
|
||||||
|
normalize, delete the AABB branch — each must fail (record all three).
|
||||||
|
|
||||||
|
**F3 (minor/major, both lenses) — the false bracket comment** at
|
||||||
|
`RetailPViewPassExecutor.cs:453-457`: neither KEEP clip brackets anything
|
||||||
|
with Enable/DisableClipDistances (the six `DisableClipDistances()` calls sit
|
||||||
|
around the unclipped particle draws; the surface's bodies are no-ops on
|
||||||
|
Vulkan). Rewrite to the truth; then DELETE the six no-op
|
||||||
|
`DisableClipDistances()` calls and the private wrapper (a method that does
|
||||||
|
nothing on the only backend is a false mechanism too), keeping the
|
||||||
|
`IWorldPassSurface` members only if `WorldScenePassExecutor` still needs
|
||||||
|
them (it calls them — leave the interface, delete this file's use).
|
||||||
|
|
||||||
|
**F4 (notes, transcript exactness) —** (a) `EmitFloodTurns` prints one `EC`
|
||||||
|
per flood cell; retail's `DrawEnvCell` breakpoint fires once per (cell ×
|
||||||
|
live view) (`PView::DrawCells` @0x005a4ab1–0x005a4acc, the `setup_view` /
|
||||||
|
`DrawEnvCell` loop). Print `EC` once per live view of the cell
|
||||||
|
(`InteriorFloodViewSliceCountAt`), draw unchanged (the stamp dedupes).
|
||||||
|
(b) `WalkTraceConformanceTests.Recorder` lacks `OnWeatherTurn`, so the
|
||||||
|
eight-kind signature drops the weather `OC` on both sides; implement it and
|
||||||
|
stop dropping the trailing OC on the oracle side — the signature then pins
|
||||||
|
the trailing weather turn. Every fixture row must still pass (the captures
|
||||||
|
carry the OC literally).
|
||||||
|
|
||||||
|
**F5 (major) — the dead per-cell clip machinery.** `WbDrawDispatcher.
|
||||||
|
SetClipRouting(...)` (the only writer of `_clipRoutingActive`) has ZERO
|
||||||
|
callers; `EnvCellRenderer.SetClipRouting` is called only with `null`. So no
|
||||||
|
path can arm the per-cell clip-region table — §10.6's "live for the flat
|
||||||
|
path" was wrong, and five pipelines (`mesh_modern`, `mesh_atmospheric`,
|
||||||
|
`mesh_detail`, `particle`, `particle_mesh`) still fetch `clipRegions[slot]`
|
||||||
|
and write eight always-passing `gl_ClipDistance`s per vertex. Delete: the
|
||||||
|
routing state and methods (`SetClipRouting` both overloads,
|
||||||
|
`ClearClipRouting` remnants, `_clipRoutingActive`, `ResolveSlotForFrame`'s
|
||||||
|
routing arm — it becomes "slot 0, never culled"), the `ProbeClipRouteEnabled
|
||||||
|
&& _clipRoutingActive` branch, the five shaders' `clipRegions` fetch +
|
||||||
|
`gl_ClipDistance` loops + `gl_PerVertex` redeclarations (recompile; re-pin
|
||||||
|
the manifest), and the `ClipRegions` SSBO publication/binding IF no other
|
||||||
|
shader reads it (`portal_depth.vert` takes its planes per draw through the
|
||||||
|
UBO at binding 2 — verify; if `ClipRegions` has no reader, delete
|
||||||
|
`PrepareClipFrame`'s publish, `WorldFrameSections.ClipRegions`,
|
||||||
|
`BindClipRegions`, and `ClipFrame`'s region packing, keeping only
|
||||||
|
`AppendSlot`/`GetSlotPlanes` as the CPU plane store the seals read). Keep
|
||||||
|
the vertex layouts' `aClipSlot`/`instanceClipSlot` inputs THIS round (the
|
||||||
|
instance-buffer layout is S5's), fed 0; note the residue in the commit body.
|
||||||
|
AD-17 is corrected by the lead in the landing ("dormant in every path;
|
||||||
|
deleted").
|
||||||
|
|
||||||
|
**E1 (LEAD, BLOCKING on evidence) — the chunk-3 perf gate.** The ledger's
|
||||||
|
"every destination within the §9.7 gate" quoted only the `turn` phase of the
|
||||||
|
two report files; the `stationary` phase has Aerlinthe 4.00→5.80 ms GPU p50
|
||||||
|
(1.45×, +1.8 ms; p95 4.20→6.00) — outside the gate — and two destinations
|
||||||
|
(Sawato revisit/plateau) were omitted. The lead re-reads both files, records
|
||||||
|
the COMPLETE table, and re-measures the current tip against the S2-final
|
||||||
|
binary in the same session (`run-connected-r6-soak.ps1 -SkipBuild`, both
|
||||||
|
worktrees, back-to-back); chunk 3's status becomes STOPPED-LANDED with an
|
||||||
|
open perf item if the regression holds (the plan's own rule), and the
|
||||||
|
order-preserving reductions the shader lens listed (skip the terrain flush
|
||||||
|
when the alpha queue is empty; coalesce contiguous per-cell runs into fewer
|
||||||
|
indirect commands) become the S5 perf chunk's contract.
|
||||||
|
|
||||||
|
**Open question logged (not this round):** the weather gate reads the
|
||||||
|
PLAYER cell (`is_player_outside`) while the `OC` line prints the VIEWER cell
|
||||||
|
(retail's `after_sky_cell` = the P cell). A camera inside a cell with the
|
||||||
|
player outdoors would print an EnvCell id; no capture exercises it. Settle
|
||||||
|
with one retail capture at such a pose before S5's transcript closeout.
|
||||||
|
|
||||||
|
**Gates:** build 0 warnings; hermetic fully green; InstalledDat exactly the
|
||||||
|
four known; every fixture row of `WalkTraceConformanceTests` unchanged
|
||||||
|
except the OC now compared; the shader tests (descriptor contract, manifest,
|
||||||
|
SPIR-V validator, sky layout) green; the L6+H6 grep sweeps plus
|
||||||
|
`SetClipRouting|_clipRoutingActive|clipRegions|instanceClipSlot` (the last
|
||||||
|
two allowed only in the vertex-layout residue named in the body); no new
|
||||||
|
flag/probe; the lead's four-pose validation self-gate afterwards.
|
||||||
|
|
||||||
## 11. Chunk 1 contract — transcript kinds, fixtures, and the print-only emitter (lead, 2026-09-03; runs AFTER chunk 3, because `LC`/`SC` only exist once terrain is per cell)
|
## 11. Chunk 1 contract — transcript kinds, fixtures, and the print-only emitter (lead, 2026-09-03; runs AFTER chunk 3, because `LC`/`SC` only exist once terrain is per cell)
|
||||||
|
|
||||||
### 11.1 What exists (verified in the tree at `542b049b`)
|
### 11.1 What exists (verified in the tree at `542b049b`)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue