[bug#70493,v2] gnu: Add gamescope.
Commit Message
From: dan <i@dan.games>
* 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 <aurtzy@gmail.com>
Co-authored-by: Demis Balbach <db@minikn.xyz>
---
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(-)
base-commit: 8635dad843d299497bd46e036266a8b2a2abff11
@@ -81,6 +81,8 @@
;;; Copyright © 2025 Tomáš Čech <sleep_walker@gnu.org>
;;; Copyright © 2025 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2025 Junker <dk@junkeria.club>
+;;; Copyright © 2022 Demis Balbach <db@minikn.xyz>
+;;; Copyright © 2025 aurtzy <aurtzy@gmail.com>
;;;
;;; 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)))