Kwin 可以通过在 KWIN_DRM_DEVICES 中指向 DRM device 来指定使用的 GPU。同理 wlroots 也有 WLR_DRM_DEVICES

多个 GPU 可以用 : 分隔,按顺序决定优先级。问题在于,/dev/dri/card* 的顺序并不稳定,而 /dev/dri/by-path 下的路径包含冒号,和分隔符重合,无法正常处理,见 Change separator for WLR_DRM_DEVICES (#1386) · 议题 · wlroots / wlroots · GitLab

其中也提供了解决办法:通过 udev 规则创建不含 : 的符号链接。

首先获取显卡的 vendor id 和 device id:

$ lspci -nn | grep VGA
00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-P GT2 [Iris Xe Graphics] [8086:46a6] (rev 0c)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104M [GeForce RTX 3070 Mobile / Max-Q] [10de:249d] (rev a1)

[8086:46a6]10de:249d 即代表 [<vendor id>:<device id>]

创建对应的 udev 规则(需要替换 vendor、device 并自定义相应的路径):

# /etc/udev/rules.d/61-gpu.rules
KERNEL=="card*", SUBSYSTEM=="drm", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x46a6", SYMLINK+="dri/by-name/intel-iris-xe-graphics"
KERNEL=="card*", SUBSYSTEM=="drm", ATTRS{vendor}=="0x10de", ATTRS{device}=="0x249d", SYMLINK+="dri/by-name/nvidia-geforce-rtx-3070-mobile"

重启后,可以看到 ls -l /dev/dri/by-name 下生成了指向 ../card0../card1 的符号链接。

设置环境变量:

/etc/environment
KWIN_DRM_DEVICES="/dev/dri/by-name/intel-iris-xe-graphics:/dev/dri/by-name/nvidia-geforce-rtx-3070-mobile"
WLR_DRM_DEVICES="/dev/dri/by-name/intel-iris-xe-graphics:/dev/dri/by-name/nvidia-geforce-rtx-3070-mobile"