解决 openSUSE Factory KDE 桌面无法启用 OpenGL 的问题

#1

最近在推 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.solibGL.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。

Has Likes
#2

让我想起现代汉语老师用文化语言学的方法而古代汉语老师用训诂学的方法得出同样的结论时我的感受,很爽,是一种……“学术的愉悦”?

#3

前些时候上滚动版的时候也发现这个问题,一直不知道怎么解决

#4

刚才升级到了 13.2 ,也遇到了 OpenGL 初始化失败的问题(系统升级完成后独显好像没启用,之后又再次升级了显卡驱动才正常,结果桌面效果 -> 混成类型 无法选用 OpenGL)。

搜到了这个帖子,正在装软件于是顺手查了一下版本号,填进去了,结果重启发现还是不行。
于是回来认真看帖
glxinfo

name of display: :0
Xlib:  extension "GLX" missing on display ":0".
Error: couldn't find RGB GLX visual or fbconfig


less /var/log/Xorg.0.log | grep glx 

提示 libglx.so 不存在,载入 glx 失败。

找到 /usr/lib64/xorg/modules/extensions/ 真的没有 libglx.so.340.76 唉, 于是往上级目录,发现在 ./updates/extensions/libglx.so.340.76 ,
本想软链过去,但是后面驱动再升级的话不知道又会怎么样,还是复制到过去了。

ln -s /usr/lib64/xorg/modules/extensions/libglx.so.340.76 /usr/lib64/xorg/modules/extensions/libglx.so

因为刚开始就直接修改了软链,无法具体知道出错的原因,只能推测大概是驱动升级后没有链接到 so 文件~
囫囵吞枣噎死人呐~ :sweat: