Портирование RADV на Win32
- title
- Портирование RADV на Win32
- type
- summary
- summary
- Collabora запустила Counter-Strike 2 на Windows через RADV - открытый драйвер Vulkan от Mesa для AMD
- tags
- graphics, vulkan, windows, drivers, reverse-engineering
- sources
- radv-win32-port
- created
- 2026-07-29
- updated
- 2026-07-29
- lang
- ru
- translation_of
- radv-win32-port
- source_updated
- 2026-07-29
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Обзор Луи-Франсиса Ратте-Бульянна (Louis-Francis Ratté-Boulianne) от июля 2026 года о работе Collabora при спонсорстве Valve по запуску RADV на Windows. RADV - это открытый Vulkan-драйвер для GPU от AMD в составе Mesa, ставший де-факто основным Vulkan-драйвером для оборудования AMD на Linux: AMD отказалась от собственной альтернативы на базе PAL в его пользу и сосредоточилась на Mesa. На Windows у пользователей AMD по-прежнему есть только проприетарный драйвер. Аргументы в пользу изменений - единая кодовая база для всех платформ, упрощённая отладка, более быстрые исправления и возможность для разработчиков игр отправлять баг-репорты или коммиты в драйвер с открытым кодом, который можно прочитать.
Что даёт WDDM2 и что скрывает
Базу заложила Фейт Экстранд (Faith Ekstrand) в докладе на XDC 2024. Её вывод состоял в том, что начиная с Windows 10 модель WDDM2 вполне годится как основа для стороннего драйвера: она чётко задаёт разделение на драйвер пользовательского режима (UMD) и драйвер режима ядра (KMD), а также правила их взаимодействия с ОС - ровно то разделение, которое требуется для реализации Vulkan.
Подвох в том, что многие вызовы D3DKMT передают private driver data - непрозрачные бинарные блоки (blobs), специфичные для каждого вендора, структура которых касается исключительно самого драйвера. UMD и KMD через этот канал остаются жёстко связанными, и он совершенно не документирован. Экстранд обошла это с помощью wddm2-pdd-re - инструмента, который логирует вызовы WDDM2 и передаваемые ими приватные данные для D3D12-приложений. По этим логам она отреверсила достаточную часть закрытого интерфейса (запросы информации об адаптере, выделение буферов, создание очередей, отправку команд), чтобы RADV смог передавать команды проприетарному драйверу ядра. Итогом стала вращающаяся 3D-модель на экране.
От треугольника к игре
Collabora подхватила эту работу с тремя целями: сделать решение более гибким (меньше жёстко заданных значений, чтобы поддерживалось разное железо), более переносимым (нативная Windows вместо запуска через WSL) и гораздо более стабильным (без падений через две минуты работы deqp-vk). Они переработали обработку потоков команд и синхронизацию, добавили sparse bindings, тесселяцию, task-шейдеры и динамический опрос свойств GPU. Драйвер всё ещё не проходит тесты на соответствие спецификации полностью, хотя доля успешно пройденных тестов deqp-vk заметно выросла. Наглядный результат - запуск Counter-Strike 2 на RADV под Windows: любой желающий может проверить это, запустив игру с флагом -vulkan.
Три конкретных препятствия
Поколения оборудования расходятся сильнее, чем ожидалось. Collabora работала с оборудованием 11-го поколения (RX 7900 XT), тогда как Экстранд использовала карту 10-го поколения (RX 7800 XT). Из-за различий в архитектуре повторить её результаты долго не удавалось: любое действие сложнее заливки поверхности фиксированным цветом вешало GPU. В Windows нет инструментов для отладки зависаний такого рода, поэтому выходом стало создание дополнительных инструментов: утилиту для реверс-инжиниринга переписали в полноценный слой логирования WDDM2, способный анализировать любое приложение, работающее на официальном драйвере Vulkan, с дампом потоков команд, регистров и кода шейдеров, что позволяет сравнивать поведение двух драйверов.
MSVC расходится во мнениях с компиляторами, под которые писалась Mesa. Mesa разрабатывается под GCC и Clang, и её кодовая база опирается на общие для них допущения. В качестве примера приводится обработка enum: MSVC может трактовать значение enum как знаковое и ограничивать его 32 битами, что приводит к неожиданному поведению в коде, где такая вероятность не учитывалась.
Непрозрачные данные внутри непрозрачного вызова. D3DKMTEscape - это вендор-специфичный хук в WDDM2 вообще без фиксированной структуры; единственное правило - он не должен дублировать то, что уже делает стандартизированный вызов. По оценке Collabora, наблюдаемые вызовы escape относятся к продвинутым возможностям вроде рендеринга на нескольких GPU, поэтому на данном этапе их можно безопасно игнорировать.
Что мешает использованию в production
Интерфейс ядра остаётся открытым вопросом. Написание собственного KMD исключено, поэтому RADV вынужден взаимодействовать с драйвером от AMD, и сейчас это общение целиком держится на отреверсенных структурах приватных данных. Хуже того, UMD и KMD поставляются согласованной парой без каких-либо гарантий обратной совместимости, поэтому эти структуры могут меняться между релизами драйверов без предупреждения и без каких-либо сигналов об ошибках. Чтобы сделать систему поддерживаемой, требуется либо стабильный документированный интерфейс к проприетарному KMD, либо библиотека-shim, служащая посредником в канале приватных данных и предоставляющая стабильный интерфейс по мере эволюции внутренних blob'ов.
Вторая проблема - отображение кадра (presentation). Джесси Натали (Jesse Natalie) занимался WSI для Windows в рамках драйвера Dozen, но RADV сейчас поддерживает только медленный путь через CPU. Использование цепочек показа DXGI (swapchains) требует импорта изображения из D3D12 (ещё больше непрозрачных метаданных), а поддержка zero-copy поверх этого потребует прямого участия AMD и, вероятно, Microsoft из-за ограничений на совместное использование изображений. Заявленный выигрыш от этого шага - ускорение до 3 раз для приложений, производительность которых не упирается в GPU.
Весь проект - это ставка на то, что открытые драйверы стоят затрат на реверс-инжиниринг на платформе, создатели которой такого не планировали. Эту же тему, но с противоположной стороны, затрагивает win32-stable-abi: там Win32 через Wine оказался самым долговечным ABI на Linux именно потому, что интерфейсы Microsoft не меняются. Здесь же недокументированная половина интерфейса Microsoft меняется с каждым релизом драйвера AMD, и именно это делает порт хрупким.
Результаты работы находятся в ветке wddm2 форка Mesa от lfrb.