Arch Linux WSL 硬件视频加速 + 硬件图形加速
参考
WSLg + Mesa D3D12 是在保留 Windows 桌面集成的前提下能达到的最高效率,WSLg 的显示路径和 GPU 计算路径已经是理论最优,真正的天花板是 VMBUS 序列化,要突破这个天花板只能离开 WSL2,要么双系统,要么 Hyper-V 独立 VM + GPU 直通(DDA),失去 Windows 集成/互操作
安装必要的包
sudo pacman -Syu ffmpeg glmark2 libva-utils mesa mesa-utils mpv vulkan-dzn vulkan-tools环境变量
echo "export GALLIUM_DRIVER=d3d12" | sudo tee /etc/profile.d/wslg.sh
echo "export LIBVA_DRIVER_NAME=d3d12" | sudo tee -a /etc/profile.d/wslg.sh
echo "export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA" | sudo tee -a /etc/profile.d/wslg.sh
echo "export GSK_RENDERER=vulkan" | sudo tee -a /etc/profile.d/wslg.sh
# echo "export MESA_LOADER_DRIVER_OVERRIDE=d3d12" | sudo tee -a /etc/profile.d/wslg.sh用户组
# sudo usermod -aG video,render $USER内核模块
echo vgem | sudo tee /etc/modules-load.d/vgem.conf验证
eglinfo -B | grep "renderer"
vulkaninfo | grep "GPU id"
vainfo --display drm --device /dev/dri/renderD128
glmark2
vkcube
mpv --hwdec=auto
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128 -i input.mp4 -c:v h264_vaapi output.mp4
taskmgr.exe

原理分析
WSL2 的图形加速建立在 WDDM GPU 半虚拟化(GPU-PV) 之上。WDDM 2.5 起,Windows 显示驱动模型内建了 GPU 虚拟化能力;WDDM 2.9 将该能力扩展到 Linux 客户机。微软在 WSL2 定制内核中实现了一个新的内核驱动 dxgkrnl,于用户态暴露 /dev/dxg 设备,其 IOCTL 紧密模拟 Windows 原生 WDDM 的 D3DKMT 内核服务层;dxgkrnl 通过 VM Bus 连接到宿主机内核的 dxgkrnl,再由宿主机 GPU 的内核模式驱动(KMD)访问物理 GPU。
用户态的 libd3d12.so 与 Windows 侧的 d3d12.dll 来自同一份源代码,仅目标平台不同,功能与性能等价(虚拟化开销除外)。DxCore(libdxcore.so)则是 DXGI 的现代简化版本,Windows 与 Linux 两侧均可用。
Linux 图形 API 到物理 GPU 的完整调用链为:
Linux 应用 (OpenGL / Vulkan / VA-API)
↓
Mesa —— D3D12 Gallium 驱动 / dzn / VA-API 前端
↓
libd3d12.so (与 d3d12.dll 同源)
↓ ioctl
/dev/dxg (dxgkrnl) ──VM Bus──> Windows 宿主机 dxgkrnl ──> GPU KMD ──> 物理 GPU- OpenGL 经由 Mesa D3D12 Gallium 驱动翻译为 D3D12 调用;
- Vulkan 经由 Mesa 的
dzn驱动(Vulkan-on-D3D12)翻译为 D3D12 调用; - 视频加速 在 Mesa D3D12 后端之上集成 VA-API 前端,使支持 VA-API 的 Linux 多媒体应用(如 FFmpeg、GStreamer)能够将解码、编码、视频处理卸载到 GPU 执行。可用的 VA Profile 与 Entrypoint 由底层 GPU 动态上报,随硬件与驱动版本而异。该能力需要 Mesa 22.2 及以上。
WSLg 的显示通路与 GPU 加速通路是两个独立而又协同的组件。WSLg 由一个基于 CBL-Mariner 的只读系统发行版承载,核心编排进程 WSLGd 负责启动并监控各组件、在 Windows 宿主机以静默方式启动 mstsc.exe 建立 RDP 连接。其核心是 Wayland 参考合成器 Weston,X11 应用经由 XWayland 接入,音频由 PulseAudio 处理。
Weston 的 RDP 后端被扩展以支持应用级远程化,采用两种技术:
- RAIL(Remote Application Integrated Locally):将单个应用窗口(而非整个桌面)的像素内容通过 RDP 传输,为网络连接优化;
- VAIL(Virtualized Application Integrated Locally):RAIL 面向 VM 边界的变体,通过宿主机与客户机之间的共享内存避免昂贵的像素拷贝。
Linux GUI 应用的显示通路为:
GUI 应用 ──(Wayland 或 X11 via XWayland)──> Weston (RDP 后端, RAIL/VAIL shell)
──RDP over 共享内存 (VAIL)──> Windows 宿主机 mstsc.exe ──> Windows 桌面环境层面的配置项 在架构中对应如下环节:GALLIUM_DRIVER=d3d12 与 LIBVA_DRIVER_NAME=d3d12 这两个环境变量分别强制 Mesa 的 OpenGL 与 VA-API 路径走 D3D12 后端;/dev/dri/card0 与 /dev/dri/renderD128 设备节点由 vgem 内核模块创建,是 Mesa D3D12 后端完成 DRI 初始化的前置条件——若节点缺失,Mesa 将静默回退至 llvmpipe 软件渲染。Windows 侧的 vGPU 驱动(AMD / Intel / NVIDIA)提供宿主机 KMD 对 GPU-PV 的支持,是整条链路在物理 GPU 上执行的起点。