A Weird Imagination

Nvidia GLX not working

The problem#

I recently replaced my old Nvidia graphics card with a newer one. Upon booting up, I ran glxgears to test that 3D graphics were working properly and got an error like

X Error of failed request:  BadWindow (invalid Window parameter)
 Major opcode of failed request:  155 (NV-GLX)
 Minor opcode of failed request:  4 ()
 Resource id in failed request:  0x1200003
 Serial number of failed request:  34
 Current serial number in output stream:  34

The solution#

Either delete /etc/X11/xorg.conf or edit it and remove (or comment out) the "Files" section; that is, the lines

Section "Files"
    ...
EndSection

The details#

Initial troubleshooting#

Doing a search on the error message, I found suggestions that this was a sign the Nvidia driver installation was corrupted and a reinstall might fix it. Other posts pointed me at the Xorg logs.

Looking at the Xorg log file in /var/log/Xorg.0.log, I found messages like

(II) LoadModule: "glx"
(II) Loading /usr/lib/xorg/modules/extensions/libglx.so
(II) Module glx: vendor="X.Org Foundation"
(II) Loading extension GLX
...
(EE) NVIDIA(0): Failed to initialize the GLX module; please check in your X
(EE) NVIDIA(0):     log file that the GLX module has been loaded in your X
(EE) NVIDIA(0):     server, and that the module is the NVIDIA GLX module.

indicating the wrong libglx.so was being loaded.

Finding libglx.so#

This leads to the question of which libglx.so should be loaded.

Using locate found

$ locate libglx.so
/etc/alternatives/glx--linux-libglx.so
/etc/alternatives/nvidia--libglx.so
/usr/lib/nvidia/current/libglx.so
/usr/lib/nvidia/current/libglx.so.390.87
/usr/lib/nvidia/libglx.so
/usr/lib/xorg/modules/extensions/libglx.so
/usr/lib/xorg/modules/linux/libglx.so

and wajig's whichpkg sub-command found

$ wajig whichpkg libglx.so
INSTALLED MATCHES (x3)
----------------------
xserver-xorg-video-nvidia: /usr/lib/nvidia/current/libglx.so
xserver-xorg-video-nvidia: /usr/lib/nvidia/current/libglx.so.390.87
xserver-xorg-core: /usr/lib/xorg/modules/extensions/libglx.so

The desired libglx.so is the one from the Nvidia-related package (xserver-xorg-video-nvidia), not the general Xorg package (xserver-xorg-core), which suggests that /usr/lib/xorg/modules/extensions/ is not actually where Xorg should be looking for modules (at least not as the first choice).

Wait, /usr/lib/xorg/modules/linux/libglx.so isn't an installed file?#

Note that /usr/lib/xorg/modules/linux/libglx.so is not actually listed by wajig whichpkg. Looking at that file reveals that it's a symbolic link:

$ ll /usr/lib/xorg/modules/linux/
total 0
lrwxrwxrwx 1 root root 38 Jan 26  2018 libglx.so -> /etc/alternatives/glx--linux-libglx.so

As the correct libglx.so to use depends on the system setup, Debian's alteratives system is used to select which one to use. A quick check in the /etc/alternatives directory shows that is indeed pointing at an Nvidia-related file as expected.

$ ll /etc/alternatives | grep glx--linux-libglx.so
lrwxrwxrwx 1 root root  25 Oct 17 20:05 glx--linux-libglx.so -> /usr/lib/nvidia/libglx.so

We also could have used readlink to skip to the final target of the chain of links:

$ readlink -f /usr/lib/xorg/modules/linux/libglx.so
/usr/lib/nvidia/current/libglx.so.390.87

Fixing ModulePath in xorg.conf#

Looking in more detail at /var/log/Xorg.0.log, I noticed the line

(==) ModulePath set to "/usr/lib/xorg/modules"

To help interpret this line, looking toward the top of the log is the legend for the prefixes of the lines in this log:

Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.

indicating that (==) means it's the default setting. Looking at my xorg.conf, I found

Section "Files"
EndSection

Given that Debian intentionally put libglx.conf in /usr/lib/xorg/modules/linux/—and that was not getting included in the ModulePath list—I figured that empty "Files" section was overridding a settings file from Debian. Indeed, after removing it, glxgears worked and Xorg.0.log contained the line

(**) ModulePath set to "/usr/lib/xorg/modules/linux,/usr/lib/xorg/modules"

indicating that path was now being correctly included in ModulePath, and the (**) indicates that it's from a config file.

Why did that work?#

Looking further, the log file contains the information on the config files it uses:

(==) Using config file: "/etc/X11/xorg.conf"
(==) Using config directory: "/etc/X11/xorg.conf.d"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"

In /usr/share/X11/xorg.conf.d/, the file nvidia-drm-outputclass.conf contains

Section "Files"
    ModulePath     "/usr/lib/xorg/modules/linux"
    ModulePath     "/usr/lib/xorg/modules"
EndSection

which is apparently where ModulePath is supposed to be set.

Comments

Have something to add? Post a comment by sending an email to comments@aweirdimagination.net. You may use Markdown for formatting.

There are no comments yet.