Skip to content

v1.2 — Round v8 wrap (lightmap+multitex hygiene + icon fix + G3 demo3 recovery)

Choose a tag to compare

@matthewdeaves matthewdeaves released this 10 May 13:24
· 73 commits to master since this release

One fat universal binary, six retro Macs spanning 23 years (1999 G3 → 2019 i5 iMac).

Drop-in install

  1. Download quakespasm-fat-app-v0.97.0.zip
  2. Unzip; you get Quakespasm.app + id1/ (per-machine autoexec configs)
  3. Drop id1/PAK0.PAK + id1/PAK1.PAK from your registered Quake install in next to the app
  4. Double-click Quakespasm.app

The fat binary holds three slices (ppc_750 G3, ppc_7400 G4 + AltiVec, x86_64 Lion+). dyld picks the right one at launch. host.c reads sysctl hw.model and chains the right per-machine autoexec on top of the per-arch baseline, so the same bundle delivers a hand-tuned visual stack on each machine without a per-target build.

Bench fleet (full grid this round, 84d3597)

Machine OS GPU demo1 1024 demo3 1024 (lava-heavy)
yosemite (PowerMac1,1, 1999, G3 449 MHz) Panther 10.3.9 Rage 128 16 MB 17.35 20.70
sawtooth (PowerMac3,1, 1999, G4 500 MHz) Tiger 10.4.11 GeForce2 MX 32 MB 40.30 35.75
quicksilver (PowerMac3,5, 2001, G4 733 MHz) Tiger 10.4.11 Radeon 9000 Pro 64 MB 64.60 61.05
mini-g4 (PowerMac10,1, 2005, G4 1.25 GHz) Tiger 10.4.11 Radeon 9200 32 MB 50.30 45.30
mini-intel (Macmini2,1, 2007, C2D 2.33 GHz) Lion 10.7.5 GMA 950 64 MB 75.95 36.85
imac-2019 (iMac19,1, 2019, i5-9600K) Sequoia 15.7.5 Radeon Pro 580X 8 GB 1619.05 1314.90

What's new vs v1.1

v8 lightmap + multitex hygiene cluster (already in master):

  • gl_lightmap_subrect 1 — honor the existing dirty-rect's l/w fields instead of uploading full 256-wide rows. ~16× upload-bandwidth saved per dirty lightmap on R128.
  • multitex enable/disable hoisted out of per-texture loop in R_DrawTextureChains_Multitexture.
  • Per-frame dirty-lightmap list in R_RenderDynamicLightmaps instead of walking every lightmap.
  • 2-texel scalar unroll of R_BuildLightMap's compose loop (G3 path).

v8.1 G4 AltiVec defaults flipped on (sawtooth/quicksilver/mini-g4):

  • Lightmap-compose AltiVec path enabled by default (was opt-in).
  • Per-texel dlight attenuation AltiVec enabled by default.

v8 followup — G3 demo3 lava-heavy regression fix:

  • Round v5 wrap polish enabled r_lavaalpha/r_telealpha/r_slimealpha 0.6 across yosemite + the G4 trio. Bisect on yosemite demo3 1024 (e1m6 "The Door To Chthon", lava-heavy) showed r_lavaalpha 0.6 alone drops fps from 19.65 → 14.40 (-26 %), pushing G3 below the 20-fps floor. Tele + slime alpha together also regressed.
  • Decision: drop those three on G3 (autoexec-yosemite.cfg); keep r_wateralpha 0.6 (water see-through is the most-common transparent-liquid effect in regular play). Yosemite demo3 1024 recovered to 20.60 fps.
  • G4 trio + Lion + iMac keep all four liquid alphas at 0.6 (different fillrate envelope).

Tiger/Panther icon display fix:

  • The bundled .icns now contains ONLY classic legacy chunks (ICN#, ics#, is32, s8mk, il32, l8mk, ih32, h8mk, it32, t8mk). Apple's iconutil adds modern TOC + ic07-ic14 PNG chunks unconditionally, and Panther / Tiger Finder bail on those — verified by progressive-A/B against Apple's stock Calculator.icns.
  • Trade-off: max chunk size 128×128, so Lion+ Finder upscales for Retina display sizes. Acceptable; the alternative (per-OS .icns swap inside the bundle) was a bigger code surface.
  • New tooling: scripts/rebuild-icon.sh is now pure Python (Pillow + hand-rolled RLE), runs in ~1 second instead of the previous iconutil-on-Lion round-trip.

deploy.sh hardening:

  • rsync --checksum (not just size+mtime) prevents stale files surviving deploy. We hit a sawtooth case where --partial left a 298 KB stale ICNS while local was 2.6 MB and --size+mtime skipped the update.
  • Post-deploy md5 verification of binary + icon, with portable md5/md5sum probe (Lion BSD, Tiger/Panther, Linux all covered).

Hardware reach

Era First model Last model Span
PowerPC PowerMac1,1 (1999) PowerMac10,1 (2005) 6 years
Intel Macmini2,1 (2007) iMac19,1 (2019) 12 years

Six bench machines, 23 years of Apple silicon, one fat universal binary, one source tree.

Known constraints

  • G3 yosemite ships at 800×600 default since round v9; 1024×768 is also playable on demo3 (20.7 fps) but interactive play feels sharper at 800×600. Override with vid_width N; vid_height M; vid_restart in console.
  • Sawtooth GeForce2 MX is the only G4 without a fragment-shader water path; uses the classic-warp r_oldwater 1 fallback like the G3.

Source

🤖 Built with Claude Code