QuakeSpasm app icon

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.

QuakeSpasm on yosemite, a 1999 PowerMac G3 with an ATI Rage 128 — grenade in mid-air with explosion sparks
yosemite — 1999 PowerMac G3 / Rage 128
QuakeSpasm on sawtooth, a 1999 PowerMac G4 AGP with a GeForce2 MX — combat scene with explosions and dynamic lighting
sawtooth — 1999 PowerMac G4 AGP / GeForce2 MX
QuakeSpasm on quicksilver, a 2001 PowerMac G4 with a Radeon 9000 — slipgate hub with sparks, Q-rune floor, glowing E sigils
quicksilver — 2001 PowerMac G4 / Radeon 9000
QuakeSpasm on mini-g4, a 2005 Mac mini G4 with a Radeon 9200 — overhead view of an Ogre with chainsaw and visible alias-model shadow
mini-g4 — 2005 Mac mini G4 / Radeon 9200
QuakeSpasm on mini-intel, a 2007 Mac mini Core 2 Duo with a GMA 950 on Lion — banner corridor with four grunts
mini-intel — 2007 Mac mini / GMA 950 / Lion
QuakeSpasm on imac-2019, a 2019 iMac 27 inch 5K with a Radeon Pro 580X — overhead slipgate hub with Q-rune floor logo
imac-2019 — 2019 iMac 5K / Radeon Pro 580X

# 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

C OpenGL 1.x/2.x AltiVec PowerPC Apple gcc 4.0.1 Apple clang SDL Bash ssh + rsync

# 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.

Architecture diagram showing Ubuntu workstation orchestrating six Mac bench targets via the Lion mini cross-build host

Three toolchains converge into one fat Mach-O via lipo -create. No CI, no containers — rsync + ssh + scp on top of make.

Build pipeline diagram showing three toolchains (g3 SDK, g4 SDK, lion clang) converging through lipo into one fat binary

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.

Bench loop showing deploy, launch with timedemo, poll qconsole.log, parse fps, append to results.csv

# 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