最近在推 openSUSE 13.2 翻译的时候,有一些 OpenGL 屏保的翻译,需要看到效果才能知道究竟翻译成什么好,于是我就安装了 rss-glx 这个软件包。
可是我在“系统设置”-“显示和监控”-“屏幕锁”下面,选了那些 OpenGL 屏保,点测试,发现没有反应。而且是所有的 OpenGL 都没有预览。
我想我是不是忘记 OpenGL 没开啊,于是就去“系统设置”-“桌面效果”-“高级“下面,果然,我的”混成类型“是 Xrender,也就是软件渲染而非硬件渲染,也没有 3D 特效。这个我平时真不怎么注意的,实际上日用的计算机真不容易注意到某个特效是否炫酷的(Xrender 渲染在日用的情况下跟 OpenGL 的差别就是窗口的阴影处理有细微差别,如果你不知道你自己开没开,没有反馈盲测的话,肉眼很难分辨的)。
但是来,我选一下 OpenGL 3.1,居然说不能开启,好吧,版本太新了么?可是 OpenGL 2.0 也不行是什么情况?我的显卡 openSUSE 12.2 的时候就能开 2.0 啊,现在你告诉我不能开!
于是简单 Google 了一下,看到了这个:
userbase.kde.org/Desktop_Effects_Performance/zh-cn
Kinfocenter -> 图形信息 -> OpenGL
居然告诉我 OpenGL 不能加载!什么情况,我是闭源 N 卡啊!
于是运行 glxinfo,报这个错:
couldn’t find rgb glx visual or fbconfig
又继续 Google 了下,看到 Arch 论坛有人有这个问题,debug 的时候用到了
less /var/log/Xorg.0.log | grep gl
好吧我不用 less,于是用 cat 代替,看到这个错误:
swrast_dri.so: undefined symbol: _glapi_tls_Dispatch
搜了一下发现 Debian 的 bugzilla:
bugs.debian.org/cgi-bin/bugreport.cgi?bug=756407
里面说了一大堆没细看,但有一个是让人
ldd /usr/lib/xorg/modules/extensions/libglx.so
的,我知道 libglx.so 和 libGL.so 这种东西是有两套的,一套是 Mesa 提供的也就是 nouveau 那些开源的,另一套是 NVIDIA 闭源驱动自带的。装了闭源驱动一般会把开源的覆盖掉的。
cd /usr/lib64/xorg/modules/extensions
ls -l
纳尼?为什么会有一个指向 /etc/alternatives/libglx.so 的 libglx.so?
alternatives 是一个工具,意思就是你两个软件包都提供了一个文件,可以通过优先级来判定用哪个包提供的。
ls -l /etc/alternatives/libglx.so
指向了 /usr/lib64/xorg/modules/extensions/xorg/xorg-libglx.so。
这家伙才 276KB 大啊,而且关键的是 /usr/lib64/xorg/modules/extensions 就有一个 11MB 大的 libglx.so.340.32 啊,一看就是 NVIDIA 闭源驱动提供的,这样一比较,笨人也知道 276KB 大的那个不靠谱。
于是直接:
mv /usr/lib64/xorg/modules/extensions/libglx.so /usr/lib64/xorg/modules/extensions/libglx.so.bak
ln -s /usr/lib64/xorg/modules/extensions/libglx.so.340.32 /usr/lib64/xorg/modules/extensions/libglx.so
然后重启电脑。
查看 Xorg.0.log,那个 undefined symbol 消失了。
去开 OpenGL 3.1,成功了!
总结:xorg-libglx.so 属于 xorg-x11-server 这个软件包,不知道为什么 13.2 和 Factory 要对 libglx.so 用 alternatives(因为用 alternatives 就代表还有别的包提供了 libglx.so,但闭源显卡驱动不属于 openSUSE 发行版,不算闭源显卡就只剩 Mesa 提供的那套了,按理不需要。但既然用了,就一定还有一个软件包现在也提供了 libglx.so,难道是 wayland?),但现在用了 alternatives 后 NVIDIA 的闭源显卡就没法覆盖这个文件了(以前它是一个文件,现在是一个软链接,可能 NVIDIA 闭源驱动的检测代码出了问题),所以需要手动去链接一下才能开 OpenGL。