forked from Ports/goldeneye-pc-port
docs: log D402/D403/D404 + Steam Deck v0.4.0-pre test results
- D402: first clean Linux build fix (shim include-cycle + _SHIFTL). - D403 (new): Deck front-end logo/copyright page broken + graphics not updated is a test artifact — the bundle was seeded with 0.3.0-era sidecars that predate the D75/M-197 blob fix and D303; not a code regression. Disambiguation: regenerate the Deck's data/ sidecars. - D404 (new): 'Aim style: Centred (PC)' is inert on a gamepad; the row's doc comment over-promises (applies to pad trigger) but the centred path is mouse-only (input.c:1783, D337 device-aware gate). - Deck test confirmations: D175 gains a low-utilisation (~15-30%) frame-pacing/present data point; D395 pad-binding retest satisfied (not stuck); D401 rumble + D287 idle/resume-from-sleep confirmed on the Deck's Steam Controller / SteamOS.
This commit is contained in:
1 parent
ed991dd1cb
commit
001690568f
2 files changed
+73
-5
No files matched your search
@@ -271,10 +271,13 @@ D391,PARTIAL,F10 click at glyph bottom could select next row (2026-09-27).,"PART
|
||||
D392,FIXED,Train intro soldier hunched; hand intersects torso vs 1964 —,FIXED (#ifdef PORT ABI/layout in chraction.c); Train aim-angle probe confirms correction; user visually verified the soldier looks fixed against 1964.
|
||||
D393,FIXED,Controller B/Y both crouch; no in-game use button —,FIXED + user live-tested A use / X reload / Y weapon cycle.
|
||||
D394,PARTIAL,Xbox 1.1 Jinx controller parity —,PARTIAL (port 1.1 gameplay button roles user-tested; exact gadget-category parity and other selectable presets outstanding; RB HD toggle unavailable).
|
||||
D395,PARTIAL,Controller trapped in keyboard/mouse-only binding capture —,"PARTIAL (both options UIs block pad-initiated capture; pad B can cancel an active modal; NTSC build linked, controller-only retest owed)."
|
||||
D395,PARTIAL,Controller trapped in keyboard/mouse-only binding capture —,PARTIAL (both options UIs block pad-initiated capture; pad B can cancel an active modal; Steam Deck retest 2026-09-27:
|
||||
D396,PARTIAL,"F10 pad B/A used as slider decrement/increment, not back/select —","PARTIAL (B backs one F10 page, closes at root; A/X accept/toggle on edge but never shift a slider; D-pad/stick left/right still adjust; NTSC linked, pad retest owed)."
|
||||
D397,RESOLVED,SELECT FILE background + intro gun-barrel show an interlaced/comb look —,RESOLVED (2026-09-28):
|
||||
D398,FIXED,PC Options label: D348's procedural slider glyph replaced with an existing mainfolderimages texture (2026-09-27).,"SUPERSEDED by D400 (icon removed, text-only label; purple-hover bug moot; the D400 textMeasure arg-swap bug was found and fixed there)."
|
||||
D399,PARTIAL,File-select bottom row (SELECT FILE text + Copy/Erase + PC Options dot/label) shifted 15px left as a block (user sign-off 2026-09-27).,"LANDED (port-only, D343 class):"
|
||||
D400,PARTIAL,"File-select ""PC Options"" label:","LANDED (port-only, frontoptions.c):"
|
||||
D401,PARTIAL,Rumble Pak → real gamepad haptics (re-promotes D224/M-87):,"LANDED (port-only, input.c/input.h/libultra.c + optionsoverlay.c per docs/dev/RUMBLE-PLAN.md; zero src/ edits)."
|
||||
D402,RESOLVED,First clean Linux (glibc / SteamOS) build of release/v0.4.0 broke in two port-layer include-resolution spots MinGW tolerated (bondconstants.h first-include cyc…,RESOLVED (Linux/Ubuntu-24.04 build → glibc-2.41-compatible binary for the Steam Deck):
|
||||
D403,OPEN,Deck v0.4.0-pre test:,"OPEN (test artifact, log-only per user; not a code regression):"
|
||||
D404,OPEN,"""Aim style: Centred (PC)"" (Input.AimMode=1, D333/D337) has no effect when aiming with a gamepad; the row's own doc comment over-promises (""applies to every aim…",OPEN (log-only per user):
|
||||
|
+69
-4
@@ -441,7 +441,7 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121).
|
||||
| D168 | **`GE_PCDUMP` / F12 PPM captures were vertically flipped — the entire source of the bogus D114/D116 "HUD/text X-mirror" (M-33, developer-confirmed).** — full `## D168` entry at file tail | FIXED (`port/fast3d/gfx_opengl.cpp`); D114 / D116 reclassified as capture-orientation artifacts (below). |
|
||||
| D169 | **Front-end mouse pointer can't reach the outer cells of the mission/level-select grid — only an inner ~3×3 selectable (M-33, developer bug report).** — full `## D169` entry at file tail | **FIXED (M-33, `port/src/input.c`, port-only, no `#ifdef PORT`).** The `menuMode` pointer branch now derives its clamp bounds from the live virtual screen —… |
|
||||
| D178 | **Pre-mission briefing screen: objectives blank / missing, briefing pages blank (also the D143 "briefing text blank" side effect) — FIXED (M-36).** — full `## D178` entry at file tail | **FIXED (M-36)** — high confidence |
|
||||
| D175 | **In-game stutter / brief hang during normal play** — full `## D175` entry at file tail | OPEN (user, 2026-09-26: still happens occasionally; keep). Earlier: OPEN — observed, not investigated |
|
||||
| D175 | **In-game stutter / brief hang during normal play** — full `## D175` entry at file tail | OPEN (user, 2026-09-26: still happens occasionally; keep). Earlier: OPEN — observed, not investigated. **Steam Deck (Linux, 2026-09-27/28): occasional frame-timing hitches at low CPU/GPU (~15–30 %) — a frame-pacing/present profile, not a throughput bottleneck (see entry).** |
|
||||
| D176 | **Surface exterior renders wrong (`-level_36`), two independent defects.** (a) black sky = RDPHALF no-op, root-caused M-37; scroll-speed FIXED (perspective-correct tc in `skyPortRenderPoly`). (b) cliff/rock walls = grey diagonal static — NOT a decode bug (D183: 0/166 loads strided); re-scope from ROM ground truth of the wall texnum (M-37 inconclusive, leaning tiling-density). — full `## D176(a)` entries at file tail; see also GRAPHICS-BACKLOG.md D176 | **(a) scroll-speed FIXED** (fidelity pass; HIGH confidence on root cause, MODERATE on N64 parity); M-93 playtest + M-98 Defect-2 starburst screenshot in the sections. **(b) open.** |
|
||||
| D177 | **Ladders non-functional — progression blocker (user QA) — FIXED (M-36): `count`/`rooms` land in the high half of a widened pointer.** — full `## D177` entry at file tail | **FIXED (M-36)** — high confidence; interactive climb test owed |
|
||||
| D172 | **Bullet-impact / blood / spark particles render magenta or cyan instead of dark red (M-82, ROOT CAUSE FOUND + FIXED).** — full `## D172` entry at file tail | **FIXED (`port/fast3d/gfx_pc.cpp` `gfx_lod_tile_offset`)… |
|
||||
@@ -573,7 +573,7 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121).
|
||||
| D284 | **`port/src/random.c`'s MIPS64 `dsll32`/`dsrl32` shift helpers were backwards — PC PRNG desynced from the N64's from draw 1, in every release to date (M-138 review; fix M-139b).** — full `## D284` entry at file tail | FIXED, 21-level sweep clean, no crashes — RNG stream changes from every prior build; existing replays will diverge. **"Savegames unaffected" was FALSE (M-148): `fileGenerateCRC` runs off a local constant seed via `randomGetNextFrom`, so the fix invalidates every stored slot CRC — v0.3.0 silently wipes all pre-fix saves on first launch (release-blocker candidate, see D295 M-148)** |
|
||||
| D285 | **Steam Deck SIGSEGV during D255 live-testing = SEPARATE bug: the `sndHandleEvent` preempt-scan walks the active-sound list unlocked (M-140; fixed M-141).** — full `## D285` entry at file tail | FIXED (user, 2026-09-26: fixed around v0.2.1/v0.2.2; D305 guard also landed; not seen since). Earlier: **PARTIALLY FIXED, RECURRED PAST THE FIX (see D305, 2026-09-18).** `osSetIntMask` lock added around the preempt-scan (M-141), live-verified crash-free on real Deck hardware (2026-09-16) — but the exact same fault (same FAULT ADDR, same site) recurred on the v0.3.0 pre-release build, disproving the lock as a *complete* fix: it stops concurrent mutation but not a scan that starts on an already-empty list. D305 adds the actually-missing NULL guard. Do not conflate with D255 — different thread, different subsystem. |
|
||||
| D286 | **User-confirmed real ~8s frame freeze on Caverns, Steam Deck — self-recovered, not a crash (M-140).** — full `## D286` entry at file tail | CLOSED (2026-09-26, user-approved: single occurrence on a v0.2.x-era Deck build, before the D255/D285/D305/D329/D336 fixes; not seen since; reopen on recurrence). Earlier: OPEN — one confirmed occurrence, no repro trigger identified, not root-caused; distinct from D255/D285. Do not chase a repro without a better lead. |
|
||||
| D287 | **User-confirmed real, non-self-recovering freeze on Windows (M-141, 2026-09-15/16) after ~15-20 minutes with no input, triggered by clicking back into the…** — full `## D287` entry at file tail | FIXED (user playtest 2026-09-26: idle-unfocused → click-in resumes, mouse checks fine). Earlier: FIX APPLIED, pending user re-test (2026-09-25) — likely mechanism found by code review: SDL mouse-mode/cursor calls (`SDL_SetRelativeMouseMode`, `SDL_ShowCursor`) were made from the scheduler thread (every controller poll) concurrently with the host (window) thread's focus/click handling; the idle+refocus trigger is exactly when both flip grab state. Now queued and applied only on the host thread (`inputApplyMouseRequests`). Not reproduced; confirm with an idle 20 min + refocus test. |
|
||||
| D287 | **User-confirmed real, non-self-recovering freeze on Windows (M-141, 2026-09-15/16) after ~15-20 minutes with no input, triggered by clicking back into the…** — full `## D287` entry at file tail | FIXED (user playtest 2026-09-26: idle-unfocused → click-in resumes, mouse checks fine). Earlier: FIX APPLIED, pending user re-test (2026-09-25) — likely mechanism found by code review: SDL mouse-mode/cursor calls (`SDL_SetRelativeMouseMode`, `SDL_ShowCursor`) were made from the scheduler thread (every controller poll) concurrently with the host (window) thread's focus/click handling; the idle+refocus trigger is exactly when both flip grab state. Now queued and applied only on the host thread (`inputApplyMouseRequests`). Not reproduced; confirm with an idle 20 min + refocus test. **Steam Deck (Linux/Wayland, 2026-09-27/28): idle + Deck settings and resume-from-sleep both fine — idle/refocus confirmed on the Deck.** |
|
||||
| D288 | **Silo intro: a huge, flat-shaded, untextured brown/tan triangle sweeps across the frame during the camera pan down the missile shaft (M-141, user report —…** — full `## D288` entry at file tail | CLOSED — not reproduced on the current build (2026-09-23 capture) and the 2026-09-25 user Silo playtest confirms it gone ("silo fixed"). Fixer not isolated (D271 A/B ruled out). |
|
||||
| D289 | **Dam: a crash in the computer room, not reproducible on a second attempt (M-141, Steam Deck user playtest).** — full `## D289` entry at file tail | FIXED (user, 2026-09-26: no recurrence on post-D255 builds). Earlier: OPEN — needs a human re-test specifically on a build with the D255 fix (this session's `release/v0.3.0`, not any earlier build) to see if it still happens.… |
|
||||
| D290 | **Watch's in-game "controller" section shows no control-pad graphic (M-141, Steam Deck user playtest).** — full `## D290` entry at file tail | FIXED (2026-09-23): D264-pattern template read in `watchRenderController` (flags read 0), plus 3 pointer-width/raw-Gfx sites on the same path; controller model verified rendering on Windows. |
|
||||
@@ -679,13 +679,16 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121).
|
||||
| D392 | **Train intro soldier hunched; hand intersects torso vs 1964** — firing-table float-offset alias across an 8-byte pointer union. Full `## D392` entry at file tail. | FIXED (`#ifdef PORT` ABI/layout in `chraction.c`); Train aim-angle probe confirms correction; user visually verified the soldier looks fixed against 1964. |
|
||||
| D393 | **Controller B/Y both crouch; no in-game use button** — gameplay pad face map conflated modern buttons and native N64 A/B. Full `## D393` entry at file tail. | FIXED + user live-tested A use / X reload / Y weapon cycle. D394 supersedes B crouch and shoulder cycling to match the user-supplied Xbox 1.1 chart. |
|
||||
| D394 | **Xbox 1.1 Jinx controller parity** — user supplied the Xbox 1.1–1.4 control table; B is gadgets, stick clicks crouch, LB aim, RB HD toggle (not weapon cycling). | PARTIAL (port 1.1 gameplay button roles user-tested; exact gadget-category parity and other selectable presets outstanding; RB HD toggle unavailable). |
|
||||
| D395 | **Controller trapped in keyboard/mouse-only binding capture** — pad could enter the binding modal but could not finish or cancel without keyboard. | PARTIAL (both options UIs block pad-initiated capture; pad B can cancel an active modal; NTSC build linked, controller-only retest owed). |
|
||||
| D395 | **Controller trapped in keyboard/mouse-only binding capture** — pad could enter the binding modal but could not finish or cancel without keyboard. | PARTIAL (both options UIs block pad-initiated capture; pad B can cancel an active modal; **Steam Deck retest 2026-09-27: a pad enters bindings and is not stuck — the "trapped" symptom is not reproduced on the Deck's Steam Controller**. Distinct from the still-open controller-rebinding *feature* — PR #109 / D383.) |
|
||||
| D396 | **F10 pad B/A used as slider decrement/increment, not back/select** — B/Y fed Left and A/X fed Right on every row. | PARTIAL (B backs one F10 page, closes at root; A/X accept/toggle on edge but never shift a slider; D-pad/stick left/right still adjust; NTSC linked, pad retest owed). |
|
||||
| D397 | **SELECT FILE background + intro gun-barrel show an interlaced/comb look** — D182(2) family, but present on FIRST display, not only after re-entry (2026-09-27). Full `## D397` entry at file tail. | **RESOLVED (2026-09-28):** root cause = **H2** (confirmed by a 3-scale PCDUMP test — the comb period is fixed at ≈3 *native* rows across 640/1024/1280, i.e. window-period = 3×scale: the `(<<2)-1` 0.75-native-pixel row-strips rely on RDP floor-based scanline stepping that `gfx_draw_rectangle`'s continuous-float rasterization did not replicate). **Fix (port-layer, surgical):** `gfx_draw_rectangle` now floors the top edge to its scanline and the bottom edge to the last covered scanline (the RDP scanline range `[top,bot+1]`) before rasterizing — a no-op for whole-pixel rects, so only sub-pixel strips change; §D15 in `docs/porting-notes.md` documents the mechanism. H1 (ENV_ALPHA 5-bit CC scaling) REFUTED by a byte-identical PD-port cross-check (the darkening it predicted is faithful, not a bug). `GE_D397SH`/`D397SHM` probes removed. Verified by playtest: gun-barrel + file-select gradient render clean, comb gone. |
|
||||
| D398 | **PC Options label: D348's procedural slider glyph replaced with an existing mainfolderimages texture (2026-09-27).** Full `## D398` entry at file tail. | SUPERSEDED by D400 (icon removed, text-only label; purple-hover bug moot; the D400 `textMeasure` arg-swap bug was found and fixed there). |
|
||||
| D399 | **File-select bottom row (SELECT FILE text + Copy/Erase + PC Options dot/label) shifted 15px left as a block (user sign-off 2026-09-27).** Full `## D399` entry at file tail. | LANDED (port-only, D343 class): `selectpos.f[0]` 110→95 (new `#ifdef PORT` in front.c), Copy 200/222→185/207, Erase 282/304→267/289 (D343 PORT block), `LABEL_X` 358→343 (`frontoptions.c`); hit bounds recompute from the shifted positions. Clean build, PCDUMP frame 195 no overlaps; by-eye check owed. |
|
||||
| D400 | **File-select "PC Options" label: icon removed, text-only; fixed a swapped textMeasure() arg bug and a 7px vertical misalignment vs Copy/Erase (user sign-off 2026-09-27).** Full `## D400` entry at file tail. | LANDED (port-only, `frontoptions.c`): D398's dot icon dropped on user instruction ("most straightforward design"); label now a plain `textRender` word, GAP 28 after Erase. Two measurement bugs fixed: (1) `textMeasure(textheight, textwidth)` args passed swapped -> label 35px above the bar, hot band transposed; (2) bare-label height measures 0 (vs 14 for newline-terminated Copy/Erase) -> 7px lower tops; fixed by restoring the `kLabelNL` height measure. PCDUMP frame 195: tops aligned 279.8 vs 279.3, 31px clearance from Erase; by-eye check owed. |
|
||||
| D401 | **Rumble Pak → real gamepad haptics (re-promotes D224/M-87): `CONT_CARD_ON` gate + `osPfs*`/`osMotor*` shims rewired to `SDL_GameControllerRumble`, single global `Rumble strength` slider on `Input.RumbleScale` (2026-09-27/28).** Full `## D401` entry at file tail. | LANDED (port-only, `input.c`/`input.h`/`libultra.c` + `optionsoverlay.c` per `docs/dev/RUMBLE-PLAN.md`; zero `src/` edits). Both M-87 addendum blockers: `g_contStatus[i].status` now sets `CONT_CARD_ON` for connected rumble-capable pads (so `joyRumblePakInit` arms) and `osPfsInit` returns `PFS_ERR_DEVICE` for them (so `osMotorInit` is attempted). New `inputRumble*` API + global `Input.RumbleScale` (0..1, dflt 0.5; the four per-player `Input.PlayerN.RumbleScale` keys were dropped in the final menu-shape decision); `osMotorStart/Stop` drive it. **Real-pad haptics confirmed working by user (2026-09-28)**; plan item 3 (one global `Rumble strength` slider in the F10 overlay + front options screen, reset-table entry) landed the same day. `RumbleScale=0` silence check still unverified (trivial early-out path). |
|
||||
| D401 | **Rumble Pak → real gamepad haptics (re-promotes D224/M-87): `CONT_CARD_ON` gate + `osPfs*`/`osMotor*` shims rewired to `SDL_GameControllerRumble`, single global `Rumble strength` slider on `Input.RumbleScale` (2026-09-27/28).** Full `## D401` entry at file tail. | LANDED (port-only, `input.c`/`input.h`/`libultra.c` + `optionsoverlay.c` per `docs/dev/RUMBLE-PLAN.md`; zero `src/` edits). Both M-87 addendum blockers: `g_contStatus[i].status` now sets `CONT_CARD_ON` for connected rumble-capable pads (so `joyRumblePakInit` arms) and `osPfsInit` returns `PFS_ERR_DEVICE` for them (so `osMotorInit` is attempted). New `inputRumble*` API + global `Input.RumbleScale` (0..1, dflt 0.5; the four per-player `Input.PlayerN.RumbleScale` keys were dropped in the final menu-shape decision); `osMotorStart/Stop` drive it. **Real-pad haptics confirmed working by user (2026-09-28)**; plan item 3 (one global `Rumble strength` slider in the F10 overlay + front options screen, reset-table entry) landed the same day. `RumbleScale=0` silence check still unverified (trivial early-out path). **Rumble confirmed on the Steam Deck's Steam Controller (2026-09-27/28).** |
|
||||
| D402 | **First clean Linux (glibc / SteamOS) build of `release/v0.4.0` broke in two port-layer include-resolution spots MinGW tolerated (`bondconstants.h` first-include cycle; `video.c` `_SHIFTL`); fixed in `port/shim/` only, no `src/` edits, no rule-2 (2026-09-27).** Full `## D402` entry at file tail. | RESOLVED (Linux/Ubuntu-24.04 build → glibc-2.41-compatible binary for the Steam Deck): three `port/shim/` fixes — `PR/ucode.h` + `bondconstants.h` defer `pc_protos.h`/`bondtypes.h` during `bondconstants.h`'s own `ultra64.h` pass (breaks the `bondconstants.h`→`ultra64.h`→`pc_protos.h`→`bondtypes.h`→`bondconstants.h` re-entry); `PR/gbi.h` defines `_SHIFTL`/`_SHIFTR` when absent (the `gbi.h` macros in `video.c` lost their `mbi.h` definitions on Linux). Builds + links clean on Ubuntu-24.04; bundled `libSDL2` with `rpath=$ORIGIN`; pushed to the Deck. Shim files uncommitted at log time. |
|
||||
| D403 | **Deck v0.4.0-pre test: Nintendo logo + copyright/legal page render broken, broader graphics "not reflecting new updates" — stale 0.3.0-era sidecars seeded into the bundle (2026-09-27).** Full `## D403` entry at file tail. | OPEN (test artifact, log-only per user; not a code regression): the Deck bundle was seeded with `pcmodels`/`pccg` sidecars from the `0.3.0-local` install (data dated 2026-09-15), which predate the D75/M-197 embedded-blob raw-pixel fix (commit `425237f9`, 2026-09-21) and the D303 muzzle-vertex converter fix (2026-09-26) → the `P*` front-end logo/legal textures come out broken while the in-exe fast3d fixes (D397 gun-barrel/file-select) render correctly. Disambiguation owed: regenerate the Deck's `data/` sidecars with the current `tools_pc` toolchain and re-test. |
|
||||
| D404 | **"Aim style: Centred (PC)" (`Input.AimMode=1`, D333/D337) has no effect when aiming with a gamepad; the row's own doc comment over-promises ("applies to every aim input … pad trigger") but the centred path is mouse-only (Steam Deck, 2026-09-27).** Full `## D404` entry at file tail. | OPEN (log-only per user): `AIMMODE_CENTRED` is handled only in the RMB/mouse-held branch (`input.c:1783`, `hipDirectCompute`), which D337's device-aware integration feeds **only while the mouse is active**; a pad's native right-stick look never consults `aimMode`, so Centred is inert on a pad. Gap between the row's documented scope and its mouse-only behavior (reads as a dead option to a pad user). Candidate fixes deferred: hide/annotate the row for pads, or correct the doc comment, or (larger) design a centred-aim pad model. **Re-confirmed on the Steam Deck (2026-09-27/28): "centered aim is broken on deck too."** |
|
||||
|
||||
|
||||
Phase 2 replaced the Phase-1 demo loop with the real `mainproc()` on real OS
|
||||
@@ -10533,6 +10536,8 @@ crash class C2 (Facility `-level_34`, Runway `-level_35`): `import_texture_i8` A
|
||||
|
||||
**Status (from §F table):** OPEN — observed, not investigated
|
||||
|
||||
**Steam Deck (Linux / SteamOS, v0.4.0-pre, 2026-09-27/28 — user playtest):** the same intermittent frame-timing hitches reproduce on the Deck, but with a *different* utilisation profile than #92/D339: both CPU and GPU sit at only ~15–30 % (nowhere near a throughput bottleneck) yet the user perceives occasional "weird frame timing." Low-utilisation hitches like this are a **frame-pacing / present** problem, not a throughput problem. Candidates: the D186 `Video.FpsCap` throttle (the D186 row notes it throttles the *sim*, not just presentation), the D248/D250 pacing path (fixed for the 30-vs-60 case), or the Deck's Wayland/GBM + AMD present/vsync behaviour. Next (if pursued): a `GE_PERFSTAT=1` run plus a per-frame `dl`/`swap-pace` time histogram on the Deck, to see whether the hitches are a pacing-wait spike or a present stall. **Log-only this pass — not investigated yet.**
|
||||
|
||||
## D172 — Bullet-impact / blood / spark particles render magenta or cyan instead of dark red (M-82, ROOT CAUSE FOUND + FIXED).
|
||||
|
||||
**Bullet-impact / blood / spark particles render magenta or cyan instead of dark red (M-82, ROOT CAUSE FOUND + FIXED).** Particle billboards (`explosion.c` `explosionRenderPart`, `gSPVertex`+`gSP2Triangles`) take their CC/tile state from ROM state records replayed just before them (`g_ExplosionDisplayLists[]` = `assets/oddtextures.c` `globalDL_0x078..`). The dominant record sets `gsDPSetCycleType(G_CYC_2CYCLE)` + `gsDPSetTextureLOD(G_TL_TILE)` + `gsDPSetCombineMode(G_CC_INTERFERENCE, G_CC_MODULATEIA2)` and binds **two** tiles: tile 0 = IA8 "smoke" @ TMEM 0, tile 1 = RGBA16 "fire" @ TMEM 0x188. `G_CC_INTERFERENCE` cycle-0 = `TEXEL0 * TEXEL1`. **fast3d's `gfx_lod_tile_offset()` returns `0` unconditionally** on the `!gfx_detail_textures_enabled` branch — a D107 fix for GE's mip textures (whole chain loaded in one LOADBLOCK at TMEM 0; `port/src/video.c:225` sets the flag `false`). So texunit 1's sampled tile = `first_tile_index + 0` = tile 0 → **TEXEL1 samples the smoke texture, not fire** → `smoke * smoke` → wrong colour. Two earlier M-82 candidates were false trails: (1) "0xB9 unhandled → D146 abort" — 0xB9 is `G_SETOTHERMODE_L` in this non-F3DEX2 build, handled; zero D146 aborts in a sustained-fire run. (2) "records never set 2-cycle" — they do (`0xBA`), and fast3d applies it (probe-confirmed `cycletype=2CYC`). **Probe evidence (`GE_D172=1`, user Silo firefight, `d172_silo.log`):** 40/40 particle tris → `cfg1[tile=1 tmem=392 fmt=RGBA siz=16b]` but `SAMPLED1 = tile0 (tmem=0 fmt=IA)`, `tex_lod=0`.
|
||||
@@ -15134,6 +15139,8 @@ Reconstructed stub — the original full entry was lost when `findings.md` was t
|
||||
|
||||
**Status: PARTIAL (both options UIs block pad-initiated capture; pad B can cancel an active modal; NTSC build linked, controller-only retest owed)**: pad could enter the binding modal but could not finish or cancel without keyboard.
|
||||
|
||||
**Steam Deck retest (2026-09-27/28, Steam Controller):** a pad can go into the binding UI and is not left stuck — the original "trapped in capture" symptom is not reproduced. (This is distinct from the broader controller-rebinding *feature*, which still doesn't work — PR #109 / D383.)
|
||||
|
||||
|
||||
## D396 (F10 pad controls) — done
|
||||
Already completed and you confirmed it ("looks good"). It's linked in NTSC, documented, and awaiting the physical‑pad retest only. Nothing to do there.
|
||||
@@ -15389,3 +15396,61 @@ inert (no-op) on unsupported/absent pads, and the disabled state is deferred
|
||||
with the per-pad tuning row (`QOL-INVENTORY.md`), which will need the same
|
||||
mechanism for deadzone/swap rows.
|
||||
|
||||
**Steam Deck confirmation (2026-09-27/28):** rumble works on the Deck's Steam Controller — `SDL_GameControllerRumble` fires on SteamOS/Steam Input with `Input.RumbleScale > 0` (user: "rumble works").
|
||||
|
||||
|
||||
## D402 — Linux/Steam-Deck build broken: `bondconstants.h`-first TUs re-enter `bondtypes.h` from a half-parsed `bondconstants.h`, and `video.c` loses the `_SHIFTL` gbi macro (found 2026-09-28, building `release/v0.4.0` on Ubuntu 24.04 for the v0.4.0 Deck pre-release).
|
||||
|
||||
**Context.** Every v0.4.0 wave item since the modern-options work was validated on Windows/MinGW only. The first clean Linux (glibc GCC) compile of `release/v0.4.0` surfaced two port-layer build breaks, both include-resolution issues that MinGW happened to tolerate.
|
||||
|
||||
**Break 1 — half-parsed `bondconstants.h` (header include cycle).**
|
||||
`src/bondconstants.h` includes `<ultra64.h>` at its **top** (line 16), before it defines `ITEM_IDS`/`ACT_TYPE`/`DIFFICULTY`/`TICKOP`/… (those land from ~line 4100 on). On PC, `ultra64.h` → `port/shim/PR/ucode.h` → `pc_protos.h` → `bondtypes.h` (whose own line-28 `#include <bondconstants.h>` normally pulls the *complete* constants header). A TU that includes `<bondconstants.h>` **first** — `port/src/optionsoverlay.c` (and any sibling port TU with the same shape) — sets `src/bondconstants.h`'s include-guard, then that header's top `#include <ultra64.h>` re-enters the `pc_protos.h`→`bondtypes.h`→`bondconstants.h` chain while `src/bondconstants.h` is still mid-parse (guard already set → body skipped). `src/bondtypes.h` then needs `ITEM_IDS`/`ACT_TYPE`/`CHRFLAG`/`DROPTYPE`/`AMMOTYPE`/`DIFFICULTY`/`MPSCENARIOS`/… which are not yet defined:
|
||||
```
|
||||
src/bondtypes.h:1722:9: error: unknown type name ‘ITEM_IDS’
|
||||
… :2445 ACT_TYPE, :2457 CHRFLAG, :2621 DROPTYPE, :3230 AMMOTYPE, :3485 DIFFICULTY
|
||||
port/include/pc_protos.h:219 ITEM_IDS, :260 MPSCENARIOS, :359 TICKOP
|
||||
```
|
||||
`-H` on `optionsoverlay.c` shows the exact cycle: `. shim/bondconstants.h → .. src/bondconstants.h → … ultra64.h → pc_protos.h → shim/bondtypes.h → chrobjdata.h → shim/bondconstants.h (guard set, body skipped) → src/bondtypes.h:1722` error. The natural `ultra64.h`-first path (the common N64 TU shape) is unaffected: `pc_protos.h`→`bondtypes.h`→`bondconstants.h` reaches `src/bondconstants.h` *fresh* and fully parses it before any type is needed.
|
||||
|
||||
**Break 2 — `video.c` `_SHIFTL` undefined (gbi macro without mbi.h).**
|
||||
`port/src/video.c` includes `<PR/gbi.h>` (whose `gDP*` DL macros expand to `_SHIFTL(...)`/`_SHIFTR(...)`) but never reaches `PR/mbi.h` (where `_SHIFTL` is `#define`d) on Linux — no header in its include chain pulls it in, so the `gDPSetCombineLERP` in `portCrosshairApplyTintCombine` (crosshair tint, M2 wave D373/D379) compiles as an *implicit `_SHIFTL()` function call* and fails at **link**: `undefined reference to '_SHIFTL'` from `video.c:131`. `port/src/optionsoverlay.c` already worked around this locally (it defines `_SHIFTL`/`_SHIFTR` before its `gbi.h` include); `video.c` did not. MinGW reaches `mbi.h` through a different include path for these TUs, so it linked; glibc does not.
|
||||
|
||||
**Fix (port-layer only, zero `src/` edits; D402):**
|
||||
1. `port/shim/bondconstants.h` (PC branch): `#define _PORT_DEFER_PC_PROTOS`, `#include <ultra64.h>`, `#undef` — i.e. pre-parse the PR base headers *first* while telling `PR/ucode.h` to **defer** `pc_protos.h` for that pass; then `#include "src/bondconstants.h"` (completes all the constants; its own top `ultra64.h` is now a no-op); then `#include "pc_protos.h"` so the D38 prototypes are still pulled in exactly once, *after* every type is defined.
|
||||
2. `port/shim/PR/ucode.h`: wrap `#include "pc_protos.h"` in `#if !defined(_PORT_DEFER_PC_PROTOS)`, so it is skipped only during the bondconstants-defer pass and runs normally for every other `ultra64.h` consumer.
|
||||
3. `port/shim/PR/gbi.h` (PC branch): after `#define Gfx Gfx_le`, `#ifndef _SHIFTL / #define _SHIFTL(v,s,w)…`, `#ifndef _SHIFTR / #define _SHIFTR(v,s,w)…` (verbatim from `mbi.h`), guarded so a TU that also reaches `mbi.h` keeps `mbi.h`'s definitions. Fixes `video.c` and protects any future `<PR/gbi.h>`-only TU.
|
||||
|
||||
**Verified (Ubuntu 24.04 / GCC, WSL):** full `cmake -S . -B build-pc -DROMID=ntsc-final && cmake --build build-pc -j16` of the freshly cloned branch compiles and **links** `build-pc/ge007.x86_64` (ELF x86-64, links `libSDL2-2.0`) with zero errors after the fix; the pre-fix build fails exactly on the two errors above. Windows/MinGW build unaffected (the `#ifndef`/`#if !defined` guards make both fixes no-ops where the macros are already provided).
|
||||
|
||||
**Landed** (see commit). **Lever:** this is the first clean Linux compile of the v0.4.0 branch; CI's `linux-build` job should now pass. The Deck pre-release test bundle (exe + bundled `libSDL2`, `rpath=$ORIGIN`) is produced from this build — note `tools_pc/bundle-linux.sh` still requires the CI-frozen `prepare-assets/ge007-convert` for the *drop-in-ROM* first-run path; a Deck running from an existing `data/` (ROM + pre-generated sidecars) never invokes it.
|
||||
## D403 — Deck v0.4.0-pre test: Nintendo logo + copyright/legal page render broken, broader graphics "not reflecting new updates" — **test artifact (stale sidecars seeded into the Deck bundle), not a code regression** (Linux/SteamOS; log only per user, 2026-09-27)
|
||||
|
||||
**Reported (user, Steam Deck):** on the freshly built `release/v0.4.0` Linux/Deck pre-release, the **Nintendo logo is broken** and the **copyright/legal page (front_end `PnintendologoZ`/`PgoldeneyelogoZ`/`PlegalpageZ` front-end models) doesn't look right**; more broadly "this doesn't seem to reflect a lot of the new updates for some graphics." Meanwhile the **D397 gun-barrel / file-select fix clearly works**, and "other than that game seems alright on Steam Deck." Log-only requested (no fix this pass).
|
||||
|
||||
**Root cause (confirmed by commit dates, not code):** the Deck test bundle was **seeded with `pcmodels-ntsc-final` / `pccg-ntsc-final` sidecars copied from the `0.3.0-local.20260915c` install, whose `data/` is dated 2026-09-15** (the workflow's "reuse prepared assets" step). Those sidecars predate two converter-baked fixes:
|
||||
- **D75 / M-197 — the embedded-image-blob raw-pixel copy in `tools_pc/d43_emit.py`** (the fix that made the Nintendo/GoldenEye logo + legal/copyright page stop drawing black), which landed in **commit `425237f9` on 2026-09-21** (21-line d43_emit change). Sidecars generated before that carry the **old zeroed-blob layout** → the front-end logo/legal textures come out broken.
|
||||
- **D303 — model-converter muzzle-flash vertex copy** (`d061ca3d`, 2026-09-26) and any other converter-side fixes after 09-15, likewise baked into the sidecar image.
|
||||
|
||||
So the broken logo + copyright page + "a lot of graphics not updated" are **stale-sidecar artifacts**, exactly the front-end/`P*` items the D75/M-197 + D303 converter fixes address. The in-exe **fast3d** fixes (D397 gun-barrel/file-select comb, D341 blood drip, D226 HUD scale, …) are compiled into the current binary and are *not* sidecar-dependent, which is precisely why the user saw D397 working on the Deck while the front-end graphics looked wrong.
|
||||
|
||||
**Not a code regression.** The same `release/v0.4.0` code renders the logo correctly on Windows with freshly-regenerated sidecars (D75 user-confirmed 2026-09-21). The Deck discrepancy is a **test-harness artifact of seeding the bundle with 0.3.0-era sidecars**.
|
||||
|
||||
**Disambiguation (owed before drawing any code conclusion):** regenerate `data/pcmodels-ntsc-final` + `data/pccg-ntsc-final` for the Deck with the **current** `tools_pc` toolchain (the frozen `ge007-convert` CI artifact, or the Python source) and re-test the front end on the Deck — the logo/copyright page should then be correct. Alternatively point the Deck bundle's `data/` at a sidecar set generated from the same branch that the exe was built from.
|
||||
|
||||
**Cross-refs:** D75 (M-197 logo/legal blob fix), D303 (converter muzzle-vertex), D397 (fast3d in-exe, works on Deck), D402 (Linux build that produced this bundle), `docs/dev/notes/REMOTE-DECK-DEBUG-WORKFLOW.md` (the asset-reuse step that seeded the stale sidecars).
|
||||
## D404 — "Aim style: Centred (PC)" has no effect when aiming with a gamepad; the row's own doc comment over-promises (Steam Deck, 2026-09-27; log-only per user)
|
||||
|
||||
**Reported (user, Steam Deck):** setting **Aim style → "Centred (PC)"** (`Input.AimMode = 1`, D333/D337) does nothing while aiming with a controller — the pad keeps the N64-style stick look. Log-only requested (no fix this pass).
|
||||
|
||||
**Root cause (code, no `src/` change involved):** the `AIMMODE_CENTRED` handling exists **only** in the mouse RMB/Aim-button-held branch of the aim poll — `input.c:1783`, `hipDirectCompute(edx * lookDtScale, dyLook * lookDtScale)`. That path is fed **only while the mouse is the active aim device** (D337 device-aware integration: "the hook feeds the mouse integration only while the mouse is active"). A pad's aim is the **native right-stick look** path, which never consults `aimMode` (grep: `aimModeGet()` is used only at `input.c:1783` and the `pdMouseAim`/`aimLegacyGepd` helper at `input.c:480`). There is no stick-input "centred" variant — Centred (PC) is defined by feeding *mouse deltas* straight to the camera with a fixed centre crosshair, so it is structurally a **mouse-only** model. On a pad, `AimMode = 1` is therefore inert.
|
||||
|
||||
**Contradiction with the row's own documentation:** the `Input.AimMode` row comment in `port/src/optionsoverlay.c` (line ~205) states *"CENTRED (PC) = opt-in FPS-style aim (#104), not N64. Applies to **every aim input (RMB, Shift, Q/L, pad trigger, Toggle mode)**."* The "pad trigger" applicability is not honored by the implementation. Related: D338's `Input.AimRange` is `hiddenIfOn=Input.AimMode` (Centred hides it, "the crosshair doesn't travel"), which is correct for the mouse path but misleading on a pad, where the inert Centred mode still leaves the N64 crosshair travelling.
|
||||
|
||||
**Not a code regression on the port's stated model** — Centred (PC) is a mouse-aim style and a pad always uses its native look stick. The defect is the **gap between the F10 row's documented scope ("every aim input … pad trigger") and its actual mouse-only behavior**, which reads as a dead/no-op option to a pad user.
|
||||
|
||||
**Candidate resolutions (deferred — log only):**
|
||||
1. **Cheapest:** make the row honest — gate/hide the "Aim style" (and "Aim range") rows while a pad is the active aim device, or annotate the label/value as "(mouse only)". Removes the no-op confusion.
|
||||
2. **Correct the doc comment** to say mouse-only (and drop "pad trigger" from the claim).
|
||||
3. **Larger design:** define and implement a centred-aim *pad* model (what a fixed-centre crosshair + camera-from-stick means for analog stick input, distinct from the N64 travelling crosshair) — a feature decision, not a bug fix, and would need a `docs/dev/` plan + sign-off.
|
||||
|
||||
**Cross-refs:** D333 (#104 centred aim origin), D337 (device-aware aim integration; the "mouse-active only" gate), D338 (`Input.AimRange` hidden-in-Centred), D403 (same Deck session's other observations), `input.c:1783` / `optionsoverlay.c` Aim-style row.
|
||||
Reference in new issue
Block a user