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>
3.2 KiB
Ch432 — perspective palette-bilinear handshake repair
Result
Ch432 removes the alternate-sample loss in the serialized perspective palette-bilinear raster path. It restores a broad missing surface population in the unchanged 292-epoch f42 composition and is accepted on silicon.
The mapped PCSX2 score improves from Ch431's MAE 18.9405 / RMSE 27.6301 to MAE 15.0765 / RMSE 21.9717. This is a fidelity improvement from corrected RTL coverage, not an increase in draw count or a fixture substitution.
Root and repair
Dense perspective epochs emitted almost exactly half of the independently
rasterized coverage. Isolated f19 epoch 74 produced 7,301 fragments against
14,371 reference pixels. The sampler advanced once when launching the held
S1 pixel and again on PB_RELEASE, skipping the next S1 sample.
Launch is now the single normal advance, PB_WAIT holds while the four-tap
sample returns, and PB_RELEASE contributes a final hold cycle. Perspective
valid is qualified by the existing Z and texture-alpha advance enables so a
frozen beat cannot resubmit the same pixel. The expensive triangle-inside
result remains off the global pipeline-enable path.
An ALWAYS-Z diagnostic had previously added only 571 lit pixels and worsened the reference score, independently ruling out Z as the large coverage root.
Simulation acceptance
The focused perspective PSMT8 regression emits all 31/31 independently covered samples, with no missing pixels, valid colors, correct alpha metadata, and correct MODULATE behavior. The isolated production epoch-74 regression passes its explicit 14,341-fragment count, up from 7,301, with zero drops and exact scoreboards. The affine palette-bilinear regression remains clean.
The complete unchanged f42 replay passes:
- 2,339,405 fragments fed and 2,285,783 passed;
- 292 markers and drains;
- zero fragment drops, color overflows, and AXI errors;
- Z mismatch 0/307,200 and color mismatch 0/245,760;
- framebuffer SHA-256
31d21fb5c38816ef99ace1d7b55186dc749720e874ecb055a68b21584ec27037.
The repaired f19 scene improves against its independent software reference from MAE 11.7491 / RMSE 24.6649 to MAE 8.7494 / RMSE 18.7008. Its mapped PCSX2 score improves from 20.9469 / 29.7626 to 18.3393 / 25.8374.
Fit and silicon acceptance
The owner GUI fit is timing-clean. Runtime-fabric audit reports 38,367 ALMs,
336 RAM blocks, required feeder/texture/Z hierarchy present, and 310 MHz setup
met at +0.069 ns. Hold is nonnegative. The deployed RBF SHA-256 is
69b1f91b26d0d78ba654b3d0ccc48f747fa3249f08e2a23535007ff3df40d63e.
After explicit loader confirmation, the DE25 completed all 292 epochs with
every texture checksum, palette checksum, staged-record count, ordered drain,
and zero-drop gate passing. The host returned rc=0, selected the HDMI
line-buffer source, and dumped 307,200 words with sum32 0x8304eb9b, xor32
0x89a68e4f, 240,414 nonzero 32-bit words, and bounds (0,0)..(511,479).
The board dump is byte-identical to the production-gradient simulation at the
framebuffer SHA above. The accepted board image is
captures/gs/silenthill3/extracted/sh3_zsrt139f42_ch432_board.png; its PNG
SHA-256 is
45d7f3eed485ab4650bcf61e849598423c46302c42465dbd2a2579ae4518fab3.
Ch432 is accepted and is the current live HDMI baseline.