User Tools

Site Tools


wiki:development:glx-xlib-workaround

Workaround for getting GLX 1.4 working

Symptoms

  • Gnome-based and other applications report messages like “Failed to initialize gtk+: Unable to initialize the Clutter backend: no available drivers found.”
  • glxinfo reports GLX Version is 1.2
  • Disabling GLX entirely in /etc/x2go/x2goagent.options via -extension GLX does not work because the application does not have the capability to work without GLX at all.

Approach

Use a wrapper/proxy library provided by Mesa. The applications will use the supplied libGL.so, which in turn uses the lib interface to talk to the X server (nxagent) rather than the GLX interface. From the applications' perspective, they have GLX 1.4.

Compile

The general way to build the required library is this (see also https://mesa3d.org/llvmpipe.html):

  • download and extract tarball from mesa3d.org. Try with the newest and go down to older versions if you have problems with the newer one
  • cd mesa-<the version you downloaded>
  • mkdir build
  • cd build
  • meson -D glx=gallium-xlib -D gallium-drivers=swrast -D platforms=x11 -D dri3=false -D dri-drivers=“” -D vulkan-drivers=“” -D buildtype=release -D optimization=3
  • ninja

Wrappers

Now you should find a libGL.so in src/gallium/targets/libgl-xlib. This is the lib the your program need to load instead of the libGL of the system.

Copy the src/gallium/targets/libgl-xlib directory to a place of your preference. Create two wrapper scripts ~/x2goglx and ~/x2goglx2

x2goglx:

#!/bin/sh
LD_LIBRARY_PATH=<your directory>/libgl-xlib:${LD_LIBRARY_PATH} exec "$@"

x2goglx2:

#!/bin/sh
LD_PRELOAD=<your directory>/libgl-xlib/libGL.so.1 exec "$@"

Make them executable and test them:

$ chmod u+rx x2goglx*
$ x2goglx glxinfo
$ x2goglx2 glxinfo

Watch the output of the two glxinfo calls. You should see references to your mesa version and you should also see it reporting “GLX version: 1.4”, e.g. (shortened):

...
server glx vendor string: Brian Paul
server glx version string: 1.4 Mesa 18.0.5
...
client glx vendor string: Brian Paul
client glx version string: 1.4 Mesa 18.0.5
...
GLX version: 1.4
...
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: llvmpipe (LLVM 3.8, 128 bits)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.0.5
...

Instead of creating the scripts mentioned above you can also add this to your .bashrc (or the config of your favourite shell):

export LD_LIBRARY_PATH=<your directory>/libgl-xlib:${LD_LIBRARY_PATH}

Usage

Now you can use one of these created wrapper scripts to run your application: x2goglx <your application>. Some apps modify LD_LIBRARY_PATH so the x2goglx could have no effect. In that case try x2goglx2.

If you still cannot succeed you can try to find your if your application needs some special treatment. If so, please add the solution to the end of this page or post it to the mailinglist for some to add it.

Versions / Platforms

The following chapters give some hints on how to compile the library on various combinations of platforms and mesa versions.

Mesa 19 and newer

Please note: the instructions below are valid for older Mesa releases. In Mesa 19 meson is recommended for building. Please consult https://mesa3d.org/llvmpipe.html for a basic compilation instruction. Since those instructions will not work out of the box (Error: “gallium-xlib conflicts with any dri driver”) as of Mesa 19.3.2 you need to call meson with some further parameters like this:

$ meson -D glx=gallium-xlib -D gallium-drivers=swrast -D platforms=x11 -D dri3=false -D dri-drivers="" -D vulkan-drivers="" -D buildtype=release -D optimization=3
$ ninja

Debian Buster and Mesa 19.3.2

$ (download and extract tarball from mesa3d.org)
$ cd mesa-19.3.2
$ mkdir build
$ cd build
$ meson -D glx=gallium-xlib -D gallium-drivers=swrast -D platforms=x11 -D dri3=false -D dri-drivers="" -D vulkan-drivers="" -D buildtype=release -D optimization=3
$ ninja
$ LD_LIBRARY_PATH=`pwd`/src/gallium/targets/libgl-xlib/:${LD_LIBRARY_PATH} glxinfo | grep 'GLX version:'

Ubuntu 14.04

(with trusty-updates mesa 10.1.3-0ubuntu0.3)

sudo aptitude build-dep mesa
sudo aptitude install scons llvm-dev
apt-get source mesa
cd mesa
scons libgl-xlib
export LD_LIBRARY_PATH=`pwd`/build/linux-x86_64-debug/gallium/targets/libgl-xlib/:${LD_LIBRARY_PATH}
glxinfo | grep 'GLX version:'

Gentoo

Ensure that some required tools are installed:

emerge -1av app-portage/gentoolkit dev-util/scons dev-python/mako

Create a place to store the library - adapt this path to your liking.

mkdir -p /usr/local/share/mesa-libgl-xlib

Place the following line in a suitable place - either in your .bashrc or in the script that calls the individual application:

export LD_LIBRARY_PATH=/usr/local/share/mesa-libgl-xlib/:${LD_LIBRARY_PATH}

Configure portage to extract and patch the Mesa package into a known location. Before doing so, ensure that the USE flags for media-libs/mesa are configured to your liking.

mesa_version="$(equery -q list media-libs/mesa -F '$version')"
ebuild "/usr/portage/media-libs/mesa/mesa-${mesa_version}.ebuild" prepare

Now compile the library and move it over to the storage location:

cd "/var/tmp/portage/media-libs/mesa-${mesa_version}/work/mesa-${mesa_version}"
scons libgl-xlib
cp -av build/linux-x86_64-debug/gallium/targets/libgl-xlib/* /usr/local/share/mesa-libgl-xlib/

Cleanup:

ebuild "/usr/portage/media-libs/mesa/mesa-${mesa_version}.ebuild" clean

Applications

Matlab 2019b

Compile like this:

meson -D glx=gallium-xlib -D gallium-drivers=swrast -D platforms=x11 -D dri3=false -D dri-drivers="" -D vulkan-drivers="" -D buildtype=release -D optimization=3 -Dprefix=/usr/local/mesa-20.1.0/

To make Matlab load the new driver modify Matlab's lib search path: cp $MATLAB_DIRECTORY/bin/.matlab7rc.sh ~

Edit the file ~/.matlab7rc.sh, find the glnxa* section and add /usr/local/mesa-20.1.0/lib/x86_64-linux-gnu to LDPATH_PREFIX

Add to your .profile: export MESA_GL_VERSION_OVERRIDE=3.0

wiki/development/glx-xlib-workaround.txt · Last modified: 2020/08/20 21:49 by uli42