init (podpierdolenie)

This commit is contained in:
installer
2024-10-31 20:28:32 +01:00
commit 3224ea75aa
91 changed files with 15003 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
{
lib,
fetchFromGitHub,
alsa-ucm-conf,
}: (alsa-ucm-conf.overrideAttrs (oldAttrs: rec {
version = "5";
src_asahi = fetchFromGitHub {
# tracking: https://src.fedoraproject.org/rpms/alsa-ucm-asahi
owner = "AsahiLinux";
repo = "alsa-ucm-conf-asahi";
rev = "v${version}";
hash = "sha256-daUNz5oUrPfSMO0Tqq/WbtiLHMOtPeQQlI+juGrhTxw=";
};
postInstall =
oldAttrs.postInstall
or ""
+ ''
cp -r ${src_asahi}/ucm2 $out/share/alsa
'';
}))

View File

@@ -0,0 +1,37 @@
{
stdenv,
lib,
fetchFromGitHub,
}:
stdenv.mkDerivation rec {
pname = "asahi-audio";
# tracking: https://src.fedoraproject.org/rpms/asahi-audio
version = "2.2";
src = fetchFromGitHub {
owner = "AsahiLinux";
repo = "asahi-audio";
rev = "v${version}";
hash = "sha256-5YBQibt/dfJb9/TzF6rczeQE3ySm0SeewhZrgublu2E=";
};
preBuild = ''
export PREFIX=$out
readarray -t configs < <(\
find . \
-name '*.conf' -or \
-name '*.json' -or \
-name '*.lua'
)
substituteInPlace "''${configs[@]}" --replace \
"/usr/share/asahi-audio" \
"$out/asahi-audio"
'';
postInstall = ''
# no need to link the asahi-audio dir globally
mv $out/share/asahi-audio $out
'';
}

View File

@@ -0,0 +1,32 @@
{
lib,
python3,
fetchFromGitHub,
gzip,
gnutar,
lzfse,
}:
python3.pkgs.buildPythonApplication rec {
pname = "asahi-fwextract";
version = "0.7.5";
# tracking version: https://packages.fedoraproject.org/pkgs/asahi-installer/python3-asahi_firmware/
src = fetchFromGitHub {
owner = "AsahiLinux";
repo = "asahi-installer";
rev = "v${version}";
hash = "sha256-lGZFvB1zK+5MYhy2DgAHNUUG4EJPDGlIJ8MfdnDm4Ak=";
};
postPatch = ''
substituteInPlace asahi_firmware/img4.py \
--replace 'liblzfse.so' '${lzfse}/lib/liblzfse.so'
substituteInPlace asahi_firmware/update.py \
--replace '"tar"' '"${gnutar}/bin/tar"' \
--replace '"xf"' '"-x", "-I", "${gzip}/bin/gzip", "-f"'
'';
nativeBuildInputs = [python3.pkgs.setuptools];
doCheck = false;
}

View File

@@ -0,0 +1,40 @@
From 0fcdbacd8b06c24f5761a0cf9cb0c43cad05c19b Mon Sep 17 00:00:00 2001
From: Thomas Watson <twatson52@icloud.com>
Date: Mon, 26 Feb 2024 19:51:12 -0600
Subject: [PATCH] fs/fcntl: accept more values as F_DUPFD_CLOEXEC args
libwebrtc doesn't pass anything as the arg to this function so the
minimum fd ends up as random garbage. If it's bigger than the maximum
fd, which is likely, then the duplication fails, and libwebrtc breaks.
The previous patch (081abc5fa701738699705a6c0a41c824df77cb37) rejects
args >= 1024 (the default soft max fd) and instead subtitutes a minimum
fd of 0 to allow such requests to succeed.
However, gnulib's test suite can pass the following values and expects
them to fail; this patch prevents those from succeeding:
* -1 (hard-coded)
* 1024 (`ulimit -n` value by default)
* 1048576 (`ulimit -n` value in Nix build sandbox)
Hopefully the garbage values libwebrtc passes do not match very often.
---
fs/fcntl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/fcntl.c b/fs/fcntl.c
index f18f87419445..65a6861476ec 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -326,7 +326,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
err = f_dupfd(argi, filp, 0);
break;
case F_DUPFD_CLOEXEC:
- if (arg >= 1024)
+ if ((arg > 1024) && (argi != 1048576) && (argi != -1))
argi = 0; /* Lol libwebrtc */
err = f_dupfd(argi, filp, O_CLOEXEC);
break;
--
2.43.0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,165 @@
{
lib,
pkgs,
callPackage,
writeShellScriptBin,
writeText,
linuxPackagesFor,
withRust ? false,
_kernelPatches ? [],
}: let
i = builtins.elemAt;
# parse <OPT> [ymn]|foo style configuration as found in a patch's extraConfig
# into a list of k, v tuples
parseExtraConfig = config: let
lines =
builtins.filter (s: s != "") (lib.strings.splitString "\n" config);
parseLine = line: let
t = lib.strings.splitString " " line;
join = l:
builtins.foldl' (a: b: "${a} ${b}")
(builtins.head l) (builtins.tail l);
v =
if (builtins.length t) > 2
then join (builtins.tail t)
else (i t 1);
in ["CONFIG_${i t 0}" v];
in
map parseLine lines;
# parse <OPT>=lib.kernel.(yes|module|no)|lib.kernel.freeform "foo"
# style configuration as found in a patch's extraStructuredConfig into
# a list of k, v tuples
parseExtraStructuredConfig = config:
lib.attrsets.mapAttrsToList
(k: v: ["CONFIG_${k}" (v.tristate or v.freeform)])
config;
parsePatchConfig = {
extraConfig ? "",
extraStructuredConfig ? {},
...
}:
(parseExtraConfig extraConfig)
++ (parseExtraStructuredConfig extraStructuredConfig);
# parse CONFIG_<OPT>=[ymn]|"foo" style configuration as found in a config file
# into a list of k, v tuples
parseConfig = config: let
parseLine = builtins.match ''(CONFIG_[[:upper:][:digit:]_]+)=(([ymn])|"([^"]*)")'';
# get either the [ymn] option or the "foo" option; whichever matched
t = l: let
v = i l 2;
in [
(i l 0)
(
if v != null
then v
else (i l 3)
)
];
lines = lib.strings.splitString "\n" config;
in
map t (builtins.filter (l: l != null) (map parseLine lines));
origConfigfile = ./config;
linux-asahi-pkg = {
stdenv,
lib,
fetchFromGitHub,
fetchpatch,
linuxKernel,
rustPlatform,
rustc,
rustfmt,
rust-bindgen,
...
} @ args: let
origConfigText = builtins.readFile origConfigfile;
# extraConfig from all patches in order
extraConfig =
lib.fold (patch: ex: ex ++ (parsePatchConfig patch)) [] _kernelPatches;
# config file text for above
extraConfigText = let
text = k: v:
if (v == "y") || (v == "m") || (v == "n")
then "${k}=${v}"
else ''${k}="${v}"'';
in (map (t: text (i t 0) (i t 1)) extraConfig);
# final config as a text file path
configfile =
if extraConfig == []
then origConfigfile
else
writeText "config" ''
${origConfigText}
# Patches
${lib.strings.concatStringsSep "\n" extraConfigText}
'';
# final config as an attrset
configAttrs = let
makePair = t: lib.nameValuePair (i t 0) (i t 1);
configList = (parseConfig origConfigText) ++ extraConfig;
in
builtins.listToAttrs (map makePair (lib.lists.reverseList configList));
# used to (ostensibly) keep compatibility for those running stable versions of nixos
rustOlder = version: withRust && (lib.versionOlder rustc.version version);
bindgenOlder = version: withRust && (lib.versionOlder rust-bindgen.unwrapped.version version);
# used to fix issues when nixpkgs gets ahead of the kernel
rustAtLeast = version: withRust && (lib.versionAtLeast rustc.version version);
bindgenAtLeast = version: withRust && (lib.versionAtLeast rust-bindgen.unwrapped.version version);
in
(linuxKernel.manualConfig rec {
inherit stdenv lib;
version = "6.9.12-asahi";
modDirVersion = version;
extraMeta.branch = "6.9";
src = fetchFromGitHub {
# tracking: https://github.com/AsahiLinux/linux/tree/asahi-wip (w/ fedora verification)
owner = "AsahiLinux";
repo = "linux";
rev = "asahi-6.9.12-1";
hash = "sha256-LCMrG+RVONK/eIvygRExaVvY/ATV3IfvSsFbVsHVu48=";
};
kernelPatches =
[
{
name = "coreutils-fix";
patch = ./0001-fs-fcntl-accept-more-values-as-F_DUPFD_CLOEXEC-args.patch;
}
]
++ _kernelPatches;
inherit configfile;
# hide Rust support from the nixpkgs infra to avoid it re-adding the rust packages.
# we can't use it until it's in stable and until we've evaluated the cross-compilation impact.
config = configAttrs // {"CONFIG_RUST" = "n";};
}
// (args.argsOverride or {}))
.overrideAttrs (old:
if withRust
then {
nativeBuildInputs =
(old.nativeBuildInputs or [])
++ [
rust-bindgen
rustfmt
rustc
];
RUST_LIB_SRC = rustPlatform.rustLibSrc;
}
else {});
linux-asahi = callPackage linux-asahi-pkg {};
in
lib.recurseIntoAttrs (linuxPackagesFor linux-asahi)

View File

@@ -0,0 +1,108 @@
{
stdenv,
buildPackages,
lib,
fetchFromGitHub,
python3,
dtc,
imagemagick,
isRelease ? false,
withTools ? true,
withChainloading ? false,
rust-bin ? null,
customLogo ? null,
}:
assert withChainloading -> rust-bin != null; let
pyenv = python3.withPackages (p:
with p; [
construct
pyserial
]);
rustenv = rust-bin.selectLatestNightlyWith (toolchain:
toolchain.minimal.override {
targets = ["aarch64-unknown-none-softfloat"];
});
in
stdenv.mkDerivation rec {
pname = "m1n1";
version = "1.4.14";
src = fetchFromGitHub {
# tracking: https://src.fedoraproject.org/rpms/m1n1
owner = "AsahiLinux";
repo = "m1n1";
rev = "v${version}";
hash = "sha256-bhX6qtyiKgSpBic4q3jNu9Xi+SOw21JC4sBI44YHKK0=";
fetchSubmodules = true;
};
makeFlags =
["ARCH=${stdenv.cc.targetPrefix}"]
++ lib.optional isRelease "RELEASE=1"
++ lib.optional withChainloading "CHAINLOADING=1";
nativeBuildInputs =
[
dtc
buildPackages.gcc
]
++ lib.optional withChainloading rustenv
++ lib.optional (customLogo != null) imagemagick;
postPatch = ''
substituteInPlace proxyclient/m1n1/asm.py \
--replace 'aarch64-linux-gnu-' 'aarch64-unknown-linux-gnu-' \
--replace 'TOOLCHAIN = ""' 'TOOLCHAIN = "'$out'/toolchain-bin/"'
'';
preConfigure = lib.optionalString (customLogo != null) ''
pushd data &>/dev/null
ln -fs ${customLogo} bootlogo_256.png
if [[ "$(magick identify bootlogo_256.png)" != 'bootlogo_256.png PNG 256x256'* ]]; then
echo "Custom logo is not a 256x256 PNG"
exit 1
fi
rm bootlogo_128.png
convert bootlogo_256.png -resize 128x128 bootlogo_128.png
patchShebangs --build ./makelogo.sh
./makelogo.sh
popd &>/dev/null
'';
installPhase =
''
runHook preInstall
mkdir -p $out/build
cp build/m1n1.bin $out/build
''
+ (lib.optionalString withTools ''
mkdir -p $out/{bin,script,toolchain-bin}
cp -r proxyclient $out/script
cp -r tools $out/script
for toolpath in $out/script/proxyclient/tools/*.py; do
tool=$(basename $toolpath .py)
script=$out/bin/m1n1-$tool
cat > $script <<EOF
#!/bin/sh
${pyenv}/bin/python $toolpath "\$@"
EOF
chmod +x $script
done
GCC=${buildPackages.gcc}
BINUTILS=${buildPackages.binutils-unwrapped}
ln -s $GCC/bin/${stdenv.cc.targetPrefix}gcc $out/toolchain-bin/
ln -s $GCC/bin/${stdenv.cc.targetPrefix}ld $out/toolchain-bin/
ln -s $BINUTILS/bin/${stdenv.cc.targetPrefix}objcopy $out/toolchain-bin/
ln -s $BINUTILS/bin/${stdenv.cc.targetPrefix}objdump $out/toolchain-bin/
ln -s $GCC/bin/${stdenv.cc.targetPrefix}nm $out/toolchain-bin/
'')
+ ''
runHook postInstall
'';
}

View File

@@ -0,0 +1,55 @@
{
lib,
fetchFromGitLab,
pkgs,
meson,
llvmPackages,
}:
# don't bother to provide Darwin deps
((pkgs.callPackage ./vendor {
OpenGL = null;
Xplugin = null;
})
.override {
galliumDrivers = ["swrast" "asahi"];
vulkanDrivers = ["swrast"];
enableGalliumNine = false;
# libclc and other OpenCL components are needed for geometry shader support on Apple Silicon
enableOpenCL = true;
})
.overrideAttrs (oldAttrs: {
# version must be the same length (i.e. no unstable or date)
# so that system.replaceRuntimeDependencies can work
version = "24.2.0";
src = fetchFromGitLab {
# tracking: https://pagure.io/fedora-asahi/mesa/commits/asahi
domain = "gitlab.freedesktop.org";
owner = "asahi";
repo = "mesa";
rev = "asahi-20240727";
hash = "sha256-XXhmiedwJwjKTZeApDE/GdAzIteteoi78J4LJ3WBJsY=";
};
mesonFlags =
# remove flag to configure xvmc functionality as having it
# breaks the build because that no longer exists in Mesa 23
(lib.filter (x: !(lib.hasPrefix "-Dxvmc-libs-path=" x)) oldAttrs.mesonFlags)
++ [
# we do not build any graphics drivers these features can be enabled for
"-Dgallium-va=disabled"
"-Dgallium-vdpau=disabled"
"-Dgallium-xa=disabled"
# does not make any sense
"-Dandroid-libbacktrace=disabled"
"-Dintel-rt=disabled"
# do not want to add the dependencies
"-Dlibunwind=disabled"
"-Dlmsensors=disabled"
];
# replace patches with ones tweaked slightly to apply to this version
patches = [
./disk_cache-include-dri-driver-path-in-cache-key.patch
./opencl.patch
];
})

View File

@@ -0,0 +1,67 @@
Author: David McFarland <corngood@gmail.com>
Date: Mon Aug 6 15:52:11 2018 -0300
[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.
diff --git a/meson_options.txt b/meson_options.txt
index 512e05d..93001da 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -513,6 +513,13 @@ option(
description : 'Enable direct rendering in GLX and EGL for DRI',
)
+option(
+ 'disk-cache-key',
+ type : 'string',
+ value : '',
+ description : 'Mesa cache key.'
+)
+
option('egl-lib-suffix',
type : 'string',
value : '',
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 8298f9d..e622133 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -226,8 +226,10 @@ disk_cache_type_create(const char *gpu_name,
/* Create driver id keys */
size_t id_size = strlen(driver_id) + 1;
+ size_t key_size = strlen(DISK_CACHE_KEY) + 1;
size_t gpu_name_size = strlen(gpu_name) + 1;
cache->driver_keys_blob_size += id_size;
+ cache->driver_keys_blob_size += key_size;
cache->driver_keys_blob_size += gpu_name_size;
/* We sometimes store entire structs that contains a pointers in the cache,
@@ -248,6 +250,7 @@ disk_cache_type_create(const char *gpu_name,
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 c0c1b9d..442163c 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -268,7 +268,12 @@ _libmesa_util = static_library(
include_directories : [inc_util, include_directories('format')],
dependencies : deps_for_libmesa_util,
link_with: [libmesa_util_sse41],
- c_args : [c_msvc_compat_args],
+ c_args : [
+ c_msvc_compat_args,
+ '-DDISK_CACHE_KEY="@0@"'.format(
+ get_option('disk-cache-key')
+ ),
+ ],
gnu_symbol_visibility : 'hidden',
build_by_default : false
)

View File

@@ -0,0 +1,84 @@
From bbd0f154183e4d26a14bb005f6afc636629c201e Mon Sep 17 00:00:00 2001
From: Thomas Watson <twatson52@icloud.com>
Date: Sat, 16 Dec 2023 20:46:51 -0600
Subject: [PATCH] opencl.patch from nixpkgs
f416128e90ac75bec060e8b9435fe9c38423c036
---
meson.build | 2 +-
meson_options.txt | 6 ++++++
src/gallium/targets/opencl/meson.build | 6 +++---
src/gallium/targets/rusticl/meson.build | 3 +--
4 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/meson.build b/meson.build
index 552ff196aa8..9e10156b875 100644
--- a/meson.build
+++ b/meson.build
@@ -1829,7 +1829,7 @@ endif
dep_clang = null_dep
if with_clc
- llvm_libdir = dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir')
+ llvm_libdir = get_option('clang-libdir')
dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false)
diff --git a/meson_options.txt b/meson_options.txt
index c76fa6d3382..d2021f55634 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,6 +1,12 @@
# Copyright © 2017-2019 Intel Corporation
# SPDX-License-Identifier: MIT
+option(
+ 'clang-libdir',
+ type : 'string',
+ value : '',
+ description : 'Locations to search for clang libraries.'
+)
option(
'platforms',
type : 'array',
diff --git a/src/gallium/targets/opencl/meson.build b/src/gallium/targets/opencl/meson.build
index 7c14135898e..cbcd67cc443 100644
--- a/src/gallium/targets/opencl/meson.build
+++ b/src/gallium/targets/opencl/meson.build
@@ -39,7 +39,8 @@ if dep_llvm.version().version_compare('>=10.0.0')
polly_isl_dep = cpp.find_library('PollyISL', dirs : llvm_libdir, required : false)
endif
-dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false)
+clang_libdir = get_option('clang-libdir')
+dep_clang = cpp.find_library('clang-cpp', dirs : clang_libdir, required : false)
# meson will return clang-cpp from system dirs if it's not found in llvm_libdir
linker_rpath_arg = '-Wl,--rpath=@0@'.format(llvm_libdir)
@@ -123,8 +124,7 @@ if with_opencl_icd
configuration : _config,
input : 'mesa.icd.in',
output : 'mesa.icd',
- install : true,
- install_tag : 'runtime',
+ install : false,
install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'),
)
diff --git a/src/gallium/targets/rusticl/meson.build b/src/gallium/targets/rusticl/meson.build
index b2963fe6dfa..2f784bdccd4 100644
--- a/src/gallium/targets/rusticl/meson.build
+++ b/src/gallium/targets/rusticl/meson.build
@@ -76,8 +76,7 @@ configure_file(
configuration : _config,
input : 'rusticl.icd.in',
output : 'rusticl.icd',
- install : true,
- install_tag : 'runtime',
+ install : false,
install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'),
)
--
2.40.1

View File

@@ -0,0 +1,17 @@
diff --git a/src/glx/glxext.c b/src/glx/glxext.c
index 8770863eb7c..537f0af112c 100644
--- a/src/glx/glxext.c
+++ b/src/glx/glxext.c
@@ -886,10 +886,11 @@ __glXInitialize(Display * dpy)
Bool zink = False;
Bool try_zink = False;
+ const char *env = getenv("MESA_LOADER_DRIVER_OVERRIDE");
+
#if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE))
Bool glx_direct = !debug_get_bool_option("LIBGL_ALWAYS_INDIRECT", false);
Bool glx_accel = !debug_get_bool_option("LIBGL_ALWAYS_SOFTWARE", false);
- const char *env = getenv("MESA_LOADER_DRIVER_OVERRIDE");
zink = env && !strcmp(env, "zink");
try_zink = False;

View File

@@ -0,0 +1,601 @@
{
lib,
OpenGL,
Xplugin,
bison,
buildPackages,
directx-headers,
elfutils,
expat,
fetchCrate,
fetchurl,
file,
flex,
glslang,
intltool,
jdupes,
libdrm,
libffi,
libglvnd,
libomxil-bellagio,
libunwind,
libva-minimal,
libvdpau,
llvmPackages,
lm_sensors,
meson,
ninja,
openssl,
pkg-config,
python3Packages,
rust-bindgen,
rust-cbindgen,
rustPlatform,
rustc,
spirv-llvm-translator,
stdenv,
udev,
valgrind-light,
vulkan-loader,
wayland,
wayland-protocols,
wayland-scanner,
xcbutilkeysyms,
xorg,
zstd,
withValgrind ?
lib.meta.availableOn stdenv.hostPlatform valgrind-light
&& !valgrind-light.meta.broken,
withLibunwind ? lib.meta.availableOn stdenv.hostPlatform libunwind,
enableGalliumNine ? stdenv.isLinux,
enableOSMesa ? stdenv.isLinux,
enableOpenCL ? stdenv.isLinux && stdenv.isx86_64,
enableTeflon ? stdenv.isLinux && stdenv.isAarch64, # currently only supports aarch64 SoCs, may change in the future
enablePatentEncumberedCodecs ? true,
galliumDrivers ?
if stdenv.isLinux
then
[
"d3d12" # WSL emulated GPU (aka Dozen)
"iris" # new Intel (Broadwell+)
"kmsro" # special "render only" driver for GPUs without a display controller
"nouveau" # Nvidia
"radeonsi" # new AMD (GCN+)
"r300" # very old AMD
"r600" # less old AMD
"swrast" # software renderer (aka LLVMPipe)
"svga" # VMWare virtualized GPU
"virgl" # QEMU virtualized GPU (aka VirGL)
"zink" # generic OpenGL over Vulkan, experimental
]
++ lib.optionals (stdenv.isAarch64 || stdenv.isAarch32) [
"etnaviv" # Vivante GPU designs (mostly NXP/Marvell SoCs)
"freedreno" # Qualcomm Adreno (all Qualcomm SoCs)
"lima" # ARM Mali 4xx
"panfrost" # ARM Mali Midgard and up (T/G series)
"vc4" # Broadcom VC4 (Raspberry Pi 0-3)
]
++ lib.optionals stdenv.isAarch64 [
"tegra" # Nvidia Tegra SoCs
"v3d" # Broadcom VC5 (Raspberry Pi 4)
]
++ lib.optionals stdenv.hostPlatform.isx86 [
"crocus" # Intel legacy, x86 only
"i915" # Intel extra legacy, x86 only
]
else ["auto"],
vulkanDrivers ?
if stdenv.isLinux
then
[
"amd" # AMD (aka RADV)
"intel" # new Intel (aka ANV)
"microsoft-experimental" # WSL virtualized GPU (aka DZN/Dozen)
"nouveau" # Nouveau (aka NVK)
"swrast" # software renderer (aka Lavapipe)
]
++ lib.optionals (stdenv.hostPlatform.isAarch -> lib.versionAtLeast stdenv.hostPlatform.parsed.cpu.version "6") [
# QEMU virtualized GPU (aka VirGL)
# Requires ATOMIC_INT_LOCK_FREE == 2.
"virtio"
]
++ lib.optionals stdenv.isAarch64 [
"broadcom" # Broadcom VC5 (Raspberry Pi 4, aka V3D)
"freedreno" # Qualcomm Adreno (all Qualcomm SoCs)
"imagination-experimental" # PowerVR Rogue (currently N/A)
"panfrost" # ARM Mali Midgard and up (T/G series)
]
++ lib.optionals stdenv.hostPlatform.isx86 [
"intel_hasvk" # Intel Haswell/Broadwell, "legacy" Vulkan driver (https://www.phoronix.com/news/Intel-HasVK-Drop-Dead-Code)
]
else ["auto"],
eglPlatforms ? ["x11"] ++ lib.optionals stdenv.isLinux ["wayland"],
vulkanLayers ?
lib.optionals (!stdenv.isDarwin) [
# No Vulkan support on Darwin
"device-select"
"overlay"
"intel-nullhw"
],
}:
# When updating this package, please verify at least these build (assuming x86_64-linux):
# nix build .#mesa .#pkgsi686Linux.mesa .#pkgsCross.aarch64-multiplatform.mesa .#pkgsMusl.mesa
let
version = "24.1.1";
hash = "sha256-ADiCbG9+iNkLTOb3GRkvpYyn3t9O3KoRdM972SDvieo=";
# Release calendar: https://www.mesa3d.org/release-calendar.html
# Release frequency: https://www.mesa3d.org/releasing.html#schedule
branch = lib.versions.major version;
withLibdrm = lib.meta.availableOn stdenv.hostPlatform libdrm;
haveWayland = lib.elem "wayland" eglPlatforms;
haveZink = lib.elem "zink" galliumDrivers;
haveDozen = (lib.elem "d3d12" galliumDrivers) || (lib.elem "microsoft-experimental" vulkanDrivers);
rustDeps = [
{
pname = "paste";
version = "1.0.14";
hash = "sha256-+J1h7New5MEclUBvwDQtTYJCHKKqAEOeQkuKy+g0vEc=";
}
{
pname = "proc-macro2";
version = "1.0.70";
hash = "sha256-e4ZgyZUTu5nAtaH5QVkLelqJQX/XPj/rWkzf/g2c+1g=";
}
{
pname = "quote";
version = "1.0.33";
hash = "sha256-VWRCZJO0/DJbNu0/V9TLaqlwMot65YjInWT9VWg57DY=";
}
{
pname = "syn";
version = "2.0.39";
hash = "sha256-Mjen2L/omhVbhU/+Ao65mogs3BP3fY+Bodab3uU63EI=";
}
{
pname = "unicode-ident";
version = "1.0.12";
hash = "sha256-KX8NqYYw6+rGsoR9mdZx8eT1HIPEUUyxErdk2H/Rlj8=";
}
];
copyRustDep = dep: ''
cp -R --no-preserve=mode,ownership ${fetchCrate dep} subprojects/${dep.pname}-${dep.version}
cp -R subprojects/packagefiles/${dep.pname}/* subprojects/${dep.pname}-${dep.version}/
'';
copyRustDeps = lib.concatStringsSep "\n" (builtins.map copyRustDep rustDeps);
needNativeCLC = !stdenv.buildPlatform.canExecute stdenv.hostPlatform;
self = stdenv.mkDerivation {
pname = "mesa";
inherit version;
src = fetchurl {
urls = [
"https://archive.mesa3d.org/mesa-${version}.tar.xz"
"https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz"
"ftp://ftp.freedesktop.org/pub/mesa/mesa-${version}.tar.xz"
"ftp://ftp.freedesktop.org/pub/mesa/${version}/mesa-${version}.tar.xz"
"ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
];
inherit hash;
};
patches =
[
./opencl.patch
]
++ lib.optionals stdenv.isDarwin [
# Reorder things to make it build on Darwin again
# Submitted upstream: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29592
# FIXME: remove when merged or otherwise addressed
./darwin.patch
];
postPatch = ''
patchShebangs .
# The drirc.d directory cannot be installed to $drivers as that would cause a cyclic dependency:
substituteInPlace src/util/xmlconfig.c --replace \
'DATADIR "/drirc.d"' '"${placeholder "out"}/share/drirc.d"'
substituteInPlace src/util/meson.build --replace \
"get_option('datadir')" "'${placeholder "out"}/share'"
substituteInPlace src/amd/vulkan/meson.build --replace \
"get_option('datadir')" "'${placeholder "out"}/share'"
${copyRustDeps}
'';
outputs =
[
"out"
"dev"
"drivers"
]
++ lib.optionals enableOSMesa [
"osmesa"
]
++ lib.optionals stdenv.isLinux [
"driversdev"
]
++ lib.optionals enableTeflon [
"teflon"
]
++ lib.optionals enableOpenCL [
"opencl"
]
++ lib.optionals haveDozen [
# the Dozen drivers depend on libspirv2dxil, but link it statically, and
# libspirv2dxil itself is pretty chonky, so relocate it to its own output in
# case anything wants to use it at some point
"spirv2dxil"
];
# Keep build-ids so drivers can use them for caching, etc.
# Also some drivers segfault without this.
separateDebugInfo = true;
# Needed to discover llvm-config for cross
preConfigure = ''
PATH=${llvmPackages.libllvm.dev}/bin:$PATH
'';
mesonFlags =
[
"--sysconfdir=/etc"
"--datadir=${placeholder "drivers"}/share" # Vendor files
# Don't build in debug mode
# https://gitlab.freedesktop.org/mesa/mesa/blob/master/docs/meson.html#L327
(lib.mesonBool "b_ndebug" true)
(lib.mesonOption "dri-search-path" "${libglvnd.driverLink}/lib/dri")
(lib.mesonOption "platforms" (lib.concatStringsSep "," eglPlatforms))
(lib.mesonOption "gallium-drivers" (lib.concatStringsSep "," galliumDrivers))
(lib.mesonOption "vulkan-drivers" (lib.concatStringsSep "," vulkanDrivers))
(lib.mesonOption "dri-drivers-path" "${placeholder "drivers"}/lib/dri")
(lib.mesonOption "vdpau-libs-path" "${placeholder "drivers"}/lib/vdpau")
(lib.mesonOption "omx-libs-path" "${placeholder "drivers"}/lib/bellagio")
(lib.mesonOption "va-libs-path" "${placeholder "drivers"}/lib/dri")
(lib.mesonOption "d3d-drivers-path" "${placeholder "drivers"}/lib/d3d")
(lib.mesonBool "gallium-nine" enableGalliumNine) # Direct3D in Wine
(lib.mesonBool "osmesa" enableOSMesa) # used by wine
(lib.mesonBool "teflon" enableTeflon) # TensorFlow frontend
(lib.mesonEnable "microsoft-clc" false) # Only relevant on Windows (OpenCL 1.2 API on top of D3D12)
# To enable non-mesa gbm backends to be found (e.g. Nvidia)
(lib.mesonOption "gbm-backends-path" "${libglvnd.driverLink}/lib/gbm:${placeholder "out"}/lib/gbm")
# meson auto_features enables these features, but we do not want them
(lib.mesonEnable "android-libbacktrace" false)
]
++ lib.optionals stdenv.isLinux [
(lib.mesonEnable "glvnd" true)
(lib.mesonBool "install-intel-clc" true)
(lib.mesonEnable "intel-rt" stdenv.isx86_64)
(lib.mesonOption "clang-libdir" "${llvmPackages.clang-unwrapped.lib}/lib")
]
++ lib.optionals stdenv.isDarwin [
# Disable features that are explicitly unsupported on the platform
(lib.mesonEnable "gbm" false)
(lib.mesonEnable "xlib-lease" false)
(lib.mesonEnable "egl" false)
(lib.mesonEnable "gallium-vdpau" false)
(lib.mesonEnable "gallium-va" false)
(lib.mesonEnable "gallium-xa" false)
(lib.mesonEnable "lmsensors" false)
# Dont build with glvnd support to make sure Mesa builds libGL on Darwin
(lib.mesonEnable "glvnd" false)
# This gets enabled by mesonAutoFeatures and fails on aarch64-darwin,
# which makes no sense because Darwin has neither Intel nor RT, but OK
(lib.mesonEnable "intel-rt" false)
]
++ lib.optionals enableOpenCL [
# Clover, old OpenCL frontend
(lib.mesonOption "gallium-opencl" "icd")
(lib.mesonBool "opencl-spirv" true)
# Rusticl, new OpenCL frontend
(lib.mesonBool "gallium-rusticl" true)
]
++ lib.optionals (!withValgrind) [
(lib.mesonEnable "valgrind" false)
]
++ lib.optionals (!withLibunwind) [
(lib.mesonEnable "libunwind" false)
]
++ lib.optionals enablePatentEncumberedCodecs [
(lib.mesonOption "video-codecs" "all")
]
++ lib.optionals (vulkanLayers != []) [
(lib.mesonOption "vulkan-layers" (builtins.concatStringsSep "," vulkanLayers))
]
++ lib.optionals needNativeCLC [
(lib.mesonOption "intel-clc" "system")
];
strictDeps = true;
buildInputs = with xorg;
[
expat
glslang
libffi
libglvnd
libvdpau
llvmPackages.libllvm
openssl
zstd
]
++ (with xorg; [
libX11
libXext
libXfixes
libXrandr
libXt
libXvMC
libpthreadstubs
libxcb
libxshmfence
xcbutilkeysyms
xorgproto
])
++ lib.optionals withLibunwind [
libunwind
]
++ [
python3Packages.python # for shebang
]
++ lib.optionals haveWayland [
wayland
wayland-protocols
]
++ lib.optionals stdenv.isLinux [
libomxil-bellagio
libva-minimal
llvmPackages.clang-unwrapped
llvmPackages.libclc
lm_sensors
spirv-llvm-translator
udev
]
++ lib.optionals (lib.meta.availableOn stdenv.hostPlatform elfutils) [
elfutils
]
++ lib.optionals enableOpenCL [
llvmPackages.clang
]
++ lib.optionals withValgrind [
valgrind-light
]
++ lib.optionals haveZink [
vulkan-loader
]
++ lib.optionals haveDozen [
directx-headers
];
depsBuildBuild =
[
pkg-config
]
++ lib.optionals (!stdenv.isDarwin) [
# Adding this unconditionally makes x86_64-darwin pick up an older
# toolchain, as we explicitly call Mesa with 11.0 stdenv, but buildPackages
# is still 10.something, and Mesa can't build with that.
# FIXME: figure this out, or figure out how to get rid of Mesa on Darwin,
# whichever is easier.
buildPackages.stdenv.cc
];
nativeBuildInputs =
[
meson
pkg-config
ninja
intltool
bison
flex
file
python3Packages.python
python3Packages.packaging
python3Packages.pycparser
python3Packages.mako
python3Packages.ply
jdupes
glslang
rustc
rust-bindgen
rust-cbindgen
rustPlatform.bindgenHook
]
++ lib.optionals haveWayland [
wayland-scanner
]
++ lib.optionals needNativeCLC [
buildPackages.mesa.driversdev
];
disallowedRequisites = lib.optionals needNativeCLC [
buildPackages.mesa.driversdev
];
propagatedBuildInputs =
(with xorg; [
libXdamage
libXxf86vm
])
++ lib.optionals withLibdrm [
libdrm
]
++ lib.optionals stdenv.isDarwin [
OpenGL
Xplugin
];
doCheck = false;
postInstall =
''
# Some installs don't have any drivers so this directory is never created.
mkdir -p $drivers $osmesa
''
+ lib.optionalString stdenv.isLinux ''
mkdir -p $drivers/lib
if [ -n "$(shopt -s nullglob; echo "$out/lib/libxatracker"*)" -o -n "$(shopt -s nullglob; echo "$out/lib/libvulkan_"*)" ]; then
# move gallium-related stuff to $drivers, so $out doesn't depend on LLVM
mv -t $drivers/lib \
$out/lib/libpowervr_rogue* \
$out/lib/libxatracker* \
$out/lib/libvulkan_*
fi
if [ -n "$(shopt -s nullglob; echo "$out"/lib/lib*_mesa*)" ]; then
# Move other drivers to a separate output
mv -t $drivers/lib $out/lib/lib*_mesa*
fi
# 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 Vulkan (it's pointing to $out but
# drivers are in $drivers)
for js in $drivers/share/vulkan/icd.d/*.json; do
substituteInPlace "$js" --replace "$out" "$drivers"
done
''
+ lib.optionalString enableOpenCL ''
# Move OpenCL stuff
mkdir -p $opencl/lib
mv -t "$opencl/lib/" \
$out/lib/gallium-pipe \
$out/lib/lib*OpenCL*
# We construct our own .icd files that contain absolute paths.
mkdir -p $opencl/etc/OpenCL/vendors/
echo $opencl/lib/libMesaOpenCL.so > $opencl/etc/OpenCL/vendors/mesa.icd
echo $opencl/lib/libRusticlOpenCL.so > $opencl/etc/OpenCL/vendors/rusticl.icd
''
+ lib.optionalString enableOSMesa ''
# move libOSMesa to $osmesa, as it's relatively big
mkdir -p $osmesa/lib
mv -t $osmesa/lib/ $out/lib/libOSMesa*
''
+ lib.optionalString (vulkanLayers != []) ''
mv -t $drivers/lib $out/lib/libVkLayer*
for js in $drivers/share/vulkan/{im,ex}plicit_layer.d/*.json; do
substituteInPlace "$js" --replace '"libVkLayer_' '"'"$drivers/lib/libVkLayer_"
done
''
+ lib.optionalString haveDozen ''
mkdir -p $spirv2dxil/{bin,lib}
mv -t $spirv2dxil/lib $out/lib/libspirv_to_dxil*
mv -t $spirv2dxil/bin $out/bin/spirv2dxil
'';
postFixup = lib.optionalString stdenv.isLinux ''
# set the default search path for DRI drivers; used e.g. by X server
for pc in lib/pkgconfig/{dri,d3d}.pc; do
[ -f "$dev/$pc" ] && substituteInPlace "$dev/$pc" --replace "$drivers" "${libglvnd.driverLink}"
done
# remove pkgconfig files for GL/EGL; they are provided by libGL.
rm -f $dev/lib/pkgconfig/{gl,egl}.pc
# Move development files for libraries in $drivers to $driversdev
mkdir -p $driversdev/include
mv $dev/include/xa_* $dev/include/d3d* -t $driversdev/include || true
mkdir -p $driversdev/lib/pkgconfig
for pc in lib/pkgconfig/{xatracker,d3d}.pc; do
if [ -f "$dev/$pc" ]; then
substituteInPlace "$dev/$pc" --replace $out $drivers
mv $dev/$pc $driversdev/$pc
fi
done
moveToOutput bin/intel_clc $driversdev
# Don't depend on build python
patchShebangs --host --update $out/bin/*
# NAR doesn't support hard links, so convert them to symlinks to save space.
jdupes --hard-links --link-soft --recurse "$drivers"
# 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
if [[ ! -L "$lib" ]]; then
patchelf --set-rpath "$(patchelf --print-rpath $lib):$drivers/lib" "$lib"
fi
done
# add RPATH here so Zink can find libvulkan.so
${lib.optionalString haveZink ''
patchelf --add-rpath ${vulkan-loader}/lib $drivers/lib/dri/zink_dri.so
''}
${lib.optionalString enableTeflon ''
moveToOutput lib/libteflon.so $teflon
''}
'';
env.NIX_CFLAGS_COMPILE = toString (
lib.optionals stdenv.isDarwin [
"-fno-common"
]
++ lib.optionals enableOpenCL [
"-UPIPE_SEARCH_DIR"
"-DPIPE_SEARCH_DIR=\"${placeholder "opencl"}/lib/gallium-pipe\""
]
);
passthru = {
inherit (libglvnd) driverLink;
inherit llvmPackages;
libdrm =
if withLibdrm
then libdrm
else null;
tests = lib.optionalAttrs stdenv.isLinux {
devDoesNotDependOnLLVM = stdenv.mkDerivation {
name = "mesa-dev-does-not-depend-on-llvm";
buildCommand = ''
echo ${self.dev} >>$out
'';
disallowedRequisites = [llvmPackages.llvm self.drivers];
};
};
};
meta = {
description = "Open source 3D graphics library";
longDescription = ''
The Mesa project began as an open-source implementation of the OpenGL
specification - a system for rendering interactive 3D graphics. Over the
years the project has grown to implement more graphics APIs, including
OpenGL ES (versions 1, 2, 3), OpenCL, OpenMAX, VDPAU, VA API, XvMC, and
Vulkan. A variety of device drivers allows the Mesa libraries to be used
in many different environments ranging from software emulation to
complete hardware acceleration for modern GPUs.
'';
homepage = "https://www.mesa3d.org/";
changelog = "https://www.mesa3d.org/relnotes/${version}.html";
license = with lib.licenses; [mit]; # X11 variant, in most files
platforms = lib.platforms.mesaPlatforms;
badPlatforms = []; # Load bearing for libGL meta on Darwin.
maintainers = with lib.maintainers; [primeos vcunat]; # Help is welcome :)
};
};
in
self

View File

@@ -0,0 +1,66 @@
diff --git a/meson.build b/meson.build
index fbb0b29322d..b4825056449 100644
--- a/meson.build
+++ b/meson.build
@@ -1805,7 +1805,7 @@ endif
dep_clang = null_dep
if with_clc
- llvm_libdir = dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir')
+ llvm_libdir = get_option('clang-libdir')
dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false)
diff --git a/meson_options.txt b/meson_options.txt
index e885ba61a8a..591ed957c85 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,6 +23,12 @@ option(
description : 'the window system EGL assumes for EGL_DEFAULT_DISPLAY',
)
+option(
+ 'clang-libdir',
+ type : 'string',
+ value : '',
+ description : 'Locations to search for clang libraries.'
+)
option(
'android-stub',
type : 'boolean',
diff --git a/src/gallium/targets/opencl/meson.build b/src/gallium/targets/opencl/meson.build
index 7c14135898e..74dc6850603 100644
--- a/src/gallium/targets/opencl/meson.build
+++ b/src/gallium/targets/opencl/meson.build
@@ -39,7 +39,8 @@ if dep_llvm.version().version_compare('>=10.0.0')
polly_isl_dep = cpp.find_library('PollyISL', dirs : llvm_libdir, required : false)
endif
-dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false)
+clang_libdir = get_option('clang-libdir')
+dep_clang = cpp.find_library('clang-cpp', dirs : clang_libdir, required : false)
# meson will return clang-cpp from system dirs if it's not found in llvm_libdir
linker_rpath_arg = '-Wl,--rpath=@0@'.format(llvm_libdir)
@@ -123,7 +124,7 @@ if with_opencl_icd
configuration : _config,
input : 'mesa.icd.in',
output : 'mesa.icd',
- install : true,
+ install : false,
install_tag : 'runtime',
install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'),
)
diff --git a/src/gallium/targets/rusticl/meson.build b/src/gallium/targets/rusticl/meson.build
index b2963fe6dfa..99d6d801b94 100644
--- a/src/gallium/targets/rusticl/meson.build
+++ b/src/gallium/targets/rusticl/meson.build
@@ -76,7 +76,7 @@ configure_file(
configuration : _config,
input : 'rusticl.icd.in',
output : 'rusticl.icd',
- install : true,
+ install : false,
install_tag : 'runtime',
install_dir : join_paths(get_option('sysconfdir'), 'OpenCL', 'vendors'),
)

View File

@@ -0,0 +1,9 @@
final: prev: {
linux-asahi = final.callPackage ./linux-asahi {};
m1n1 = final.callPackage ./m1n1 {};
uboot-asahi = final.callPackage ./uboot-asahi {};
asahi-fwextract = final.callPackage ./asahi-fwextract {};
mesa-asahi-edge = final.callPackage ./mesa-asahi-edge {};
alsa-ucm-conf-asahi = final.callPackage ./alsa-ucm-conf-asahi {inherit (prev) alsa-ucm-conf;};
asahi-audio = final.callPackage ./asahi-audio {};
}

View File

@@ -0,0 +1,44 @@
{
lib,
fetchFromGitHub,
buildUBoot,
m1n1,
}:
(buildUBoot rec {
src = fetchFromGitHub {
# tracking: https://pagure.io/fedora-asahi/uboot-tools/commits/main
owner = "AsahiLinux";
repo = "u-boot";
rev = "c134629a8bc448e979967bf0632fdd5bb42ee1d7";
hash = "sha256-EPdpyvblkvQrMCiPjX3Bnqp8s/3Yd/gYM1PQu4PDMhs=";
};
version = "2024.04-4-asahi";
defconfig = "apple_m1_defconfig";
extraMeta.platforms = ["aarch64-linux"];
filesToInstall = [
"u-boot-nodtb.bin.gz"
"m1n1-u-boot.bin"
];
extraConfig = ''
CONFIG_IDENT_STRING=" ${version}"
CONFIG_VIDEO_FONT_4X6=n
CONFIG_VIDEO_FONT_8X16=n
CONFIG_VIDEO_FONT_SUN12X22=n
CONFIG_VIDEO_FONT_16X32=y
'';
})
.overrideAttrs (o: {
# nixos's downstream patches are not applicable
patches = [
];
# DTC= flag somehow breaks DTC compilation so we remove it
makeFlags = builtins.filter (s: (!(lib.strings.hasPrefix "DTC=" s))) o.makeFlags;
preInstall = ''
# compress so that m1n1 knows U-Boot's size and can find things after it
gzip -n u-boot-nodtb.bin
cat ${m1n1}/build/m1n1.bin arch/arm/dts/t[68]*.dtb u-boot-nodtb.bin.gz > m1n1-u-boot.bin
'';
})