How to build mesa
=================
:toc:
Cyril Brulebois <kibi@debian.org>


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 https://en.wikipedia.org/wiki/Gallium3D[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/`.


[float]
The end.
~~~~~~~~

Now you should be ready to test upstream’s suggestions!
