所谓切换显卡的功能,台式倒不是完全没有。
这东西用 NV 的黑话叫 Optimus,Linux 社区叫 PRIME ( NV 一开始应该就在玩 Transformers 里面的梗)。原本 Linux 可以通过社区搞的 bumblebee (就是上次热情帮用户 rm -rf /usr 的那个)来“模拟”,所谓模拟就是在 dGPU 上开一个 X server,拦截 GL 调用放到那边执行,再把结果读回来显示。这个一直能用,虽然不是官方解决方案(并且不支持 Vulkan,虽然后来有另一个项目做 Vulkan 的)。官方的是在大概 450 驱动的时候,加了 PRIME 的支持。根据文档
http://us.download.nvidia.com/XFree86/Linux-x86_64/470.63.01/README/primerenderoffload.html 并没有提到需要 laptop,只是要“systems with both an integrated GPU and an NVIDIA discrete GPU”。
OpenGL 程序是通过 GLVND 实现的(因为 OpenGL 标准只告诉你怎么和设备交互,没告诉你和*哪个*设备交互,也就是说执行你 OpenGL 调用的可能是只母猪,或者是个土豆),在我这貌似不太稳定。跑 glxgears 十次有七次能跑,两次 crash,一次黑屏。自己写的 GL 程序也差不多,游戏没找到能跑的。
Vulkan 自己有选 Device 的功能,好像直接就选到 dGPU 了,可能有些程序自作多情,觉得我比用户牛逼别教我写程序,帮你选了,也可以通过设置 VK_ICD_FILENAMES 改回来。我这 Vulkan 的 PRIME 出奇的稳定,并且完全可以和 DXVK 一块用。
如果你用 Valve 的 Proton 跑游戏的话,新版本 Proton 中以上全部无效,因为较新版本的 Proton 用了 pressure-vessel 容器,会把所有安排全都搞乱,官方回复是这种 scenario 太复杂没法支持。不过官方提供的不用 pressure-vessel 的最后一个版本( 5.0 )也不是太老,还很能用。
由于 Linux native 的游戏大多没 Vulkan 支持( V 社给 Portal 做 Vulkan 支持还是用 DXVK 做的 ...),在这种设定下,除了星露谷这种根本用不上 GPU 之外的游戏之外,最佳的方式居然是用 Win 版+老版 Proton+DXVK+官方 PRIME ...
另外还有一点就是为什么要折腾这么麻烦,因为我只有一个 PCIe 槽,但是遇到 Proton 搞不定的情况要开虚拟机 ... 所以必须蹭 iGPU (大部分 AU 和 F 版都不行),并且 host 显示输出只能接 iGPU 。不过本来如果只挂 nvidia 模块用 bumblebee,就可以在需要的时候把卡卸掉给虚拟机用,用完再挂回来。如果使用官方 PRIME,需要额外挂载 nvidia_modeset 模块,好像之前有一段时间也是可以这么干,但是由于我是该死的 Arch Linux 用户,貌似在升级了一次之后就只能挂上去不能卸下来了 ...