Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mesa: build with meson #56199

Merged
merged 2 commits into from Jun 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
187 changes: 98 additions & 89 deletions pkgs/development/libraries/mesa/default.nix
@@ -1,8 +1,8 @@
{ stdenv, fetchurl, lib
, pkgconfig, intltool, autoreconfHook
, file, expat, libdrm, xorg, wayland, wayland-protocols, openssl
{ stdenv, lib, fetchurl, fetchpatch
, pkgconfig, intltool, ninja, meson
, file, flex, bison, expat, libdrm, xorg, wayland, wayland-protocols, openssl
, llvmPackages, libffi, libomxil-bellagio, libva-minimal
, libelf, libvdpau, python2, python2Packages
, libelf, libvdpau, python3Packages
, libglvnd
, enableRadv ? true
, galliumDrivers ? null
Expand Down Expand Up @@ -32,17 +32,17 @@ let
defaultGalliumDrivers = optionals (elem "drm" eglPlatforms) ([ "virgl" ]
++ lib.optionals pciePlatform [ "r300" "r600" "radeonsi" ]
++ lib.optionals (pciePlatform || stdenv.hostPlatform.isAarch32 || stdenv.hostPlatform.isAarch64) [ "nouveau" ]
++ lib.optionals stdenv.hostPlatform.isx86 [ "i915" "svga" ]
++ lib.optionals stdenv.hostPlatform.isx86 [ "svga" ]
++ lib.optionals (stdenv.hostPlatform.isAarch32 || stdenv.hostPlatform.isAarch64) [ "vc4" ]
++ lib.optionals stdenv.hostPlatform.isAarch64 [ "freedreno" "etnaviv" "imx" ]
);
defaultDriDrivers = optionals (elem "drm" eglPlatforms) ([ ]
++ lib.optionals pciePlatform [ "radeon" "r200" ]
++ lib.optionals pciePlatform [ "r200" ]
++ lib.optionals (pciePlatform || stdenv.hostPlatform.isAarch32 || stdenv.hostPlatform.isAarch64) [ "nouveau" ]
++ lib.optionals stdenv.hostPlatform.isx86 [ "i915" "i965" ]);
defaultVulkanDrivers = optionals stdenv.hostPlatform.isLinux ([ ]
++ lib.optional stdenv.hostPlatform.isx86 "intel"
++ lib.optional enableRadv "radeon");
++ lib.optional enableRadv "amd");
in

let gallium_ = galliumDrivers; dri_ = driDrivers; vulkan_ = vulkanDrivers; in
Expand All @@ -56,15 +56,15 @@ let
driDrivers =
(if dri_ == null
then optionals (elem "drm" eglPlatforms) defaultDriDrivers
else dri_) ++ lib.optional stdenv.isLinux "swrast";
eadwu marked this conversation as resolved.
Show resolved Hide resolved
else dri_);
vulkanDrivers =
if vulkan_ == null
then defaultVulkanDrivers
else vulkan_;
in

let
version = "18.3.4";
version = "19.1.1";
branch = head (splitString "." version);
in

Expand All @@ -79,7 +79,7 @@ stdenv.mkDerivation rec {
"ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
"https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz"
];
sha256 = "01xv03ah4l5lcfx015n3fg1620dh4nbbv6gmhh6zhdsx6sj4sc9j";
sha256 = "10amy5sdmpjbskr3xazgk0jyli8xpgi0y1nsmjr76hx8nhb4n4bj";
};

prePatch = "patchShebangs .";
Expand All @@ -88,59 +88,75 @@ stdenv.mkDerivation rec {
# revive ./dricore-gallium.patch when it gets ported (from Ubuntu), as it saved
# ~35 MB in $drivers; watch https://launchpad.net/ubuntu/+source/mesa/+changelog
patches = [
./symlink-drivers.patch
./missing-includes.patch # dev_t needs sys/stat.h, time_t needs time.h, etc.-- fixes build w/musl
./opencl-install-dir.patch
./disk_cache-include-dri-driver-path-in-cache-key.patch
];
] # do not prefix user provided dri-drivers-path
++ lib.optional (lib.versionOlder version "19.0.0") (fetchpatch {
url = "https://gitlab.freedesktop.org/mesa/mesa/commit/f6556ec7d126b31da37c08d7cb657250505e01a0.patch";
sha256 = "0z6phi8hbrbb32kkp1js7ggzviq7faz1ria36wi4jbc4in2392d9";
})
++ lib.optionals (lib.versionOlder version "19.1.0") [
# do not prefix user provided d3d-drivers-path
(fetchpatch {
url = "https://gitlab.freedesktop.org/mesa/mesa/commit/dcc48664197c7e44684ccfb970a4ae083974d145.patch";
sha256 = "1nhs0xpx3hiy8zfb5gx1zd7j7xha6h0hr7yingm93130a5902lkb";
})

# don't build libGLES*.so with GLVND
(fetchpatch {
url = "https://gitlab.freedesktop.org/mesa/mesa/commit/b01524fff05eef66e8cd24f1c5aacefed4209f03.patch";
sha256 = "1pszr6acx2xw469zq89n156p3bf3xf84qpbjw5fr1sj642lbyh7c";
})
];

outputs = [ "out" "dev" "drivers" ]
++ lib.optional (elem "swrast" galliumDrivers) "osmesa";

# TODO: Figure out how to enable opencl without having a runtime dependency on clang
configureFlags = [
"--sysconfdir=${libglvnd.driverLink}/etc"
"--localstatedir=/var"
"--with-dri-driverdir=$(drivers)/lib/dri"
"--with-dri-searchpath=${libglvnd.driverLink}/lib/dri"
"--with-platforms=${concatStringsSep "," eglPlatforms}"
"--with-gallium-drivers=${concatStringsSep "," galliumDrivers}"
"--with-dri-drivers=${concatStringsSep "," driDrivers}"
"--with-vulkan-drivers=${concatStringsSep "," vulkanDrivers}"
"--enable-texture-float"
(enableFeature stdenv.isLinux "dri3")
(enableFeature stdenv.isLinux "nine") # Direct3D in Wine
(enableFeature stdenv.isLinux "libglvnd")
"--enable-dri"
"--enable-driglx-direct"
"--enable-gles1"
"--enable-gles2"
"--enable-glx"
# https://bugs.freedesktop.org/show_bug.cgi?id=35268
(enableFeature (!stdenv.hostPlatform.isMusl) "glx-tls")
# used by wine
(enableFeature (elem "swrast" galliumDrivers) "gallium-osmesa")
"--enable-llvm"
(enableFeature stdenv.isLinux "egl")
(enableFeature stdenv.isLinux "xa") # used in vmware driver
(enableFeature stdenv.isLinux "gbm")
"--enable-xvmc"
"--enable-vdpau"
"--enable-shared-glapi"
"--enable-llvm-shared-libs"
(enableFeature stdenv.isLinux "omx-bellagio")
(enableFeature stdenv.isLinux "va")
"--disable-opencl"
];

nativeBuildInputs = [
autoreconfHook intltool pkgconfig file
python2 python2Packages.Mako
];

propagatedBuildInputs = with xorg; [
libXdamage libXxf86vm
] ++ optional stdenv.isLinux libdrm
++ optionals stdenv.isDarwin [ OpenGL Xplugin ];
mesonFlags = [
"--sysconfdir=/etc"

# Don't build in debug mode
# https://gitlab.freedesktop.org/mesa/mesa/blob/master/docs/meson.html#L327
"-Db_ndebug=true"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, guess this isn't really needed at the moment. Though in the future [1] it might.

[1] #58310


"-Ddisk-cache-key=${placeholder "drivers"}"
"-Ddri-search-path=${libglvnd.driverLink}/lib/dri"

"-Dplatforms=${concatStringsSep "," eglPlatforms}"
"-Ddri-drivers=${concatStringsSep "," driDrivers}"
"-Dgallium-drivers=${concatStringsSep "," galliumDrivers}"
"-Dvulkan-drivers=${concatStringsSep "," vulkanDrivers}"

"-Ddri-drivers-path=${placeholder "drivers"}/lib/dri"
"-Dvdpau-libs-path=${placeholder "drivers"}/lib/vdpau"
"-Dxvmc-libs-path=${placeholder "drivers"}/lib"
"-Domx-libs-path=${placeholder "drivers"}/lib/bellagio"
"-Dva-libs-path=${placeholder "drivers"}/lib/dri"
"-Dd3d-drivers-path=${placeholder "drivers"}/lib/d3d"

"-Dgallium-vdpau=true"
"-Dgallium-xvmc=true"
"-Dgallium-opencl=disabled"
"-Dshared-glapi=true"
"-Dgles1=true"
"-Dgles2=true"
"-Dglx=dri"
"-Dglvnd=true"
"-Dllvm=true"
"-Dshared-llvm=true"
"-Dglx-direct=true"
] ++ optional (elem "swrast" galliumDrivers) "-Dosmesa=gallium" # used by wine
++ optionals (stdenv.isLinux) [
"-Ddri3=true"
"-Dgallium-omx=bellagio"
"-Dgallium-va=true"
"-Dgallium-xa=true" # used in vmware driver
"-Dgallium-nine=true" # Direct3D in Wine
"-Dgbm=true"
"-Degl=true"
];

buildInputs = with xorg; [
expat llvmPackages.llvm libglvnd xorgproto
Expand All @@ -151,62 +167,45 @@ stdenv.mkDerivation rec {
++ lib.optionals stdenv.isLinux [ libomxil-bellagio libva-minimal ]
++ lib.optional withValgrind valgrind-light;

nativeBuildInputs = [
pkgconfig meson ninja
intltool bison flex file
python3Packages.python python3Packages.Mako
];

propagatedBuildInputs = with xorg; [
libXdamage libXxf86vm
] ++ optional stdenv.isLinux libdrm
++ optionals stdenv.isDarwin [ OpenGL Xplugin ];

enableParallelBuilding = true;
doCheck = false;

installFlags = [
"sysconfdir=\${drivers}/etc"
"localstatedir=\${TMPDIR}"
"vendorjsondir=\${out}/share/glvnd/egl_vendor.d"
];

# TODO: probably not all .la files are completely fixed, but it shouldn't matter;
postInstall = ''
# Some installs don't have any drivers so this directory is never created.
mkdir -p $drivers
'' + optionalString (galliumDrivers != []) ''
mkdir -p $drivers/lib

# move gallium-related stuff to $drivers, so $out doesn't depend on LLVM
mv -t "$drivers/lib/" \
$out/lib/libXvMC* \
$out/lib/d3d \
$out/lib/vdpau \
$out/lib/bellagio \
mv -t $drivers/lib \
$out/lib/libxatracker* \
$out/lib/libvulkan_*

# Move other drivers to a separate output
mv $out/lib/dri/* $drivers/lib/dri # */
rmdir "$out/lib/dri"
mv $out/lib/lib*_mesa* $drivers/lib

# move libOSMesa to $osmesa, as it's relatively big
mkdir -p {$osmesa,$drivers}/lib/
mkdir -p $osmesa/lib
mv -t $osmesa/lib/ $out/lib/libOSMesa*

# now fix references in .la files
sed "/^libdir=/s,$out,$osmesa," -i $osmesa/lib/libOSMesa*.la

# set the default search path for DRI drivers; used e.g. by X server
substituteInPlace "$dev/lib/pkgconfig/dri.pc" --replace '$(drivers)' "${libglvnd.driverLink}"

# remove GLES libraries; they are provided by libglvnd
rm $out/lib/lib{GLESv1_CM,GLESv2}.*

# remove pkgconfig files for GL/GLES/EGL; they are provided by libGL.
rm $dev/lib/pkgconfig/{gl,egl,glesv1_cm,glesv2}.pc

# move vendor files
mv $out/share/ $drivers/

# Update search path used by glvnd
for js in $drivers/share/glvnd/egl_vendor.d/*.json; do
substituteInPlace "$js" --replace '"libEGL_' '"'"$drivers/lib/libEGL_"
done

# Update search path used by pkg-config
for pc in $dev/lib/pkgconfig/{d3d,dri,xatracker}.pc; do
substituteInPlace "$pc" --replace $out $drivers
done
'' + optionalString (vulkanDrivers != []) ''
# Update search path used by Vulkan (it's pointing to $out but
# drivers are in $drivers)
Expand All @@ -219,6 +218,17 @@ stdenv.mkDerivation rec {
# check $out doesn't depend on llvm: builder failures are ignored
# for some reason grep -qv '${llvmPackages.llvm}' -R "$out";
postFixup = optionalString (galliumDrivers != []) ''
# set the default search path for DRI drivers; used e.g. by X server
substituteInPlace "$dev/lib/pkgconfig/dri.pc" --replace "$drivers" "${libglvnd.driverLink}"

# remove pkgconfig files for GL/EGL; they are provided by libGL.
rm $dev/lib/pkgconfig/{gl,egl}.pc

# Update search path used by pkg-config
for pc in $dev/lib/pkgconfig/{d3d,dri,xatracker}.pc; do
substituteInPlace "$pc" --replace $out $drivers
done

# add RPATH so the drivers can find the moved libgallium and libdricore9
# moved here to avoid problems with stripping patchelfed files
for lib in $drivers/lib/*.so* $drivers/lib/*/*.so*; do
Expand All @@ -241,4 +251,3 @@ stdenv.mkDerivation rec {
maintainers = with maintainers; [ vcunat ];
};
}

Expand Up @@ -6,29 +6,30 @@ Subject: [PATCH] disk_cache: include dri driver path in cache key
This fixes invalid cache hits on NixOS where all shared library
timestamps in /nix/store are zero.
---
src/util/Makefile.am | 3 +++
meson_options.txt | 6 ++++++
src/util/disk_cache.c | 3 +++
2 files changed, 6 insertions(+)
src/util/meson.build | 7 ++++++-
3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index bafb57439a..a22e2e41eb 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -35,6 +35,9 @@ noinst_LTLIBRARIES = \
libmesautil.la \
libxmlconfig.la

+AM_CFLAGS = \
+ -DDISK_CACHE_KEY=\"$(drivers)\"
+
AM_CPPFLAGS = \
$(PTHREAD_CFLAGS) \
-I$(top_srcdir)/include
diff --git a/meson_options.txt b/meson_options.txt
index a723b5406cf..65a8954291f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -330,3 +330,9 @@ option(
value : true,
description : 'Enable direct rendering in GLX and EGL for DRI',
)
+option(
+ 'disk-cache-key',
+ type : 'string',
+ value : '',
+ description : 'Mesa cache key.'
+)
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 368ec41792..071220b2ba 100644
index 0aa2646a9bb..bd784d38e21 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -388,8 +388,10 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
@@ -389,8 +389,10 @@ disk_cache_create(const char *gpu_name, const char *driver_id,

/* Create driver id keys */
size_t id_size = strlen(driver_id) + 1;
Expand All @@ -39,14 +40,32 @@ index 368ec41792..071220b2ba 100644
cache->driver_keys_blob_size += gpu_name_size;

/* We sometimes store entire structs that contains a pointers in the cache,
@@ -410,6 +412,7 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
@@ -411,6 +413,7 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
uint8_t *drv_key_blob = cache->driver_keys_blob;
DRV_KEY_CPY(drv_key_blob, &cache_version, cv_size)
DRV_KEY_CPY(drv_key_blob, driver_id, id_size)
+ DRV_KEY_CPY(drv_key_blob, DISK_CACHE_KEY, key_size)
DRV_KEY_CPY(drv_key_blob, gpu_name, gpu_name_size)
DRV_KEY_CPY(drv_key_blob, &ptr_size, ptr_size_size)
DRV_KEY_CPY(drv_key_blob, &driver_flags, driver_flags_size)
diff --git a/src/util/meson.build b/src/util/meson.build
index 397c2228129..77013563e5d 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -120,7 +120,12 @@ libmesa_util = static_library(
[files_mesa_util, format_srgb],
include_directories : inc_common,
dependencies : [dep_zlib, dep_clock, dep_thread, dep_atomic, dep_m],
- c_args : [c_msvc_compat_args, c_vis_args],
+ c_args : [
+ c_msvc_compat_args, c_vis_args,
+ '-DDISK_CACHE_KEY="@0@"'.format(
+ get_option('disk-cache-key')
+ ),
+ ],
build_by_default : false
)

--
2.19.1
2.19.2

12 changes: 12 additions & 0 deletions pkgs/development/libraries/mesa/opencl-install-dir.patch
@@ -0,0 +1,12 @@
diff --git a/src/gallium/targets/opencl/meson.build b/src/gallium/targets/opencl/meson.build
index 317ad8dab4a..5567308caf0 100644
--- a/src/gallium/targets/opencl/meson.build
+++ b/src/gallium/targets/opencl/meson.build
@@ -68,6 +68,6 @@ if with_opencl_icd
input : 'mesa.icd.in',
output : 'mesa.icd',
install : true,
- install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'),
+ install_dir : join_paths(get_option('prefix'), 'etc', 'OpenCL', 'vendors'),
)
endif