开发者生态
morning
Triton:适用于 QEMU 的 DirectX 11 驱动程序
2026-08-09
1 阅读
约6分钟阅读
electricant
字号:
在前传中,我们介绍了 Neptune,VirtIO 的 Direct3D 协议转发层。 Neptune 允许我们跨虚拟机管理程序边界序列化 Direct3D API 调用,这使我们能够在具有 Linux 主机的 Linux 来宾上运行 Wine 游戏,速度比直接在来宾中使用 DXVK 更快。诚然,回报并不那么令人兴奋,但它为我们真正的目标奠定了基础:为 Windows 客户提供现代图形加速。现在,我们通过构建名为 Triton 的全新 Windows 驱动程序实现了这一目标,该驱动程序与 Neptune 一起为 QEMU 虚拟机带来了完整的 DirectX 11 支持。在 Windows 11 上运行的古惑狼三部曲 (x64) 通过 QEMU 在 macOS 上虚拟化 ARM64 什么是 Triton?您可能想知道:如果 Neptune 可以序列化 Direct3D API 调用并且 Windows 使用 Direct3D,那么我们不是已经完成了吗?如果 Direct3D 在 Wine 中工作,它也应该在 Windows 中工作,对吧?毕竟,如果 Wine 不是 Windows 模拟器,那它是什么?简短的回答是:你可以。 Neptune Mesa 驱动程序构建了 d3d11.dll 和 dxgi.dll,它们完全实现了 Direct3D API 集,因此如果您将这些文件放在游戏的可执行文件旁边,它应该加载它们而不是 Windows 自己的驱动程序,并且您可以让一些游戏以这种方式运行。这也是之前尝试使用 DXVK→Vulkan→Venus 在应用程序内本地运行 Direct3D 的方法。这种方法有一些缺点。首先也是最重要的是,您无法获得良好的性能,因为窗口合成器 (DWM) 将您的帧“视为”图像,因此它需要使用 CPU blitting 将 GPU 图像缓冲区复制到正确的窗口位置。您也许可以使用一些技巧让全屏应用程序以本机方式进行扫描,但您永远不会获得流畅的桌面体验。其次,由于d3d11.dll和dxgi.dll是Windows的核心组件,因此您无法替换系统文件本身并期望Windows仍然可以工作。即使您确实设法让它发挥作用,您也将无法玩许多带有专门检测此类修改的反作弊游戏。这就是为什么只能在每个应用程序的基础上加载 DLL(并且兼容性各不相同)。这给我们带来了最后一点:需要将文件复制到您想要工作的图形加速的每个应用程序并不是一种用户友好的体验。正确的方法不是实现 DirectX API,而是实现 DirectX DDI(设备驱动程序接口)。如果您想完整了解整个开发过程,请查看这篇配套文章。 DDI 用户模式应用程序 Direct3D 11 (d3d11.dll) 用户模式驱动程序 (DDI) DXGI (dxgi.dll) 内核模式 内核模式驱动程序 硬件/虚拟化 在 Windows 中,应用程序与系统 Direct3D 和 DXGI 库进行通信。 d3d11.dll(以及旧版本)执行复杂的状态跟踪工作,并向实现 DDI 的用户模式驱动程序 (UMD) 发送更干净的命令流。应用程序还与 dxgi.dll 通信以初始化图形适配器、设置交换链等。UMD 还通过 DXGI 与内核模式驱动程序 (KMD) 通信。 KMD 由图形供应商(我们)实现来驱动实际硬件(或在我们的例子中为虚拟硬件)。对于 Wine,我们实现了自定义 d3d11.dll 和 dxgi.dll 来拦截 API 调用,现在对于 Windows,我们需要实现 UMD 和 KMD。这就是挑战:使用 DirectX DDI 接口实现 UMD,并使用与 VirtIO 设备通信的 KMD 设置专用接口。对我们来说幸运的是,第二部分已经解决了。 anonymix007 和 arehnman 都曾独立开发 Vulkan 的 KMD。由于Vulkan是一个完全独立的图形API,因此它不需要实现DirectX DDI,并且其UMD类似于“替换d3d11.dll”方法,因为它直接与KMD对话以将命令驱动到QEMU。由于 Neptune 是根据 Venus 建模的,因此高级内核接口(用于 DMA、命令缓冲区等)非常相似,并且 UMD 和 KMD 之间的接口完全相同。最终,我们选择使用 anonymix007 的分支作为基础,因为他们的实现有更多在 KMD 端工作的功能。这给我们留下了困难的部分。我们必须为 DirectX 11 实现 DDI。当您设计新系统时,了解其他人如何解决类似问题总是明智的。不幸的是,没有太多开源 DDI 实现可以从中汲取灵感。 Windows 图形驱动程序是一个非常小众的主题,大多数专家都在少数图形硬件供应商之一工作。这也是 QEMU 在 Windows GPU 加速方面始终未能取得进展的原因之一。对我们来说幸运的是,有两个可用的开源实现可供我们学习。首先,Mesa 有 DirectX 10 UMD 。如果您没有阅读上一篇文章,简短的版本是 Mesa im
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱