GLX モジュールが動かない

現象

X11 の GLXモジュールが動かない。 x11-toolkits/nanogui を利用したプログラムを動かそうとすると、 GLXモジュールが有効でないから動かないよという感じのメッセージが出てくる。

NVIDIAGPUを使っていたけど、ほかのGPUに変えた場合にこの問題に当たりがち。

エラーメッセージ

GLX モジュールが動いていないと言われるので GLX で /var/log/Xorg.0.log を検索すると、 私の場合はこういうログがあった。

[    76.231] (II) LoadModule: "glx"
[    76.281] (II) Loading /usr/local/lib/xorg/modules/extensions/libglx.so
[    77.680] (II) Module glx: vendor="NVIDIA Corporation"
[    77.680]    compiled for 4.0.2, module version = 1.0.0
[    77.680]    Module class: X.Org Server Extension
[    77.680] (II) NVIDIA GLX Module  390.144  Wed Jun  2 22:59:08 UTC 2021
...
[    79.604] (II) Initializing extension GLX
[    79.604] (EE) Failed to initialize GLX extension (Compatible NVIDIA X driver not found)

ここで「あれ? NVIDIAGPUから乗り換えたのに」と思えていれば解決は早かったのだろうが、 StackExchangeのQ&A で説明を見るまではなんでか理解していなかった。

対処法

x11/nvidia-driver* と x11-servers/xorg-server をアンインストールして、 x11-servers/xorg-server をインストールしなおす。

これでうまく行くはずだけど、それでもログのエラーメッセージが変わらなかったら、 /usr/local/lib/xorg/modules/extensions/.xorg/libglx.so を /usr/local/lib/xorg/modules/extensions/libglx.so にコピーすればよい。

要するに、/usr/local/lib/xorg/modules/extensions/libglx.so が nvidia-server のもので、 xorg ではなくてそちらがロードされてしまうのが問題なのだ。

そうすると /var/log/Xorg.0.log のメッセージは次のようになるはず。

[    74.516] (II) LoadModule: "glx"
[    74.520] (II) Loading /usr/local/lib/xorg/modules/extensions/libglx.so
[    75.449] (II) Module glx: vendor="X.Org Foundation"
[    75.449]    compiled for 1.20.14, module version = 1.0.0
[    75.449]    ABI class: X.Org Server Extension, version 10.0
...
[    77.773] (II) Initializing extension GLX
[    77.778] (II) AIGLX: Loaded and initialized radeonsi
[    77.778] (II) GLX: Initialized DRI2 GL provider for screen 0