Files
goldeneye-pc-port/port/fast3d
James Dansereau cd6cc158b6 Add PC port scaffolding (CMake build + port layer)
Initial scaffolding for a PC port of GoldenEye 007, modeled on the
Perfect Dark PC port (same Rare "Indy" engine). The N64 build
(Makefile + IDA) is untouched; the PC build is a parallel CMake build.

Build:
- CMakeLists.txt: SDL2 + zlib + OpenGL. Compiles src/game/*.c + curated
  engine files + libultra audio/gu + port/. Per-region macro sets
  (ROMID US/EU/JP) mirror the N64 Makefile's LCDEFS exactly.
- build-pc.sh, cmake/: configure+build helper and target/SDL2 modules.

Port layer (port/):
- video/audio/input/fs/romdata/config/system/mixer: stubs with
  TODO(Phase N) markers and correct interfaces.
- libultra.c: libultra OS shims (message queues, VI, PI, AI, EEPROM,
  controller, PFS/motor no-ops, region-gated osTvType).
- gesched.c: software-RSP scheduler replacing src/sched.c task submission.
- n64stubs.c: inert stubs for N64-boot + rmon symbols.
- random.c: PRNG ported verbatim from src/random.s (bit-exact).
- ucode.c: RSP/ASP/GSP microcode segment markers (dummies; Phase 3 TODO).

Docs:
- docs/PCPortResearch.md: architecture, GE-specific deltas, phased plan,
  and the scaffolding review (findings A1-A4/B1-B4/C1-C2 + resolutions).
- PORTING.md: top-level entry point.

See docs/PCPortResearch.md for the full plan.
2026-08-17 19:17:06 -04:00
..

fast3d — software RSP for the GE PC port

This directory will hold the software RSP: a C++ interpreter that consumes the Gfx display list the game builds and emits OpenGL calls, bypassing the N64 RDP entirely.

Source: adapt from the Perfect Dark PC port

The PD port ships a complete, working fast3d at perfect-dark-pc-port/perfect_dark/port/fast3d/:

File Role ~Lines
gfx_pc.cpp The RSP interpreter: matrices, lights, fog, tri1/tri4, vtx 2800
gfx_opengl.cpp OpenGL backend: shaders, textures, zbuf, framebuffers 1300
gfx_cc.cpp Color-combiner equation -> GLSL shader compiler 60
gfx_sdl2.cpp SDL2 window-manager backend 460
gfx_api.h Public API (gfx_init/run/start_frame/end_frame/...) 58
gfx_pc.h Internal state (RSP struct, texture cache, combiner pool) 60
gfx_rendering_api.h Rendering-API vtable (GL backend implements this) 61
gfx_window_manager_api.h Window-manager vtable (SDL2 implements this) 54
glad/ GL loader —

The PD fast3d already handles G_TRI4 (GE's 4-triangle command) — the PD game uses it too. So the bulk of the RSP work is done; we adapt, not rewrite.

GE-specific work to add

  1. G_SETTEX (opcode 0xc0) — GE's custom texture-bank command (include/gbi_extension.h, gsSPUseTexture). Add a case in the gfx_pc.cpp dispatch and a corresponding texture-bank selection in the GL backend. Reverse the exact semantics from rsp/graphics/gmain.s + src/game/tex.c / initmttex.c.
  2. Verify custom color-combiner modes — G_CC_MODULATEIFADE, G_CC_FADE, G_CC_DECALFADE, G_CC_BLENDRGBFADEA, etc. The gfx_cc.cpp compiler handles arbitrary CC equations; confirm each GE mode compiles to correct GLSL.
  3. Verify the custom render mode — G_RM_CUSTOM_AA_ZB_XLU_SURF (AA_ZB_XLU with Z_UPD).
  4. gDPLoadTLUT06/07 — map onto the existing G_LOADTLUT path.

Ground truth

rsp/graphics/gmain.s (repo root) is the real GE RSP ucode. We do not run it on PC, but it is the authoritative reference for the exact command encodings GE emits — use it to validate the software RSP's decoding.

Status

Empty (scaffolding). Populate during Phase 2 by adapting the PD fast3d and adding the GE-specific commands above.