(define-module (ryan-packages gl) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix gexp) #:use-module (guix utils) #:use-module (ice-9 match) #:use-module (gnu packages) #:use-module (gnu packages gl)) (define-public mesa-libglvnd (package (inherit mesa) (inputs (modify-inputs (package-inputs mesa) (prepend libglvnd))) (arguments (list #:configure-flags #~(list #$@(cond ((or (target-aarch64?) (target-arm32?)) '("-Dgallium-drivers=etnaviv,freedreno,kmsro,lima,nouveau,\ panfrost,r300,r600,svga,swrast,tegra,v3d,vc4,virgl,zink")) ((or (target-ppc64le?) (target-ppc32?) (target-riscv64?)) '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,svga,swrast,virgl,zink")) (else '("-Dgallium-drivers=crocus,iris,nouveau,r300,r600,radeonsi,\ svga,swrast,virgl,zink"))) ;; 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" "-Dglvnd=true" ;; Explicitly enable Vulkan on some architectures. #$@(cond ((or (target-x86-32?) (target-x86-64?)) '("-Dvulkan-drivers=intel,intel_hasvk,amd,swrast")) ((or (target-ppc64le?) (target-ppc32?)) '("-Dvulkan-drivers=amd,swrast")) ((target-aarch64?) '("-Dvulkan-drivers=freedreno,amd,broadcom,swrast")) ((target-riscv64?) '("-Dvulkan-drivers=amd,swrast")) (else '("-Dvulkan-drivers=auto"))) ;; Enable the Vulkan overlay layer on all architectures. "-Dvulkan-layers=device-select,overlay" ;; Enable all the codecs that were built by default as part of the ;; 21.3.x releases to avoid functionality regressions. "-Dvideo-codecs=all" ;; Enable ZSTD compression for shader cache. "-Dzstd=enabled" ;; 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 #$@(if (%current-target-system) #~((add-after 'unpack 'fix-cross-compiling (lambda* (#:key native-inputs #:allow-other-keys) ;; When cross compiling, we use cmake to find llvm, not ;; llvm-config, because llvm-config cannot be executed ;; see https://github.com/llvm/llvm-project/issues/58984 (substitute* "meson.build" (("method : host_machine\\.system.*") "method : 'cmake',\n")) (setenv "CMAKE" (search-input-file native-inputs "/bin/cmake"))))) #~()) (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" "src/gallium/targets/osmesa/meson.build") (("if with_tests") "if not with_tests")) ;; This is probably a big-endian test failure. (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',.*") "")))) ("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")))))) (add-before 'configure 'fix-dlopen-libnames (lambda* (#:key inputs #:allow-other-keys) (let ((out #$output)) ;; 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"))) (substitute* "src/gallium/drivers/zink/zink_screen.c" (("util_dl_open\\(VK_LIBNAME\\)") (format #f "util_dl_open(\"~a\")" (search-input-file inputs "lib/libvulkan.so.1"))))))) (add-after 'install 'split-outputs (lambda _ (let ((out #$output) (bin #$output: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 _ ;; 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 #$output) (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))))) (add-after 'install 'set-layer-path-in-manifests (lambda _ (let* ((out #$output) (implicit-path (string-append out "/share/vulkan/implicit_layer.d/")) (explicit-path (string-append out "/share/vulkan/explicit_layer.d/")) (fix-layer-path (lambda (layer-name) (let* ((explicit (string-append explicit-path layer-name ".json")) (implicit (string-append implicit-path layer-name ".json")) (manifest (if (file-exists? explicit) explicit implicit))) (substitute* manifest (((string-append "\"lib" layer-name ".so\"")) (string-append "\"" out "/lib/lib" layer-name ".so\""))))))) (for-each fix-layer-path '("VkLayer_MESA_device_select" "VkLayer_MESA_overlay")))))))))) mesa-libglvnd