問題點:WSL Ubuntu跑圖形程式支援使用Winodws GPU加速,WSLg會把Mesa轉譯成DirectX的指令。
可一到Docker容器內就不行了,變成llvmpipe CPU渲染。
此時,只要設定正確的環境變數,還有使用支援WGLg的發行版映像檔,即可讓Docker容器使用Windows的GPU加速。
- 登入WSL Ubuntu
wsl
- 我這裡使用環境變數
MESA_D3D12_DEFAULT_ADAPTER_NAME
,指定使用Intel
GPU驅動 (如果你是Nvidia要記得安裝 Nvidia WSL驅動,並將下面字串改為NVIDIA
)
export MESA_D3D12_DEFAULT_ADAPTER_NAME=Intel
- 跑Docker容器。此處必須使用Debian Stable或者Ubuntu LTS容器。方能掛載WSLg的函式庫轉譯。
docker run \
--device /dev/dxg \
--device /dev/dri/card0 \
--device /dev/dri/renderD128 \
--env DISPLAY=$DISPLAY \
--env WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
--env XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
--env PULSE_SERVER=$PULSE_SERVER \
--volume /tmp/.X11-unix:/tmp/.X11-unix \
--volume /mnt/wslg:/mnt/wslg \
--volume /usr/lib/wsl:/usr/lib/wsl \
--name debian \
debian:latest
- 進入Debian容器的shell
docker exec debian
- 在Debian內安裝以下套件
apt-get install \
libxext-dev \
libx11-dev \
libglvnd-dev \
libglx-dev \
libgl1-mesa-dev \
libgl1-mesa-glx \
libgl1-mesa-dri \
libegl1-mesa-dev \
libgles2-mesa-dev \
freeglut3-dev \
mesa-utils \
mesa-utils-extra
- 並設定環境變數
export LD_LIBRARY_PATH=/usr/lib/wsl/lib
export LIBVA_DRIVER_NAME=d3d12
- 執行指令
glxinfo | grep "OpenGL"
,看容器是否成功認到Windows的GPU
現在你知道了必須使用支援的映像檔才能於Docker達成硬體加速。為此你可能需要用Dockerfile,修改專案,重新建置映像檔。
參考資料
WSL2 + Docker + OpenGL + NVIDIA not working (uses llvmpipe) - Github