diff --git a/AGENTS.md b/AGENTS.md index 14e0ca6..4556f40 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,8 +33,8 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine `VERSION` whenever what `_enable` sets up changes (a new component gets one too): installs recorded with an older version are ticked and re-applied ("update" in the plan and the app). New default - sub-options are ticked for installs whose parent is on (`feature_new`, - shown as "new"). + options are ticked for installs whose parent (top-level: `gaming`) is on + (`feature_new`, shown as "new"). Status still comes from the system; don't add ad-hoc `_repair` checks for new changes. - **Reversibility.** Every per-user KDE setting a component changes goes @@ -232,8 +232,9 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine `linux-cachyos` is clang-built, `-bore` GCC-built: let DKMS pick the compiler, never pass `LLVM=1`. Test shutdown on the real machine for every new major kernel. -- VRAM booster (`vram`, `lib/vram-booster.sh`, a default sub-option of - `machine`, 2.3.0): CachyOS's `dmemcg-booster` (system + user service) and +- VRAM booster (`vram`, `lib/vram-booster.sh`, top-level, ticked by + default, 2.3.0; only available when `/sys/fs/cgroup/dmem.capacity` lists a + region): CachyOS's `dmemcg-booster` (system + user service) and `plasma-foreground-booster`, like SteamOS 3.9's VRAM management. The latter only starts with `kcgroupsrc [Foreground Booster] autostart=true` (set with `kset`). Disable removes only the packages it installed diff --git a/CHANGELOG.md b/CHANGELOG.md index adbbaf3..2eeb285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ one per merged pull request. ## 2.3.0 - 2026-09-27 -- **feat: VRAM booster for the Steam Machine** +- **feat: VRAM booster for every supported GPU, not only the Steam Machine** +- `fd162c1` **feat: New badge for default sub-options added in this version** +- `54ebddf` **feat: VRAM booster for the Steam Machine** ## 2.2.0 - 2026-09-27 diff --git a/README.md b/README.md index be8b5ff..b4c6e6c 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,11 @@ Steam Machine. 5. **Steamify shortcut** - "Steamify CachyOS" on the desktop and in the launcher opens the newest Steamify app, so you don't need the install command again. "Steamify Terminal" in the launcher opens the terminal menu. -6. **HDMI-CEC** (experimental; off by default, on by default on a Steam +6. **VRAM booster** - on by default: the game you're playing keeps its video + memory and background apps make room, like SteamOS 3.9. Shown for GPUs + whose driver supports it (AMD, Intel) on kernel 7.2 or newer + ([details](TECHNICAL.md#vram-booster)). +7. **HDMI-CEC** (experimental; off by default, on by default on a Steam Machine) - use Steam with your TV's remote, and the TV turns on and off with the PC. Needs a PC with CEC (like the Steam Machine) or a USB CEC adapter; most graphics cards, NVIDIA @@ -48,9 +52,6 @@ What Steamify can do on a Valve Steam Machine: - **Power-off fix** - on by default: shutting down really turns the Steam Machine off, also with the newest CachyOS kernel ([details](TECHNICAL.md#power-off-fix-steam-machine)). - - **VRAM booster** - on by default: the game you're playing keeps its - video memory and background apps make room, like SteamOS 3.9 - ([details](TECHNICAL.md#vram-booster-steam-machine)). - **Update BIOS** - installs Valve's newest Steam Machine BIOS. Never ticked by default, at your own risk, and only after two warnings ([details](TECHNICAL.md#bios-updates-steam-machine)). diff --git a/TECHNICAL.md b/TECHNICAL.md index cd75c37..ca5b3c6 100644 --- a/TECHNICAL.md +++ b/TECHNICAL.md @@ -236,15 +236,17 @@ Where Steam Machine support was set up before 2.2.0, the menu ticks the power-off fix as a new default sub-option (see feature versions below), so a normal run adds it. -## VRAM booster (Steam Machine) +## VRAM booster SteamOS 3.9 manages the dGPU's VRAM per cgroup: the game in front is protected, background apps are evicted first. Without it a game that needs -most of the Steam Machine's 8 GB can be pushed into system RAM by the -desktop and other apps, and stutter. The kernel side is the `dmem` cgroup -controller (7.2); CachyOS packages the userspace side, which the **VRAM -booster** sub-option of Steam Machine support installs (ticked along with -it, can be unticked; new in 2.3.0, so existing setups get it ticked): +most of the VRAM (8 GB on the Steam Machine) can be pushed into system RAM +by the desktop and other apps, and stutter. The kernel side is the `dmem` +cgroup controller (7.2); amdgpu and Intel's xe register their VRAM with it, +NVIDIA's driver doesn't. The **VRAM booster** option is only shown when +`/sys/fs/cgroup/dmem.capacity` lists a region (or it's already on), and is +ticked by default; new in 2.3.0, so setups with the SteamOS conversion on +get it ticked. CachyOS packages the userspace side, which it installs: - `dmemcg-booster`: `dmemcg-booster-system.service` enables the `dmem` controller and sets `dmem.low` for the cgroup in front; @@ -273,9 +275,11 @@ on the system itself; the version only decides about updates: "update". A setup from before versions were recorded counts as 2.1.0, so on a machine set up with 2.1.0, Steam Machine support (2.2.0) is updated. -- **A new default sub-option** (not in `NO_PRESELECT`) whose parent is on - and that was never turned on or off: ticked, so a normal run adds it. - Turning it off once records `off`, so it isn't ticked again. +- **A new default option** (not in `NO_PRESELECT`) whose parent is on (for + a top-level one: the SteamOS conversion) and that was never turned on or + off: ticked, so a normal run adds it. Turning it off once records `off`, + so it isn't ticked again. The menu and the app show it with a **New** + badge, and the plan says "new in this version". Set a component's entry to the new `VERSION` whenever what its `_enable` sets up changes. @@ -350,7 +354,7 @@ immediately, which can turn into a loop - see | `lib/cec.sh` | HDMI-CEC: Valve's `cecd` and friends from its `holo` repository | | `lib/steam-machine.sh` | Steam Machine support: LED driver, LED access, steamos-manager | | `lib/fremont-poweroff.sh` | Steam Machine support: the power-off fix (DKMS module from `patches/`) | -| `lib/vram-booster.sh` | Steam Machine support: the VRAM booster (`dmemcg-booster`, `plasma-foreground-booster`) | +| `lib/vram-booster.sh` | VRAM booster (`dmemcg-booster`, `plasma-foreground-booster`) | | `patches/` | Module sources and patches the scripts build or apply (`patch_file`); see its README | | `.github/tools/bundle.sh` | Builds the single-file version (`dist/steamify.sh`), with `patches/` embedded | | `.github/workflows/bundle.yml` | Builds and checks it on every push; publishes it on `main` | diff --git a/lib/backend.sh b/lib/backend.sh index 76d0177..326c763 100644 --- a/lib/backend.sh +++ b/lib/backend.sh @@ -163,8 +163,7 @@ backend_apply() { [[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1 [[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; } [[ "${WANTED[poweroff]:-0}" == 1 ]] && WANTED[machine]=1 - [[ "${WANTED[vram]:-0}" == 1 ]] && WANTED[machine]=1 - [[ "${WANTED[machine]:-0}" == 0 ]] && { WANTED[poweroff]=0; WANTED[vram]=0; } + [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[poweroff]=0 [[ "${WANTED[kpin]:-0}" == 1 ]] && WANTED[machine]=1 [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0 [[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; } diff --git a/lib/menu.sh b/lib/menu.sh index 9c053eb..5c77a8d 100644 --- a/lib/menu.sh +++ b/lib/menu.sh @@ -5,12 +5,12 @@ # Menu order. Components are turned on in this order and off in reverse; # gaming must come first (single user builds on it). -COMPONENTS=(gaming boot theme glyphs single launcher cec machine poweroff vram kpin hdmi bios) +COMPONENTS=(gaming boot theme glyphs single launcher vram cec machine poweroff kpin hdmi bios) # One-off actions rather than on/off components: never preselected, never # re-applied, not listed as on or off. ACTIONS=(bios) # Sub-options, shown indented under their parent and only while it's ticked. -declare -A PARENT=([boot]=gaming [poweroff]=machine [vram]=machine [kpin]=machine [hdmi]=machine [bios]=machine) +declare -A PARENT=([boot]=gaming [poweroff]=machine [kpin]=machine [hdmi]=machine [bios]=machine) # Never preselected on a first run: booting into the desktop is a choice, # gamescope is the default; HDMI-CEC is opt-in (it can wake the machine or # upset other devices on the TV, even on SteamOS), except on a Steam Machine, @@ -37,10 +37,10 @@ declare -A LABEL=( [glyphs]="Install Steam Deck/Machine icons: Deck button icons in gaming mode" [single]="Single user mode: no password, lock screen or log out (SDDM)" [launcher]="Steamify shortcut: the app on the desktop, Steamify Terminal in the launcher" + [vram]="VRAM booster: the game in front keeps its VRAM, background apps make room" [cec]="HDMI-CEC: use Steam with the TV remote, TV on/off with the PC (experimental)" [machine]="Steam Machine support: LED bar driver, hardware settings in Steam" [poweroff]="Power-off fix: the Steam Machine stays off after shutting down" - [vram]="VRAM booster: the game in front keeps its VRAM, background apps make room" [kpin]="Pin the kernel to $PINNED_KERNEL_VER (untick for CachyOS's current kernel)" [hdmi]="HDMI refresh boost: highest refresh your HDMI display runs" [bios]="Update BIOS" @@ -49,7 +49,8 @@ declare -A CURRENT WANTED component_available() { case "$1" in - machine|poweroff|vram) machine_available ;; + machine|poweroff) machine_available ;; + vram) vram_available ;; kpin) kpin_available ;; hdmi) hdmi_available ;; bios) bios_available ;; @@ -103,9 +104,11 @@ menu_label() { } feature_new() { - # A default sub-option added after its parent was set up (e.g. the - # power-off fix under Steam Machine support): never turned on or off. - [[ -n "${PARENT[$1]:-}" && "${CURRENT[${PARENT[$1]}]:-0}" == 1 && "${CURRENT[$1]:-0}" == 0 ]] && + # A default option added after its parent was set up (e.g. the power-off + # fix under Steam Machine support; a top-level one counts the SteamOS + # conversion as its parent): never turned on or off. + local p="${PARENT[$1]:-gaming}" + [[ "$1" != gaming && "${CURRENT[$p]:-0}" == 1 && "${CURRENT[$1]:-0}" == 0 ]] && ! is_action "$1" && [[ " ${NO_PRESELECT[*]} " != *" $1 "* ]] && [[ -z "$(state_get features "$1")" ]] } @@ -161,11 +164,9 @@ toggle_component() { if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then WANTED[single]=0; WANTED[boot]=0; fi # Where to boot to is part of the conversion, too. if [[ "$c" == boot && "${WANTED[boot]}" == 1 ]]; then WANTED[gaming]=1; fi - # The power-off fix and VRAM booster are opt-out: ticked along with - # Steam Machine support. - if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; WANTED[vram]=${WANTED[machine]}; fi + # The power-off fix is opt-out: ticked along with Steam Machine support. + if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; fi if [[ "$c" == poweroff && "${WANTED[poweroff]}" == 1 ]]; then WANTED[machine]=1; fi - if [[ "$c" == vram && "${WANTED[vram]}" == 1 ]]; then WANTED[machine]=1; fi if [[ "$c" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[kpin]=0; fi if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi # HDMI refresh boost and the BIOS update sit under Steam Machine support; diff --git a/lib/vram-booster.sh b/lib/vram-booster.sh index 4815df1..3a5619a 100644 --- a/lib/vram-booster.sh +++ b/lib/vram-booster.sh @@ -1,9 +1,10 @@ #!/bin/bash -# "VRAM booster" menu item (vram), a sub-option of Steam Machine support -# ticked along with it (opt-out), like SteamOS 3.9's dGPU VRAM management: -# the game in front keeps its VRAM, background apps are evicted first, so a -# game on the 8 GB GPU doesn't spill into system RAM and stutter. The kernel -# side is the dmem cgroup controller (7.2); CachyOS packages the userspace +# "VRAM booster" menu item (vram), ticked by default, like SteamOS 3.9's +# dGPU VRAM management: the game in front keeps its VRAM, background apps +# are evicted first, so a game that needs most of it doesn't spill into +# system RAM and stutter. The kernel side is the dmem cgroup controller +# (7.2; amdgpu and xe register their VRAM, NVIDIA's driver doesn't), so it's +# only offered when the kernel lists a region. CachyOS packages the userspace # side: dmemcg-booster (a system service that enables the controller and # sets the limits, plus a user service) and plasma-foreground-booster, which # tells it which window is in front on the desktop. The latter only starts @@ -12,6 +13,11 @@ VRAM_PKGS=(dmemcg-booster plasma-foreground-booster) +vram_available() { + # cgroupfs files have size 0, so read it. + grep -q . /sys/fs/cgroup/dmem.capacity 2>/dev/null || vram_status +} + vram_status() { pacman -Q "${VRAM_PKGS[@]}" >/dev/null 2>&1 && systemctl is-enabled -q dmemcg-booster-system.service 2>/dev/null && diff --git a/ui/qml/Main.qml b/ui/qml/Main.qml index 2ca5d8b..c13c01f 100644 --- a/ui/qml/Main.qml +++ b/ui/qml/Main.qml @@ -73,7 +73,7 @@ ApplicationWindow { body: "With recent kernels the Steam Machine starts again right after shutting down: the firmware leaves a wake bit set, and newer kernels (7.2, and updates of 6.x, 7.0 and 7.1) no longer clear it. Valve's own kernel clears it; this small module does the same right before power-off.", changes: ["steamify-fremont-poweroff module for each installed kernel (DKMS)", "Only on a Steam Machine, only touches that one wake bit", "Off: recent kernels may start it again after shutting down"] }, vram: { label: "VRAM booster", hint: "The game in front keeps its VRAM", - body: "Like SteamOS 3.9: the game you're playing keeps its video memory, and background apps are moved out first. Without it a game that needs most of the 8 GB can spill into system RAM and stutter.", + body: "Like SteamOS 3.9: the game you're playing keeps its video memory, and background apps are moved out first. Without it a game that needs most of the video memory can spill into system RAM and stutter. Shown for GPUs whose driver supports it (AMD, Intel) on kernel 7.2 or newer.", changes: ["dmemcg-booster (system and user service)", "plasma-foreground-booster, which tells it which window is in front", "Off: removed again, unless you had installed them yourself"] }, kpin: { label: "Pin the kernel", hint: "Untick for CachyOS's current kernel", body: "Keeps the Steam Machine on CachyOS kernel 7.1.6. Untick it to go back to CachyOS's current kernel; HDMI refresh boost goes with it.", @@ -253,9 +253,8 @@ ApplicationWindow { if (id === "hdmi" && !hdmiChoice && hdmiSaved.length) { openHdmiList(); return; } if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; } if (id === "hdmi" && !w.hdmi) hdmiChoice = ""; - if (id === "machine") { w.poweroff = w.machine; w.vram = w.machine; } + if (id === "machine") w.poweroff = w.machine; if (id === "poweroff" && w.poweroff) w.machine = true; - if (id === "vram" && w.vram) w.machine = true; if (id === "machine" && !w.machine) w.kpin = false; if (id === "kpin" && w.kpin) w.machine = true; if (id === "hdmi" && w.hdmi) { w.machine = true; w.kpin = true; }