forked from Ports/goldeneye-pc-port
gfx_sp_tri1's CPU-side trivial-reject AND-test trusted per-vertex outcodes (x<-w / x>w / y<-w / y>w / z>w) that are only valid half-space tests when w>0. A vertex that has crossed behind the camera plane (w<0 -- common when the camera is close to a large room-structure polygon, e.g. walls/ceiling trusses near a doorway) flips the comparison sense, so its outcode can come out wrong. When that spurious bit happens to match the other two genuinely correct vertices' bits, the AND-reduction fired and dropped the whole triangle before it ever reached OpenGL -- even though GL's own homogeneous clipper (which handles w<0 correctly) would have rendered the visible part of it. This reads exactly like D233 (indoor geometry intermittently vanishing near doors while props/furniture keep drawing): large near-camera polygons are far more likely to have a vertex cross behind the eye than small self-contained prop meshes, and the backface-cull code six lines below already special-cases this same w-sign hazard for its own cross-product sign -- the trivial-reject block above it never got the same treatment. Fix: skip the trivial-reject AND-test whenever any of the triangle's three vertices has w<0, deferring to GL's clipper instead. This can only ever send MORE triangles to the GPU than before, never fewer, so it cannot make anything newly invisible. Also investigated D234 (Dam guard towers, only the first renders) under the same M-106 hypothesis that it shares a root cause with D233/D222 -- did not find fast3d-side evidence for it; left open in findings.md with the ruled-out mechanisms and a next-step recommendation. D222 (FovScale breaks culling) is a separate, already-characterised game-logic bug in src/game/fr.c/bondview2.c, out of this fast3d-only fix's scope. Build verified green (MSYS2 mingw64 cmake+ninja, full link succeeds). Could not visually verify -- this worktree has no ROM/data and no interactive display; see docs/dev/findings.md D233 entry for the exact human verification steps (GE_PCDUMP on a doorway-heavy interior). docs/dev/findings.md: D233 (FIXED, high confidence on mechanism/unverified visually) + D234 (OPEN, not root-caused) entries added. docs/porting-notes.md: generalised the w<0 trivial-reject hazard as a recurring class for any future CPU-side "skip this triangle" heuristic. docs/dev/findings-index.csv regenerated. Claude-Session: https://claude.ai/code/session_016TaKy6AAsVUTfjkhrX6CjG
16 KiB
16 KiB
| 1 | # GENERATED by tools_pc/gen_findings_index.py -- do not hand-edit. | |||
|---|---|---|---|---|
| 2 | # Grep this to pick which findings.md entries to read; it is not authoritative. | |||
| 3 | label | bucket | one_liner | status_raw |
| 4 | D24-D30 | RESOLVED | green threads / kernel / crash handler | resolved |
| 5 | D31-D42 | RESOLVED | boot ABI: ANIM_DATA, music seq-table, libaudio banks, Globalimagetable rebase, GL context, rsp toggle | resolved |
| 6 | D43-D50 | RESOLVED | model-file loading → offline sidecar "Plan B" (d43_emit.py); D50.6 texCopyGdls full-slot copy | resolved |
| 7 | D51-D58 | RESOLVED | font pixeldata, osGetCount tick rate, model RW pools, cseq BE header, synth slots, RLE menu bg, watch raw offsets, gun-barrel DL | resolved |
| 8 | D59-D68 | RESOLVED | intro render: blood-RLE clobber, DMA validate, OSMesgQueue, HEADS/BODIES sentinels, romCopy width, image_entry, Globalimagetable BE→LE | resolved |
| 9 | D70-D74 | RESOLVED | intro-logo pixels: C-array bswap, UV path, sinf/cosf DVAL(), texture-import truncation | resolved |
| 10 | D75 | OPEN | front-end 3D model transforms (D77 audio split out below — | OPEN (parked). M-32 triage (see §F "D75 ADDENDUM"): |
| 11 | D76 · D164 | PROPOSED | disclaimer/legal screen only draws line 1 — | fix proposed (not applied — |
| 12 | D159 | FIXED | front-end wallet-Bond photo "interlaced"/combed (RC1 / D149) — | FIXED (#ifdef PORT no-op the swap in image.c) |
| 13 | D161 | FIXED | Depot (-level_30) ceiling = bright-blue speckle + radial rays (B2). | FIXED (port/fast3d/gfx_pc.cpp) |
| 14 | D165 · D166 | FIXED | input-layer polish (M-31, port-only, port/src/input.c): | FIXED |
| 15 | D180 · D181 | PARTIAL | native-PC input pass (QoL run, qol/native-pc-input-menu): | LANDED, config-gated, feel-checks owed |
| 16 | D186 | PARTIAL | Video.FpsCap throttles the sim, not just presentation (M-39 diag, M-42 clamp). | CLAMP LANDED (port/fast3d/gfx_sdl2.cpp, port/src/video.c); real fix owed |
| 17 | D187 | FIXED | HUD ammo-type/weapon icon vanished at -O2 (M-46 root-cause, M-47 fix + verify). | FIXED (src/game/gunfire.c, #ifdef AVOID_UB); PR #19 |
| 18 | D188 | FIXED | Linux -O2 boot crash: | FIXED (src/libultrare/libc/xprintf.c, src/sprintf.c, #ifdef PORT); PR #22 |
| 19 | D189 | FIXED | Linux -fstack-protector aborts on the decomp's latent stack-buffer overruns (M-48) — | FIXED (CMakeLists.txt, src/game/stan.c #ifdef PORT); PR #23 |
| 20 | D190 | ? | Linux -level_45 SIGSEGV at load in add_ptr_to_objective (objective.c:64) (M-48, open). | CLOSED — not a port bug; level 45 is MP-only and has no solo setup file in the ROM (root-caused M-105, reproduced on Windows). |
| 21 | D191 | FIXED | Windows -O2 release-bundle crash: | FIXED + PLAYTEST-VERIFIED (M-79). |
| 22 | D193 | FIXED | NPC AI locomotion is too slow — | FIXED + user-playtest-verified (M-81) — |
| 23 | D194 | OPEN | Mouse input needs another tuning pass — | OPEN — root cause and fix direction known, not implemented. |
| 24 | D195 | OPEN | Transparency / alpha surfaces broken on Control (M-49, user playtest) — | OPEN — not investigated (M-49), needs a capture |
| 25 | D197 | OPEN | Character face/head textures wrap around the head, seen on Silo (M-49, user playtest). | OPEN — not investigated (M-49), needs a capture |
| 26 | D198 | FIXED | alAdpcmPull/_decodeChunk used K0_TO_PHYS (an unconditional & 0x1FFFFFFF mask) on 64-bit heap pointers (src/libultra/audio/load.c). | FIXED (src/libultra/audio/load.c) — |
| 27 | D199 | PARTIAL | Phase-3 software audio mixer: | LANDED (port/src/mixer.c, port/include/mixer.h, include/PR/abi.h) — |
| 28 | D200 | FIXED | -level_09 segfault: reverb's ALDelay.input/output are u32 — | FIXED — 5-line cast in reverb.c (this session) |
| 29 | D196 | FIXED | OS mouse cursor stays visible after closing the F10 options overlay in click-to-lock mode (M-49, user playtest). | FIXED (6e758f1d, merged to main) — |
| 30 | D192 | OPEN | Front-end mission/level-select grid pointer still can't reach the outer cells — | OPEN — root-caused, not fixed (M-49) |
| 31 | D221 | FIXED | SELECT FILE screen: the mouse hit-box for a file slot is vertically offset from its visible box — | FIXED (M-91) — root cause was NOT a coordinate/origin mismatch: |
| 32 | D222 | OPEN | High Video.FovScale breaks culling — | OPEN — root cause known, not fixed. |
| 33 | D223 | FIXED | QoL ask: mouse-wheel weapon cycling should be directional like a normal PC shooter — | FIXED (M-105, port/src/input.c) — |
| 34 | D224 | FIXED | QoL gap (M-87, from a PD-PC-port survey): | DEPRIORITIZED (M-87, user call). |
| 35 | D225 | OPEN | Dev-tooling QoL (M-87, user ask): | OPEN — root-caused, not implemented. |
| 36 | D226 | OPEN | QoL ask: player-adjustable HUD scale for the ammo counter, bottom-left pickup/item status text, and top-of-screen dialogue/subtitle text. | OPEN — root cause / call sites identified, not designed or implemented. |
| 37 | D227 | FIXED | Sky renders as two independently-moving halves — | FIXED (M-100b, PR #43) — |
| 38 | D229 | OPEN | Water on IsWater levels renders green and pulses blue<->green on an interval (M-101, user playtest, Frigate -level_26; Surface 2 also an IsWater level). | OPEN — pre-existing (A/B proven), mechanism partly identified, not root-caused. |
| 39 | D230 | OPEN | In-level music quality: | OPEN — not investigated. |
| 40 | D233 | FIXED | All levels (intermittent): | FIXED (port/fast3d/gfx_pc.cpp, gfx_sp_tri1) — |
| 41 | D234 | OPEN | Dam: guard towers along the dam structure invisible except the first one (M-106, user QA report). | OPEN — not root-caused. |
| 42 | D228 | OPEN | AK47 (and other) weapon models still show WHITE missing-texture patches after D217's texpool-alignment fix — | OPEN — newly split out, not investigated. |
| 43 | D204 | FIXED | PC audio ran ~2 % below real time permanently: | FIXED (port/src/audio.c, port/src/libultra.c, port/include/audio.h) — |
| 44 | D203 | OPEN | Steam Deck (SteamOS, x86_64 Linux) v0.1.0 release bundle: | OPEN — negative idle repros only; not yet reproduced with input. |
| 45 | D201 | FIXED | src/libultra/audio/bnkf.c bank/instrument/sound/wavetable relocation offsets were s32, truncating the real 64-bit base pointer. | FIXED (src/libultra/audio/bnkf.c) — |
| 46 | D202 | RESOLVED | Silenced PPK plays a "slap" instead of a gunshot, PLUS user reports broader real-time audio corruption (M-52 → M-59 → REOPENED M-60 → M-61/M-62 closed the data… | ROOT CAUSE ESTABLISHED (M-66); DISPOSITION C IMPLEMENTED + MEASURED (M-66b) — |
| 47 | D206 | FIXED | PC played every SFX one bank slot too high — | FIXED (M-76, src/snd.c:1001, #ifdef PORT → soundArray[soundIndex - 1], N64 line verbatim under #else). |
| 48 | D207 | PROPOSED | Alarm klaxon starves combat SFX and (per user) doesn't recover after it stops — | MONITORING (M-77c: user reports the alarm is acceptable in play after D206; no fix shipped) — |
| 49 | D208 | FIXED | Player weapon-fire sound goes permanently silent mid-firefight (all other SFX unaffected) — | FIXED + user playtest-verified (M-78d) — |
| 50 | D209 | FIXED | Every AI character in the game is locked to a *walk* animation regardless of the speed the ailist commands — | FIXED + user-playtest-verified (M-81). |
| 51 | D210 | FIXED | chrToPatrol() leaves act_patrol.lastvisible60 uninitialised on PC — | FIXED (chraction.c:3872, #ifdef PORT → self->act_patrol.lastvisible60 = -1;, N64 line under #else). |
| 52 | D205 | RESOLVED | PC plays wrong/extra SFX for gameplay events the user can A/B against N64: | CLOSED (M-78) — root cause was D206; all four symptoms resolved + user-confirmed by ear vs N64. |
| 53 | D152+ | FIXED | D152 addendum (M-31): | FIXED (src/snd.c, port/src/libultra.c, #ifdef PORT) — |
| 54 | D168 | FIXED | GE_PCDUMP / F12 PPM captures were vertically flipped — | FIXED (port/fast3d/gfx_opengl.cpp); D114 / D116 reclassified as capture-orientation artifacts (below). |
| 55 | D169 | FIXED | Front-end mouse pointer can't reach the outer cells of the mission/level-select grid — | FIXED (M-33, port/src/input.c, port-only, no #ifdef PORT). |
| 56 | D178 | FIXED | Pre-mission briefing screen: | FIXED (M-36) — high confidence |
| 57 | D175 | OPEN | In-game stutter / brief hang during normal play (user QA report): | OPEN — observed, not investigated |
| 58 | D176 | FIXED | Surface exterior renders wrong (-level_36), two independent defects. | (a) "scrolls too fast/tiles too visibly" ROOT-CAUSED + FIXED (see "D176(a) — |
| 59 | D177 | FIXED | Ladders non-functional — | FIXED (M-36) — high confidence; interactive climb test owed |
| 60 | D172 | FIXED | Bullet-impact / blood / spark particles render magenta or cyan instead of dark red (M-82, ROOT CAUSE FOUND + FIXED). | FIXED (port/fast3d/gfx_pc.cpp gfx_lod_tile_offset): |
| 61 | D174 | OPEN | "No blood effect" (user QA report). | OPEN — observed; first step = BUNKER1 firefight with regenerated sidecars |
| 62 | D183 | OPEN | M-36 Family A ("texture line/pitch shear") is DISPROVEN for the Surface repro (-level_36). | Hypothesis DISPROVEN + diagnostics shipped; D176(b)/D182(2) still OPEN |
| 63 | D173 | OPEN | Third-person Bond model spawns too high (user QA report): | OPEN — observed, not investigated. |
| 64 | D179 | FIXED | Packaged build crashes after the logos — | Diagnosed, not fixed — |
| 65 | D180 | PARTIAL | Native-PC input pass (M-XX QoL run, qol/native-pc-input-menu, port-only). | LANDED, port-only, no #ifdef PORT. |
| 66 | D181 | PARTIAL | Game.ScreenShakeIntensity — | LANDED behind config, default = original. |
| 67 | D184 | PARTIAL | F10 port-layer options overlay — | LANDED, port-only, no #ifdef PORT in src/. |
| 68 | D211 | PARTIAL | PC FOV slider — Video.FovScale (M-83 QoL wave, port-only, WIDESCREEN-FOV-PLAN.md Phase 4). | PARTIAL — M-84 refix: |
| 69 | D212 | PARTIAL | Anisotropic-filtering config wiring — | LANDED, port-only. Build clean. |
| 70 | D213 | PARTIAL | On-screen FPS readout — | LANDED, port-only. Build clean; bunker1 no-op confirmed. |
| 71 | D214 | PARTIAL | Keyboard rebinding — [Input.Bind] config section (M-83, port-only, PD parity, Phase 4 debt). | PARTIAL — M-84: code PASS (alt/ctrl); one doc-only fix. |
| 72 | D215 | FIXED | 1P weapon viewmodel never drew in-level — | FIXED (src/game/gunfire.c, #ifdef PORT). |
| 73 | D216 | PARTIAL | Game.SkipIntro — boot straight to the file-select menu (M-83, port + one #ifdef PORT game-code line, PD parity, Phase 4 quick win). | LANDED + VERIFIED this session. |
| 74 | D217 | FIXED | 1P weapon viewmodel + third-person Bond model textures render garbled — | FIXED (M-90/M-92/M-97; PR #47 texpool alignment + PR #49 CI-cache palette key) — |
| 75 | D218 | PROPOSED | Wide FOV exposes the per-level draw-distance / fog boundary — | Logged (M-84), fix proposed + parked. |
| 76 | D219 | OPEN | PPK explosions render purple on Dam (M-87, user QA, "not 3D but noting"). | OPEN — observed, not investigated. |
| 77 | D220 | PARTIAL | 1P muzzle flash position shifts upward at higher Video.FovScale (M-87, user QA, Jungle/M16). | ANALYZED (M-91) — the suspected unscaled-viewmodel root does NOT hold; this is correct perspective behavior, likely cosmetic/QoL. |
| 78 | D85 | OPEN | room primary/secondary DL → texLoadFromGdl garbage | OPEN (safety-netted; widen/pool fixes landed, geometry now renders) |
| 79 | D86 · D87 | RESOLVED | modelInitRwData truncated ptr · attract-demo BE ramromfilestructure | resolved |
| 80 | D88.4 | RESOLVED | propDefs polymorphic record stream not byteswapped → setupDoor crash | resolved (d88_propdefs.py); layout audit M-20 → D132 |
| 81 | D132 | PROPOSED | D88 propDefs layout audit (M-20): | proposed fix (not applied) — |
| 82 | D157 | FIXED | Campaign never unlocks the next level (M-30, user bug — | FIXED (src/bondtypes.h, #ifdef PORT — |
| 83 | D160 | PARTIAL | Dam level-end cutscene (Bond off the dam / bungee) never plays — | DIAGNOSTIC SHIPPED, not root-caused (c95713f5, #ifdef PORT + GE_D160=1): |
| 84 | D89-D92 | RESOLVED | stage-load→frame: stan zero-fill overrun, portal address trunc, chr/AI spawn ptrs | resolved |
| 85 | D93-D102 | RESOLVED | struct-pun / hardcoded-size pass: | resolved (D95 pool bump partial) |
| 86 | D103-D107 | RESOLVED | BUNKER1 viewport height, depth-buffer clear (G_CLEAR_DEPTH_EXT), portal near-plane, LOD mip tile | resolved |
| 87 | D108-D112 | RESOLVED | skeletal models: d43_emit.py put_f32 byte-reversal bug | resolved |
| 88 | D113-D116 | FIXED | portal BFS ok · matrix chain ok · player raw-offset audit + gunfire.c THROW* · HUD text X-mirror | D114/D116 CLOSED — NOT A BUG (M-33, see D168): |
| 89 | D117 | OPEN | frame nondeterminism root-caused; GE_DETERM deferred; framediff.py structural. | OPEN (mode attempted, not achieved) |
| 90 | D118 | RESOLVED | SDL input layer (port/src/input.c); M-24 mouse-look rework: | resolved (D118a residual) |
| 91 | D150 | FIXED | watch OBJECTIVES / BRIEF page crash: | FIXED (src/str.c #ifdef PORT); interactive re-verify pending |
| 92 | D137 | FIXED | right-mouse (aim-sight) crash: | FIXED (src/game/gunfire.c #ifdef PORT — |
| 93 | D119 · D120 | FIXED | guard-attack weapons_held[]->chr pun crash · blood-stain PointUsage[] chain hang | D119 fixed · D120 FIXED (M-30) |
| 94 | D120 | FIXED | Blood-decal PointUsage[] chain — | FIXED (tools_pc/d43_emit.py). |
| 95 | D121 | RESOLVED | WS1 frictionless per-level boot: | resolved |
| 96 | D122 | FIXED | per-level prop/item model-load crash (Dam/Facility/Runway modelLoad/modelInitRwData): | converter fixed; residual chr/fast3d crashes on those levels are separate |
| 97 | D123 | FIXED | crash class C1: chrIsNotDeadOrShot NULL deref on 6 levels (Dam/Runway/Frigate/Statue/Streets/Cradle). | converter fixed (OBJ_ID_WORDS); C1 cleared on all 6, residual crashes are fast3d (C2) |
| 98 | D125 | RESOLVED | crash classes C3+C6 (Aztec/Bunker2/Surface2): | resolved (M-16b) — line 374 → 8 NULs; all 21 sidecars regen'd; Aztec -level_28 now PASSES (was C3 CRASH). |
| 99 | D126 | RESOLVED | crash classes C3r/C4/C6 (Bunker2 -level_27 door7F054FB4 propobj.c:13523, Depot -level_30 prop.c:902, Surface2 -level_43 loadobjectmodel.c:393): | resolved — d88_propdefs.py PROPDEF_PC_BYTES[30/32/33/35]=24 + typed handler; loadobjectmodel.c sizepropdef PORT returns 6. |
| 100 | D124 | FIXED | crash class C2: fast3d bad texture pointer. | Jungle fixed (port/src/gimgfixup.c); Facility → D130 |
| 101 | D131 | RESOLVED | crash class C2m (Jungle -level_37): | resolved — seg_addr() restores the module high word for any fallthrough w1 in [0x40000000, 0x70000000) (module fixed-based at 0x140000000, no ASLR; DRAM/KSEG0/segmented/phys all handled earlier). |
| 102 | D133 | RESOLVED | intro render triage (M-20): | RESOLVED — not a regression, parked (D75/D76, GRAPHICS-BACKLOG.md) |
| 103 | D134 | FIXED | Frame-2 boot hang / sweep "NO-FRAMES" flakiness — | FIXED (port/src/libultra.c) |
| 104 | D135 | FIXED | Firefight crash — bgTestHitOnObj (propobj.c:8446) is an unported N64 GBI parser (M-22, WS6 playtest). | FIXED (src/game/propobj.c, #ifdef PORT — |
| 105 | D136 | RESOLVED | Stage-unload crash — objFree obj->prop reads float garbage (M-22, WS6 Facility playthrough). | ROOT-CAUSED → D139 (it was NOT a layout bug — |
| 106 | D139 | FIXED | Stage-unload crash root cause + fix (M-23). | FIXED (src/game/cleanup_objects.c, #ifdef PORT — |
| 107 | D140 | FIXED | Pause-menu crash (M-23 open → M-27 fixed). | FIXED (src/game/bondview.h, src/game/bondview2.c; #ifdef PORT). |
| 108 | D141 | FIXED | Watch-menu item-model crash (M-27), exposed by D140. | FIXED (src/game/gunfire.c, #ifdef PORT). |
| 109 | D152 | OPEN | Mission-failed / objective-failed → permanent black screen (M-28, user bug report — | MITIGATED (port/src/libultra.c, M-28, #ifdef PORT/port-only). |
| 110 | D154 | FIXED | bg.c room-geometry ray/hit-test GBI parser port (M-28, WRITTEN / UNVERIFIED / UNCOMMITTED). | M-30 re-audit + fixes (still playtest-gated for final verify). |
| 111 | D156 | PARTIAL | Facility outro-cutscene "hang" — | GUARDED (src/game/model.c, #ifdef PORT): |
| 112 | D155 | FIXED | Facility outro-cutscene end → "hang" = unclamped deltaFrames spiral (M-29, user bug report). | FIXED (src/game/frametiming.c, #ifdef PORT — |
| 113 | D153 | RESOLVED | -level_09 frame ~900–1400 0xc0000005 = D117/D134 load flakiness, NOT a bug (M-28). | NOT A BUG — closed. Run anchors on a quiet machine. |
| 114 | D151 | FIXED | Watch data all blank — | FIXED (src/bondtypes.h, #ifdef PORT — |
| 115 | D130 | RESOLVED | crash class C2 (Facility -level_34, Runway -level_35): | resolved — stage all 6 N64 fields in a local f[6] before writing any. |
| 116 | D164 | PROPOSED | Disclaimer / legal screen only draws the first line (D76 root cause, M-31). | FIX PROPOSED, NOT APPLIED (front.c is owned by another agent this session). |
| 117 | D165 | FIXED | Front-end menu cursor doesn't feel like a mouse pointer (M-31, user bug B5 follow-up). | FIXED (port/src/input.c; Input.MenuPointerMode, Input.HipfirePitchSpeed added). |
| 118 | D166 | FIXED | Hipfire mouse pitch is digital while yaw is analog — | FIXED (port/src/input.c). |
| 119 | D235 | OPEN | Wrong textures load after dying/restarting a level — | OPEN — needs: does it repro on a *fresh* level boot (rules out reload-state) vs only after death/restart (confirms it); which surfaces; a screenshot. |
| 120 | D236 | OPEN | Surface 1: 2D billboard trees render as a wall/sheet of tree texture instead of discrete camera-facing tree sprites (M-106, user QA report). | OPEN — not investigated |
| 121 | D237 | OPEN | QoL ask (M-106, user QA): | OPEN — not designed; port-only |
| 122 | D238 | OPEN | QoL ask (M-106, user QA): | OPEN — not designed; port-only (port/src/input.c + config.c) |
| 123 | D239 | OPEN | QoL ask (M-106, user QA): | OPEN — supersedes/re-confirms the M-82 always-grab removal item; port-only |