QuakeSpasm for old Macs
Modern QuakeSpasm tuned for six Macs spanning 1999 to 2019 — PowerPC and Intel, one fat binary, full visual stack on the slowest hardware.
![]()
A fork of QuakeSpasm tuned for six old Macs spanning 1999 to 2019. One fat 3-architecture Mach-O binary boots into a per-machine config and turns on the best visual stack each GPU can afford while staying above its playability floor.
# Headline gains
Best timedemo improvements per machine, before-and-after on the same hardware (median of three runs). Every "after" cell is the v7 build with translucent water, alias-model shadows and emissive dynamic lights enabled.
| Machine | Demo / resolution | Before | After | Δ |
|---|---|---|---|---|
| yosemite — 1999 PowerMac G3, Rage 128 | demo3 / 1024×768 | 5.10 | 19.80 | +288% |
| yosemite — 1999 PowerMac G3, Rage 128 | demo1 / 1024×768 | 7.70 | 16.55 | +115% |
| mini-g4 — 2005 Mac mini G4, Radeon 9200 | demo3 / 640×480 | 78.40 | 114.35 | +45.9% |
| mini-g4 — 2005 Mac mini G4, Radeon 9200 | demo3 / 1024×768 | 47.90 | 68.20 | +42.4% |
| sawtooth — 1999 PowerMac G4 AGP, GeForce2 MX | demo3 / 640×480 | 43.95 | 57.30 | +30.4% |
| sawtooth — 1999 PowerMac G4 AGP, GeForce2 MX | demo3 / 1024×768 | 39.45 | 46.75 | +18.5% |
| imac-2019 — 5K, Radeon Pro 580X | demo3 / 1024×768 | 1544.80 | 1731.70 | +12.1% |
The 1999 G3 going from 5.10 fps (unplayable) to 19.80 fps (playable) at 1024×768 is the headline number, and that's with the full visual stack on. Quicksilver and the Lion mini joined mid-project so don't have a clean baseline.
# Get the build
The current release is v1.1-round-v7.
| Bundle | Size | Runs on |
|---|---|---|
| Quakespasm-fat-universal-ppc750-ppc7400-x86_64.zip | 4.9 MB | All six benched Macs (recommended) |
| Quakespasm-ppc750-Panther.zip | 4.0 MB | G3 / 10.3.9 Panther+ |
| Quakespasm-ppc7400-AltiVec-Tiger.zip | 4.0 MB | G4 / 10.4 Tiger+ |
| Quakespasm-x86_64-Lion-or-newer.zip | 3.9 MB | Intel / 10.7 Lion+ (verified to Sequoia 15.7) |
The fat universal binary runs unchanged on Panther 10.3.9 through Sequoia 15.7. dyld picks the right slice on each host; the engine then queries hw.model at boot and loads the matching autoexec-<machine>.cfg.
# Features
- One fat 3-architecture Mach-O (PPC 750 + PPC 7400 + x86_64) for every supported Mac, no per-machine reinstall
- Per-machine autoexec configs that pick the best visual stack each GPU can carry: GLSL water on the programmable G4s, distance-gated dynamic lights on the G3, framebuffer-clear skip on five of six machines
- Translucent water, lava, slime and teleporters on every machine including the 1999 G3
- Alias-model shadows on every machine, with runtime distance gates (
r_shadow_distance) on the G4 trio and Lion - Emissive-fullbright dynamic lights — wall buttons, computer screens, fluorescent fixtures and tech panels cast coloured light into the room (new cvar
r_emissive_lights, on by default everywhere with per-GPU radius and max tuning) - Engine-side fix for the long-standing X-ray watervis bug on un-watervis'd id1 maps
- AltiVec replacements for the alias-model lerp and 16-bit sound mixer on G4 targets
- On-pickup HUD blink restored (regression in upstream, fix at
sbar.c:657) - Latent null-deref, signed-shift UB and unchecked-allocation bugs surfaced and fixed via modern static analysis (cppcheck, clang-tidy, scan-build, gcc
-fanalyzer, ASan, UBSan) against a Linux build target compiling the same source - SSH-based remote-recovery script (
qsreboot.sh) that survives the Rage 128 LUT corruption Panther leaves on hard kills - Parallel six-machine bench loop with three-run median, atomic CSV row appends (
parallel-bench.sh) and an unattended screenshot harness (screenshot.sh)
# The bench
| Machine | Year | CPU | GPU | macOS |
|---|---|---|---|---|
| yosemite | 1999 | PowerMac G3 B&W, 449 MHz | ATI Rage 128, 16 MB | 10.3.9 Panther |
| sawtooth | 1999 | PowerMac G4 AGP, 500 MHz 7400 | NVIDIA GeForce2 MX, 32 MB | 10.4.11 Tiger |
| quicksilver | 2001 | PowerMac G4, 733 MHz 7450 | Radeon 9000 Pro, 64 MB | 10.4.11 Tiger |
| mini-g4 | 2005 | Mac mini G4, 1.25 GHz 7447A | Radeon 9200, 32 MB | 10.4.11 Tiger |
| mini-intel | 2007 | Mac mini, 2.33 GHz Core 2 Duo | Intel GMA 950 | 10.7.5 Lion |
| imac-2019 | 2019 | iMac 27", 3.7 GHz i5-9600K | Radeon Pro 580X, 8 GB | 15.7.5 Sequoia |
# Tech stack
# Architecture
An Ubuntu workstation orchestrates the six Macs over SSH. The Lion mini does double duty as both a bench target and the cross-build host for every PPC binary — it's the last Mac Apple shipped with PPC-targeting GCC 4.0.1 in /usr/bin.
Three toolchains converge into one fat Mach-O via lipo -create. No CI, no containers — rsync + ssh + scp on top of make.
The bench loop is the same on every machine: deploy, launch with the per-arch autoexec, poll qconsole.log for the timedemo result, append a row to a rolling CSV. Three runs per cell; the first is treated as warm-up and dropped.
# Frames per second across the rack
Round v7 wrap full-grid bench at commit f2df151d. Median of three runs per cell.
| Machine | demo1 1024×768 | demo1 640×480 | demo2 1024×768 | demo2 640×480 | demo3 1024×768 | demo3 640×480 |
|---|---|---|---|---|---|---|
| yosemite (G3) | 16.55 | 35.20 | 15.20 | 33.40 | 19.80 | 36.75 |
| sawtooth (G4) | 42.65 | 55.90 | 35.40 | 55.10 | 46.75 | 57.30 |
| quicksilver (G4) | 64.20 | 71.95 | 62.45 | 72.10 | 86.15 | 98.25 |
| mini-g4 (G4) | 49.40 | 86.50 | 39.30 | 74.80 | 68.20 | 114.35 |
| mini-intel (Lion) | 73.05 | 165.35 | 54.55 | 132.15 | 44.70 | 189.00 |
| imac-2019 | 1835.25 | 2048.60 | 1853.25 | 2018.55 | 1731.70 | 1807.00 |