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>
4.5 KiB
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
00mask byte to an enabled write byte and eachffbyte 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, TNS0.000 ns; - 25 MHz design setup WNS
+6.324 ns, TNS0.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.