Mullion translates Direct3D 10, 11 and 12 to Metal, so Windows games run on Apple silicon through Wine. It is free and open source.
This is a pre-release. Expect games that break, and please report them.
| Mullion | D3DMetal | |
|---|---|---|
| Black Myth: Wukong benchmark, High preset, 1512 × 982, TSR at 100%, no frame generation | 28 FPS | 34 FPS (D3DMetal 4.0 beta 3) |
| God of War Ragnarök, High preset, 1512 × 982, no vsync, where a save starts | 26 to 28 FPS, 35 ms of GPU time a frame | 29 to 40 FPS, 22 to 25 ms of GPU time a frame (D3DMetal 4.0 beta 3) |
| 3DMark Fire Strike | 7003 |
Both columns were measured on the same Mac. The God of War numbers are premature: they come from screenshots taken while the game was still compiling shaders, not from a benchmark. Time Spy's graphics tests render correctly, though 3DMark does not report a score for them yet. Steel Nomad does not start yet.
| Mullion | D3DMetal |
|---|---|
![]() |
![]() |
![]() |
![]() |
Direct3D 12 is supported at feature level 12_2 with shader models up to 6.7, including ray tracing at tier 1.1, mesh and amplification shaders, conservative rasterization at tier 3, variable rate shading at tier 2, tiled resources at tier 3, the depth bounds test, tessellation, geometry shaders, stream output, sampler feedback, reserved resources, pipeline libraries and planar video formats, and D3D11On12. On macOS 26 it runs on Metal 4, and on Metal 3 before that. Direct3D 10 and 11 are supported at feature level 11_1. Next for Direct3D 12 is more work on performance and reliability.
- A Mac with Apple silicon, M1 or later.
- macOS 15 or later.
- Wine for x86_64. Stock Wine works, with no patches and no DLL overrides. Only 64-bit games run for now.
- Download the latest release and unpack it.
- Run
./install.sh <wine> [prefix ...].<wine>is the directory that containsbin/wine.
The script copies the libraries into <wine>/lib/wine, where they replace Wine's Direct3D, and into each prefix named on the command line. Prefixes created later need nothing.
In CrossOver, ./install.sh --crossover <bottle> sets up that bottle and leaves CrossOver.app as it is. The bottle gets a CrossOver root of its own in ~/Library/Mullion/CrossOver, made of links to CrossOver's files with Mullion as its DXMT, and its graphics are set to DXMT. Updates of CrossOver keep it; run the script again after one, so that files it adds are linked too. Give the path of CrossOver.app as a third argument if it is not in /Applications or ~/Applications. To undo, put back the bottle's cxbottle.conf.before-mullion.
Without the script, rename CrossOver.app/Contents/SharedSupport/CrossOver/lib/dxmt to dxmt-original, put the unpacked release folder in its place under the name dxmt, and set the bottle's graphics to DXMT. Replace the whole folder: CrossOver's 32-bit DXMT cannot drive Mullion, and the release's empty i386-windows leaves 32-bit games on Wine's own Direct3D. A CrossOver update brings back its own DXMT this way.
On the first launch macOS blocks winemetal.so; allow it under System Settings, Privacy & Security, and start the game again.
The archive has the layout of DXMT's builds (x86_64-windows and x86_64-unix), so tools that install DXMT can install Mullion the same way. To install by hand, copy both directories into <wine>/lib/wine, and the DLLs of x86_64-windows into drive_c/windows/system32 of each existing prefix.
MULLION_LOG_PATH=<directory> |
Writes a log file for each DLL. Attach it to bug reports. |
MULLION_D3D12_METAL4=0 |
Keeps Direct3D 12 on Metal 3 on macOS 26. If a game draws differently there than on Metal 3, please report it. |
MULLION_CONFIG="dxgi.customVendorId=106b" |
Reports Apple's vendor ID. By default Mullion reports the GPU's own name with AMD's vendor ID, because some games exit at startup when they do not know the vendor. |
Options can also go in a mullion.conf next to the game's executable, or in the file MULLION_CONFIG_FILE names. The mullion.conf in this repository lists them. The DXMT_ names and dxmt.conf of earlier builds still work.
You need macOS, Meson 1.3 or later, Xcode with its Metal toolchain, LLVM 15 as static libraries for x86_64, llvm-mingw and a Wine build tree.
git submodule update --init
meson setup build --cross-file build-win64.txt \
-Dnative_llvm_path=<llvm> -Dwine_build_path=<wine build tree> \
--buildtype release --prefix "$PWD/install"
meson install -C buildinstall/ then has the layout of a release. With -Dwine_builtin_dll=false the DLLs are built for a prefix's system32 instead, and need WINEDLLOVERRIDES="d3d12,d3d12core,d3d11,d3d10core,dxgi=n".
About 200 test programs draw, read the result back and compare it with what the Direct3D specification says, each run as every Apple GPU family. Wine's and vkd3d-proton's Direct3D tests also run against Mullion, and their verdicts are recorded in tests/conformance.
Configure with -Denable_tests=true, then run the suite in a Wine:
python3 tests/run.py --build build --wine <wine> --prefix <prefix> --family native,9The tests compile their own shaders, so the prefix needs d3dcompiler_47.dll (from winetricks) and dxcompiler.dll (from DirectXShaderCompiler) in its system32.
Open an issue with the Mac model, the macOS version, how the game was run, and the log. A screenshot helps most. Reports of games that work are welcome as well. Patches are covered in CONTRIBUTING.md.
Mullion is built on DXMT by Feifan He and CodeWeavers, from commit 7c8dee1 (16 September 2026). DXMT provides the Direct3D 10 and 11 foundation, the DXBC shader converter and the Metal bridge. The DXIL front end and most of Direct3D 12 were written for Mullion, about 28,000 lines of source and 78,000 lines of tests so far.
Mullion is a separate project. Please do not report its problems to DXMT.
Thanks to DXVK, whose utility code DXMT carries; to Wine and LLVM; to Microsoft for the DirectX specifications and DirectXShaderCompiler; to Apple for the Metal documentation; and to vkd3d-proton and Mesa, whose tests and drivers we learned from.
LGPL, version 2.1 or later, like DXMT. See LICENSE. LICENSE.OLD is the license DXMT had before April 2026, which still covers the code from then.



