doitsujin/dxvk

GitHub: doitsujin/dxvk

基于 Vulkan 的 Direct3D 8/9/10/11 兼容翻译层,实现 Windows 3D 应用在 Linux/Wine 环境下的高性能运行。

Stars: 17041 | Forks: 1113

# DXVK 一个基于 Vulkan 的 Direct3D 8/9/10/11 转换层,允许通过 Wine 在 Linux 上运行 3D 应用程序。 有关项目的当前状态,请参考[项目 wiki](https://github.com/doitsujin/dxvk/wiki)。 最新的开发版本可以在[这里](https://github.com/doitsujin/dxvk/actions/workflows/artifacts.yml?query=branch%3Amaster)找到。 发布版本可以在[这里](https://github.com/doitsujin/dxvk/releases)找到。 ## 使用方法 为了将从 [release](https://github.com/doitsujin/dxvk/releases) 页面获取的 DXVK 包安装到指定的 wine prefix 中,请按以下说明将 DLL 复制或符号链接到相应的目录中,然后打开 `winecfg` 并在“库”选项卡下为 `d3d8`、`d3d9`、`d3d10core`、`d3d11` 和 `dxgi` 手动添加 `native` DLL 覆盖。 在默认的 Wine prefix 中,操作如下: ``` export WINEPREFIX=/path/to/wineprefix cp x64/*.dll $WINEPREFIX/drive_c/windows/system32 cp x32/*.dll $WINEPREFIX/drive_c/windows/syswow64 winecfg ``` 对于纯 32 位的 Wine prefix(非默认),32 位 DLL 应放入 `system32` 目录: ``` export WINEPREFIX=/path/to/wineprefix cp x32/*.dll $WINEPREFIX/drive_c/windows/system32 winecfg ``` 通过启用 HUD(见下方说明)来验证你的应用程序是否使用了 DXVK 而不是 wined3d。 要从 prefix 中移除 DXVK,请删除相应的 DLL 和 DLL 覆盖,并运行 `wineboot -u` 以恢复原始的 DLL 文件。 诸如 Steam Play、Lutris、Bottles、Heroic Launcher 等工具在启用时,会自动处理 dxvk 的设置。 #### DLL 依赖 下面列出了将 DXVK 用于任何单一 API 的 DLL 要求。 - d3d8:`d3d8.dll` 和 `d3d9.dll` - d3d9:`d3d9.dll` - d3d10:`d3d10core.dll`、`d3d11.dll` 和 `dxgi.dll` - d3d11:`d3d11.dll` 和 `dxgi.dll` ### 关于 Vulkan 驱动的说明 在报告问题之前,请查阅 [Wiki](https://github.com/doitsujin/dxvk/wiki/Driver-support) 页面上关于当前驱动状态的信息,并确保你的硬件运行了足够新的驱动版本。 ### 网络多人游戏 在多人游戏中修改 Direct3D 库可能会被视为作弊行为,并可能导致你的账号被**封禁**。这也可能适用于带有嵌入式或专用多人游戏部分的单机游戏。**使用风险自负。** ### HUD `DXVK_HUD` 环境变量控制着一个可以显示帧率和一些统计计数器的 HUD。它接受以下以逗号分隔的选项列表: - `devinfo`:显示 GPU 名称和驱动版本。 - `fps`:显示当前帧率。 - `frametimes`:显示帧时间图表。 - `submissions`:显示每帧提交的命令缓冲区数量。 - `drawcalls`:显示每帧的绘制调用和渲染通道数量。 - `pipelines`:显示图形和计算管线的总数。 - `descriptors`:显示描述符池和描述符集的数量。 - `memory`:显示已分配和使用的设备内存量。 - `allocations`:显示详细的内存块子分配信息。 - `gpuload`:显示预估的 GPU 负载。可能不准确。 - `version`:显示 DXVK 版本。 - `api`:显示应用程序使用的 D3D 功能级别。 - `cs`:显示工作线程统计信息。 - `compiler`:显示着色器编译器活动 - `samplers`:显示当前使用的采样器对数量 *[仅限 D3D9]* - `ffshaders`:显示从固定功能状态生成的着色器当前数量 *[仅限 D3D9]* - `swvp`:显示设备是否在软件顶点处理模式下运行 *[仅限 D3D9]* - `scale=x`:按 `x` 的倍数缩放 HUD(例如 `1.5`) - `opacity=y`:按 `y` 的系数调整 HUD 不透明度(例如 `0.5`,`1.0` 为完全不透明)。 此外,`DXVK_HUD=1` 与 `DXVK_HUD=devinfo,fps` 效果相同,而 `DXVK_HUD=full` 会启用所有可用的 HUD 元素。 ### 日志 与 Wine 一起使用时,DXVK 会将日志消息打印到 `stderr`。此外,可以通过设置 `DXVK_LOG_PATH` 变量来选择性地生成独立的日志文件,指定目录中的日志文件将被命名为 `app_d3d11.log`、`app_dxgi.log` 等,其中 `app` 是游戏可执行文件的名称。 在 Windows 上,默认情况下会在游戏的工作目录中创建日志文件,通常位于游戏可执行文件的旁边。 ### 设备过滤器 某些应用程序不提供选择不同 GPU 的方法。在这种情况下,可以强制 DXVK 使用指定的设备: - `DXVK_FILTER_DEVICE_NAME="Device Name"` 选择具有匹配的 Vulkan 设备名称的设备,可以使用 `vulkaninfo` 等工具获取该名称。支持子字符串匹配,例如,如果完整的设备名称是 "AMD RADV VEGA10 (LLVM 9.0.0)",则支持匹配 "VEGA" 或 "AMD RADV VEGA10"。如果子字符串匹配到多个设备,则将使用第一个匹配的设备。 - `DXVK_FILTER_DEVICE_UUID="00000000000000000000000000000001"` 通过匹配 Vulkan 设备 UUID 来选择设备,这同样可以使用 `vulkaninfo` 等工具获取。UUID 必须是 32 个字符的十六进制字符串,不带破折号。此方法提供了更精确的选择,特别是在使用多个相同 GPU 时。 **注意:** 如果设备过滤器配置不正确,可能会过滤掉所有设备,导致应用程序无法创建 D3D 设备。 ### 调试 以下环境变量可用于**调试**目的。 - `VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation` 启用 Vulkan 调试层。强烈建议用于排查渲染问题和驱动崩溃。需要在主机系统上安装 Vulkan SDK。 - `DXVK_LOG_LEVEL=none|error|warn|info|debug` 控制消息日志记录。 - `DXVK_LOG_PATH=/some/directory` 更改日志文件的存储路径。设置为 `none` 可完全禁用日志文件创建,但不会禁用日志记录。 - `DXVK_DEBUG=markers|validation` 启用 `VK_EXT_debug_utils` 扩展以转换性能事件标记,或者分别用于启用 Vulkan 验证。 - `DXVK_CONFIG_FILE=/xxx/ddxvk.conf` 设置配置文件的路径。 - `DXVK_CONFIG="dxgi.hideAmdGpu = True; dxgi.syncInterval = 0"` 可用于通过环境设置配置变量,使用与配置文件相同的语法,而不需要配置文件。`;` 用作分隔符。 - `DXVK_SHADER_CACHE=0`:禁用内部着色器缓存。 - `DXVK_SHADER_CACHE_PATH=/some/directory`:内部着色器缓存文件的路径。默认情况下,在 Windows 或 Wine 环境中将使用 `%LOCALAPPDATA%/dxvk`,在原生 Linux 环境中将使用 `$HOME/.cache` 或 `$XDG_CACHE_HOME`。 ### 图形管线库 在支持 `VK_EXT_graphics_pipeline_library` 的驱动上,Vulkan 着色器将在游戏加载其 D3D 着色器时编译,而不是在绘制时编译。与之前的系统相比,这减少或消除了许多游戏中的着色器编译卡顿。 在加载画面或菜单期间加载着色器的游戏中,这可能会导致长时间的 CPU 占用率极高,尤其是在性能较弱的 CPU 上。对于受影响的游戏,建议在开始游戏前等待着色器编译完成,以避免卡顿和低性能。可以使用 `DXVK_HUD=compiler` 监看着色器编译器的活动。 **注意:** 仅在绘制时加载其 D3D 着色器的游戏(例如大多数 Unreal Engine 游戏)仍然会出现一些卡顿,尽管应该比没有此功能时轻微得多。 ## 构建说明 为了拉取所有构建所需的子模块,请使用以下命令克隆仓库: ``` git clone --recursive https://github.com/doitsujin/dxvk.git ``` ### 要求: - [wine 10.0](https://www.winehq.org/) 或更新版本 - [Meson](https://mesonbuild.com/) 构建系统(至少 0.58 版本) - [Mingw-w64](https://www.mingw-w64.org) 编译器和头文件(至少 10.0 版本) - [glslang](https://github.com/KhronosGroup/glslang) 编译器 ### 构建 DLL #### 简单方法 在 DXVK 目录中运行: ``` ./package-release.sh master /your/target/directory --no-package ``` 这将在 `/your/target/directory` 中创建一个 `dxvk-master` 文件夹,其中包含 32 位和 64 位版本的 DXVK,可以按照上述发布版本的说明以相同的方式进行设置。 为了保留构建目录用于开发,请向脚本传递 `--dev-build`。此选项隐含了 `--no-package`。在对源代码进行更改后,你可以执行以下操作来重新构建 DXVK: ``` # 对于 32 位,更改为 build.32 cd /your/target/directory/build.64 ninja install ``` #### 手动编译 ``` # 64 位 build。对于 32 位 builds,请替换 # build-win64.txt 为 build-win32.txt meson setup --cross-file build-win64.txt --buildtype release --prefix /your/dxvk/directory build.w64 cd build.w64 ninja install ``` D3D8、D3D9、D3D10、D3D11 和 DXGI DLL 将位于 `/your/dxvk/directory/bin` 中。 ### 构建故障排除 DXVK 需要 mingw-w64 构建环境提供线程支持。如果 缺少此支持,你可能会看到 "error: ‘std::cv_status’ has not been declared" 或类似的与线程相关的错误。 在 Debian 和 Ubuntu 上,可以通过使用支持线程的 posix 替代版本来解决此问题。例如,从以下 命令中选择 posix 替代版本: ``` update-alternatives --config x86_64-w64-mingw32-gcc update-alternatives --config x86_64-w64-mingw32-g++ update-alternatives --config i686-w64-mingw32-gcc update-alternatives --config i686-w64-mingw32-g++ ``` 对于非基于 Debian 的发行版,请确保你的 mingw-w64-gcc 交叉编译器 在配置期间确实启用了 `--enable-threads=posix`。如果你的发行版 附带的是启用了 `--enable-threads=win32` 的 mingw-w64-gcc 二进制文件,你可能需要 在本地重新编译,或者在你发行版的 bugtracker 上提交 bug 来请求支持。 # DXVK Native DXVK Native 是 DXVK 的一个版本,允许在不使用 Wine 的情况下原生运行。 这对于游戏和应用程序移植非常有用,可以避免编写另一个渲染后端,或者在开发过程中协助移植的初始阶段。 [发布版本](https://github.com/doitsujin/dxvk/releases) 是使用 Steam Runtime 构建的。 ### 它是如何工作的? DXVK Native 使用与平台和框架无关的替代方案替换了某些 Windows 特有的机制,例如,`HWND` 可以变为 `SDL_Window*` 等。 完成此操作只需添加另一个 WSI 后端。 **注意:** DXVK Native 需要通过 `DXVK_WSI_DRIVER` 环境变量显式设置后端。当前内置的选项有 `SDL3`、`SDL2` 和 `GLFW`。 DXVK Native 附带了一组精简的、D3D9/11 所需的 Windows 头文件定义,以及用于 D3D9/11 的 MinGW 头文件。 在大多数情况下,它可以直接插入到你的渲染器中并直接使用,但也可能会出现一些磨合问题,例如: - 支持 `__uuidof(type)`,但不支持 `__uuidof(variable)`。请改用 `__uuidof_var(variable)`。
标签:3D应用程序, D3D10, D3D11, D3D8, D3D9, Direct3D, DNS解析, DXVK, Lutris, Steam Play, Vulkan, Wine, 兼容层, 图形渲染, 开源项目, 游戏兼容性, 游戏移植, 系统工具, 翻译层, 转换层, 预握手