summaryrefslogtreecommitdiff
path: root/src/racing
diff options
context:
space:
mode:
authorquarrel07 <178681861+quarrel07@users.noreply.github.com>2026-07-20 03:14:36 -0700
committerGitHub <noreply@github.com>2026-07-20 12:14:36 +0200
commitb3e0fe248d9983c5dbd5dcf656d099eeec4d9329 (patch)
treef02ce8c9b867ce36f03442e124321694e12026bd /src/racing
parent582900a1b9198bc941d139b0374b92a178c27efe (diff)
Fix widescreen letterbox/divider left-edge clipping on ARM64 (#709)
* Fix widescreen letterbox/divider left-edge clipping on ARM64 The race-intro letterbox bars (draw_box_fill_wide) and the splitscreen divider lines fed the float OTRGetDimensionFromLeftEdge result into gDPFillWideRectangle, whose _SHIFTL packing casts float->unsigned. Converting a negative float to unsigned is UB: x86 wraps (and the wide-rect handler's sign extension recovers the value, so the bug is invisible there), but ARM64 fcvtzu saturates negatives to zero — so on Apple Silicon the fills started at the 4:3 left edge instead of the true left edge, leaving a strip of sky visible left of the intro bars in widescreen. Use the integer OTRGetRectDimensionFrom*Edge getters, matching the sibling draw_box_wide helpers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shorten the fix comment Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'src/racing')
-rw-r--r--src/racing/skybox_and_splitscreen.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c
index 825150f83..dff50e117 100644
--- a/src/racing/skybox_and_splitscreen.c
+++ b/src/racing/skybox_and_splitscreen.c
@@ -308,11 +308,16 @@ void func_802A4300(void) {
gDPFillRectangle(gDisplayListHead++, 157, 0, 159, 239);
break;
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
- gDPFillWideRectangle(gDisplayListHead++, OTRGetDimensionFromLeftEdge(0), 119, OTRGetGameRenderWidth(), 121);
+ // Integer Rect getter: the float getter's negative result through
+ // _SHIFTL is float->unsigned UB, which saturates to 0 on ARM64 and
+ // clips the divider's left extension (see draw_box_fill_wide).
+ gDPFillWideRectangle(gDisplayListHead++, OTRGetRectDimensionFromLeftEdge(0), 119,
+ OTRGetGameRenderWidth(), 121);
break;
case SCREEN_MODE_3P_4P_SPLITSCREEN:
gDPFillRectangle(gDisplayListHead++, 157, 0, 159, 239);
- gDPFillWideRectangle(gDisplayListHead++, OTRGetDimensionFromLeftEdge(0), 119, OTRGetGameRenderWidth(), 121);
+ gDPFillWideRectangle(gDisplayListHead++, OTRGetRectDimensionFromLeftEdge(0), 119,
+ OTRGetGameRenderWidth(), 121);
break;
}
gDPPipeSync(gDisplayListHead++);