WSL cannot load NVIDIA OpenGL.
Windows build number:
10.0.26100.3476
Your Distribution version:
24.04
Your WSL versions:
1.When I try to use hardware acceleration, my WSL can't find file libnvidia-gl.so
~$ ls /usr/lib/wsl/lib | grep nvidia libnvidia-encode.so libnvidia-encode.so.1 libnvidia-ml.so.1 libnvidia-opticalflow.so libnvidia-opticalflow.so.1 nvidia-smi
2.WSL is not using your NVIDIA GPU for OpenGL/Vulkan. glxinfo | grep "OpenGL renderer" → Shows D3D12 (Intel UHD Graphics) instead of RTX 4060 and I can't change it manuly. vulkaninfo | grep "GPU id" → Shows LLVM software renderer, meaning hardware acceleration is missing.
3.WSL does not have full NVIDIA library support: nvidia-smi works, but only sees CUDA, not OpenGL.
4.Segmentation fault (core dumped) when running OpenGL apps: glxgears crashes, meaning MESA+NVIDIA are not working together.
5.WSL may be using an outdated or incompatible driver: WSL reports NVIDIA-SMI 570.124.03, but Windows reports 572.60. Possible mismatch between Windows and WSL driver versions.
6.Vulkan driver is broken: vulkaninfo | grep "GPU id" → "ERROR_INCOMPATIBLE_DRIVER" Likely due to missing /usr/share/vulkan/icd.d/nvidia_icd.json.
Steps to reproduce:
- nvidia-smi in WSL
WSL logs:
WSL dumps:
No response
Expected behavior:
No response
Actual behavior:
WSL installation does not have the full NVIDIA driver stack for OpenGL and Vulkan. missing libnvidia-gl.so, which is needed for OpenGL rendering.
NVIDIA GPU is detected (nvidia-smi works), but OpenGL is still using Intel GPU (D3D12).
Vulkan also fails with ERROR_INCOMPATIBLE_DRIVER, meaning WSL is not correctly using the NVIDIA driver.
EDIT: See https://gist.github.com/lzlrd/0d9b757d2122f551794fd00c7f0752d6 as there are a few updates there (inc. fixing Wayland). I won't be updating the message below going forward.
So I got this working on both Ubuntu, and Arch. First, start with a fresh install (of archlinux from https://gitlab.archlinux.org/archlinux/archlinux-wsl or Ubuntu from wsl --install Ubuntu or https://apps.microsoft.com/detail/9pdxgncfsczv).
For Arch:
- Clone https://aur.archlinux.org/packages/directx-headers-git and https://aur.archlinux.org/packages/mesa-wsl2-git.
- Build
directx-headers-gitusingmakepkg -rsi. You may need to set up as per https://wiki.archlinux.org/title/Makepkg. -
cdintomesa-wsl2-git. - Edit
PKGBUILDto remove all instances of=18.1.8. - Build
mesa-wsl2-gitusingmakepkg -rsi. - Run
echo "export GALLIUM_DRIVER=d3d12" | sudo tee /etc/profile.d/wslg.sh. - Run
echo "L+ /tmp/.X11-unix - - - - /mnt/wslg/.X11-unix" | sudo tee /etc/tmpfiles.d/wslg.conf. (Thanks to https://github.com/microsoft/wslg/issues/43#issuecomment-826039096 for this.) - Restart WSL with
wsl --shutdownfrom CMD/PowerShell and you should see the following (given you install the relevant packages):
$ glxinfo | grep Device
Device: D3D12 (NVIDIA GeForce RTX 4080 SUPER) (0xffffffff)
$ vulkaninfo | grep "GPU id"
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id : 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER)):
GPU id : 1 (llvmpipe (LLVM 19.1.7, 256 bits)):
For Ubuntu:
- OpenGL should already be working. We'll add Vulkan support.
- Go to https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu/pool/main/m/mesa/.
- Look for
mesa-vulkan-drivers_*.deb. - You'll see
...<LETTER>_<ARCH>.deb. The letter corresponds to your Ubuntu version codename. In your case, "n" for Noble. - Copy the link for the right package,
https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu/pool/main/m/mesa/mesa-vulkan-drivers_25.0.1~kisak1~n_amd64.debin your case. - Run
wget https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu/pool/main/m/mesa/mesa-vulkan-drivers_25.0.1~kisak1~n_amd64.debanywhere you have write access to on the Ubuntu WSL instance. - Run
sudo apt install <PACKAGE>(in your case,sudo apt install mesa-vulkan-drivers_25.0.1~kisak1~n_amd64.deb. - You should see the following (given you install
mesa-utilsandvulkan-tools):
$ glxinfo | grep Device
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: Some incorrect rendering might occur because the selected Vulkan device (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER)) doesn't support base Zink requirements: feats.features.logicOp have_EXT_custom_border_color have_EXT_line_rasterization
Device: D3D12 (NVIDIA GeForce RTX 4080 SUPER) (0xffffffff)
$ vulkaninfo | grep "GPU id"
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id = 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER))
GPU id = 1 (llvmpipe (LLVM 19.1.7, 256 bits))
GPU id : 0 (Microsoft Direct3D12 (NVIDIA GeForce RTX 4080 SUPER)):
GPU id : 1 (llvmpipe (LLVM 19.1.7, 256 bits)):
The reason we're using just the Vulkan driver from Kisak's repo. is that the mesa package causes llvmpipe to be used instead of D3D12. Maybe overring GALLIUM_DRIVER would work - I didn't try.
Update: Documented at https://gist.github.com/lzlrd/0d9b757d2122f551794fd00c7f0752d6, as well.
@lzlrd Did you mean that I can fix this WSL bug by following your instructions above?