如何利用英特尔芯片组让 Unity 3D 与 Bumblebee 协同工作

如何利用英特尔芯片组让 Unity 3D 与 Bumblebee 协同工作

我有一台配备可怕的 Optimus 的 Sony VAIO S 笔记本电脑,最后设法让 Bumblebee 在 Ubuntu 12.04 上完全运行,这样我就可以通过 optirun 和/或 bumble-app-settings 利用英特尔芯片组的硬件加速以及 Nvidia 的硬件加速。

但是桌面效果不起作用。不过它们应该可以,我依稀记得在我安装 Bumblebee 之前它们能用一段时间。

这是我通过支持测试获得的结果:

:~$ /usr/lib/nux/unity_support_test -p
Xlib:  extension "NV-GLX" missing on display ":0".
OpenGL vendor string:   Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile 
OpenGL version string:  1.4 (2.1 Mesa 8.0.2)

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  no
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       no

首先,我有点怀疑该芯片组不支持 VBO(基本上是 GL 中的标准功能)。

Xorg.0.log 和 Xorg.8.log 都没有显示任何特定错误。

至于 Nvidia 驱动程序:为了让它们工作,我必须安装 304.22 驱动程序(旧版本无法工作)。它们破坏了 libglx.so,因此我将 xserver-xorg-core libglx.so 恢复到其原始位置,将 Nvidia 的 libglx.so 移动到 nvidia 特定的文件夹,并在 bumblebee.config 中指定该文件夹。这似乎有效,不应该导致我在此处看到的问题。

为了好玩,我尝试将 Nvidia 芯片组用于 Unity,但也没有成功:

~$ optirun /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   NVIDIA Corporation
OpenGL renderer string: GeForce GT 640M LE/PCIe/SSE2
OpenGL version string:  4.2.0 NVIDIA 304.22

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  no
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       no

答案1

问题出在 libGL.so.1 - 显然,Nvidia 安装程序也已删除英特尔的产品,并用自己的产品替换它。

所以我从 libgl1-mesa-glx 中检索它并更改 /usr/lib 中的符号链接以指向它。

我不会详细介绍如何设置 Bumblebee,但有一些关键部分尚未真正记录下来:

  1. Nvidia 驱动程序安装程序可能会破坏您现有的 libglx.so(位于 /usr/lib/xorg/modules/extensions 中)和 libGL.so(位于 /usr/lib 中)。请在安装驱动程序之前备份它们。如果您已经丢失了它们,您可以通过重新安装 xserver-xorg-core 和 libgl1-mesa-glx 来找回它们,但当我第一次尝试这样做时,它让我的笔记本电脑处于不良状态(登录后黑屏,必须进入恢复状态),所以我建议通过 dpkg-deb 手动获取它们。

  2. 安装 Nvidia 驱动程序后,您会注意到 Nvidia 将上面列出的两个文件替换为指向 Nvidia 库的符号链接。例如,在我的情况下,libglx.so 是指向 libglx.so.304.22 的符号链接。

  3. 由于 Bumblebee 需要这两种驱动程序,而且它只能通过目录来区分,因此让我们将每个图形适配器的驱动程序移动到单独的目录中。我使用的 Nvidia 安装程序将一些驱动程序安装到 /usr/lib/nvidia-current 中,让我们使用它。请记住,我们需要分离库和 Xorg 模块。以下是我将相关文件放在的位置:

在 /usr/lib 中:

libGL.so.304.22   -- Nvidia's driver (unchanged where the installer put it)
libGL.so          -- symlink to libGL.so.1
libGL.so.1        -- symlink to /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1,
                     i.e. the libgl1-mesa-glx driver

在 /usr/lib/x86_64-linux-gnu/mesa 中:

libGL.so.1   -- symlink to libGL.so.1.2
libGL.so.1.2 -- The normal driver from libgl1-mesa-glx 

在 /usr/lib/nvidia-current 中:

libGL.so   -- symlink to libGL.so.1
libGL.so.1 -- symlink to /usr/lib/libGL.so.304.22 (i.e. Nvidia's driver)

在 /usr/lib/nvidia-current/xorg 中:

libglx.so -- symlink to /usr/lib/xorg/modules/extensions/libglx.so.304.22

在 /usr/lib/xorg/modules/extensions 中:

libglx.so.1       -- symlink to libglx.so.xserver
libglx.so.304.22  -- Nvidia's driver (unchanged from where the installer put it)
libglx.so.xserver -- I renamed the original libglx.so to that and put it here

最后,我们需要修改 /etc/bumblebee/bumbleebee.conf 来告诉系统在哪里可以找到 Nvidia 驱动程序。我使用的是 nvidia 驱动程序(而不是 nouveau),因此在 nvidia 部分中,我使用以下内容:

KernelDriver=nvidia
Module=nvidia
PMMethod=auto
# colon-separated path to the nvidia libraries
LibraryPath=/usr/lib/nvidia-current:/usr/lib32/nvidia-current
# comma-separated path of the directory containing nvidia_drv.so and the
# default Xorg modules path
XorgModulePath=/usr/lib/nvidia-current/xorg,/usr/lib/xorg/modules

请注意 LibraryPath 和 XorgModulePath 如何指向 Nvidia 驱动程序,因此如果 Bumblebee 正在寻找它们,它就会找到它们。如果 Unity 正在寻找它们,它会在 /usr/lib 和 /usr/lib/xorg/modules/extensions 中查找,我们确保这些符号链接到非 Nvidia 驱动程序。

这可能在某些地方有点笨拙,但我能说什么呢?它运行完美:

Unity 3D 可实现完整的桌面效果,速度快如闪电,但仍使用节能的较慢的 Intel 芯片组。VirtualBox 等应用程序可以使用常规 3D 加速。optirun 可运行,我可以选择运行“glxspheres”(约 60 fps)或“optirun glxspheres”(约 120 fps)。

相关内容