Venemo / mesa-howto.md
This explains how to build mesa from source, and how to use the custom built mesa to run some apps and games, without needing to replace the mesa libraries that your operating system runs on.
Let’s assume that you are using an x86_64 system.
Here is what we are going to do:
- Install all build dependencies for mesa
- Clone the mesa repo to ~/Projects/mesa
- Build mesa
- Install the mesa version you just built into ~/mesa (not the same as the above directory)
- Create a script which can tell games / apps to use the libraries from ~/mesa instead of what is on your system out of the box.
Step 1. Install dependencies
Use your distro package manager to install mesa dependencies. If you’re on a different distro, you will need to substitute with the correct commands for your package manager. The packages are usually named similarly but maybe have a different naming convention (eg. -dev vs. -devel , etc.).
dnf install git meson ninja-build gcc gcc-c++ cmake.i686 cmake.x86_64 glibc-devel.i686 glibc-devel.x86_64 valgrind-devel.i686 valgrind-devel.x86_64 bison flex vulkan*.x86_64 vulkan*.i686 libdrm-devel.x86_64 libdrm-devel.i686 libvdpau-devel.x86_64 libvdpau-devel.i686 libva-devel.x86_64 libva-devel.i686 libomxil-bellagio-devel.x86_64 libomxil-bellagio-devel.i686 zlib-devel.x86_64 zlib-devel.i686 llvm-devel.x86_64 llvm-devel.i686 elfutils-libelf-devel.x86_64 elfutils-libelf-devel.i686 wayland*-devel.x86_64 wayland*-devel.i686 wayland-protocols-devel libX*-devel.x86_64 libX*-devel.i686 libunwind-devel.x86_64 libunwind-devel.i686 libxshmfence-devel.x86_64 libxshmfence-devel.i686 lm_sensors-devel.x86_64 lm_sensors-devel.i686 expat-devel.x86_64 expat-devel.i686 libzstd-devel.x86_64 libzstd-devel.i686 pkgconf-pkg-config.i686 pkgconf-pkg-config.x86_64 libffi-devel.i686 libffi-devel.x86_64 libxcb-devel.i686 libxcb-devel.x86_64
Step 2. Clone the mesa repo
I usually put every git repo I work with into a directory such as ~/Projects — I recommend the same to you.
mkdir -p ~/Projects cd ~/Projects git clone https://gitlab.freedesktop.org/mesa/mesa.git
We’re assuming that your distro uses lib64 for the 64-bit libraries like Fedora. If not, adjust the meson commands below according to your distro. The compiled libraries will go into ~/mesa for the sake of simplicity.
This command will build both Intel and AMD drivers in release mode:
# Enter the mesa root directory cd mesa # Configure the build with meson meson build64 --libdir lib64 --prefix $HOME/mesa -Dgallium-drivers=radeonsi,swrast,iris,zink -Dvulkan-drivers=intel,amd -Dgallium-nine=true -Dosmesa=false -Dbuildtype=release # Compile with ninja ninja -C build64 install
Config with AMD drivers only in release mode (recommended for AMD performance testing):
meson build64 --libdir lib64 --prefix $HOME/mesa -Dgallium-drivers=radeonsi,swrast,zink -Dvulkan-drivers=amd -Dgallium-nine=true -Dosmesa=false -Dbuildtype=release ninja -C build64 install
Config with RADV only in debug mode (recommended for bisecting RADV crashes, etc.)
meson build64radvdebug --libdir lib64 --prefix $HOME/mesa -Dgallium-drivers= -Dvulkan-drivers=amd -Dbuild-aco-tests=true -Dbuildtype=debug ninja -C build64radvdebug install
You can compile one with ninja -C build64radvdebug and the other with ninja -C build64 — they don’t interfere with each other. Of course if you use the same install prefix they will overwrite each other when you install them.
Note about upgrading to a different version of mesa
You can use the usual git commands for updating, for example git pull etc. You don’t need to re-run meson but you do need to re-run ninja (eg. ninja -C build64 install ) to compile and install the changes in the new version.
Step 4. 32-bit build on an x86_64 system (skip when only testing a 64-bit game)
If you don’t use Fedora (or another Red Hat family distro), replace i686-redhat-linux-gnu-pkg-config with the correct 32-bit pkg-config executable for your distro. Also verify the location of llvm-config-32 which might be different on another distro.
Make sure the meson cross directory exists:
mkdir -p ~/.local/share/meson/cross
Create a meson cross file here: ~/.local/share/meson/cross/gcc-i686 with the following content:
[binaries] c='gcc' cpp='g++' ar='ar' strip='strip' pkgconfig='i686-redhat-linux-gnu-pkg-config' llvm-config='/usr/bin/llvm-config-32' [properties] c_args=['-m32', '-march=native'] c_link_args=['-m32'] cpp_args=['-m32', '-march=native'] cpp_link_args=['-m32'] [host_machine] system='linux' cpu_family='x86' cpu='x86' endian='little'
Now you can use it to build 32-bit mesa libs.
32-bit config with Intel and AMD drivers only in release mode:
cd ~/Projects/mesa meson build32 --cross-file gcc-i686 --libdir lib --prefix $HOME/mesa -Dgallium-drivers=radeonsi,swrast,iris,zink -Dvulkan-drivers=intel,amd -Dgallium-nine=true -Dosmesa=false -Dbuildtype=release ninja -C build32 install
32-bit config with AMD drivers only:
meson build32 --cross-file gcc-i686 --libdir lib --prefix $HOME/mesa -Dgallium-drivers=radeonsi,swrast,zink -Dvulkan-drivers=amd -Dgallium-nine=true -Dosmesa=false -Dbuildtype=release ninja -C build32 install
Note that you can build both the x86_64 and the i686 libraries together and they can still all go to ~/mesa , meaning there is no need to configure anything else when you need both 32 and 64-bit. You can use all of that with either 32-bit or 64-bit games.
Using the compiled mesa binaries
Running through a script (recommended for testing a single game or app)
Create a script file like this, eg. nano ~/mesa-run.sh
If you used a different install prefix or a different lib dir above, you will need to adjust this script accordingly.
#!/bin/sh MESA=$HOME/mesa \ LD_LIBRARY_PATH=$MESA/lib64:$MESA/lib:$LD_LIBRARY_PATH \ LIBGL_DRIVERS_PATH=$MESA/lib64/dri:$MESA/lib/dri \ VK_ICD_FILENAMES=$MESA/share/vulkan/icd.d/radeon_icd.x86_64.json:$MESA/share/vulkan/icd.d/radeon_icd.x86.json \ D3D_MODULE_PATH=$MESA/lib64/d3d/d3dadapter9.so.1:$MESA/lib/d3d/d3dadapter9.so.1 \ exec "$@"
Don’t forget to add executable permissions to the script:
Now you can run your games like:
Note about games with a 32-bit launcher
Some games have a launcher which is a small app that doesn’t do anything useful other than launching the game. These are usually 32-bit, so if you want to run a game that has such a launcher and it doesn’t work, you may need to do the 32-bit build to make it work.
Testing a Steam game with your custom built mesa:
- Compile mesa as written above
- Create the ~/mesa-run.sh script as above
- First make sure it works correctly with vkcube or another simple sample app outside of Steam
- Open Steam, go to your Library
- Right-click the game, click «Properties»
- In the «Launch options» type:
~/mesa-run.sh %command%
Alternative: sourcing a script method
Use this when you want all apps you launch from a terminal to use your custom built mesa.
Create a script at ~/mesa.sh with the following content.
If you used a different install prefix or a different lib dir above, you will need to adjust this script accordingly.
#!/bin/sh MESA=$HOME/mesa export LD_LIBRARY_PATH=$MESA/lib64:$MESA/lib:$LD_LIBRARY_PATH export LIBGL_DRIVERS_PATH=$MESA/lib64/dri:$MESA/lib/dri export VK_ICD_FILENAMES=$MESA/share/vulkan/icd.d/radeon_icd.x86_64.json:$MESA/share/vulkan/icd.d/radeon_icd.i686.json export D3D_MODULE_PATH=$MESA/lib64/d3d/d3dadapter9.so.1:$MESA/lib/d3d/d3dadapter9.so.1
Now you can just source mesa.sh and then anything launched from that terminal will use the mesa libs you just built.
To verify that it uses the version of mesa you want:
# Run RADV with pipeline tracing enabled, and specify a trigger file RADV_THREAD_TRACE_PIPELINE=1 RADV_THREAD_TRACE_TRIGGER=/tmp/trigger ~/mesa-run.sh ./bin/triangle # From a different terminal, touch the trigger file. This will make RADV create an RGP capture in /tmp touch /tmp/trigger
Building LLVM and using it with mesa (skip this unless you know you specifically need it)
Sometimes you need to test the very latest LLVM and use it without messing up your system packages.
Here are some useful cmake options:
- CMAKE_INSTALL_PREFIX — for simplicity, let’s just use the same prefix as used by your mesa build
- LLVM_LIBDIR_SUFFIX — for distros that use /usr/lib64 or a similar convention, eg. set this to 64 on Fedora
cd llvm-project/llvm mkdir build cd build cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/mesa -DLLVM_LIBDIR_SUFFIX=64 -DLLVM_TARGETS_TO_BUILD="AMDGPU" -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_INCLUDE_EXAMPLES=OFF ninja ninja install
After this, you need to rebuild mesa. First, tell mesa’s meson to use the LLVM that you just built.
Create a meson native file at $HOME/.local/share/meson/native/my-llvm-x64 with the following content. Substitute Timur with your own username.
[binaries] llvm-config = "/home/Timur/mesa/bin/llvm-config"
Finally, specify this to meson using the —native-file=my-llvm-x64 argument, for example:
meson build64 --libdir lib64 --prefix $HOME/mesa -Dgallium-drivers=radeonsi,swrast -Dvulkan-drivers=amd -Dgallium-nine=true -Dosmesa=false -Dbuildtype=release --native-file=my-llvm-x64 ninja -C build64 install
mesa-freeworld available on RPMFusion update-testing repository
Mesa vaapi & vdpau drivers for GPU accelerated video encode/decode are now shipped by RPMFusion free in updates-testing for Fedora 37 and Rawhide.
sudo dnf install --enablerepo=rpmfusion-free-updates-testing mesa-va-drivers-freeworld
sudo dnf install --enablerepo=rpmfusion-free-updates-testing mesa-vdpau-drivers-freeworld
If already installed either mesa-va-drivers or mesa-vdpau-drivers,
sudo dnf swap --enablerepo=rpmfusion-free-updates-testing mesa-va-drivers mesa-va-drivers-freeworld
sudo dnf swap --enablerepo=rpmfusion-free-updates-testing mesa-vdpau-drivers mesa-vdpau-drivers-freeworld
Mesa vaapi & vdpau drivers for GPU accelerated video encode/decode
И как? Сильно ускоряет h264 и h265 на Radeon-ах?
Ну вот, пришлось гуглить, что это за freeworld ваш. Получается, федорасты отключили H.264, H.265 и VC-1, а теперь сообщество героически включает взад.
Без понятия. Собственно, это соломку подстелили для следующей версии Федоры, которая выйдет на днях. В текущей ничего делать не надо, насколько я понял.
а теперь сообщество героически включает взад
Это нормальный протокол поведения в сообществе Федора: не все пакеты можно включить дистрибутив из-за патентных ограничений, поэтому их скидывают в RPM Fusion. Ничего плохого в этом не вижу.
Просто когда новость вышла, было куча сообщений от анонимных специалистов, что Федора уже не та, ПРОДАЛИСЬ, угрозы суицида и перехода на Бубунту. Но сразу было понятно, что эти пакеты просто закинут в RPM Fusion.
Цели то понятны это всего. Про белок-истеричек тоже не новость.
Единственный ньюанс в том, что в современном линуксе без ящика водки не разобраться что на чем работает и с поддержкой чего собрано.
Классно, надо запомнить при обновлении. Кстати, а есть готовые рецепты, что надо делать после установки Федорки? Я каждый раз как в первый раз, что вспомнил — то включил, что нет — разбираюсь по факту и страдаю.
Из обязательных только включение rpmfusion:
Можно шрифты Убунтовские поставить, а в остальном то же самое, что в любом другом Линуксе.
У меня памятка есть, что нужно доустановить / удалить после обновы 🙂
Похожие темы
- Форум Для чего Cinnamon’у нужны gstreamer1-libav, gstreamer1-plugins-bad-freeworld и gstreamer1-plugins-ugly? (2020)
- Форум wine — проблема (2009)
- Форум Mesa 23 на Debian Bullseye (Stable) (2023)
- Форум Проблемы с libgl1-mesa-dri:i386 libglx-mesa0:i386 (2022)
- Форум Red Hat ищет людей для работы над десктопным Linux (2021)
- Форум [fedora] [yum] ошибка обновления (осторожно, километр логов) (2011)
- Форум странное поведение при обновлении дистрибутива xubuntu 14.04 -> 16 (2016)
- Форум Проблема с обновлением ПО (2022)
- Форум GPU используется на полную? (2019)
- Форум Баг Chromium 137247. (2019)