Releases: matthewdeaves/old-mac-quake3
Release list
v0.4.0 — native game modules
One DMG that auto-tunes every Mac from a G3 running Panther to a modern Intel — now with native game modules.
This release adds native game-code modules to the single fat .app. The cgame/qagame/ui game logic now ships as native dylibs (fat ppc750+ppc7400+x86_64, bundled inside the app) and is loaded in place of the stock pak8.pk3 bytecode. dyld picks the right slice per machine, and it falls back to the bytecode automatically if a module is missing or you're on a pure server. The engine binary is otherwise unchanged from v0.3.0.
What's new
- Native game modules (
vm_cgame/vm_game/vm_ui 0). Stock ioquake3 already JIT-compiles the QVM bytecode to native PowerPC, so this isn't an "interpreter → native" leap — it's a real compiler's codegen plus dropping the VM's per-access sandbox masking. Bench-measured +1.3% on the Radeon-9000 G4 (41.10 → 41.65 fps; 42.0 on the production auto-config path), zero visual cost, and it's free on every machine. Native load verified on all three arches (ppc750 / ppc7400 / x86_64). - Honest scope in the README. A new "What this port actually changes in the engine" section: the graphics/fps tuning is all config (cvars in the bundled
autoexec-*.cfg), and the measured C changes are the per-machine auto-config (common.c), the Pantherobjc_msgSendSIGSEGV fix (SDLMain.m), the optional Apple Watch companion (watchlink), and Makefile plumbing. The native modules are built from stock, unmodified game source.
Under the hood (measured negatives, so they're never re-chased)
Two candidate code-level wins were investigated on real hardware and rejected with data (see docs/PROFILING.md):
- Bot-skin upload pre-caching — the recurring frame-time spikes are not first-time texture uploads (a cold-vs-warm-VRAM run is frame-for-frame identical); they're per-frame CPU on heavy scenes. Nothing to pre-cache.
- A bigger native-module win — the QVM is already JIT'd to native PPC, so the realistic gain is the ~1% measured here, not the hoped ~5%. Shipped anyway because it's free and consistent.
Measured native-res fps (demo four, each machine's native panel)
| Machine | GPU | Native res | fps |
|---|---|---|---|
| yosemite (G3 449 MHz) | Rage 128 | 800×600 | 22 |
| quicksilver (G4 733 MHz) | Radeon 9000 | 1680×1050 | 42 |
| mini-g4 (G4 1.25 GHz) | Radeon 9200 | 1680×1050 | 27.5 |
| imac-g5 (PPC 970 2.0 GHz) | Radeon 9600 | 1440×900 | 60 (34.5 w/ 2× FSAA) |
| mini-intel (Core 2 Duo) | GMA 950 | 1920×1080 | 41.6 |
Install
Mount the DMG, copy ioquake3.app next to your existing baseq3/ (your own Quake III game data — none is shipped here), and launch. The .app auto-tunes to your Mac and loads the native game modules from inside the bundle. To override, edit baseq3/autoexec.cfg; to disable auto-tuning, launch with +set com_archAutoexec 0; to force the bytecode, +set vm_cgame 2 +set vm_game 2 +set vm_ui 2.
The DMG is built on Tiger so it mounts on Panther 10.3.9 through modern macOS, and every binary inside it (engine + SDL + all six game dylibs) is verified byte-identical to the source build.
v0.3.0 — per-machine graphics tuning: FSAA, anisotropic + trilinear
Best-looking ioquake3 (Quake III Arena) for old Macs — one DMG that auto-tunes every machine from a G3 running Panther to a modern Intel.
This is a config-only release: the engine binary is byte-identical to v0.2.0 (the same fat ppc750 + ppc7400 + x86_64 Mach-O). What's new is the per-machine autoexec layer baked into the .app — auto-selected at launch by hw.model — now measurably tuned across the live bench fleet. Drop ioquake3.app next to your own baseq3/ and it configures itself.
What's new — per-machine graphics tuning
- iMac G5 (Radeon 9600): 2× FSAA (
r_ext_multisample) — antialiased geometry/weapon edges, fixing Q3's most dated look. Costs 60 → 34.5 fps at native 1440×900, affordable with no fps floor. (4× was measured and rejected — 20 fps.) - Quicksilver G4 (Radeon 9000): 16× anisotropic filtering + trilinear (
GL_LINEAR_MIPMAP_LINEAR) — both bench-proven free at native 1680×1050 (the card has fill headroom there). Plus a free CPU win from a tuned sound mix rate (38.9 → 41.1 fps, zero visual cost). - Mac mini G4 (Radeon 9200): bench-confirmed on real hardware at native 1680×1050 (27.5 fps, hardware GL); characterized as fill-rate bound; auto-config wired.
Under the hood
- Profiled the Quicksilver render thread on real ppc7400 hardware and recorded an evidence-based negative: an ARB VBO renderer retrofit is not worth it — no dominant hotspot, the ATI hardware command dispatch is irreducible, and the mesh/lighting hot loops are already AltiVec-vectorized in the baseline. (See
docs/PROFILING.md.)
Measured native-res fps (demo four, each machine's native panel)
| Machine | GPU | Native res | fps |
|---|---|---|---|
| yosemite (G3 449 MHz) | Rage 128 | 800×600 | 22 |
| quicksilver (G4 733 MHz) | Radeon 9000 | 1680×1050 | 41 |
| mini-g4 (G4 1.25 GHz) | Radeon 9200 | 1680×1050 | 27.5 |
| imac-g5 (PPC 970 2.0 GHz) | Radeon 9600 | 1440×900 | 60 (34.5 w/ 2× FSAA) |
| mini-intel (Core 2 Duo) | GMA 950 | 1920×1080 | 57 |
Install
Mount the DMG, copy ioquake3.app next to your existing baseq3/ (your own Quake III game data — none is shipped here), and launch. The .app auto-tunes to your Mac. To override, edit baseq3/autoexec.cfg; to disable auto-tuning, launch with +set com_archAutoexec 0.
The DMG is built on Tiger so it mounts on Panther 10.3.9 through modern macOS, and its contents are verified byte-identical to the source build.
v0.2.0 — native-res auto-tuning confirmed across the fleet
One universal fat .app (ppc750 + ppc7400 + x86_64) that auto-tunes to each old
Mac by hw.model. Drop ioquake3.app next to your own baseq3/ and launch —
the engine picks a tuned config for that machine automatically.
Confirmed native-resolution performance (bench fleet, four timedemo)
| Machine | GPU | Native res | fps |
|---|---|---|---|
| G3 449 MHz (yosemite) | Rage 128 16 MB | 800×600 | 22 — lightmaps + shaders + dlights + flares |
| G4 733 MHz (quicksilver) | Radeon 9000 | 1680×1050 | 39 |
| Core 2 Duo (mini-intel) | GMA 950 | 1920×1080 | 57 — vsync on, no tearing |
| G5 2.0 GHz (imac-g5) | Radeon 9600 | 1440×900 | 60 — maxed (picmip 0, aniso 8×, trilinear) |
What's new since v0.1.0
- Per-machine native-res configs, bench-confirmed on all four live machines.
- mini-intel vsync fix —
r_swapInterval 1kills the GMA 950 tearing at 1080p. - Safe ssh benchmarking (
safebench.sh): single-session, engine self-quits
vianextdemo quit, never KILLs a fullscreen app (which wedges the GPU driver). - Fleet reboot recovery actually wired up (NOPASSWD
qsreboot.sh, verified). /fleet-optimizeskill for ongoing per-class fps/graphics tuning.
Install
Mount the DMG, drag ioquake3.app next to your baseq3/ folder (your own
pak0.pk3…pak8.pk3 — no game data is shipped), and double-click. To override
the auto-tuning, edit baseq3/autoexec.cfg; to disable it, launch with
+set com_archAutoexec 0. The DMG contents are verified byte-for-byte at build.
v0.1.0 — first build (watchlink companion)
First packaged build of the old-Mac ioquake3 port. One verified universal
.dmg runs on the whole vintage fleet — drag ioquake3.app next to your own
baseq3/ and play.
⚠️ Early work in progress. This is a get-it-running milestone: a fat
binary that compiles, launches and renders across the fleet. No per-machine
performance optimisation or visual tuning has been done yet — the numbers
below are stock-settings baselines and will improve.
Runs on
- PowerPC G3 (
ppc750) — Mac OS X 10.3 Panther - PowerPC G4 (
ppc7400) — Mac OS X 10.4 Tiger - PowerPC G5 — Mac OS X 10.5 Leopard (runs the
ppc7400slice) - Intel (
x86_64) — Mac OS X 10.7 Lion and newer
dyld picks the right slice automatically. The .dmg is content-verified
byte-for-byte against the source binary and built on a Tiger host so it mounts
from Panther through modern macOS.
Apple Watch "tactical computer" companion
This build includes watchlink: with the companion iPhone/Apple Watch app on
the same Wi-Fi, your live health / armor / ammo / weapon / score / powerups
stream to your wrist (auto-discovered over Bonjour, UDP 27999) — the same
companion that drives the Quake 1 and Quake 2 ports. Off by default; enable per
machine with seta watch_host "auto" in baseq3/autoexec.cfg.
Initial baselines (four timedemo, stock settings — not optimised)
- iMac G5 (Radeon 9600 / Leopard): ~87 fps @ native 1440×900
- Intel Mac mini (GMA 950 / Lion): ~133 fps @ 1024×768
(See the README for G3/G4 baselines and screenshots.)
Game data is NOT included — supply your own baseq3 pak files. GPL-2.0-or-later.