Merge branch 'master' into 'master'

DRAFT: #166: nongnu: nvidia: Add wayland-native vulkan rendering ; nvidia_icd.json

See merge request nonguix/nonguix!160
This commit is contained in:
Samuel Culpepper 2022-03-22 16:22:59 +00:00
commit 8c1dc5c3b0

View File

@ -21,6 +21,7 @@
;;; along with this program. If not, see <https://www.gnu.org/licenses/>. ;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(define-module (nongnu packages nvidia) (define-module (nongnu packages nvidia)
#:use-module (gnu packages xdisorg)
#:use-module (guix packages) #:use-module (guix packages)
#:use-module (guix download) #:use-module (guix download)
#:use-module (guix utils) #:use-module (guix utils)
@ -54,13 +55,13 @@
(define-public nvidia-driver (define-public nvidia-driver
(package (package
(name "nvidia-driver") (name "nvidia-driver")
(version "470.86") (version "495.46")
(source (source
(origin (origin
(uri (format #f "http://us.download.nvidia.com/XFree86/Linux-x86_64/~a/~a.run" (uri (format #f "http://us.download.nvidia.com/XFree86/Linux-x86_64/~a/~a.run"
version version
(format #f "NVIDIA-Linux-x86_64-~a" version))) (format #f "NVIDIA-Linux-x86_64-~a" version)))
(sha256 (base32 "0krwcxc0j19vjnk8sv6mx1lin2rm8hcfhc2hg266846jvcws1dsg")) (sha256 (base32 "1xb23kimlfsailpwy7kv4l217id5jpmdc4svm9kldid0gp8pffyq"))
(method url-fetch) (method url-fetch)
(file-name (string-append "nvidia-driver-" version "-checkout")))) (file-name (string-append "nvidia-driver-" version "-checkout"))))
(build-system linux-module-build-system) (build-system linux-module-build-system)
@ -75,10 +76,20 @@
(chdir ,(format #f "NVIDIA-Linux-x86_64-~a" version)) (chdir ,(format #f "NVIDIA-Linux-x86_64-~a" version))
#t))) #t)))
(replace 'build (replace 'build
(lambda* (#:key inputs outputs #:allow-other-keys) (lambda* (#:key inputs outputs #:allow-other-keys)
;; We cannot use with-directory-excursion, because the install ;; We cannot use with-directory-excursion, because the install
;; phase needs to be in the kernel folder. Otherwise no .ko ;; phase needs to be in the kernel folder. Otherwise no .ko
;; would be installed. ;; would be installed.
;;
;; NOTE: new in 495 nvidia-drm.ko
;; see Chapter 35 "Direct Rendering Manager Kernel Modesetting (DRM KMS)"
;; - PRIME offload: CONFIG_DRM enabled
;; - Atomic Modeset: non-X11: CONFIG_DRM, CONFIG_DRM_KMS_HELPER enabled
;; modprobe -r nvidia_drm ; modprobe nvidia_drm modeset=1
;; caveats: ( 495.46 >= )
;; - DRM KMS cannot use SLI mosaic
;; - no overlay plane, only primary & cursor
;; - allocation/submission to DRM KMS is not possible with GBM
(chdir "kernel") (chdir "kernel")
;; Patch Kbuild ;; Patch Kbuild
(substitute* "Kbuild" (substitute* "Kbuild"
@ -102,6 +113,7 @@
(libdir (string-append out "/lib")) (libdir (string-append out "/lib"))
(bindir (string-append out "/bin")) (bindir (string-append out "/bin"))
(etcdir (string-append out "/etc"))) (etcdir (string-append out "/etc")))
;; ------------------------------ ;; ------------------------------
;; Copy .so files ;; Copy .so files
(for-each (for-each
@ -111,9 +123,42 @@
(scandir "." (lambda (name) (scandir "." (lambda (name)
(string-contains name ".so")))) (string-contains name ".so"))))
(install-file "nvidia_drv.so" (string-append out "/lib/xorg/modules/drivers/")) (install-file "nvidia_drv.so"
(install-file ,(string-append "libglxserver_nvidia.so." version) (string-append out "/lib/xorg/modules/extensions/")) (string-append out "/lib/xorg/modules/drivers/"))
(install-file ,(string-append "libglxserver_nvidia.so." version)
(string-append out "/lib/xorg/modules/extensions/"))
;; ------------------------------
;; Copy .json files
(for-each
(lambda (file)
(let ((dest (assoc file
'(("nvidia_icd.json" . "vulkan/icd.d")
("nvidia_layers.json" . "vulkan/explicit_layer.d")
("10_nvidia.json" . "glvnd/egl_vendor.d")
("10_nvidia_wayland.json" . "glvnd/egl_external_platform.d")
("15_nvidia_gbm.json" . "glvnd/egl_external_platform.d")))))
(when dest
(format #t "Copying '~a' -> '~a' ...~%" file (cdr dest))
(install-file file (string-append out "/" (cdr dest))))))
(scandir "." (lambda (name)
(string-contains name ".json"))))
(use-modules (ice-9 string-fun))
(let* ((outdir (string-append out "/vulkan/icd.d"))
(outfile (string-append outdir "/nvidia_icd.json")))
(mkdir-p outdir)
(call-with-output-file outfile
(lambda (port)
(put-string
port (call-with-input-file "nvidia_icd.json"
(lambda (source)
(string-replace-substring
(get-string-all source)
"libGLX_nvidia.so.0"
"libEGL_nvidia.so.0")))))))
;; ------------------------------
;; ICD Loader for OpenCL ;; ICD Loader for OpenCL
(let ((file (string-append etcdir "/OpenCL/vendors/nvidia.icd"))) (let ((file (string-append etcdir "/OpenCL/vendors/nvidia.icd")))
(mkdir-p (string-append etcdir "/OpenCL/vendors/")) (mkdir-p (string-append etcdir "/OpenCL/vendors/"))
@ -122,12 +167,13 @@
(display (string-append out "/lib/libnvidia-opencl.so.1") port))) (display (string-append out "/lib/libnvidia-opencl.so.1") port)))
(chmod file #o555)) (chmod file #o555))
;; ------------------------------
;; Add udev rules for nvidia ;; Add udev rules for nvidia
(let ((rulesdir (string-append out "/lib/udev/rules.d/")) (let ((rulesdir (string-append out "/lib/udev/rules.d/"))
(rules (string-append out "/lib/udev/rules.d/90-nvidia.rules")) (rules (string-append out "/lib/udev/rules.d/90-nvidia.rules"))
(sh (string-append (assoc-ref inputs "bash-minimal") "/bin/sh")) (sh (string-append (assoc-ref inputs "bash-minimal") "/bin/sh"))
(mknod (string-append (assoc-ref inputs "coreutils") "/bin/mknod")) (mknod (string-append (assoc-ref inputs "coreutils") "/bin/mknod"))
(cut (string-append (assoc-ref inputs "coreutils") "/bin/cut")) (cut (string-append (assoc-ref inputs "coreutils") "/bin/cut"))
(grep (string-append (assoc-ref inputs "grep") "/bin/grep"))) (grep (string-append (assoc-ref inputs "grep") "/bin/grep")))
(mkdir-p rulesdir) (mkdir-p rulesdir)
(call-with-output-file rules (call-with-output-file rules
@ -173,7 +219,6 @@
;; ------------------------------ ;; ------------------------------
;; nvidia-smi ;; nvidia-smi
(install-file "nvidia-smi" bindir) (install-file "nvidia-smi" bindir)
;; ------------------------------ ;; ------------------------------
@ -196,6 +241,9 @@
(string-append (assoc-ref inputs "cairo") "/lib") (string-append (assoc-ref inputs "cairo") "/lib")
(string-append (assoc-ref inputs "gdk-pixbuf") "/lib") (string-append (assoc-ref inputs "gdk-pixbuf") "/lib")
(string-append (assoc-ref inputs "wayland") "/lib") (string-append (assoc-ref inputs "wayland") "/lib")
(string-append (assoc-ref inputs "libdrm") "/lib") ; libdrm.so
;; mesa >= 21.2 provids libgbm.so.1 -- see 39B "REQUIREMENTS"
(string-append (assoc-ref inputs "mesa") "/lib")
(string-append (assoc-ref inputs "gcc:lib") "/lib")) (string-append (assoc-ref inputs "gcc:lib") "/lib"))
":"))) ":")))
(define (patch-elf file) (define (patch-elf file)
@ -236,7 +284,20 @@
(symlink (basename file) mid-file)))) (symlink (basename file) mid-file))))
(find-files libdir "\\.so\\.")) (find-files libdir "\\.so\\."))
(symlink ,(string-append "libglxserver_nvidia.so." version) (symlink ,(string-append "libglxserver_nvidia.so." version)
(string-append out "/lib/xorg/modules/extensions/" "libglxserver_nvidia.so"))) (string-append out "/lib/xorg/modules/extensions/" "libglxserver_nvidia.so"))
;; ------------------------------
;; Install GBM backend
;;
;; export GBM_BACKENDS_PATH=/gnu/store/...-nvidia-driver-VERSION/lib/gbm/nvidia-drm_gbm.so
;; see [2/2] https://github.com/Frogging-Family/nvidia-all/commit/ef12a70f293cb23b35205503eab4de63af52305d
;; see [1/2] https://github.com/Frogging-Family/nvidia-all/commit/9404b959dce5152da15afb5b9cda4907c3492e8d
;; see [0/2] https://github.com/Frogging-Family/nvidia-all/commit/e7b6638d4640a490e365387a6351d162c8c69cdd
(let* ((old (string-append out "/lib/libnvidia-allocator.so." ,version))
(new (string-append out "/lib/gbm/nvidia-drm_gbm.so")))
(mkdir (string-append out "/lib/gbm"))
(format #t "SYMLINK ~a -> ~a~%" old new)
(symlink old new)))
#t))))) #t)))))
(supported-systems '("x86_64-linux")) (supported-systems '("x86_64-linux"))
(native-inputs (native-inputs
@ -258,6 +319,8 @@
("gtk2" ,gtk+-2) ("gtk2" ,gtk+-2)
("kmod" ,kmod) ("kmod" ,kmod)
("libc" ,glibc) ("libc" ,glibc)
("libdrm" ,libdrm)
("mesa" ,mesa)
("libx11" ,libx11) ("libx11" ,libx11)
("libxext" ,libxext) ("libxext" ,libxext)
("linux" ,linux-lts) ("linux" ,linux-lts)
@ -276,13 +339,13 @@ Further xorg should be configured by adding:
(define-public nvidia-libs (define-public nvidia-libs
(package (package
(name "nvidia-libs") (name "nvidia-libs")
(version "470.86") (version "495.46")
(source (source
(origin (origin
(uri (format #f "http://us.download.nvidia.com/XFree86/Linux-x86_64/~a/~a.run" (uri (format #f "http://us.download.nvidia.com/XFree86/Linux-x86_64/~a/~a.run"
version version
(format #f "NVIDIA-Linux-x86_64-~a" version))) (format #f "NVIDIA-Linux-x86_64-~a" version)))
(sha256 (base32 "0krwcxc0j19vjnk8sv6mx1lin2rm8hcfhc2hg266846jvcws1dsg")) (sha256 (base32 "1xb23kimlfsailpwy7kv4l217id5jpmdc4svm9kldid0gp8pffyq"))
(method url-fetch) (method url-fetch)
(file-name (string-append "nvidia-driver-" version "-checkout")))) (file-name (string-append "nvidia-driver-" version "-checkout"))))
(build-system copy-build-system) (build-system copy-build-system)
@ -298,7 +361,7 @@ Further xorg should be configured by adding:
(delete 'build) (delete 'build)
(delete 'check) (delete 'check)
(add-after 'install 'patch-symlink (add-after 'install 'patch-symlink
(lambda* (#:key inputs native-inputs outputs #:allow-other-keys) (lambda* (#:key inputs native-inputs outputs #:allow-other-keys)
(use-modules (ice-9 ftw) (use-modules (ice-9 ftw)
(ice-9 regex) (ice-9 regex)
(ice-9 textual-ports)) (ice-9 textual-ports))
@ -326,6 +389,8 @@ Further xorg should be configured by adding:
(string-append (assoc-ref inputs "libx11") "/lib") (string-append (assoc-ref inputs "libx11") "/lib")
(string-append (assoc-ref inputs "libxext") "/lib") (string-append (assoc-ref inputs "libxext") "/lib")
(string-append (assoc-ref inputs "pango") "/lib") (string-append (assoc-ref inputs "pango") "/lib")
(string-append (assoc-ref inputs "libdrm") "/lib") ; libdrm.so
(string-append (assoc-ref inputs "mesa") "/lib") ; libgbm.so
(string-append (assoc-ref inputs "wayland") "/lib")) (string-append (assoc-ref inputs "wayland") "/lib"))
":"))) ":")))
(define (patch-elf file) (define (patch-elf file)
@ -343,7 +408,6 @@ Further xorg should be configured by adding:
(for-each (lambda (file) (for-each (lambda (file)
(let* ((short (regexp-substitute (let* ((short (regexp-substitute
#f #f
(string-match "([^/]*\\.so).*" file) (string-match "([^/]*\\.so).*" file)
1)) 1))
(major (cond (major (cond
@ -365,9 +429,9 @@ Further xorg should be configured by adding:
(format #t "Linking ~a to ~a ...~%" mid file) (format #t "Linking ~a to ~a ...~%" mid file)
(symlink (basename file) mid-file)))) (symlink (basename file) mid-file))))
(find-files libdir "\\.so\\.")) (find-files libdir "\\.so\\."))
#t)))) #t))))
#:install-plan #:install-plan
,@(match (%current-system) ,@(match (%current-system)
("x86_64-linux" '(`(("." "lib" #:include-regexp ("^./[^/]+\\.so"))))) ("x86_64-linux" '(`(("." "lib" #:include-regexp ("^./[^/]+\\.so")))))
("i686-linux" '(`(("32" "lib" #:include-regexp ("^./[^/]+\\.so"))))) ("i686-linux" '(`(("32" "lib" #:include-regexp ("^./[^/]+\\.so")))))
(_ '())))) (_ '()))))
@ -388,14 +452,15 @@ Further xorg should be configured by adding:
("gtk2" ,gtk+-2) ("gtk2" ,gtk+-2)
("libc" ,glibc) ("libc" ,glibc)
("libx11" ,libx11) ("libx11" ,libx11)
("libdrm" ,libdrm)
("mesa" ,mesa)
("libxext" ,libxext) ("libxext" ,libxext)
("wayland" ,wayland))) ("wayland" ,wayland)))
(home-page "https://www.nvidia.com") (home-page "https://www.nvidia.com")
(synopsis "Libraries of the proprietary Nvidia driver") (synopsis "Libraries of the proprietary Nvidia driver")
(description "These are the libraries of the evil Nvidia driver compatible (description "These are the libraries of the evil Nvidia driver compatible with the ones
with the ones usually provided by Mesa. To use these libraries with usually provided by Mesa. To use these libraries with packages that have been
packages that have been compiled with a mesa output, take a look at the nvda compiled with a mesa output, take a look at the nvda package.")
package.")
(license (license:nonfree (format #f "file:///share/doc/nvidia-driver-~a/LICENSE" version))))) (license (license:nonfree (format #f "file:///share/doc/nvidia-driver-~a/LICENSE" version)))))
;; nvda is used as a name because it has the same length as mesa which is ;; nvda is used as a name because it has the same length as mesa which is
@ -408,22 +473,27 @@ package.")
(build-system trivial-build-system) (build-system trivial-build-system)
(arguments (arguments
'(#:modules ((guix build union)) '(#:modules ((guix build union))
#:builder (begin #:builder
(use-modules (guix build union) (begin
(srfi srfi-1) (use-modules (guix build union)
(ice-9 regex)) (srfi srfi-1)
(union-build (assoc-ref %outputs "out") (ice-9 regex))
(list (assoc-ref %build-inputs "mesa") (assoc-ref %build-inputs "nvidia-libs")) (union-build (assoc-ref %outputs "out")
#:resolve-collision (lambda (files) (let ((file (list (assoc-ref %build-inputs "mesa")
(if (string-match "nvidia-libs" (first files)) (assoc-ref %build-inputs "nvidia-libs"))
(first files) #:resolve-collision
(last files)))) (lambda (files)
(format #t "chosen ~a ~%" file) (let ((file
file))) (if (string-match "nvidia-libs" (first files))
#t))) (first files)
(last files))))
(format #t "library collision: chosen ~a ~%" file)
file)))
#t)))
(description "These are the libraries of the evil Nvidia driver, (description "These are the libraries of the evil Nvidia driver,
packaged in such a way that you can use the transformation option packaged in such a way that you can use the transformation option
@code{--with-graft=mesa=nvda} to use the nvidia driver with a package that requires mesa.") @code{--with-graft=mesa=nvda} to use the nvidia driver with a package that
requires mesa.")
(inputs (inputs
`(("nvidia-libs" ,nvidia-libs) `(("nvidia-libs" ,nvidia-libs)
("mesa" ,mesa))) ("mesa" ,mesa)))