← На главную

Valve спонсирует порт RADV на Windows, но CS2 пока сыроват

29.07.2026 04:30 · hackernews

RADV — открытый Vulkan-драйвер для AMD GPU из состава Mesa — уже стал стандартом де-факто на Linux, и AMD даже свернула свой проприетарный PAL-драйвер в его пользу. На Windows пользователи AMD до сих пор сидят на закрытом драйвере. Теперь появилось решение: портировать RADV на Windows и дать им ту же открытую реализацию Vulkan, которая отлично зарекомендовала себя на Linux. Обещают общую кодовую базу, простую отладку, быстрые правки и возможность для сообщества (например, разработчиков игр) вносить улучшения, полезные всем независимо от ОС.

Всё началось с изысканий Faith Ekstrand, которая на XDC 2024 показала, что запустить RADV на Windows реально. Она объяснила, что интерфейс WDDM2 со времён Windows 10 даёт куда более приличную основу для стороннего драйвера: он чётко разделяет пользовательский драйвер (UMD) и драйвер режима ядра (KMD). Загвоздка в том, что многие вызовы D3DKMT тащат в себе private driver data — непрозрачные вендорские блобы, структура которых не документирована. С помощью утилиты wddm2-pdd-re она логировала вызовы и содержимое приватных данных для D3D12-приложений, восстановила достаточно деталей приватного интерфейса — запросы информации об адаптере, выделение буферов, создание очередей и отправку команд — и в итоге вывела на экран вращающуюся 3D-модель.

Новый проект подхватил эту нить и довёл дело до запуска первой игры. Команда повысила гибкость (убрали хардкод под разные поколения GPU), добилась родной поддержки Windows без WSL и сильно улучшила стабильность. Доработали обработку command stream и синхронизацию, добавили поддержку sparse bindings, тесселяции, task shaders и динамического опроса свойств GPU. До полной конформности пока далеко, но главное достижение — Counter-Strike 2 запускается на RADV с ключом -vulkan.

Портирование шло через потёмки обратной разработки, и трудностей хватало. Переход с Gen 10 (RX 7800 XT), с которой работала Faith, на Gen 11 (RX 7900 XT) долго не давал воспроизвести результаты: при любых сложных операциях всё зависало. Инструментов отладки таких зависаний под Windows не было, поэтому пришлось прокачать утилиту до полноценного слоя логирования WDDM2: теперь она анализирует работу официального Vulkan-драйвера и умеет дампить потоки команд, регистры и шейдеры. Отдельно досаждала MSVC — её трактовка enum’ов (знаковые 32-битные значения) расходится с GCC и Clang, из-за чего вылезали сюрпризы. Есть ещё вызовы D3DKMTEscape — эдакий чёрный ящик в чёрном ящике, вендорские хуки с произвольным содержимым. К счастью, их пока можно игнорировать, потому что они завязаны на фичи вроде multi-GPU.

Главная развилка на пути к production-ready — общение с проприетарным KMD. Писать свой KMD не вариант, приходится разговаривать с драйвером AMD через реверс-инженерные приватные структуры. Они меняются от версии к версии без гарантий обратной совместимости, так как UMD и KMD поставляются в паре. Для настоящей стабильности нужно либо стабильное и документированное API к KMD, либо shim-библиотека, которая скроет изменчивые блобы за постоянным интерфейсом.

Остаётся серьёзная работа над презентацией. Джесс Натали в своё время сделал заготовку WSI для Windows в драйвере Dozen, но RADV пока выводит кадры только по медленному CPU-пути. Чтобы ускориться через DXGI swapchains, надо уметь импортировать изображения из D3D12, а там опять opaque metadata. До zero-copy swaps мечты — они дали бы трёхкратный прирост производительности в сценариях не GPU-bound — ещё далеко, и без участия AMD и, вероятно, Microsoft тут не обойтись. Но прецеденты улучшений для открытых проектов есть, так что надежда жива. Код пока живёт в отдельной ветке, Valve спонсировала этот этап работы по переносу открытых драйверов на Windows.

Читать оригинал →