幽谷奇峰 | 燕雀鸣幽谷,鸿鹄掠奇峰

Ubuntu12.04更新后Unity 3D无法工作


Ubuntu12.04更新后Unity 3D无法工作,运行以下命令

1
$ /usr/lib/nux/unity_support_test -p

得到如下结果:

1
2
3
4
5
6
X Error of failed request:  BadWindow (invalid Window parameter)
Major opcode of failed request:  138 (NV-GLX)
Minor opcode of failed request:  4 ()
Resource id in failed request:  0x26f
Serial number of failed request:  41
Current serial number in output stream:  41

这是因为更新过xserver-xorg-core这个软件包所致。此包包含以下文件:

1
/usr/lib/xorg/modules/extensions/libglx.so

如果使用的是自己从NVIDIA官网上下载的驱动,那么此文件必须是一个软链接,指向以下文件:

1
/usr/lib/xorg/modules/extensions/libglx.so.XXX.YY

这里,XXX和YY给出的是驱动版本。因此,每当xserver-xorg-core这个软件包更新后,就把这个软链接文件给覆盖掉了,导致GLX相关的应用程序无法使用Nvidia驱动。

解决方法当然是重新创建这个软链接:

1
2
$ sudo mv /usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/libglx.so_backup
$ sudo ln -s /usr/lib/xorg/modules/extensions/libglx.so.XXX.YY /usr/lib/xorg/modules/extensions/libglx.so

然后,重启图形界面服务就可以看到Unity 3D正常工作了。

1
$ sudo service lightdm restart

以后,每次更新过xserver-xorg-core这个软件包,就要记得进行以上操作。

还有另外一种情况,也会导致Unity 3D无法工作,那就是更新过libgl1-mesa-glx,unity测试结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   NVIDIA Corporation
OpenGL renderer string: GeForce 7300 GT/PCIe/SSE2
OpenGL version string:  1.4 (2.1.2 NVIDIA 295.59)

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

运行命令

1
$ ldd /usr/bin/glxinfo

你会看到

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
linux-vdso.so.1 =>  (0x00007ffffe7d9000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f7ff5442000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f7ff510e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ff4d50000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f7ff4b2b000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f7ff491a000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f7ff4716000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f7ff4510000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f7ff430e000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f7ff40f6000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7ff3ed8000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f7ff3cd3000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f7ff3ac7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ff38aa000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ff36a6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ff56c3000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f7ff34a2000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f7ff329c000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7ff3093000)

其中,libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f7ff5442000)表示GL模块使用的是开源的mesa驱动,而非Nvidia驱动。

ls -l命令查看此文件

1
2
$ ls -l /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
lrwxrwxrwx 1 root root 12  9月 11 07:40 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 -> libGL.so.1.2

得知,它是指向/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2的软链接文件。只要删掉这两个文件,再运行ldconfig就可以啦。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ sudo rm /usr/lib/libGL.so.1 /usr/lib/libGL.so.1.2
$ sudo ldconfig
$ ldd /usr/bin/glxinfo
    linux-vdso.so.1 =>  (0x00007fff240f8000)
    libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f9bb976a000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f9bb9436000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bb9078000)
    libnvidia-tls.so.295.59 => /usr/lib/tls/libnvidia-tls.so.295.59 (0x00007f9bb8e75000)
    libnvidia-glcore.so.295.59 => /usr/lib/libnvidia-glcore.so.295.59 (0x00007f9bb6b3b000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f9bb6929000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9bb6725000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f9bb6507000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9bb9aa3000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9bb620c000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f9bb6009000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f9bb5e03000)

重启图形界面服务,Unity 3D就可以正常工作了。

参考资料

  1. What to do when GLX stops working with Nvidia
  2. Nvidia, Unity, glxinfo couldn't find RGB GLX visual

本作品由 Yysfire 创作,采用知识共享许可协议进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/linux/unity-3d-does-not-work-after-upgrade-on-ubuntu-12.04.html


相关文章


最后修改
2012-10-07 16:50
发表时间
2012-10-07 15:23
本文标签
Linux 18 NVIDIA 2 Ubuntu 9 Unity 1
关注我

侧栏导航