Subject: [PATCH v2] gnu: Add gamescope.

From: aurtzy <[email-masked]>
Date: Sun, 11 May 2025 18:40:39 -0400

From: dan <[email-masked]>

* gnu/packages/wm.scm (%gamescope-version, libliftoff-for-gamescope,
reshade-for-gamescope, vkroots-for-gamescope, wlroots-for-gamescope,
gamescope): New variables.

Change-Id: If86bc6127144854189f8fa66415f32bc80a26d6b
Co-authored-by: aurtzy <[email-masked]>
Co-authored-by: Demis Balbach <[email-masked]>
---

Hey,

(Coming from: <https://gitlab.com/nonguix/nonguix/-/merge_requests/452>)

Sorry about the long delay!  Finally got around to looking at this again.  I've
attached a v2 with our patches combined in addition to any updates since then,
with all notable changes from v1 listed below.

This depends on a pending patch to add stb-image-resize [1].

Changes from dan's v1:
- Update gamescope version to 3.16.4.
- Drop libavif-1.0 patch; we can use libavif which is updated, now.
- Convert libliftoff and vkroots patches to libliftoff-for-gamescope and
  vkroots-for-gamescope due to upstream relying on unstable features and
  strongly recommending against using different versions [2].  Also subject
  wlroots to this treatment.
- Use origin snippet to add pinned submodule/dependency sources.
- Remove HWDATA_PNP_IDS configure flag, since (IIUC) hwdata outputs have since
  been merged into the default "out" output which made pkgconfig able to
  automatically find hwdata files.
- Add a 'patch-loader-path phase to fix an error when starting gamescope due to
  "Failed to load vulkan module" (related issue [3]).
- Add a 'patch-version phase that patches in version number instead of trying to
  execute git to infer version from tag.
- Opt for patching stb via wrap file instead of meson.build which should
  (probably) be less brittle.
- Drop libdisplay-info patch, since versions up to 0.3.0 are accepted now.
- Use gcc instead of gcc-toolchain (toolchain version doesn't seem to be
  needed?).  Also use newer version (gcc-14) since gamescope 3.16.4 would fail
  to build without at least gcc-13.
- Include various additional inputs that are searched for during the build.

Related side note: I've managed to get gamescope with the "nice" capability
working with the following services (some personal config stuff omitted so it
can work for others; source here [4]), although I'm still trying to figure out
if anything can be done about removing a hack that's currently needed:
#+begin_src scheme
  ;; gamescopereaper needs to be available in PATH.
  (list (simple-service 'name
                        profile-service-type
                        (list gamescope))
        (simple-service 'name
                        privileged-program-service-type
                        (list (privileged-program
                               (program (file-append gamescope "/bin/gamescope"))
                               (capabilities "cap_sys_nice=eip"))))
        ;; HACK: Using privileges causes gamescope to not inherit
        ;; environment, so it fails an attempt to search for needed
        ;; vulkan files.  Conveniently provide them at this location,
        ;; which gamescope searches by default.
        (simple-service 'name
                        etc-service-type
                        `(("vulkan" ,(file-append mesa "/share/vulkan")))))
#+end_src

[1] https://issues.guix.gnu.org/78294

[2] https://github.com/ValveSoftware/gamescope/commit/7741cd587fa2274989f3307a3c6f23ab08e98460

[3] https://issues.guix.gnu.org/71109

[4] https://github.com/aurtzy/guix-config/blob/54eeb0a1587a90b4c59ae88e96c1609ba6cebeba/modules/my-guix/mods/entertainment.scm#L70

Cheers,

aurtzy

 gnu/packages/wm.scm | 182 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 181 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 66dd5f2035..6d01066570 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -81,6 +81,8 @@
 ;;; Copyright © 2025 Tomáš Čech <[email-masked]>
 ;;; Copyright © 2025 Ricardo Wurmus <[email-masked]>
 ;;; Copyright © 2025 Junker <[email-masked]>
+;;; Copyright © 2022 Demis Balbach <[email-masked]>
+;;; Copyright © 2025 aurtzy <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -117,6 +119,7 @@ (define-module (gnu packages wm)
   #:use-module (guix utils)
   #:use-module (gnu packages)
   #:use-module (gnu packages bash)
+  #:use-module (gnu packages benchmark)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
@@ -179,8 +182,10 @@ (define-module (gnu packages wm)
   #:use-module (gnu packages qt)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages regex)
+  #:use-module (gnu packages sdl)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages sphinx)
+  #:use-module (gnu packages stb)
   #:use-module (gnu packages suckless)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages textutils)
@@ -189,7 +194,8 @@ (define-module (gnu packages wm)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xml)
-  #:use-module (gnu packages xorg))
+  #:use-module (gnu packages xorg)
+  #:use-module (srfi srfi-26))
 
 (define-public bspwm
   (package
@@ -4419,3 +4425,177 @@ (define-public scenefx
      "A drop-in replacement for the wlroots scene API that allows wayland
 compositors to render surfaces with eye-candy effects.")
     (license license:expat)))
+
+;; Upstream strongly recommends using some of its pinned dependencies due to
+;; relying on unstable features; these should be checked when updating
+;; gamescope.  See:
+;; <https://github.com/ValveSoftware/gamescope/commit/7741cd587fa2274989f3307a3c6f23ab08e98460>
+(define %gamescope-version "3.16.4")
+
+(define libliftoff-for-gamescope
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://gitlab.freedesktop.org/emersion/libliftoff.git")
+          (commit "8b08dc1c14fd019cc90ddabe34ad16596b0691f4")))
+    (file-name (git-file-name "libliftoff-for-gamescope" %gamescope-version))
+    (sha256 (base32 "163g8ndsbma7acy2k9mrnvlpb7yi4431hgkx1gygkafgwpq1ii1x"))))
+
+(define reshade-for-gamescope
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://github.com/Joshua-Ashton/reshade")
+          (commit "696b14cd6006ae9ca174e6164450619ace043283")))
+    (file-name (git-file-name "reshade-for-gamescope" %gamescope-version))
+    (sha256
+     (base32 "1zvhf3pgd8bhn8bynrsh725xn1dszsf05j8c9g6zabgv7vnz04a5"))))
+
+(define vkroots-for-gamescope
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://github.com/Joshua-Ashton/vkroots")
+          (commit "5106d8a0df95de66cc58dc1ea37e69c99afc9540")))
+    (file-name (git-file-name "vkroots-for-gamescope" %gamescope-version))
+    (sha256 (base32 "0hrp0xqq93552ipw2bmryixgm1aywnz49xagsx5rwzg2d0hwa0aa"))))
+
+(define wlroots-for-gamescope
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://github.com/Joshua-Ashton/wlroots.git")
+          (commit "4bc5333a2cbba0b0b88559f281dbde04b849e6ef")))
+    (file-name (git-file-name "wlroots-for-gamescope" %gamescope-version))
+    (sha256 (base32 "14m9j9qkaphzm3g36im43b6h92rh3xyjh7j46vw9w2qm602ndwcf"))))
+
+(define-public gamescope
+  (package
+    (name "gamescope")
+    (version %gamescope-version)
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ValveSoftware/gamescope")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "09h7046vwqn0w3kv1zaij4h3rcrvs1r2qlm0vva3mk3gg44fnhjl"))
+       (modules '((guix build utils)
+                  (ice-9 match)))
+       (snippet
+        #~(begin
+            ;; Add some dependencies to source tree where they're expected.
+            (for-each (match-lambda
+                        ((source dest)
+                         (copy-recursively source dest)))
+                      '((#$libliftoff-for-gamescope "subprojects/libliftoff")
+                        (#$reshade-for-gamescope "src/reshade")
+                        (#$vkroots-for-gamescope "subprojects/vkroots")
+                        (#$wlroots-for-gamescope "subprojects/wlroots")))))))
+    (build-system meson-build-system)
+    (arguments
+     (list
+      #:configure-flags #~(list "-Dpipewire=enabled"
+                                "-Denable_openvr_support=false")
+      #:modules '((guix build meson-build-system)
+                  (guix build utils)
+                  (srfi srfi-26))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-usr-dir
+            (lambda _
+              (substitute* "src/reshade_effect_manager.cpp"
+                (("/usr") #$output))))
+          (add-after 'unpack 'patch-loader-path
+            ;; "Failed to load vulkan module" error occurs without this patch.
+            ;; Related issue: https://issues.guix.gnu.org/71109
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "src/rendervulkan.cpp"
+                (("dlopen\\( \"libvulkan\\.so")
+                 (string-append "dlopen( \""
+                                (search-input-file
+                                 inputs "/lib/libvulkan.so"))))))
+          (add-after 'unpack 'patch-version
+            (lambda _
+              (substitute* "src/meson.build"
+                (("^vcs_tag = .*$")
+                 (string-append
+                  "vcs_tag = '" #$(package-version this-package) "'\n")))))
+          (add-after 'unpack 'patch-stb
+            (lambda _
+              (let ((stb-files-dir #+(directory-union
+                                      "stb"
+                                      (map (cut this-package-native-input <>)
+                                           (list "stb-image"
+                                                 "stb-image-write"
+                                                 "stb-image-resize")))))
+                (copy-recursively (string-append stb-files-dir "/include")
+                                  "subprojects/stb"))
+              (copy-recursively "subprojects/packagefiles/stb"
+                                "subprojects/stb")
+              (call-with-output-file "subprojects/stb.wrap"
+                (cut format <> "\
+[wrap-file]
+directory = stb
+"))))
+          (add-after 'unpack 'patch-spirv-headers
+            (lambda _
+              (substitute* "src/meson.build"
+                (("../thirdparty/SPIRV-Headers")
+                 #$(this-package-native-input "spirv-headers"))))))))
+    (native-inputs (list gcc-14
+                         glslang
+                         pkg-config
+                         python-3
+                         spirv-headers
+                         stb-image
+                         stb-image-write
+                         stb-image-resize
+                         vulkan-headers))
+    (inputs (list benchmark
+                  glm
+                  hwdata
+                  lcms
+                  libavif
+                  libdecor
+                  libdisplay-info
+                  libdrm
+                  libei
+                  libinput
+                  libseat
+                  libx11
+                  libxcomposite
+                  libxcursor
+                  libxdamage
+                  libxext
+                  libxkbcommon
+                  libxmu
+                  libxrender
+                  libxres
+                  libxt
+                  libxtst
+                  libxxf86vm
+                  luajit
+                  pipewire
+                  pixman
+                  sdl2
+                  vulkan-loader
+                  xcb-util-wm
+                  xcb-util-errors
+                  xorg-server-xwayland
+                  wayland
+                  wayland-protocols))
+    (home-page "https://github.com/ValveSoftware/gamescope")
+    (synopsis "Micro-compositor for running games")
+    (description
+     "gamescope is a micro-compositor for running games.  Its goal is to
+provide an isolated compositor that is tailored towards gaming and supports
+many gaming-centric features such as:
+@itemize
+@item Spoofing resolutions.
+@item Upscaling.
+@item Limiting framerates.
+@end itemize")
+    (license license:bsd-2)))

base-commit: 8635dad843d299497bd46e036266a8b2a2abff11
-- 
2.49.0