Foreword
Mesa is a special package since many flavours are built, which means
it takes quite some time to get all packages ready, as well as some
disc space (over 2GB for the build/
directory alone).
Also, trying to figure out whether latest master
is also affected,
or backporting some bug fixes might lead to some painful I/O while
generating the .deb
files, and then installing/unpacking them. This
is why this document was written: Helping users test other mesa
releases, branches, bug fixes without having to build full packages,
and without having to mess with their systems (i.e. no root access
is needed once the build dependencies are installed).
We’ll focus on the DRI (Direct Rendering Infrastructure) flavour
(libgl1-mesa-dri
), which is the most common.
It might be possible to adapt the following steps to another flavour,
in which case the appropriate options to be passed to ./configure
should be looked up in the debian/rules
file of the Debian source
package.
Gathering information
Get started by installing mesa-utils
, which contains glxinfo
.
-
Is direct rendering enabled?
$ glxinfo | grep ^direct direct rendering: Yes
↪ Yes.
-
Is this the classic or Gallium driver?
$ glxinfo | grep 'renderer string' OpenGL renderer string: Mesa DRI Intel(R) 945GM GEM 20100330 DEVELOPMENT
↪ No “Gallium” here, therefore: “classic”.
-
Which driver is this, and where is it located?
$ LIBGL_DEBUG=verbose glxinfo 2>&1 >/dev/null | grep so$ libGL: OpenDriver: trying /usr/lib/dri/tls/i915_dri.so libGL: OpenDriver: trying /usr/lib/dri/i915_dri.so
↪
i915
, from the system directory:/usr/lib/dri
(likely installed through a Debian package). -
How can I get more debugging information?
export LIBGL_DEBUG=verbose export MESA_DEBUG=1 export EGL_LOG_LEVEL=debug
Preparing mesa sources
To get started, installing all build dependencies of the mesa
source
package should be sufficient, along with the essential build tools,
and git
:
$ sudo apt-get install build-essential git
$ sudo apt-get build-dep mesa
Make sure you have some disc space available, since the git repository is over 120MB, and since the mesa directory is over 500MB after a build. Once you’re ready, grab the upstream mesa sources:
$ git clone git://anongit.freedesktop.org/mesa/mesa mesa.git
$ cd mesa.git
$ autoreconf -vfi
Here’s what the ./configure
call will look like:
$ ./configure --prefix=/usr \
--enable-driglx-direct \
--enable-gles1 \
--enable-gles2 \
--enable-glx-tls \
--with-dri-driverdir=/usr/lib/dri \
--with-egl-platforms='drm x11' \
…
Now, what are the parameters to replace “…
” with? Basically, if
you determined an Intel driver (i915
or i965
), you want to use the
classic drivers and to disable the Gallium drivers. Other drivers are
only available on Gallium (r300
, r600
, radeonsi
and more).
Running ./configure --help
might be useful.
Examples for common drivers:
-
For
i915
, you need:--with-dri-drivers=i915
-
For
i965
, you need:--with-dri-drivers=i965
-
For
nouveau
, you may want to try:--with-dri-drivers=nouveau --with-gallium-drivers=nouveau
-
For
r300
, you need:--with-gallium-drivers=r300
-
For
r600
, you need:--with-gallium-drivers=r600
-
For
radeonsi
, you need:--with-gallium-drivers=radeonsi
Now, once you’ve run ./configure
, time for your favorite beverage:
$ make
Running the newly-built mesa libraries
Shared libraries end up in the lib/
directory. It contains the
classic drivers, while Gallium drivers end up under lib/gallium
. If
you’re not an Intel user, overwrite the classic drivers with the
Gallium ones:
$ mv lib/gallium/* lib/
Now, 3 variables need to be set, so that the locally-built libraries are used.
-
To begin with, libGL itself and its drivers:
$ export LIBGL_DRIVERS_PATH=lib
Did this work?
$ LIBGL_DEBUG=verbose glxinfo 2>&1 >/dev/null | grep so$ libGL: OpenDriver: trying lib/tls/i915_dri.so libGL: OpenDriver: trying lib/i915_dri.so
↪ Yes: No system directory, paths are relative to
lib/
. -
Set
LD_LIBRARY_PATH
to make sure the locally-built libraries (including those pulled through library dependencies) are used, instead of system ones:$ export LD_LIBRARY_PATH=lib
Did this work?
$ ldd lib/libGLESv2.so | grep glapi libglapi.so.0 => lib/libglapi.so.0 (0x00007fee3192e000)
↪ Yes: Path is relative to
lib
. -
Set the EGL search path:
$ export EGL_DRIVERS_PATH=lib/egl
Did this work?
$ EGL_LOG_LEVEL=debug es2_info 2>&1 >/dev/null | grep '\.so' libEGL debug: added lib/egl/egl_gallium.so to module array libEGL debug: dlopen(lib/egl/egl_gallium.so) libEGL debug: DRI2: dlopen(lib/i915_dri.so)
↪ Yes: No system directory, paths are relative to
lib/
.
The end.
Now you should be ready to test upstream’s suggestions!