Software 44684 Published by

Triton, a full DirectX 11 driver stack for QEMU/KVM released by UTM developer osy, brings working GPU acceleration to Windows ARM64 virtual machines. By reverse-translating Windows DDI calls back into standard D3D11 API commands and routing them through Neptune’s VirtIO transport layer, the stack bypasses the DLL-replacement tricks that typically trigger anti-cheat systems. The project supports DXVK on Linux hosts and leverages Apple’s D3DMetal framework or DXMT for macOS, with developers already reporting playable runs of Crash Bandicoot and full 3DMark FireStrike benchmarks. Though still labeled a pre-release and awaiting shader-container polish, Triton stands as the first fully open-source, anti-cheat-compatible DirectX 11 GPU path in QEMU.



Triton Brings DirectX 11 GPU Acceleration to QEMU, Enabling Windows Games in VMs

The long wait for a working DirectX 11 driver stack in QEMU is over. osy, the developer behind UTM, has released Triton, a full kernel-mode and user-mode driver pair that enables modern Windows games to run inside QEMU/KVM virtual machines. The release, tagged as v0.2.1 of the kvm-guest-drivers-windows package, dropped last week.

This isn't a prototype anymore. It's a functional stack that's already been used to run Crash Bandicoot: The Trilogy on Windows 11 ARM64 and complete 3DMark FireStrike benchmarks.

The work builds directly on Neptune, a Direct3D protocol forwarding layer for VirtIO that the team introduced in late July. Where Neptune proved that D3D11 calls could traverse the hypervisor boundary, Triton takes it a step further by implementing an actual Windows graphics driver that games recognize.

Screenshot_from_2026_08_09_07_56_05

How It Actually Works

Here's the thing about virtualized GPUs: most of them are terrible at it.

Previous attempts either faked the GPU identity (and got caught), or relied on DLL replacement that anti-cheat systems would flag immediately. Triton sidesteps both problems by implementing the DDI — the Device Driver Interface — that real GPU drivers provide. The render pipeline looks like this:

Application  d3d11.dll/DXGI API calls  Triton UMD (DDI)  Neptune serialization  VirtIO KMD  QEMU host  virglrenderer  host DirectX renderer

The core innovation is the DDI API inverse transform. Instead of inventing a new serialization format for DDI commands (which would be brittle and slow), Triton converts DDI calls back into standard DirectX 11 API calls and reuses Neptune's existing transport layer.

Most D3D11 DDI functions have direct API equivalents. The mapping is mostly handle lookups and enum translations. It's elegant, in the way that "I found the right screw and didn't have to machine a new one" is elegant.

Host Renderer Options

Triton supports different backends depending on your host OS, which is about the most reasonable design decision you could make given the constraints.

On Linux, it uses DXVK (D3D11 Vulkan translation) with Neptune's existing swapchain export via DMAbuf. This path was already proven working for Wine games on Linux during the Neptune work.

macOS is where things get interesting and complicated. Vulkan isn't a first-class citizen here, so you've got three options:

  1. DXMT (the team's fork of VirtualBox's d3d11-to-Metal translation) - functional but slower
  2. d3dmetal-native - wraps Apple's D3DMetal.framework from Game Porting Toolkit, significantly faster, but the EULA prohibits distribution outside "developing, testing, or evaluating video games for Apple-branded products"
  3. D3DMetal.framework - same Apple restriction applies; UTM can't bundle it, you have to get it yourself

Performance-wise, the D3DMetal path outperforms DXMT even under Rosetta on ARM64 hosts. The license restriction is annoying, sure, but it's the same arrangement CrossOver uses. You probably already have it if you're running Game Porting Toolkit.

The Shader Bytecode Problem

One detail worth mentioning: Triton passes DXBC shader bytecode through unmodified. The guest's d3d11.dll consumes the metadata container, but Triton must reconstruct DXContainer fields from raw SHDR bytecode before forwarding to Neptune.

osy describes this reconstruction as "the weakest and most error-prone part" of the implementation. Significant trial and error, assisted by AI, went into getting it working. That's... fair. Shader containers are a pain point even for native drivers.

Requirements and Setup

You'll need:

  • macOS with Apple Silicon (HVF acceleration), or Linux with KVM
  • QEMU flags: -device virtio-ramfb-gl,...,venus=true,neptune=true plus -accel hvf,ipa-granule-size=0x1000 and -display cocoa,gl=es on macOS
  • ANGLE (from WebKit), libepoxy, LLVM 15 for DXMT builds

Pre-built signed Windows drivers are available as release assets for testing, with a stability warning attached. The GitHub page labels this a "pre-release" but osy notes it represents the final Triton state at time of writing, with one commit beyond v0.2.1 on the neptune branch.

Why This Actually Matters

Let's be clear: QEMU had attempted DirectX 11 GPU acceleration multiple times before without success. The complexity of implementing a real Windows graphics driver, the DDI, the shader translation, the host-side rendering, is genuinely hard. Most teams gave up.

Triton proves it's possible. More importantly, it does so in a way that's anti-cheat compatible (no DLL replacement, no fake GPU identity) and performant enough to actually run games. The DDI approach means the guest sees a legitimate graphics driver, which opens the door for DRM content, anti-cheat software, and generally anything that checks for tampering.

The macOS angle is particularly significant. Apple Silicon Macs are powerful machines with no path to native Vulkan, which has historically made gaming through QEMU a non-starter. Triton sidesteps that by using D3DMetal where available, and DXMT as a fallback. It's not perfect, D3DMetal's EULA is restrictive and DXMT is slower, but it's a working solution where there wasn't one before.

What's Next

All of this is open source. The Windows UMD lives in osy/virtio-win-mesa on the neptune branch, the kernel-mode driver in osy/kvm-guest-drivers-windows, and the QEMU/virglrenderer forks in utmapp/qemu and utmapp/virglrenderer respectively. Build scripts are in osy/build-mesa.

The team has also published " Bringup Notes: Building Triton" on the UTM blog for anyone looking to get involved.

Head here to grab the drivers and  here for the architecture deep-dive.