PowerEmu
PowerPC, now with the power back.
PowerEmu runs Mac OS X Tiger on an Apple silicon Mac. Finder, Dock, Aqua, Classic — the whole system, the way it shipped in 2005, in a window on your current machine.
The interesting part is the graphics. Most emulators hand the guest a fake framebuffer and make Mac OS X draw every pixel in software, which is why windows crawl and games won’t launch. PowerEmu emulates an ATI Radeon 9000 and routes its 3D through Metal on your real GPU. Tiger’s own ATI drivers load, Quartz Extreme switches on, and OpenGL works. Warcraft III runs at around 30 fps, all settings high, at 1680×1050.
Around the emulator there’s a proper Mac app: a library of VMs, shared folders, clipboard sync both ways, and a mail proxy and web accelerator so the old system can still sign into Gmail and load pages. Built on QEMU, GPL, free.
What it can do
- 3D that actually runs. Games, screen savers and OpenGL apps go through your Mac’s GPU instead of being drawn by the CPU one pixel at a time.
- Quartz Extreme switches on. Tiger sees a real graphics card, so the compositor turns on and the window effects come with it.
- Warcraft III at around 30 fps. All settings high, at 1680×1050, on an emulated PowerPC Mac.
- Clipboard both directions. Copy in Tiger, paste in macOS, and the other way around.
- Shared folders. A folder on your Mac shows up as a mounted volume in the guest, so moving files is drag and drop.
- Real full screen. Display modes shaped like your actual panel, including the notch strip, rather than a menu of 1998 resolutions.
- The clock stays right. A small guest agent keeps Tiger’s time in step with the host instead of drifting off by hours.
- Mail signs in again. A built-in proxy does the modern TLS that iCloud and Gmail now insist on, so Tiger’s own Mail app can connect with an app password.
- A web accelerator. Your modern Mac does the TLS handshakes and re-encodes the heavy images, so the old system gets pages it can cope with.
- Classic works. Mac OS 9 runs inside Tiger inside the emulator, which means pre-OS X software runs too. Yes, it’s turtles.
- A shelf full of Macs. Keep as many VMs as you like, each with its own disks and settings, and pass through CDs, DVDs, disc images and USB devices.
- An overlay that tells you the truth. Frame rate, draw calls and VRAM, plus what the host is doing — so a slow moment reads as “something else took the CPU” rather than as a mystery.
Why it’s faster than the alternatives
PowerEmu is built on QEMU, which already knows how to pretend to be a Power Mac. On its own, though, it stops a long way short of usable. Here’s what changed.
| Plain QEMU | PowerEmu |
|---|---|
| A dumb framebuffer. Mac OS X draws every window itself, on the CPU. | An emulated Radeon 9000 that Tiger’s own ATI drivers bind to, unmodified. |
| No 3D at all, so games and screen savers either crawl or refuse to launch. | 3D commands go to Metal on your real GPU. Warcraft III runs around 30 fps on high. |
| Quartz Extreme stays off, because Tiger looks for a real card and doesn’t find one. | It finds one. The compositor turns on and windows move like they should. |
| The pointer smears trails across OpenGL windows. | The host draws the cursor, so it stays clean. |
| A short list of old resolutions, none of them the shape of a modern display. | Modes that match your panel, plus true full screen including the notch. |
| Audio crackles and cuts out constantly. | Paced in real time, which fixed the dropouts. Some distortion is still being chased. |
| Plug in a USB device at the wrong moment and the whole thing wedges. | The USB controller drops missed frames instead of livelocking. It keeps going. |
| Click another window and macOS quietly parks it on the efficiency cores. | It tells macOS it’s busy, so it keeps running at full tilt in the background. |
| Stock settings that suit PowerPC code badly, so everything is slower than it needs to be. | Retuned emulation internals. One guest benchmark went from 9–11 seconds to about 2. |
| No link to the host: no clipboard, no shared folders, no clock sync. | All three, plus a real Shut Down instead of yanking the virtual power cable. |
| A second Dock icon and no way to manage more than one machine. | One app, one icon, and a library of VMs with their own disks and settings. |
Technical details
Graphics
- An emulated ATI Radeon 9000 (RV280/R200) —
ppc-mac-gpu, with an MMIO register set, a PM4 command processor and ring buffer, a 2D engine (fills, blits, host data, clipping) and AGP/GART address translation. Mac OS X’s own ATI kexts bind to it unmodified. - A Metal renderer for the R200 3D pipeline. Draw packets go straight to Metal: hardware T&L (model-view-projection, lighting, spot lights and attenuation, texture matrices, fog), viewport and scissor, R200 texture combiners, alpha test, blending done in-shader through framebuffer fetch, plane masks, depth and stencil. Textures in ARGB8888, RGBA/ABGR8888, RGB565, ARGB1555, ARGB4444, I8, AI88, DXT1/3/5 and YUV 4:2:2, resident in VRAM or fetched over AGP. It renders into VRAM through linear Metal texture views — no shadow copies.
- Quartz Extreme. The uni-north host bridge gets an AGP capability and a working
GART, so Apple’s
AppleMacRiscAGPdrives the bus, the Radeon driver builds its AGP GART and reportsAccelCaps = 1, and WindowServer switches on the OpenGL compositor. - A hardware cursor. A patched QEMU VGA NDRV reports cursor support and hands the image and position to the GPU model, which draws it on the host — fixing the stale save-under that left cursor-shaped notches over OpenGL windows.
- Host-shaped display modes. The device’s EDID (Established Timings III) and the patched NDRV’s mode table add 1440×932, 1280×828, 1152×746 and 1680×1088, plus below-the-notch variants. Full-panel fullscreen covers the whole display including the notch strip.
- 64, 128 or 256 MB of VRAM, behind a 1 GB uni-north PCI window.
Sound, input and stability
- Screamer audio pulls DMA at the sample rate from a 1 ms virtual-clock timer into a 186 ms ring; the position register advances with it and a 40 ms jitter buffer fronts the host backend. A four-second 1 kHz capture went from 10–20 dropouts to zero.
- Seamless pointer via a USB tablet taking absolute positions; captured mode remains for games.
- OHCI bounds transfer descriptors per endpoint per frame and drops missed frames rather than replaying them, which used to livelock the emulator under host load.
Speed
- Host scheduling. An
NSActivityUserInitiated | LatencyCriticalassertion plusQOS_CLASS_USER_INTERACTIVEon the TCG vCPU threads stops App Nap exiling the emulator to the efficiency cores. A guest benchmark loop dropped from 9–11 s to 3.4 s on that change alone. - TCG: a raised softmmu TLB floor (1024 entries) and a 64K-entry TB jump cache
retired by a generation counter, so a flush stays O(1) — a game covers 100k+
translation blocks and every PowerPC
blris an indirect branch. - target/ppc:
lmw/stmwexpanded inline instead of a helper thatprobe_accesses the range, and a host-FPU fast path for A-form arithmetic when FPSCR is RN with no enables and no NaNs. - GPU batching: conflicting batches ordered on the GPU with shared events rather
than
waitUntilCompletedon the vCPU thread, hybrid fences, an AGP/GART page-to-host-pointer cache, and draw vertices bump-allocated from a recycled 8 MB buffer. - Net result: benchmark loop 9–11 s → 1.95 s. Warcraft III went from 4–5 fps to around 30 fps on all-high settings at 1680×1050.
The app and the guest
- SwiftUI app driving QEMU over QMP. VMs are
.poweremupackages; importing disks and ROMs uses APFS clones. The guest screen is drawn inside the app through apoweremu-displayobject over a Unix socket with shared memory and damage rectangles, so QEMU isn’t a second Dock icon. - PowerEmu Tools — a guest agent for 10.4+ PPC, installed per user with no
administrator password: clipboard both ways, shutdown and restart through loginwindow
(
kAEShutDown/kAERestart), and an optional root clock daemon that steps errors over 1 s and slews smaller ones withadjtime. - Shared folders over a WebDAV server implementing enough of RFC 4918 for
Tiger’s
webdavfs, on a per-VM Unix socket so no TCP port is opened. - Service Hub: a mail proxy (the guest authenticates locally; PowerEmu does
implicit TLS or STARTTLS to iCloud, Gmail, Yahoo or Fastmail with an app password) and a
Web Accelerator on
10.0.2.100:7780doing TLS 1.3 and HTTP/2, WebP/AVIF/HEIC transcoding, image downscaling and 204s for trackers. - Built on QEMU 10.0.2 as patched by UTM. GPL-2.0-or-later.
Alpha, and still moving. Tiger is tested; Leopard isn’t yet — if you try it, tell me how it went. Free and GPL, always.