feat: Gaming on NVIDIA is not offered any more, the SteamOS conversion covers NVIDIA PCs
Sync git.upriser.nl mirror / sync (push) Skipped

The conversion installs the patched gamescope on every NVIDIA PC and sets up the kernel parameters, suspend memory and 32-bit libraries on a supported card; it turns off an existing Gaming on NVIDIA.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KkpbsMw4rQyBsxDG6ebHK2
This commit is contained in:
theupriserandClaude Sonnet 5.5 committed 2026-10-13 18:27:13 +02:00
1 parent 2811ecce1c
commit f3cd053ea0
7 files changed
+45 -58

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@ one per merged pull request.
## 2.11.2 - 2026-10-13 ## 2.11.2 - 2026-10-13
- **feat: the SteamOS conversion is offered on NVIDIA PCs again (GTX 16 / RTX 20 series or newer: Turing and later, the cards NVIDIA's open kernel driver supports): it builds and installs a patched gamescope from [steamify-gamescope-nvidia](https://github.com/theupriser/steamify-gamescope-nvidia) (GBM-allocated scan-out buffers, NVIDIA's corrupted gaming-mode picture, gamescope#2309; a few minutes to build) and sets `gamescope_drm_gbm_scanout=1` for the session (`lib/gamescope-nvidia.sh`). On those cards it replaces "Gaming on NVIDIA" (kernel parameters, early modules, suspend memory and the 32-bit libraries come with it); "Gaming on NVIDIA" is only offered on older NVIDIA cards, or while it is on (turn it off or swap it for the conversion; the two exclude each other); single user mode works with either. Tested on an RTX 5080 (driver 615.78.08): Steam's gaming UI is clean with it and shows artifacts without. The package is pinned to one gamescope release: updating it is not automatic yet** - **feat: the SteamOS conversion is offered on NVIDIA PCs again (GTX 16 / RTX 20 series or newer: Turing and later, the cards NVIDIA's open kernel driver supports): it builds and installs a patched gamescope from [steamify-gamescope-nvidia](https://github.com/theupriser/steamify-gamescope-nvidia) (GBM-allocated scan-out buffers, NVIDIA's corrupted gaming-mode picture, gamescope#2309; a few minutes to build) and sets `gamescope_drm_gbm_scanout=1` for the session (`lib/gamescope-nvidia.sh`). It replaces "Gaming on NVIDIA", which is not offered any more (the kernel parameters, early modules, suspend memory and the 32-bit libraries come with the conversion on a supported card; a PC that had "Gaming on NVIDIA" on has it turned off when the conversion is turned on). Tested on an RTX 5080 (driver 615.78.08): Steam's gaming UI is clean with it and shows artifacts without. The package is pinned to one gamescope release: updating it is not automatic yet**
- **feat: "Gaming on NVIDIA" also keeps video memory over suspend (`NVreg_PreserveVideoMemoryAllocations=1` in `/etc/modprobe.d/90-steamify-nvidia.conf`, the initramfs is rebuilt), enables `nvidia-suspend`/`nvidia-resume`/`nvidia-hibernate`, and installs `lib32-nvidia-utils` and `lib32-libxkbcommon` (32-bit games, the 32-bit MangoHud preload) on a supported card; off removes only what Steamify added. Untested on hardware yet** - **feat: "Gaming on NVIDIA" also keeps video memory over suspend (`NVreg_PreserveVideoMemoryAllocations=1` in `/etc/modprobe.d/90-steamify-nvidia.conf`, the initramfs is rebuilt), enables `nvidia-suspend`/`nvidia-resume`/`nvidia-hibernate`, and installs `lib32-nvidia-utils` and `lib32-libxkbcommon` (32-bit games, the 32-bit MangoHud preload) on a supported card; off removes only what Steamify added. Untested on hardware yet**
+10 -11
View File
@@ -245,18 +245,17 @@ without. The patch is nine commits of [farnoy/gamescope](https://github.com/farn
that repository, builds the package as the user (`makepkg -sf`) and installs it with `pacman -U --ask 4` (the package provides and that repository, builds the package as the user (`makepkg -sf`) and installs it with `pacman -U --ask 4` (the package provides and
conflicts with `gamescope`). It is opt-in inside gamescope: `gamescope_drm_gbm_scanout=1` in conflicts with `gamescope`). It is opt-in inside gamescope: `gamescope_drm_gbm_scanout=1` in
`~/.config/gamescope-session/environment` and `~/.config/environment.d/99-steamify-gamescope-nvidia.conf`. The SteamOS conversion `~/.config/gamescope-session/environment` and `~/.config/environment.d/99-steamify-gamescope-nvidia.conf`. The SteamOS conversion
(`gaming_enable`) does this on a supported card (`nvidia_supported`), together with what "Gaming on NVIDIA" sets up there (the kernel (`gaming_enable`) does this on every NVIDIA PC (`nvidia_present`: PCI vendor 0x10de, display class, its driver providing
parameters, the early modules, suspend memory, the 32-bit libraries: `nvidia_kernel_enable`, `nvidia_extras_enable`). So on a `nvidia_drm`), together with what "Gaming on NVIDIA" set up (on a supported card, `nvidia_supported`: GTX 16 / RTX 20 series or
supported card the conversion replaces "Gaming on NVIDIA": that one is only offered on older NVIDIA cards, or while it is already on newer, Turing and later): the kernel parameters, the early modules, suspend memory, the 32-bit libraries (`nvidia_kernel_enable`,
(to turn it off, or swap it for the conversion; the two exclude each other: `toggle_component`, `backend.sh`, `AppState.qml`). `nvidia_extras_enable`). So the SteamOS conversion is the one gaming option on NVIDIA now, and "Gaming on NVIDIA" (below) is not
Single user mode works with either. Turning the conversion off removes the setting and those settings, and keeps the packages. The package is pinned to the gamescope release the patch was made for offered any more (`nvidia_available`); a PC that had it on keeps it until the conversion is turned on, which turns it off
(`UPSTREAM_VERSION` in that repository): pacman does not update it, and Steamify does not rebuild it yet. (`nvidia_swap_out`). Turning the conversion off removes the setting and those settings, and keeps the packages. The package is
pinned to the gamescope release the patch was made for (`UPSTREAM_VERSION` in that repository): pacman does not update it, and
Steamify does not rebuild it yet. Tested on an RTX 5080 only.
So with an NVIDIA GPU (PCI vendor 0x10de, display class, its driver providing `nvidia_drm`: `nvidia_present`) the SteamOS Before 2.11.2, with an NVIDIA GPU the SteamOS conversion (`gaming`, and its options `boot`, `single`, `glyphs`) wasn't offered, unless
conversion (`gaming`, and its options `boot`, `single`, `glyphs`) is only offered on a supported card (GTX 16 / RTX 20 series or newer, Turing and later, it was already on. `nvidia` ("Gaming on NVIDIA", `lib/nvidia.sh`) took its place (both would start Steam at login): it installs `steam` when missing (recorded in state `nvidia`, removed again only then) and enables the user
`nvidia_supported`) with the patched gamescope described below, or when it is already on (so it can be turned off).
`nvidia` ("Gaming on NVIDIA", `lib/nvidia.sh`) is for older NVIDIA cards (and for PCs where it is already on), and excludes the
conversion (both would start Steam at login): it installs `steam` when missing (recorded in state `nvidia`, removed again only then) and enables the user
unit `steamify-steam-autostart.service` (`services/`, `ExecStart=/usr/bin/steam @ARGS@`, Plasma only). Its sub-option unit `steamify-steam-autostart.service` (`services/`, `ExecStart=/usr/bin/steam @ARGS@`, Plasma only). Its sub-option
`bigpicture` ("Steam starts in Big Picture", ticked along with it) rewrites the unit with `-gamepadui` and sets `bigpicture` ("Steam starts in Big Picture", ticked along with it) rewrites the unit with `-gamepadui` and sets
`ksmserverrc [General] loginMode=emptySession` (`kset`, undone with `krevert bigpicture`), so windows of the last session `ksmserverrc [General] loginMode=emptySession` (`kset`, undone with `krevert bigpicture`), so windows of the last session
+2 -8
View File
@@ -147,15 +147,9 @@ backend_apply() {
for id in "${want[@]}"; do [[ "$id" == "$c" ]] && WANTED[$c]=1; done for id in "${want[@]}"; do [[ "$id" == "$c" ]] && WANTED[$c]=1; done
done done
# The same rules as the menu's toggles. # The same rules as the menu's toggles.
# (Single user mode only needs the conversion where it is offered: not on NVIDIA PCs, where it works without it.) [[ "${WANTED[single]:-0}" == 1 ]] && component_available gaming && WANTED[gaming]=1
[[ "${WANTED[single]:-0}" == 1 ]] && component_available gaming && ! nvidia_present && WANTED[gaming]=1
# On NVIDIA the conversion and "Gaming on NVIDIA" exclude each other: the one that is not on yet wins.
if nvidia_present && [[ "${WANTED[gaming]:-0}" == 1 && "${WANTED[nvidia]:-0}" == 1 ]]; then
if [[ "${CURRENT[gaming]:-0}" == 1 ]]; then WANTED[gaming]=0; WANTED[boot]=0; WANTED[silent]=0; WANTED[glyphs]=0
else WANTED[nvidia]=0; WANTED[bigpicture]=0; WANTED[nvsilent]=0; fi
fi
if component_available gaming; then if component_available gaming; then
[[ "${WANTED[gaming]:-0}" == 0 ]] && { nvidia_present || WANTED[single]=0; WANTED[boot]=0; } [[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; }
else else
WANTED[boot]=0 WANTED[boot]=0
fi fi
+10 -6
View File
@@ -4,8 +4,9 @@
# https://github.com/theupriser/steamify-gamescope-nvidia; the package `steamify-gamescope-nvidia` is built here, on the PC, # https://github.com/theupriser/steamify-gamescope-nvidia; the package `steamify-gamescope-nvidia` is built here, on the PC,
# and replaces `gamescope` (it provides it). The patch is opt-in: gamescope reads `gamescope_drm_gbm_scanout=1` from its # and replaces `gamescope` (it provides it). The patch is opt-in: gamescope reads `gamescope_drm_gbm_scanout=1` from its
# environment, which is set for the gaming session (gamescope-session's environment file, and environment.d). # environment, which is set for the gaming session (gamescope-session's environment file, and environment.d).
# Used by the SteamOS conversion (`gaming_enable`/`gaming_disable`) on a supported NVIDIA card (`nvidia_supported`): # Used by the SteamOS conversion (`gaming_enable`/`gaming_disable`) on every NVIDIA PC (`nvidia_present`); the kernel
# GTX 16 / RTX 20 series or newer (Turing and later, what NVIDIA's open kernel driver supports). # parameters and the rest of lib/nvidia.sh's setup only on a supported card (`nvidia_supported`): GTX 16 / RTX 20 series or
# newer (Turing and later, what NVIDIA's open kernel driver supports). Tested on an RTX 5080 only.
# Sourced by steamify.sh; not meant to be run on its own. # Sourced by steamify.sh; not meant to be run on its own.
GSN_PKG=steamify-gamescope-nvidia GSN_PKG=steamify-gamescope-nvidia
@@ -60,9 +61,12 @@ gsn_env_disable() {
gsn_enable() { gsn_enable() {
# Only on a supported NVIDIA card; elsewhere the stock gamescope is right. # Only on a supported NVIDIA card; elsewhere the stock gamescope is right.
nvidia_supported || return 0 nvidia_present || return 0
# What NVIDIA's DRM stack wants (lib/nvidia.sh): modeset/fbdev on the kernel command line, the modules in the # A PC that had "Gaming on NVIDIA" on: Steam must not also start on the desktop.
# initramfs, video memory kept over suspend, the 32-bit libraries. Takes effect at the next boot, like the session. nvidia_swap_out
# What NVIDIA's DRM stack wants (lib/nvidia.sh; a supported card only, the functions check): modeset/fbdev on the
# kernel command line, the modules in the initramfs, video memory kept over suspend, the 32-bit libraries. Takes
# effect at the next boot, like the session.
nvidia_kernel_enable || return 1 nvidia_kernel_enable || return 1
nvidia_extras_enable || return 1 nvidia_extras_enable || return 1
gsn_install_package || return 1 gsn_install_package || return 1
@@ -74,7 +78,7 @@ gsn_disable() {
# The setting goes, and what nvidia_*_enable added; the packages stay (patched gamescope, 32-bit libraries), like # The setting goes, and what nvidia_*_enable added; the packages stay (patched gamescope, 32-bit libraries), like
# the other packages of the conversion (steam, gamescope-session-cachyos). # the other packages of the conversion (steam, gamescope-session-cachyos).
gsn_env_disable gsn_env_disable
nvidia_supported || return 0 nvidia_present || return 0
nvidia_extras_disable nvidia_extras_disable
nvidia_kernel_disable nvidia_kernel_disable
} }
+5 -18
View File
@@ -57,12 +57,9 @@ declare -A CURRENT WANTED
component_available() { component_available() {
case "$1" in case "$1" in
# gamescope's own session shows a corrupted picture on NVIDIA unless it is the patched one (lib/gamescope-nvidia.sh, # The SteamOS conversion is offered on NVIDIA PCs too: it installs the patched gamescope there (lib/gamescope-nvidia.sh)
# installed with the conversion on a supported card); "Gaming on NVIDIA" is the alternative there. Older NVIDIA # and turns off "Gaming on NVIDIA" (lib/nvidia.sh), which is not offered any more (nvidia_available).
# cards only get the alternative (the conversion is shown anyway when it's already on, so it can be turned off). nvidia|bigpicture|nvsilent) nvidia_available ;;
gaming|boot|silent|glyphs) ! nvidia_present || gaming_status || nvidia_supported ;;
nvidia) nvidia_available ;;
bigpicture|nvsilent) bigpicture_available ;;
machine|poweroff) machine_available ;; machine|poweroff) machine_available ;;
vram) vram_available ;; vram) vram_available ;;
# Steamify in the Steam library is for gaming mode's controller: not needed for Big Picture on the desktop (NVIDIA PCs; # Steamify in the Steam library is for gaming mode's controller: not needed for Big Picture on the desktop (NVIDIA PCs;
@@ -297,9 +294,8 @@ toggle_component() {
component_selectable "$c" || return 1 component_selectable "$c" || return 1
WANTED[$c]=$(( 1 - WANTED[$c] )) WANTED[$c]=$(( 1 - WANTED[$c] ))
# Single user mode only makes sense on top of the SteamOS conversion. # Single user mode only makes sense on top of the SteamOS conversion.
# (On NVIDIA the conversion isn't offered: single user mode logs in by itself, see lib/single-user.sh.) if [[ "$c" == single && "${WANTED[single]}" == 1 ]] && component_available gaming; then WANTED[gaming]=1; fi
if [[ "$c" == single && "${WANTED[single]}" == 1 ]] && component_available gaming && ! nvidia_present; then WANTED[gaming]=1; fi if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[single]=0; WANTED[boot]=0; fi
if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then nvidia_present || WANTED[single]=0; WANTED[boot]=0; fi
# Where to boot to is part of the conversion, too. # Where to boot to is part of the conversion, too.
if [[ "$c" == boot && "${WANTED[boot]}" == 1 ]]; then WANTED[gaming]=1; fi if [[ "$c" == boot && "${WANTED[boot]}" == 1 ]]; then WANTED[gaming]=1; fi
# Big Picture is opt-out: ticked along with "Gaming on NVIDIA". # Big Picture is opt-out: ticked along with "Gaming on NVIDIA".
@@ -311,15 +307,6 @@ toggle_component() {
if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[silent]=0; WANTED[glyphs]=0; fi if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[silent]=0; WANTED[glyphs]=0; fi
if [[ "$c" == silent && "${WANTED[silent]}" == 1 ]]; then WANTED[gaming]=1; fi if [[ "$c" == silent && "${WANTED[silent]}" == 1 ]]; then WANTED[gaming]=1; fi
if [[ "$c" == glyphs && "${WANTED[glyphs]}" == 1 ]]; then WANTED[gaming]=1; fi if [[ "$c" == glyphs && "${WANTED[glyphs]}" == 1 ]]; then WANTED[gaming]=1; fi
# On NVIDIA the SteamOS conversion and "Gaming on NVIDIA" exclude each other (both would start Steam at login);
# single user mode works with either.
if nvidia_present; then
if [[ "$c" == nvidia && "${WANTED[nvidia]}" == 1 ]]; then
WANTED[gaming]=0; WANTED[boot]=0; WANTED[silent]=0; WANTED[glyphs]=0
elif [[ "$c" =~ ^(gaming|boot|silent|glyphs)$ && "${WANTED[$c]}" == 1 && "${WANTED[gaming]}" == 1 ]]; then
WANTED[nvidia]=0; WANTED[bigpicture]=0; WANTED[nvsilent]=0
fi
fi
# The power-off fix is opt-out: ticked along with Steam Machine support. # The power-off fix is opt-out: ticked along with Steam Machine support.
if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; fi if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; fi
if [[ "$c" == poweroff && "${WANTED[poweroff]}" == 1 ]]; then WANTED[machine]=1; fi if [[ "$c" == poweroff && "${WANTED[poweroff]}" == 1 ]]; then WANTED[machine]=1; fi
+15 -5
View File
@@ -37,11 +37,21 @@ nvidia_present() {
return 1 return 1
} }
# The SteamOS conversion with the patched gamescope (lib/gamescope-nvidia.sh) replaces this on a supported card, so # Not offered any more (2.11.2): the SteamOS conversion with the patched gamescope (lib/gamescope-nvidia.sh) covers NVIDIA PCs.
# this is for older NVIDIA cards, and for a PC where it is already on (so it can be turned off, or swapped for the # A PC that has this on keeps it until the conversion is turned on, which calls nvidia_swap_out.
# conversion). It and the conversion exclude each other (both would start Steam at login): the menu unticks one when nvidia_available() { return 1; }
# the other is ticked.
nvidia_available() { nvidia_present && { ! nvidia_supported || nvidia_status; }; } nvidia_swap_out() {
# The conversion takes over: Steam no longer starts by itself on the desktop at login (both would start it). Steam, the
# packages and the NVIDIA settings stay: the conversion needs them too. The state stays for the conversion's own disable.
nvidia_status || return 0
info "Gaming on NVIDIA is replaced by the SteamOS conversion: Steam no longer starts on the desktop at login."
user_systemctl disable --now "$NVIDIA_UNIT" >/dev/null 2>&1
rm -f "$(nvidia_unit_file)"
user_systemctl daemon-reload
krevert bigpicture
return 0
}
bigpicture_available() { nvidia_available; } bigpicture_available() { nvidia_available; }
nvidia_status() { nvidia_status() {
+2 -9
View File
@@ -78,21 +78,14 @@ Item {
w[id] = !w[id]; w[id] = !w[id];
// The same rules as the terminal menu (toggle_component). // The same rules as the terminal menu (toggle_component).
var hasGaming = items.some(function (i) { return i.id === "gaming"; }); var hasGaming = items.some(function (i) { return i.id === "gaming"; });
var hasNvidia = items.some(function (i) { return i.id === "nvidia"; }); if (id === "gaming" && !w.gaming) { w.single = false; w.silent = false; w.glyphs = false; }
// Single user mode works without the conversion on NVIDIA PCs. if (id === "single" && w.single && hasGaming) w.gaming = true;
if (id === "gaming" && !w.gaming) { if (!hasNvidia) w.single = false; w.silent = false; w.glyphs = false; }
if (id === "single" && w.single && hasGaming && !hasNvidia) w.gaming = true;
if (id === "nvidia") w.bigpicture = w.nvidia; if (id === "nvidia") w.bigpicture = w.nvidia;
if (id === "bigpicture" && w.bigpicture) { w.nvidia = true; w.nvsilent = false; } if (id === "bigpicture" && w.bigpicture) { w.nvidia = true; w.nvsilent = false; }
if (id === "nvsilent" && w.nvsilent) { w.nvidia = true; w.bigpicture = false; } if (id === "nvsilent" && w.nvsilent) { w.nvidia = true; w.bigpicture = false; }
if (id === "nvidia" && !w.nvidia) w.nvsilent = false; if (id === "nvidia" && !w.nvidia) w.nvsilent = false;
if (id === "silent" && w.silent) w.gaming = true; if (id === "silent" && w.silent) w.gaming = true;
if (id === "glyphs" && w.glyphs) w.gaming = true; if (id === "glyphs" && w.glyphs) w.gaming = true;
// On NVIDIA the conversion and "Gaming on NVIDIA" exclude each other (both would start Steam at login).
if (hasGaming && hasNvidia) {
if (id === "nvidia" && w.nvidia) { w.gaming = false; w.silent = false; w.glyphs = false; }
else if ((id === "gaming" || id === "silent" || id === "glyphs") && w[id] && w.gaming) { w.nvidia = false; w.bigpicture = false; w.nvsilent = false; }
}
if (id === "machine") w.poweroff = w.machine; if (id === "machine") w.poweroff = w.machine;
if (id === "poweroff" && w.poweroff) w.machine = true; if (id === "poweroff" && w.poweroff) w.machine = true;
if (id === "machine" && !w.machine) w.kpin = false; if (id === "machine" && !w.machine) w.kpin = false;