Files
retroDE_ps2/docs/ch435_frame_fbmsk_lightbuffer_closeout.md
thejayman77 ba74bbd5aa Snapshot: fog implementation + fidelity tooling baseline (pre bilinear-clamp fix)
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>
2026-07-20 19:56:46 -04:00

95 lines
4.5 KiB
Markdown

# Ch435 — FRAME.FBMSK light-buffer alpha
## Root cause
The Ch434 current-frame light chain was structurally correct but the second
draw of the CT32 conversion stage, draw 195973, has
`FRAME.FBMSK=0xff000000`. The scheduler previously discarded that field when
relocating the framebuffer, and the external LPDDR color path had no byte-mask
transport. Draw 195973 therefore replaced alpha across the full 256x256
target instead of preserving the alpha produced by draw 195957. Feeding that
incorrect all-128 alpha target through the remaining ping-pong passes made the
integrated frame much too dark.
## Static fidelity result
The first correction was an asset-boundary reconstruction. It retained alpha
128 on the 20,861 lit texels and alpha zero on the 44,675 black texels, then
propagated that target through draws 196087, 196108, 196129, 196167, and
196177. The resulting 311-epoch `zsrt139f52` replay passed production
simulation and the DE25-Nano runtime gates with zero drops, overflows, AXI
errors, Z mismatches, or color mismatches.
The board framebuffer is byte-identical to simulation at SHA-256
`d0047677371a0f6e4e319458926f604a8599c92baaf34d09b8e1fd452e31662b`.
Its mapped mean RGB `(26.38, 23.32, 21.19)` is close to the PCSX2 frame mean
`(28.47, 23.54, 21.33)`, and the booth, lamp, rabbit, bench, and character are
all readable. This supersedes the over-dark f49 result and is the live HDMI
asset baseline. The remaining dominant visual defect is spatial speckle and
edge noise, not global brightness.
## Native RTL repair
The production path now carries a four-bit byte enable derived from
`FRAME.FBMSK` with each fragment:
- the fixture generator preserves the captured upper 32 FRAME bits and
rejects masks that are not byte-granular;
- the raster wrapper converts each `00` mask byte to an enabled write byte and
each `ff` byte to a preserved destination byte;
- the request FIFO and color-align RAM carry the byte enable across the GS to
EMIF path;
- partial opaque writes use the same ordered destination-read/modify/write
path as alpha blends;
- the color stage merges disabled bytes from the destination after either the
GS ALPHA equation or opaque source selection.
The directed color-blend regression preserves destination alpha with
`BE=0111`, producing `0x8024180c`. The 1,500-fragment Z/color regression also
passes with zero errors.
The regenerated authentic two-draw fixture `zsrt139l3f` contains
`ff000000000a0000` in draw 195973's FRAME header. Its registered-gradient
simulation passes 22 epochs and 131,072 fragments with zero drops, overflows,
AXI errors, Z mismatches, or color mismatches. Most importantly, the native
256x256 output is byte-identical in all 65,536 words to the static corrected
target: 44,675 black/alpha-zero texels and 20,861 lit/alpha-128 texels.
## Accepted fit
The owner-controlled Quartus 26.1 GUI compile completed successfully on
2026-07-19. The accepted RBF is 4,112,384 bytes with SHA-256
`55b23b94f51f1aab271d91aa4fa766561c044b9633146f25f4242b431f6ce902`.
All signoff classes are nonnegative:
- EMIF setup WNS `+0.083 ns`, TNS `0.000 ns`;
- 25 MHz design setup WNS `+6.324 ns`, TNS `0.000 ns`;
- hold minimum `0.000 ns`, with zero TNS;
- recovery minimum `+1.074 ns`;
- removal minimum `+0.017 ns`;
- minimum-pulse-width minimum `+0.200 ns`.
Final resources are 38,387 / 46,800 ALMs (82%), 5,327,792 / 7,331,840
block-memory bits (73%), 344 / 358 RAM blocks (96%), and 160 / 376 DSP
blocks (43%).
## Hardware acceptance
The RBF checksum was verified on the DE25-Nano and `core_loader.sh` loaded it
successfully; `fpga0` reported `operating`. The authentic 22-epoch
`zsrt139l3f` fixture then passed every texture CRC, staging, fresh-drain, and
zero-drop gate. Its 307,200-word framebuffer has SHA-256
`e2b9f847fb64f5dbc70f112df91c6fccc54bf439138f772927150ff99aa026ce`,
byte-identical to production simulation. The native target contains exactly
20,861 lit/alpha-128 pixels and 44,675 black/alpha-zero pixels in its 256x256
region, proving that draw 195973 preserves the destination alpha byte on
silicon.
The complete 311-epoch f52 scene was then replayed on the same RBF. All
epochs completed with zero fragment drops and its framebuffer remained
byte-identical to simulation at SHA-256
`d0047677371a0f6e4e319458926f604a8599c92baaf34d09b8e1fd452e31662b`.
HDMI therefore ends on the readable f52 scene. The accepted artifact is now
the board's standard `/home/terasic/cores/retroDE_ps2.core.rbf`; the previous
artifact is retained as `retroDE_ps2.pre_ch435.core.rbf`.