Per-vertex GS fog end-to-end (gs_stub emit incl. persp_emit5, gs_prim_list_feeder XYZ2->XYZF2 on PRIM.FGE, gs_make_sh3_scheduler_fixture.py F/FGE packing), new fog TBs, fidelity attribution tooling. Functional baseline before removing the dead bilinear lerp8 clamps (Codex: 161-node comb loop -> -0.042ns setup fail). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.2 KiB
Ch359 audit log — zs640c6: shared-texture RESIDENCY, 2x204-tri lists, native 640x480 persistent Z
Codex-locked chapter: six SH3 draws sharing ONE PSMT8 texture (tbp=8192/cbp=13888), grouped into TWO ordered 204-triangle feeder lists (1843 words each), authentic GEQUAL/ZMSK=0/PSMZ16S, native 640x480. NEW capability: EXPLICIT texture-cache residency — one upload+fill (epoch 0); epoch 1 carries reuse=1 in the descriptor and runs on the resident cache. 408 tris vs Ch358's 122 (3.3x density).
Fixture/host/TB stack
- Generator --group-size (per-member strip expansion, no phantom bridging tris); shared-texture fail-closed gates (tex idxw + CLUT BYTE-identical across draws; list-local state equality; ZTE=1/ZTST=GEQUAL/ZMSK=0/PSMZ16S decode; native bounds; <=2048 words); ONE relocated CLUT; reuse in descs/params/epochs.txt. EMIT: 2x204/1843 EXACT (Codex's numbers to the digit), crc 0xcf4cae27, ref 21071 covered / 6129 multi px.
- Census lesson: strip draws' triangles = nprim-2 (my verts//3 probe was wrong; proven vs zsched 46/58/18).
- Host: optional trailing reuse column (back-compat verified); reuse epoch = no tex file, no upload/fill, fail-closed resident CRC/beats register verify. Dry-run rc=0 (zs640c6 AND legacy tables).
- TBs zs640c6_cap / zint640c6: 2-epoch arrays + EP_REUSE, reuse-epoch residency assert (fill_crc register), fills==1 hard assert. LESSON: per-scene TB wait budgets scale with tris/epoch (204-tri epochs blew the zs640-calibrated 800k-cycle budgets -> records=172/204 cut-off, cascading counter errors + phantom 65% fidelity).
THE FINDING — cold-Z burst vs request FIFO (and the Ch359 RTL change)
- zint640c6 @ REQ_DEPTH=256 (Ch358 silicon config): 424 fragment drops, ALL epoch 0 (empty-Z phase: every z_rmw miss = dirty evict = 2x AXI), zero in epoch 1 (Z-reject heavy = clean misses). Scoreboard mismatches (Z 320 / COLOR 316) == drop effects. High-water probe (Codex-corrected: write-domain wbin - gray2bin(rgray_s2), parameterized modulus) saturated 256/256.
- Codex-authorized sim-only sweep: depth 512 -> zero drops, ep0 peak 478 (34 slots margin), scoreboard EXACT; depth 1024 -> identical (bounded deterministic burst, not rate-bound).
- CODEX DECISION: REQ_DEPTH=1024 (2.1x headroom for the next density rung; no Z-RMW/scene/SDC/clock change). Changed: de25 top u_zc_emit + the 3 production-equivalent zint TBs; unit/replay depths (16/32) untouched.
Verification at depth 1024 (2026-07-10)
- Parse audit (QSF file list, exact macro set): clean (only pll/EMIF_Qsys/qsys_top IP).
- zc_emit unit PASS; zrop PASS (zsched 93.4/93.7); baseline zint PASS (Z 0/53760, drops=0, golden-identical); zint640 PASS (Z 0/307200, golden-identical); zint640c6 PASS (ZERO drops, Z 0/307200 + COLOR 0/21032 exact, 204/204 records, ONE fill + REUSE verified); zs640c6_cap PASS (MULTI=90.2% >= 90 floor, ALL=85.3% scene-dependent reciprocal floor, clut_bad=0 — flagged: floor margin is thin for future regenerations).
- Full regression: 282/282 PASS, 0 FAIL (280 baseline + the two C6 gates now in the run list).
Board Proof And Provenance Correction
- The first depth-1024 GUI fit met timing, and its board host run passed every transport/runtime gate: 204/204 records in both epochs, one fill plus verified reuse, and zero drops. The board framebuffer nevertheless differed from zint at all 21032 covered pixels while retaining the exact C6 bounds=(84,101)..(340,301). This isolated the failure to color provenance, not geometry, persistent Z, LPDDR transport, or FIFO depth.
- Root cause, verified in that fit's synthesis report: the QSF still selected Ch358
bios_sh3_zs640.memandpayload_sh3_zs640.mem, so the board booted the old CLUT rather than C6's CBP=13888 palette. The C6 fixture and host files were correct; the RBF's boot-image inputs were not. - Corrected fit inputs:
sh3_lpddr_fb_z640c6now selectsbios_sh3_zs640c6.memandpayload_sh3_zs640c6.memthroughscripts/select_de25_profile.sh. The REQ_DEPTH=1024 top change remains part of the same compile. No SDC, clock, or Z-RMW change is needed.
Handoff
Owner: run one full 26.1 GUI compile with the corrected C6 profile, then check STA before loading the RBF. Only after
timing is clean: run scp_zs640c6_to_board.sh (five files including the reuse-modified ps2_sh3_sched.c, recompile
on board), then sudo ./ps2_sh3_sched --zbuf sh3_zs640c6_epochs.txt --dump-fb sh3_zs640c6_board_fb.mem. Expect
bounds=(84,101)..(340,301), retrieve the dump, and run make -C sim sh3_zs640c6_board_compare.
Closure (2026-07-10)
- Quartus 26.1 GUI RBF
ad4e8c9627520dcaba9babf2019ca5b28892799e0500f8f3300f4f2a29b5218ccompiled the correctedbios_sh3_zs640c6.memandpayload_sh3_zs640c6.meminputs. STA met: setup +0.095 ns, hold 0.000 ns, recovery +1.042 ns, removal +0.185 ns, minimum pulse width +0.200 ns. - On silicon: both 204-record epochs drained; epoch 0 uploaded/filled the texture and epoch 1 verified resident reuse;
zero fragment drops; output bounds
(84,101)..(340,301); 21032 nonzero pixels. make -C sim sh3_zs640c6_board_comparepassed. The board and zint framebuffers had identical SHA-256948d9c45df84ccf180faebe7b24e3e4445bcce390c8bfab91fb3b50885fcaa4, and replay-color was exact at 307200/307200 pixels. Ch359 is closed.