2022-09-16 21:00:45 +02:00
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
|
|
|
;;; Copyright © 2022 John Kehayias <john.kehayias@protonmail.com>
|
|
|
|
;;;
|
|
|
|
;;; This file is not part of GNU Guix.
|
|
|
|
;;;
|
|
|
|
;;; This program is free software: you can redistribute it and/or modify
|
|
|
|
;;; it under the terms of the GNU General Public License as published by
|
|
|
|
;;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;;; (at your option) any later version.
|
|
|
|
;;;
|
|
|
|
;;; This program is distributed in the hope that it will be useful,
|
|
|
|
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;;; GNU General Public License for more details.
|
|
|
|
;;;
|
|
|
|
;;; You should have received a copy of the GNU General Public License
|
|
|
|
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
(define-module (nongnu packages mesa)
|
|
|
|
#:use-module (gnu packages bison)
|
|
|
|
#:use-module (gnu packages elf)
|
|
|
|
#:use-module (gnu packages flex)
|
|
|
|
#:use-module (gnu packages freedesktop)
|
|
|
|
#:use-module (gnu packages xml)
|
|
|
|
#:use-module (gnu packages gl)
|
|
|
|
#:use-module (gnu packages gettext)
|
|
|
|
#:use-module (gnu packages llvm)
|
|
|
|
#:use-module (gnu packages pkg-config)
|
|
|
|
#:use-module (gnu packages python)
|
|
|
|
#:use-module (gnu packages python-xyz)
|
|
|
|
#:use-module (gnu packages video)
|
|
|
|
#:use-module (gnu packages xdisorg)
|
|
|
|
#:use-module (gnu packages xorg)
|
|
|
|
#:use-module (gnu packages vulkan)
|
|
|
|
#:use-module (guix build-system meson)
|
|
|
|
#:use-module (guix download)
|
|
|
|
#:use-module (guix packages)
|
|
|
|
#:use-module (guix utils)
|
|
|
|
#:use-module ((guix licenses) #:prefix license:)
|
|
|
|
#:use-module (ice-9 match)
|
|
|
|
#:use-module (srfi srfi-1))
|
|
|
|
|
|
|
|
;; Taken from (gnu packages xdisorg) on the current core-updates branch.
|
|
|
|
;; Remove once merged to Guix's master branch.
|
|
|
|
(define libdrm-next
|
|
|
|
(package
|
|
|
|
(inherit libdrm)
|
|
|
|
(version "2.4.112")
|
|
|
|
(source (origin
|
|
|
|
(method url-fetch)
|
|
|
|
(uri (string-append
|
|
|
|
"https://dri.freedesktop.org/libdrm/libdrm-"
|
|
|
|
version ".tar.xz"))
|
|
|
|
(sha256
|
|
|
|
(base32
|
|
|
|
"1zr0hi7k5s7my4q9hyj6ryzg89zyjx24zbqfv3c5rcq9pl87gc00"))))))
|
2022-09-16 21:02:01 +02:00
|
|
|
|
|
|
|
;; Copied from (gnu packages gl) without changes, neede for mesa.
|
|
|
|
(define libva-without-mesa
|
|
|
|
;; Delay to work around circular import problem.
|
|
|
|
(delay
|
|
|
|
(package
|
|
|
|
(inherit libva)
|
|
|
|
(name "libva-without-mesa")
|
|
|
|
(inputs (fold alist-delete (package-inputs libva)
|
|
|
|
'("mesa" "wayland")))
|
|
|
|
(arguments
|
|
|
|
(strip-keyword-arguments
|
|
|
|
'(#:make-flags)
|
|
|
|
(substitute-keyword-arguments (package-arguments libva)
|
|
|
|
((#:configure-flags flags)
|
|
|
|
'(list "--disable-glx"))))))))
|
|
|
|
|
|
|
|
;; Copied from (gnu packages gl) on the current core-updates branch. Due to
|
|
|
|
;; the number of changes from master, easier to copy the whole definition than
|
|
|
|
;; try to modify with an inherit. Once this has been merged to Guix's master
|
|
|
|
;; branch, modify this to inherit with the latest source version.
|
|
|
|
(define-public mesa-next
|
|
|
|
(package
|
|
|
|
(name "mesa")
|
2022-10-14 21:04:13 +02:00
|
|
|
(version "22.2.1")
|
2022-09-16 21:02:01 +02:00
|
|
|
(source
|
|
|
|
(origin
|
|
|
|
(method url-fetch)
|
|
|
|
(uri (list (string-append "https://mesa.freedesktop.org/archive/"
|
|
|
|
"mesa-" version ".tar.xz")
|
|
|
|
(string-append "ftp://ftp.freedesktop.org/pub/mesa/"
|
|
|
|
"mesa-" version ".tar.xz")
|
|
|
|
(string-append "ftp://ftp.freedesktop.org/pub/mesa/"
|
|
|
|
version "/mesa-" version ".tar.xz")))
|
|
|
|
(sha256
|
|
|
|
(base32
|
2022-10-14 21:04:13 +02:00
|
|
|
"0g5ij57ljh3l04qf7qpildl45g5g7s8ycngc19z5xx1k1anbwy80"))))
|
2022-09-16 21:02:01 +02:00
|
|
|
(build-system meson-build-system)
|
|
|
|
(propagated-inputs
|
|
|
|
;; The following are in the Requires.private field of gl.pc.
|
|
|
|
(list libdrm-next
|
|
|
|
libvdpau
|
|
|
|
libx11
|
|
|
|
libxdamage
|
|
|
|
libxfixes
|
|
|
|
libxshmfence
|
|
|
|
libxxf86vm
|
|
|
|
xorgproto))
|
|
|
|
(inputs
|
|
|
|
(list elfutils ;libelf required for r600 when using llvm
|
|
|
|
expat
|
|
|
|
(force libva-without-mesa)
|
|
|
|
libxml2
|
|
|
|
libxrandr
|
|
|
|
libxvmc
|
|
|
|
;; Note: update the 'clang' input of mesa-opencl when bumping this.
|
|
|
|
llvm
|
|
|
|
wayland
|
|
|
|
wayland-protocols-next))
|
|
|
|
(native-inputs
|
|
|
|
(list bison
|
|
|
|
flex
|
|
|
|
gettext-minimal
|
|
|
|
glslang
|
|
|
|
pkg-config
|
|
|
|
python-libxml2 ;for OpenGL ES 1.1 and 2.0 support
|
|
|
|
python-mako
|
|
|
|
python-wrapper
|
|
|
|
(@ (gnu packages base) which)))
|
|
|
|
(outputs '("out" "bin"))
|
|
|
|
(arguments
|
|
|
|
`(#:configure-flags
|
|
|
|
'(,@(match (%current-system)
|
|
|
|
("aarch64-linux"
|
|
|
|
;; TODO: Fix svga driver for non-Intel architectures.
|
|
|
|
'("-Dgallium-drivers=etnaviv,freedreno,kmsro,lima,nouveau,\
|
|
|
|
panfrost,r300,r600,swrast,tegra,v3d,vc4,virgl"))
|
|
|
|
("armhf-linux"
|
|
|
|
;; Freedreno FTBFS when built on a 64-bit machine.
|
|
|
|
'("-Dgallium-drivers=etnaviv,kmsro,lima,nouveau,panfrost,\
|
|
|
|
r300,r600,swrast,tegra,v3d,vc4,virgl"))
|
|
|
|
((or "powerpc64le-linux" "powerpc-linux" "riscv64-linux")
|
|
|
|
'("-Dgallium-drivers=nouveau,r300,r600,radeonsi,swrast,virgl"))
|
|
|
|
(_
|
|
|
|
'("-Dgallium-drivers=iris,nouveau,r300,r600,radeonsi,\
|
|
|
|
svga,swrast,virgl")))
|
|
|
|
;; Enable various optional features. TODO: opencl requires libclc,
|
|
|
|
;; omx requires libomxil-bellagio
|
|
|
|
"-Dplatforms=x11,wayland"
|
|
|
|
"-Dglx=dri" ;Thread Local Storage, improves performance
|
|
|
|
;; "-Dopencl=true"
|
|
|
|
;; "-Domx=true"
|
|
|
|
"-Dosmesa=true"
|
|
|
|
"-Dgallium-xa=enabled"
|
|
|
|
|
|
|
|
;; features required by wayland
|
|
|
|
"-Dgles2=enabled"
|
|
|
|
"-Dgbm=enabled"
|
|
|
|
"-Dshared-glapi=enabled"
|
|
|
|
|
|
|
|
;; Explicitly enable Vulkan on some architectures.
|
|
|
|
,@(match (%current-system)
|
|
|
|
((or "i686-linux" "x86_64-linux")
|
|
|
|
'("-Dvulkan-drivers=intel,amd"))
|
|
|
|
((or "powerpc64le-linux" "powerpc-linux")
|
|
|
|
'("-Dvulkan-drivers=amd,swrast"))
|
|
|
|
("aarch64-linux"
|
|
|
|
'("-Dvulkan-drivers=freedreno,amd,broadcom,swrast"))
|
|
|
|
("riscv64-linux"
|
|
|
|
'("-Dvulkan-drivers=amd,swrast"))
|
|
|
|
(_
|
|
|
|
'("-Dvulkan-drivers=auto")))
|
|
|
|
|
|
|
|
;; Enable the Vulkan overlay layer on all architectures.
|
|
|
|
"-Dvulkan-layers=device-select,overlay"
|
|
|
|
|
|
|
|
;; Also enable the tests.
|
|
|
|
"-Dbuild-tests=true"
|
|
|
|
|
|
|
|
"-Dllvm=enabled") ; default is x86/x86_64 only
|
|
|
|
|
|
|
|
;; XXX: 'debugoptimized' causes LTO link failures on some drivers. The
|
|
|
|
;; documentation recommends using 'release' for performance anyway.
|
|
|
|
#:build-type "release"
|
|
|
|
|
|
|
|
#:modules ((ice-9 match)
|
|
|
|
(srfi srfi-1)
|
|
|
|
(guix build utils)
|
|
|
|
(guix build meson-build-system))
|
|
|
|
#:phases
|
|
|
|
(modify-phases %standard-phases
|
|
|
|
(add-after 'unpack 'disable-failing-test
|
|
|
|
(lambda _
|
|
|
|
;; Disable the intel vulkan (anv_state_pool) tests, as they may
|
|
|
|
;; fail in a nondeterministic fashion (see:
|
|
|
|
;; https://gitlab.freedesktop.org/mesa/mesa/-/issues/5446).
|
|
|
|
(substitute* "src/intel/vulkan/meson.build"
|
|
|
|
(("if with_tests")
|
|
|
|
"if false"))
|
|
|
|
,@(match (%current-system)
|
|
|
|
("riscv64-linux"
|
|
|
|
;; According to the test logs the llvm JIT is not designed
|
|
|
|
;; for this architecture and the llvmpipe tests all segfault.
|
|
|
|
;; The same is true for mesa:gallium / osmesa-render.
|
|
|
|
`((substitute* '("src/gallium/drivers/llvmpipe/meson.build"
|
|
|
|
"src/gallium/targets/osmesa/meson.build")
|
|
|
|
(("if with_tests") "if false"))))
|
|
|
|
("powerpc64le-linux"
|
|
|
|
;; Disable some of the llvmpipe tests.
|
|
|
|
`((substitute* "src/gallium/drivers/llvmpipe/lp_test_arit.c"
|
|
|
|
(("0\\.5, ") ""))))
|
|
|
|
("powerpc-linux"
|
|
|
|
;; There are some tests which fail specifically on powerpc.
|
|
|
|
`((substitute* '(;; LLVM ERROR: Relocation type not implemented yet!
|
|
|
|
"src/gallium/drivers/llvmpipe/meson.build"
|
|
|
|
;; This is probably a big-endian test failure.
|
|
|
|
"src/gallium/targets/osmesa/meson.build")
|
|
|
|
(("if with_tests") "if not with_tests"))
|
|
|
|
(substitute* "src/util/tests/format/meson.build"
|
|
|
|
;; This is definately an endian-ness test failure.
|
|
|
|
(("'u_format_test', ") ""))
|
|
|
|
;; It is only this portion of the test which fails.
|
|
|
|
(substitute* "src/mesa/main/tests/meson.build"
|
|
|
|
((".*mesa_formats.*") ""))
|
|
|
|
;; This test times out and receives SIGTERM.
|
|
|
|
(substitute* "src/amd/common/meson.build"
|
|
|
|
(("and not with_platform_windows") "and with_platform_windows"))))
|
|
|
|
("i686-linux"
|
|
|
|
;; This test is known to fail on i686 (see:
|
|
|
|
;; https://gitlab.freedesktop.org/mesa/mesa/-/issues/4091).
|
|
|
|
`((substitute* "src/util/meson.build"
|
|
|
|
((".*'tests/u_debug_stack_test.cpp',.*") ""))))
|
|
|
|
("aarch64-linux"
|
|
|
|
;; The ir3_disasm test segfaults.
|
|
|
|
;; The simplest way to skip it is to run a different test instead.
|
|
|
|
`((substitute* "src/freedreno/ir3/meson.build"
|
|
|
|
(("disasm\\.c'") "delay.c',\n link_args: ld_args_build_id"))))
|
|
|
|
("armhf-linux"
|
|
|
|
;; Disable some of the llvmpipe tests.
|
|
|
|
`((substitute* "src/gallium/drivers/llvmpipe/meson.build"
|
|
|
|
(("'lp_test_arit', ") ""))))
|
|
|
|
(_
|
|
|
|
'((display "No tests to disable on this architecture.\n"))))))
|
2022-10-15 02:40:08 +02:00
|
|
|
,@(if (string=? (%current-system) "i686-linux")
|
|
|
|
'((add-after 'disable-failing-test 'fix-instrfromstring-test
|
|
|
|
(lambda _
|
|
|
|
;; The instrfromstring test fails on i686, which has been already
|
|
|
|
;; fixed upstream but not in 22.2.1.
|
|
|
|
;; TODO: remove on update
|
|
|
|
(substitute* "src/gallium/drivers/r600/sfn/sfn_instr_export.cpp"
|
|
|
|
(("buf\\[6\\]") "buf[6] = {0}")))))
|
|
|
|
'())
|
2022-09-16 21:02:01 +02:00
|
|
|
(add-before 'configure 'fix-dlopen-libnames
|
|
|
|
(lambda* (#:key inputs outputs #:allow-other-keys)
|
|
|
|
(let ((out (assoc-ref outputs "out")))
|
|
|
|
;; Remain agnostic to .so.X.Y.Z versions while doing
|
|
|
|
;; the substitutions so we're future-safe.
|
|
|
|
(substitute* "src/glx/meson.build"
|
|
|
|
(("-DGL_LIB_NAME=\"lib@0@\\.so\\.@1@\"")
|
|
|
|
(string-append "-DGL_LIB_NAME=\"" out
|
|
|
|
"/lib/lib@0@.so.@1@\"")))
|
|
|
|
(substitute* "src/gbm/backends/dri/gbm_dri.c"
|
|
|
|
(("\"libglapi\\.so")
|
|
|
|
(string-append "\"" out "/lib/libglapi.so")))
|
|
|
|
(substitute* "src/gbm/main/backend.c"
|
|
|
|
;; No need to patch the gbm_gallium_drm.so reference;
|
|
|
|
;; it's never installed since Mesa removed its
|
|
|
|
;; egl_gallium support.
|
|
|
|
(("\"gbm_dri\\.so")
|
|
|
|
(string-append "\"" out "/lib/dri/gbm_dri.so"))))))
|
|
|
|
(add-after 'install 'split-outputs
|
|
|
|
(lambda* (#:key outputs #:allow-other-keys)
|
|
|
|
(let ((out (assoc-ref outputs "out"))
|
|
|
|
(bin (assoc-ref outputs "bin")))
|
|
|
|
;; Not all architectures have the Vulkan overlay control script.
|
|
|
|
(mkdir-p (string-append out "/bin"))
|
|
|
|
(call-with-output-file (string-append out "/bin/.empty")
|
|
|
|
(const #t))
|
|
|
|
(copy-recursively (string-append out "/bin")
|
|
|
|
(string-append bin "/bin"))
|
|
|
|
(delete-file-recursively (string-append out "/bin")))))
|
|
|
|
(add-after 'install 'symlinks-instead-of-hard-links
|
|
|
|
(lambda* (#:key outputs #:allow-other-keys)
|
|
|
|
;; All the drivers and gallium targets create hard links upon
|
|
|
|
;; installation (search for "hardlink each megadriver instance"
|
|
|
|
;; in the makefiles). This is no good for us since we'd produce
|
|
|
|
;; nars that contain several copies of these files. Thus, turn
|
|
|
|
;; them into symlinks, which saves ~124 MiB.
|
|
|
|
(let* ((out (assoc-ref outputs "out"))
|
|
|
|
(lib (string-append out "/lib"))
|
|
|
|
(files (find-files lib
|
|
|
|
(lambda (file stat)
|
|
|
|
(and (string-contains file ".so")
|
|
|
|
(eq? 'regular
|
|
|
|
(stat:type stat))))))
|
|
|
|
(inodes (map (compose stat:ino stat) files)))
|
|
|
|
(for-each (lambda (inode)
|
|
|
|
(match (filter-map (match-lambda
|
|
|
|
((file ino)
|
|
|
|
(and (= ino inode) file)))
|
|
|
|
(zip files inodes))
|
|
|
|
((_)
|
|
|
|
#f)
|
|
|
|
((reference others ..1)
|
|
|
|
(format #t "creating ~a symlinks to '~a'~%"
|
|
|
|
(length others) reference)
|
|
|
|
(for-each delete-file others)
|
|
|
|
(for-each (lambda (file)
|
|
|
|
(if (string=? (dirname file)
|
|
|
|
(dirname reference))
|
|
|
|
(symlink (basename reference)
|
|
|
|
file)
|
|
|
|
(symlink reference file)))
|
|
|
|
others))))
|
|
|
|
(delete-duplicates inodes))))))))
|
|
|
|
(home-page "https://mesa3d.org/")
|
|
|
|
(synopsis "OpenGL and Vulkan implementations")
|
|
|
|
(description "Mesa is a free implementation of the OpenGL and Vulkan
|
|
|
|
specifications - systems for rendering interactive 3D graphics. A variety of
|
|
|
|
device drivers allows Mesa to be used in many different environments ranging
|
|
|
|
from software emulation to complete hardware acceleration for modern GPUs.")
|
|
|
|
(license license:x11)))
|