From 13038d117b517c11271a4a3c1d2d4fd129893d0a Mon Sep 17 00:00:00 2001 From: Ryan Schanzenbacher Date: Sun, 28 Jul 2024 23:22:11 -0400 Subject: [PATCH] hyprlock 0.5, still need to wrap env --- modules/ryan-packages/gl.scm | 224 +++++++++++++++++++++++++++++++++++ modules/ryan-packages/wm.scm | 3 +- 2 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 modules/ryan-packages/gl.scm diff --git a/modules/ryan-packages/gl.scm b/modules/ryan-packages/gl.scm new file mode 100644 index 0000000..dd1588a --- /dev/null +++ b/modules/ryan-packages/gl.scm @@ -0,0 +1,224 @@ +(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 diff --git a/modules/ryan-packages/wm.scm b/modules/ryan-packages/wm.scm index 6a90484..7db419a 100644 --- a/modules/ryan-packages/wm.scm +++ b/modules/ryan-packages/wm.scm @@ -24,6 +24,7 @@ #:use-module (guix utils) #:use-module (rosenthal packages wm) #:use-module (ryan-packages gtk) + #:use-module (ryan-packages gl) #:use-module (gnu packages wm)) (define-public swaylock-effects-new @@ -122,7 +123,7 @@ pango libxkbcommon hyprlang - mesa + mesa-libglvnd libdrm libglvnd wayland-protocols