Supporting DirectX 12 On Mac Is Proving Tougher Than Linux But Work Is Underway
If you're a long-time Mac or Linux user, you've almost certainly benefited from the work of CodeWeavers even if you've never heard of them. Founded in 1996, the company has been working for a long time now on making Windows applications run on first Linux, then Mac, and most recently, ChromeOS
. CodeWeavers is the primary sponsor of the Wine project (a translation layer to run Windows programs on Linux), and Valve contracted the company to help with its Proton project
that powers the Steam Deck
and much of modern Linux gaming.
CodeWeavers sells a product called CrossOver, which is its primary consumer-facing product. CrossOver is a commercial piece of software that performs the same task Proton does, except with a more holistic approach rather than being purely gaming-focused. CrossOver is available for Linux and Mac, and currently it works well—as long as your application doesn't use DirectX 12.
If you do
need DirectX 12, well, you're gonna have to sit tight for a bit. CodeWeavers just posted a blog entry that says implementing DX12 in CrossOver
is the company's top priority next year. More specifically, CodeWeavers says it'll have DX12 working in Linux in the next full-number release version thanks to the maturity of Vulkan as an API and improvements in its own VKD3D library (not be confused with the open-source dxvk).
Unsurprisingly, getting DX12 working on Mac is going to be more of a problem. According to CodeWeavers, the problem comes down to Apple's poor API support in its own graphics drivers and operating system. They can't use Vulkan natively on Mac, and the ancient version of OpenGL that MacOS supports is unsuited to being used for a DirectX 12 translator.
The logo for Apple's proprietary Metal API. Image: Apple
The only option is Apple's Metal API. Metal is so-called because it allows developers to get closer to the metal than the popular APIs which preceded it (primarily DirectX 11 and OpenGL.) Unfortunately, Metal is apparently slightly lacking compared to more recent low-level graphics APIs, such as Vulkan and, of course, DirectX 12.
The specific issues that CodeWeavers describe are primarily ones of missing features. Metal doesn't support geometry shaders or transform feedback. It also handles tessellation in a radically different way from Vulkan or DX12, but most challenging seems to be an issue where DirectX 12 uses virtual addresses to refer to resources. Vulkan can apparently use its "buffer device address" extension to emulate this feature, but Metal has no such support.
that Apple is unwilling to add support for either virtual addresses or a feature similar to Vulkan's extension because it believes that Metal's existing feature support is "sufficient for what games want to do." The company goes on to note that this is probably true, technically, but that the approach required is sufficiently-different from how it's done on Windows that it fouls up the efforts of translation layers.
That also means that game developers would have to spend a lot of time specifically targeting Apple hardware to make their games work well. If you've been wondering why your favorite recent graphically-intense game isn't the App Store or Apple Arcade, that's probably it, right there. Still, there's hope: after CrossOver
22 adds DX12 support on Linux, CodeWeavers says the next full-number release version, CrossOver
23, will support DX12 on Mac, too. No word on when that'll be, though.