Root cause H2 confirmed: the gun-barrel / file-select vertical gradient is built from 0.75-native-pixel-tall gSPTextureRectangle row strips (title2.c (<<2)-1 bottom idiom). On the N64 RDP the scan converter floors the U10.2 edges to whole scanlines, so each strip rasterizes to exactly one scanline; gfx_draw_rectangle passed the fractional edges straight to the GPU's continuous rasterizer, aliasing the 0.75px pitch into a periodic 'comb' (fixed ~3-native-row period; window period = 3*scale — confirmed by a 3-scale 640/1024/1280 GE_PCDUMP test). Fix (port-layer, surgical): after the sub-pixel offset, floor the top edge to its scanline and the bottom edge to the last covered scanline (the RDP scanline range [top_scan, bot_scan+1]) before NDC conversion. No-op for whole-pixel rects (edges already 4k/4k-1), so only sub-pixel strips change and normal fills are untouched. Also: remove the temporary GE_D397SH / D397SHM env-gated shader probes (gfx_opengl.cpp, gfx_pc.cpp) now that the root cause is settled. Docs: findings.md D397 -> RESOLVED (+3-scale confirmation + fix record), findings-index.csv regenerated, porting-notes.md section D15 marked resolved with the landed fix. Verified by playtest: gun-barrel + file-select gradient render clean, comb gone.
fast3d — software RSP
A C++ interpreter that consumes the Gfx display list the game builds each
frame and emits OpenGL calls, replacing the Nintendo 64's Reality Signal
Processor and Reality Display Processor.
Origin and license
This code is adapted from the Perfect Dark PC
port (port/fast3d/), which in
turn is the Ship of Harkinian /
libultraship fast3d, itself descended from
sm64-port.
LICENSE.txt in this directory (MIT, © 2020 Emill, MaikelChan) covers that
lineage. glad/ is generated by glad
(© David Herberth, MIT). GoldenEye-specific changes in this directory are
under the repository's top-level MIT license.
Files
| File | Role |
|---|---|
gfx_pc.cpp |
the RSP interpreter — matrices, lights, fog, G_TRI1/G_TRI4, vtx |
gfx_opengl.cpp |
OpenGL backend — shaders, textures, z-buffer, framebuffers |
gfx_cc.cpp |
color-combiner equation -> GLSL shader |
gfx_sdl2.cpp |
SDL2 window-manager backend |
gfx_api.h |
public API (gfx_init / gfx_run / gfx_start_frame / ...) |
gbiex.h |
GoldenEye custom GBI command definitions |
glad/ |
OpenGL loader |
GoldenEye-specific work
The PD fast3d already handles G_TRI4 (GoldenEye uses it too). The GE additions
are the custom color-combiner / render modes and the handling of GE's GBI
extension commands. rsp/graphics/gmain.s (GE's real RSP microcode, in the
repo root) is the ground truth for the exact command encodings.