diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index 0cdb071ea0..2a40062500 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -51869,6 +51869,7 @@ (define-public rust-password-hash-0.2
                             ("rust-subtle" ,rust-subtle-2)
                             ("rust-rand-core" ,rust-rand-core-0.6))))))
 
+;; WARNING: This package is a dependency of mesa.
 (define-public rust-paste-1
   (package
     (name "rust-paste")
@@ -56703,6 +56704,7 @@ (define-public rust-proc-macro-nested-0.1
      "Support for nested proc-macro-hack invocations.")
     (license (list license:expat license:asl2.0))))
 
+;; WARNING: This package is a dependency of mesa.
 (define-public rust-proc-macro2-1
   (package
     (name "rust-proc-macro2")
@@ -60144,6 +60146,7 @@ (define-public rust-quinn-udp-0.1
         ("rust-tokio" ,rust-tokio-1)
         ("rust-tracing" ,rust-tracing-0.1))))))
 
+;; WARNING: This package is a dependency of mesa.
 (define-public rust-quote-1
   (package
     (name "rust-quote")
@@ -76939,6 +76942,7 @@ (define-public rust-symphonia-utils-xiph-0.4
 codecs and formats.")
     (license license:mpl2.0)))
 
+;; WARNING: This package is a dependency of mesa.
 (define-public rust-syn-2
   (package
     (name "rust-syn")
@@ -86599,6 +86603,7 @@ (define-public rust-unicode-id-0.3
 according to Unicode Standard Annex #31.")
     (license (list license:expat license:asl2.0))))
 
+;; WARNING: This package is a dependency of mesa.
 (define-public rust-unicode-ident-1
   (package
     (name "rust-unicode-ident")
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index c417f11571..3939f1ba1f 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -21,6 +21,7 @@
 ;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
 ;;; Copyright © 2024 Liliana Marie Prikler <liliana.prikler@gmail.com>
 ;;; Copyright © 2024 Artyom V. Poptsov <poptsov.artyom@gmail.com>
+;;; Copyright © 2024 aurtzy <aurtzy@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -41,6 +42,7 @@ (define-module (gnu packages gl)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages build-tools)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages documentation)
@@ -56,6 +58,7 @@ (define-module (gnu packages gl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages rust)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages video)
   #:use-module (gnu packages vulkan)
@@ -75,7 +78,8 @@ (define-module (gnu packages gl)
   #:use-module (guix gexp)
   #:use-module (guix utils)
   #:use-module (ice-9 match)
-  #:use-module ((srfi srfi-1) #:hide (zip)))
+  #:use-module ((srfi srfi-1) #:hide (zip))
+  #:use-module (srfi srfi-26))
 
 (define-public glu
   (package
@@ -352,10 +356,19 @@ (define-public mesa
                 pkg-config-for-build
                 wayland
                 wayland-protocols)
+          '())
+      (if (target-x86-64?)
+          ;; NVK dependencies
+          (list rust
+                (module-ref (resolve-interface '(gnu packages rust-apps))
+                            'rust-bindgen-cli)
+                (module-ref (resolve-interface '(gnu packages rust-apps))
+                            'rust-cbindgen-0.26))
           '())))
     (outputs '("out" "bin"))
     (arguments
      (list
+      #:meson meson-1.5
       #:configure-flags
       #~(list
          #$@(cond
@@ -387,7 +400,7 @@ (define-public mesa
          "-Dshared-glapi=enabled"
 
          #$@(cond
-             ((or (target-x86-32?) (target-x86-64?))
+             ((target-x86-32?)
               ;; This doesn't include nouveau (which is in "auto") as it needs
               ;; rust.
               ;; TODO: Enable nouveau/NVK.
@@ -481,6 +494,53 @@ (define-public mesa
                       (("'lp_test_arit', ") ""))))
                  (_
                   '((display "No tests to disable on this architecture.\n"))))))
+         #$@(if (target-x86-64?)
+                #~((add-after 'unpack 'patch-subproject-sources
+                     (lambda _
+                       ;; Patch each relevant subproject source URL in wrapfiles to
+                       ;; use the store, which avoids an attempt to download them
+                       ;; mid-build.
+                       (for-each
+                        (match-lambda
+                          ((name source)
+                           (let ((wrap-file (string-append
+                                             "subprojects/" name ".wrap"))
+                                 (subproject-dest (string-append
+                                                   "subprojects/" name))
+                                 (overlay-dir (string-append
+                                               "subprojects/packagefiles/" name)))
+                             (copy-recursively source subproject-dest)
+                             ;; Normally when the patch_directory wrap file property
+                             ;; is specified, meson automatically copies from
+                             ;; packagefiles, but this is not the case here (only
+                             ;; happens when downloading source?) so we manually copy
+                             ;; overlay-dir to subproject-dest.
+                             (when (file-exists? overlay-dir)
+                               (copy-recursively overlay-dir subproject-dest))
+                             (call-with-output-file wrap-file
+                               (lambda (port)
+                                 (format port "[wrap-file]
+directory = ~a
+"
+                                         name))))))
+                        '#+(map (lambda (pkg)
+                                  (let ((name (package-upstream-name* pkg))
+                                        (version (package-version pkg)))
+                                    (list (package-upstream-name* pkg)
+                                          (file-append pkg
+                                                       "/share/cargo/src/"
+                                                       name "-" version))))
+                                (let ((from-crates-io
+                                       (cut module-ref
+                                            (resolve-interface
+                                             '(gnu packages crates-io))
+                                            <>)))
+                                  (list (from-crates-io 'rust-syn-2)
+                                        (from-crates-io 'rust-unicode-ident-1)
+                                        (from-crates-io 'rust-quote-1)
+                                        (from-crates-io 'rust-proc-macro2-1)
+                                        (from-crates-io 'rust-paste-1))))))))
+                #~())
          (add-before 'configure 'fix-dlopen-libnames
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((out #$output))
