DarwinPlay: зачем я собрал свой способ запускать Windows-игры на Mac

C чего начать?

У меня Mac на Apple Silicon и библиотека игр в Steam, купленных ещё для Windows. А еще я люблю пердолинг, у меня есть steam deck, но там почти все работает из коробки.

Почему не готовые решения

Вариантов запуска Windows-игр на macOS формально много, на практике каждый упирается во что-то своё.

CrossOver работает, но за него просят шекели. Whisky не развивается, хотя честно говоря работает правда он застрял на Wine 7.7. Сборки Gcenx - это по сути чистый WineHQ без игровых доработок. Game Porting Toolkit от Apple вообще задуман как инструмент оценки для разработчиков игр, а не как лаунчер для игрока.

С графикой отдельная беда. Обычный Wine транслирует Direct3D через wined3d в Vulkan, на Mac это означает MoltenVK поверх Metal. В Metal нет геометрических шейдеров, поэтому wined3d честно рапортует Direct3D 11 уровня 9_3, и на этом всё: современная Unity-игра просто пишет «Failed to initialize graphics» и выходит. Direct3D 12 в такой связке не работает совсем, а некоторые игры, например Space Marine 2, кроме D3D12 ничего не умеют.

Что такое DarwinWine

DarwinWine складывает уже существующие куски экосистемы в один рантайм (да вы можете сами так сделать, ну если можете так делайте).

Основа взята из открытых исходников CrossOver 26.3.0 (это Wine 11.0 с доработками CodeWeavers, включая склейку для D3DMetal). Поверх кладётся D3DMetal из Game Porting Toolkit 4.0 beta 2, слой трансляции Direct3D в Metal от самой Apple. С ним Direct3D 11 поднимается с уровня 9_3 до 11_1, а Direct3D 12 даёт 12_1. Для Vulkan-игр в комплекте MoltenVK 1.4.2. Всё собирается под x86_64 и работает через Rosetta 2.

Дальше начались патчи... То логин стима не рисуется, пришло делать хак с steamwebhelper и --in-process-gpu, то просто функция Wine не написана под macos.

На выходе рантайм проходит набор обязательных проверок перед каждым релизом: создание префикса, устройства D3D11 и D3D12 через D3DMetal, HTTPS-рукопожатие со Steam. Без зелёных проверок артефакт просто не собирается.

Что такое DarwinPlay

DarwinPlay состоит из двух частей: приложение на Swift и консольная утилита darwinplay-runtime на Rust, которая делает всю работу. Приложение занимается тем, что игрок не должен делать руками:

Кнопка Download & Install сама находит свежий релиз DarwinWine на GitHub, качает архив на 850 мегабайт, сверяет контрольную сумму и устанавливает. Установка транзакционная: рантайм распаковывается во временный каталог, на нём создаётся пробный префикс Wine, и только после успешной проверки происходит атомарная подмена старой версии. Если что-то пошло не так, откат автоматический.

Ещё приложение умеет запускать конкретный exe внутри установленной игры. Это спасает игры со сломанными метаданными Steam: у Ведьмака 3, например, в кеше Steam отсутствует блок запуска, и штатный путь заканчивается ошибкой 0x2DB. Прямой запуск witcher3.exe при работающем Steam решает вопрос, DRM доволен.

Из проверенного на сегодня: Ведьмак 3 и Heroes of Might and Magic: Olden Era играются (ну а как вы хотели, пока альфу собрал, а skyrim у меня не куплен).

Как поставить

Нужен Mac на Apple Silicon с macOS 13 или новее и включённой Rosetta 2.

bash brew tap russianssamovar/tap brew trust
russianssamovar/tap brew install --cask darwinplay
xattr -dr com.apple.quarantine /Applications/DarwinPlay.app

Две неочевидные команды тут не прихоть. brew trust появился в Homebrew 6 для сторонних tap-репозиториев, это разовый шаг. А xattr обязателен после каждой установки и обновления: приложение подписано ad-hoc, без нотаризации Apple, и Homebrew принудительно вешает карантин на каски из сторонних tap. Без снятия карантина Gatekeeper молча убьёт приложение при запуске.

Дальше в самом приложении:

1. Нажать Download & Install и подождать, пока скачается и установится рантайм.
2. Поставить Steam кнопкой из приложения и залогиниться.
3. Установить игру и нажать Play.

Кто не любит GUI, может сделать то же самое из терминала:
darwinplay-runtime runtime install-latest

Обновляется всё так же через brew upgrade, не забывая про xattr после него.

Лицензии и ограничения

DarwinPlay распространяется под MIT. Рантайм сложнее: Wine лицензирован под LGPL, поэтому к каждому релизу приложены точные исходники и патчи. D3DMetal принадлежит Apple и по лицензии Game Porting Toolkit допускает только некоммерческое использование, это ограничение наследует и весь собранный рантайм.

Из известных ограничений: только Apple Silicon, подпись ad-hoc (отсюда возня с карантином), а шим для Steam остаётся костылём. Правильное решение уже существует в upstream Wine: CodeWeavers недавно добавили показ окон чужого процесса через CALayerHost, и перенос этого патча позволит выкинуть шим совсем. Это следующее в очереди.

Код обоих проектов открыт: https://github.com/russianssamovar/DarwinWine
https://github.com/russianssamovar/DarwinPlay.