feat: VRAM booster for every supported GPU, not only the Steam Machine

This commit is contained in:
theupriser committed 2026-09-27 12:51:47 +02:00
1 parent 64536fe531
commit 83dcad1622
8 files changed
+53 -40

No files matched your search

+5 -4
View File
@@ -33,8 +33,8 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
`VERSION` whenever what `<id>_enable` sets up changes (a new component gets `VERSION` whenever what `<id>_enable` sets up changes (a new component gets
one too): installs recorded with an older version one too): installs recorded with an older version
are ticked and re-applied ("update" in the plan and the app). New default 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`, options are ticked for installs whose parent (top-level: `gaming`) is on
shown as "new"). (`feature_new`, shown as "new").
Status still comes from the system; don't add ad-hoc `<id>_repair` checks Status still comes from the system; don't add ad-hoc `<id>_repair` checks
for new changes. for new changes.
- **Reversibility.** Every per-user KDE setting a component changes goes - **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 `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 compiler, never pass `LLVM=1`. Test shutdown on the real machine for every
new major kernel. new major kernel.
- VRAM booster (`vram`, `lib/vram-booster.sh`, a default sub-option of - VRAM booster (`vram`, `lib/vram-booster.sh`, top-level, ticked by
`machine`, 2.3.0): CachyOS's `dmemcg-booster` (system + user service) and 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 `plasma-foreground-booster`, like SteamOS 3.9's VRAM management. The
latter only starts with `kcgroupsrc [Foreground Booster] autostart=true` latter only starts with `kcgroupsrc [Foreground Booster] autostart=true`
(set with `kset`). Disable removes only the packages it installed (set with `kset`). Disable removes only the packages it installed
+3 -1
View File
@@ -7,7 +7,9 @@ one per merged pull request.
## 2.3.0 - 2026-09-27 ## 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 ## 2.2.0 - 2026-09-27
+5 -4
View File
@@ -28,7 +28,11 @@ Steam Machine.
5. **Steamify shortcut** - "Steamify CachyOS" on the desktop and in the 5. **Steamify shortcut** - "Steamify CachyOS" on the desktop and in the
launcher opens the newest Steamify app, so you don't need the install launcher opens the newest Steamify app, so you don't need the install
command again. "Steamify Terminal" in the launcher opens the terminal menu. 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 Machine) - use Steam with your TV's
remote, and the TV turns on and off with the PC. Needs a PC with CEC (like 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 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 - **Power-off fix** - on by default: shutting down really turns the Steam
Machine off, also with the newest CachyOS kernel Machine off, also with the newest CachyOS kernel
([details](TECHNICAL.md#power-off-fix-steam-machine)). ([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 - **Update BIOS** - installs Valve's newest Steam Machine BIOS. Never ticked
by default, at your own risk, and only after two warnings by default, at your own risk, and only after two warnings
([details](TECHNICAL.md#bios-updates-steam-machine)). ([details](TECHNICAL.md#bios-updates-steam-machine)).
+14 -10
View File
@@ -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 power-off fix as a new default sub-option (see feature versions below), so a
normal run adds it. 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 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 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 most of the VRAM (8 GB on the Steam Machine) can be pushed into system RAM
desktop and other apps, and stutter. The kernel side is the `dmem` cgroup by the desktop and other apps, and stutter. The kernel side is the `dmem`
controller (7.2); CachyOS packages the userspace side, which the **VRAM cgroup controller (7.2); amdgpu and Intel's xe register their VRAM with it,
booster** sub-option of Steam Machine support installs (ticked along with NVIDIA's driver doesn't. The **VRAM booster** option is only shown when
it, can be unticked; new in 2.3.0, so existing setups get it ticked): `/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` - `dmemcg-booster`: `dmemcg-booster-system.service` enables the `dmem`
controller and sets `dmem.low` for the cgroup in front; 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, "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 so on a machine set up with 2.1.0, Steam Machine support (2.2.0) is
updated. updated.
- **A new default sub-option** (not in `NO_PRESELECT`) whose parent is on - **A new default option** (not in `NO_PRESELECT`) whose parent is on (for
and that was never turned on or off: ticked, so a normal run adds it. a top-level one: the SteamOS conversion) and that was never turned on or
Turning it off once records `off`, so it isn't ticked again. 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 Set a component's entry to the new `VERSION` whenever what its
`<id>_enable` sets up changes. `<id>_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/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/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/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 | | `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/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` | | `.github/workflows/bundle.yml` | Builds and checks it on every push; publishes it on `main` |
+1 -2
View File
@@ -163,8 +163,7 @@ backend_apply() {
[[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1 [[ "${WANTED[single]:-0}" == 1 ]] && WANTED[gaming]=1
[[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; } [[ "${WANTED[gaming]:-0}" == 0 ]] && { WANTED[single]=0; WANTED[boot]=0; }
[[ "${WANTED[poweroff]:-0}" == 1 ]] && WANTED[machine]=1 [[ "${WANTED[poweroff]:-0}" == 1 ]] && WANTED[machine]=1
[[ "${WANTED[vram]:-0}" == 1 ]] && WANTED[machine]=1 [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[poweroff]=0
[[ "${WANTED[machine]:-0}" == 0 ]] && { WANTED[poweroff]=0; WANTED[vram]=0; }
[[ "${WANTED[kpin]:-0}" == 1 ]] && WANTED[machine]=1 [[ "${WANTED[kpin]:-0}" == 1 ]] && WANTED[machine]=1
[[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0 [[ "${WANTED[machine]:-0}" == 0 ]] && WANTED[kpin]=0
[[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; } [[ "${WANTED[hdmi]:-0}" == 1 ]] && { WANTED[machine]=1; WANTED[kpin]=1; }
+12 -11
View File
@@ -5,12 +5,12 @@
# Menu order. Components are turned on in this order and off in reverse; # Menu order. Components are turned on in this order and off in reverse;
# gaming must come first (single user builds on it). # 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 # One-off actions rather than on/off components: never preselected, never
# re-applied, not listed as on or off. # re-applied, not listed as on or off.
ACTIONS=(bios) ACTIONS=(bios)
# Sub-options, shown indented under their parent and only while it's ticked. # 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, # 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 # 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, # 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" [glyphs]="Install Steam Deck/Machine icons: Deck button icons in gaming mode"
[single]="Single user mode: no password, lock screen or log out (SDDM)" [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" [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)" [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" [machine]="Steam Machine support: LED bar driver, hardware settings in Steam"
[poweroff]="Power-off fix: the Steam Machine stays off after shutting down" [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)" [kpin]="Pin the kernel to $PINNED_KERNEL_VER (untick for CachyOS's current kernel)"
[hdmi]="HDMI refresh boost: highest refresh your HDMI display runs" [hdmi]="HDMI refresh boost: highest refresh your HDMI display runs"
[bios]="Update BIOS" [bios]="Update BIOS"
@@ -49,7 +49,8 @@ declare -A CURRENT WANTED
component_available() { component_available() {
case "$1" in case "$1" in
machine|poweroff|vram) machine_available ;; machine|poweroff) machine_available ;;
vram) vram_available ;;
kpin) kpin_available ;; kpin) kpin_available ;;
hdmi) hdmi_available ;; hdmi) hdmi_available ;;
bios) bios_available ;; bios) bios_available ;;
@@ -103,9 +104,11 @@ menu_label() {
} }
feature_new() { feature_new() {
# A default sub-option added after its parent was set up (e.g. the # A default option added after its parent was set up (e.g. the power-off
# power-off fix under Steam Machine support): never turned on or off. # fix under Steam Machine support; a top-level one counts the SteamOS
[[ -n "${PARENT[$1]:-}" && "${CURRENT[${PARENT[$1]}]:-0}" == 1 && "${CURRENT[$1]:-0}" == 0 ]] && # 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 "* ]] && ! is_action "$1" && [[ " ${NO_PRESELECT[*]} " != *" $1 "* ]] &&
[[ -z "$(state_get features "$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 if [[ "$c" == gaming && "${WANTED[gaming]}" == 0 ]]; then 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
# The power-off fix and VRAM booster are opt-out: ticked along with # The power-off fix is opt-out: ticked along with Steam Machine support.
# Steam Machine support. if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; fi
if [[ "$c" == machine ]]; then WANTED[poweroff]=${WANTED[machine]}; WANTED[vram]=${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
if [[ "$c" == vram && "${WANTED[vram]}" == 1 ]]; then WANTED[machine]=1; fi
if [[ "$c" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[kpin]=0; fi if [[ "$c" == machine && "${WANTED[machine]}" == 0 ]]; then WANTED[kpin]=0; fi
if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi if [[ "$c" == kpin && "${WANTED[kpin]}" == 1 ]]; then WANTED[machine]=1; fi
# HDMI refresh boost and the BIOS update sit under Steam Machine support; # HDMI refresh boost and the BIOS update sit under Steam Machine support;
+11 -5
View File
@@ -1,9 +1,10 @@
#!/bin/bash #!/bin/bash
# "VRAM booster" menu item (vram), a sub-option of Steam Machine support # "VRAM booster" menu item (vram), ticked by default, like SteamOS 3.9's
# ticked along with it (opt-out), like SteamOS 3.9's dGPU VRAM management: # dGPU VRAM management: the game in front keeps its VRAM, background apps
# the game in front keeps its VRAM, background apps are evicted first, so a # are evicted first, so a game that needs most of it doesn't spill into
# game on the 8 GB GPU doesn't spill into system RAM and stutter. The kernel # system RAM and stutter. The kernel side is the dmem cgroup controller
# side is the dmem cgroup controller (7.2); CachyOS packages the userspace # (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 # side: dmemcg-booster (a system service that enables the controller and
# sets the limits, plus a user service) and plasma-foreground-booster, which # 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 # 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_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() { vram_status() {
pacman -Q "${VRAM_PKGS[@]}" >/dev/null 2>&1 && pacman -Q "${VRAM_PKGS[@]}" >/dev/null 2>&1 &&
systemctl is-enabled -q dmemcg-booster-system.service 2>/dev/null && systemctl is-enabled -q dmemcg-booster-system.service 2>/dev/null &&
+2 -3
View File
@@ -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.", 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"] }, 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", 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"] }, 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", 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.", 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" && !hdmiChoice && hdmiSaved.length) { openHdmiList(); return; }
if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; } if (id === "hdmi" && w.hdmi && !nowOn("hdmi") && !hdmiChoice) { startHdmi(); return; }
if (id === "hdmi" && !w.hdmi) hdmiChoice = ""; 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 === "poweroff" && w.poweroff) w.machine = true;
if (id === "vram" && w.vram) w.machine = true;
if (id === "machine" && !w.machine) w.kpin = false; if (id === "machine" && !w.machine) w.kpin = false;
if (id === "kpin" && w.kpin) w.machine = true; if (id === "kpin" && w.kpin) w.machine = true;
if (id === "hdmi" && w.hdmi) { w.machine = true; w.kpin = true; } if (id === "hdmi" && w.hdmi) { w.machine = true; w.kpin = true; }