破解Windows的封闭:将RADV移植到Win32
路易斯-弗朗西斯·拉特-布利安 2026年7月28日 RADV是用于AMD GPU的开源Mesa Vulkan驱动程序。多年来,它已成为Linux图形栈的基石。它现在实际上已成为Linux上AMD硬件的事实上的Vulkan驱动程序。AMD甚至停止了基于PAL(平台抽象库)的替代品,选择集中其开源工作于Mesa。然而,在Windows上,AMD用户仍然只能使用专有驱动程序。但无需恐慌,我们有解决方案:将RADV移植到Windows,为他们带来同样在Linux上证明过的开源Vulkan实现。这是一个如此 improbable 的提案,以至于我们实际上可能会比光速更快到达(剧透:那会稍微慢一点)。在Windows上使用的开源Vulkan驱动程序开启了许多可能性:跨平台的共享代码库,更容易的调试和实验,更快的修复周转,以及社区(例如,游戏开发者)报告问题或贡献改进的路径,这些都能惠及所有人,无论操作系统是什么。 从第一个三角形开始... 这一努力直接建立在Faith Ekstrand奠定的基础之上,她首次探讨了在Windows上运行RADV的可行性,并在XDC 2024上展示了她的发现。我们强烈建议您去观看这场演讲,但这里有一个快速的总结。她演讲的一个核心主题是,自Windows 10以来,WDDM2接口为第三方驱动程序提供了比之前更好的基础。它定义了用户模式驱动程序(UMD)与操作系统和内核模式驱动程序(KMD)之间交互的明确模型。然而,当然也有一个重大问题:许多D3DKMT调用可能携带私有驱动程序数据——不透明的、特定于厂商的二进制数据,其内容完全取决于驱动程序。这意味着UMD和KMD紧密耦合,并且该接口完全没有文档。为了应对这一点,Faith创建了wddm2-pdd-re工具,以记录WDDM2调用和某些D3D12应用程序的私有数据内容。通过这种方法,她能够逆向工程出足够多的私有接口——查询适配器信息、分配缓冲区、创建队列以及提交命令——以使RADV能够将工作提交给专有内核驱动程序。最终,她甚至能够在屏幕上显示一个旋转的3D模型,光彩夺目。 ...到第一款游戏 Faith的工作证明了这一点可以做到,这个项目接替了这个线程。目标是改进它,使其更灵活(通过减少硬编码值支持不同硬件),更具可移植性(摆脱WSL,实现本地Windows支持),以及更稳定(在进行deqp-vk测试时不再在两分钟后崩溃)。我们改善了命令流处理和同步,并增加了对稀疏绑定、细分和任务着色器以及动态查询GPU属性等功能的支持。它仍然不符合标准(尽管成功率已大幅提高),但真正的亮点是能够用RADV运行我们的第一款游戏:《反恐精英2》。任何人都可以通过使用-vulkan参数切换渲染器来尝试它。 ...穿越黑暗 和任何移植和/或逆向工程项目一样,这也带来了挑战:新一代设备过于敏感:我们在第11代硬件(RX 7900 XT)上进行实验,而Faith则在第10代GPU(RX 7800 XT)上工作。由于这两代之间的架构变化,我们一段时间内无法复制Faith的结果。主要问题是,当我们尝试做比将表面清除为硬编码颜色更复杂的事情时,它就会挂起。不幸的是,由于没有工具来调试Windows上的这种挂起,这迫使我们改善工具,以尽可能减少与专有驱动程序的差异。我们将逆向工程工具升级为完整的WDDM2日志记录层,能够分析任何使用官方Vulkan驱动程序运行的应用程序,并增加了支持转储命令流、寄存器和着色器代码的功能。编译器不配合:Mesa主要针对GCC和Clang进行开发,而其代码库依赖的一些假设在使用MSVC编译时无法成立。例如,MSVC与其他编译器对枚举的处理方式不一致:它可以将值解释为有符号并限制为32位值,这可能导致相当惊人的行为。我听说你喜欢不透明的二进制数据:所以让我们把不透明数据放到你的不透明API调用-D3DKMTEscape中。WDDM2通过该方法具有特定于厂商的钩子的可能性,其内容完全取决于厂商。没有定义的结构,唯一的限制是它不应为现有的“标准化”调用复制某些内容。幸运的是,对我们来说,看起来目前可以安全忽略这些,因为它们似乎专注于多GPU渲染等高级功能。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡