Skip to content

[macOS] Both Metal and OpenGL crash on track load - Intel Iris Plus Graphics (MacBookPro16,2, Intel, Tahoe 26.3.1) #681

@mkoterski

Description

@mkoterski

Summary

SpaghettiKart crashes on track load with both Metal and OpenGL backends on an
Intel Mac. Metal renders a black screen and crashes with EXC_ARITHMETIC (SIGFPE).
OpenGL renders menus correctly but crashes on track load with the same exception.

Tested on both a source build (commit `f7aab65da (1.0.0-13-gf7aab65da)

crash-20260314-2337.zip

`) and the
official nightly CI build (macOS-intel-x64, downloaded 2026-03-14).
Both exhibit identical behavior.

Hardware & OS

  • Model: MacBookPro16,2 (13-inch, 2020, Four Thunderbolt 3 ports)
  • CPU: Quad-Core Intel Core i7, 2.3 GHz
  • GPU: Intel Iris Plus Graphics (built-in, no discrete GPU)
  • RAM: 32 GB LPDDR4X
  • macOS: Tahoe 26.3.1 (25D2128)
  • Xcode CLT: 17.0.0.17000604 (AppleClang)

Steps to Reproduce

  1. Download the macOS-intel nightly build from the README, or build from source:
   git clone --recursive https://github.com/HarbourMasters/SpaghettiKart.git
   cd SpaghettiKart
   cmake -H. -Bbuild-cmake -GNinja \
     -DCMAKE_BUILD_TYPE=Release \
     -DCMAKE_OSX_ARCHITECTURES=x86_64 \
     -DCMAKE_PREFIX_PATH=/usr/local \
     -DCMAKE_FIND_FRAMEWORK=LAST \
     -DNON_PORTABLE=OFF
   cmake --build build-cmake --target ExtractAssets
   cmake --build build-cmake --config Release
  1. Place US ROM as baserom.us.z64 in repo root (SHA-1: 579C48E211AE952530FFC8738709F078D5DD215E).
  2. Launch ./build-cmake/Spaghettify
  3. Select any track from the menu (e.g. Luigi Raceway, Mario Raceway)

Expected Behavior

Track loads and race begins.

Actual Behavior

Metal (Id 2, default on macOS)

  • Window title shows "Spaghetti Kart (Metal)"
  • Screen is completely black from launch — no menus visible
  • Audio plays correctly (title screen music, menu sounds)
  • Crashes with EXC_ARITHMETIC (SIGFPE) when a track auto-loads or is selected
  • Settings menu is greyed out (cannot switch backend from within the game)

OpenGL (Id 1, set via ~/spaghettify.cfg.json patch)

  • Window title shows "Spaghetti Kart (OpenGL)"
  • Menus render correctly (title screen, character select, track select all visible)
  • Audio plays correctly
  • Crashes with EXC_ARITHMETIC (SIGFPE) at the moment a track begins loading
  • Last log lines before crash:
  Loading Track 8
  [Game.cpp] Clean World
  [Track] Loading... mk:luigi_raceway
  [code_800029B0.c:192] [debug] Setup Race!
  [code_800029B0.c:193] [debug] Game Speed: 2

Crash Report

Exception Type:    EXC_ARITHMETIC (SIGFPE)
Exception Codes:   0x0000000000000001, 0x0000000000000000
Termination Reason: Namespace SIGNAL, Code 8, Floating point exception: 8
Faulting Thread:   0

Full .ips crash report attached below.

Nightly Build Test

Tested the official nightly CI build (macOS-intel-x64, downloaded 2026-03-14)
with the same ROM and o2r files. Results are identical to the source build:

Build Backend Menus Track Load Crash
Nightly CI Metal (Id 2, default) Black screen Crashes EXC_ARITHMETIC (SIGFPE)
Nightly CI OpenGL (Id 1, local config) Render correctly Crashes EXC_ARITHMETIC (SIGFPE)
Source (commit [HASH]) Metal (Id 2) Black screen Crashes EXC_ARITHMETIC (SIGFPE)
Source (commit [HASH]) OpenGL (Id 1) Render correctly Crashes EXC_ARITHMETIC (SIGFPE)

All four combinations crash with EXC_ARITHMETIC (SIGFPE) on track load.
OpenGL renders menus correctly on both builds; Metal shows a black screen on both.
This confirms the issue is upstream and affects both CI and source builds equally.

Nightly config note: The nightly build is portable (NON_PORTABLE=ON) and
reads config from its own directory, not ~/spaghettify.cfg.json. To test
OpenGL on the nightly, the config file must be placed next to the binary:

{"Window": {"Backend": {"Id": 1, "Name": "OpenGL"}}}

Config File Notes

Findings during debugging that may be useful to other Intel Mac users:

  1. Config location: With NON_PORTABLE=OFF, the config is written to ~/spaghettify.cfg.json, not the build directory. Patching the wrong file has no effect.

  2. Backend enum values: The upstream README states backend ids as {OpenGL=3, Metal=4} but the actual enum in libultraship/include/ship/window/Window.h is:

   enum class WindowBackend { FAST3D_DXGI_DX11, FAST3D_SDL_OPENGL, FAST3D_SDL_METAL, WINDOW_BACKEND_COUNT };
   // DX11=0, OpenGL=1, Metal=2
  1. Config key capitalization: The key is "Id" (capital I). Lowercase "id" is silently ignored by Config::GetInt("Window.Backend.Id").

  2. Switching to OpenGL requires patching ~/spaghettify.cfg.json before launch:

   "Window": {
       "Backend": {
           "Id": 1,
           "Name": "OpenGL"
       }
   }

This cannot be done from in-game Settings because the Settings menu is greyed out when Metal fails to render.

Build Environment

cmake 4.2.3, ninja 1.13.2, sdl2 2.32.10, glew 2.3.1
nlohmann-json 3.12.0, spdlog 1.17.0, boost 1.90.0_1
libpng 1.6.55, libzip 1.11.4_1, tinyxml2 11.0.0
AppleClang 17.0.0.17000604

Attachments

  • crash-report-intel-mac.zip — crash reports (.ips) + system info + run logs
  • Full crash report from Metal SIGFPE
  • Full crash report from OpenGL SIGFPE (if separate .ips available)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions