Deck: launching from desktop mode gets no performance treatment (GPU auto, governor powersave); pinning the GPU clock is +23% measured #716
Labels
No labels
area/accessibility
area/audio
area/input
area/install
area/menu
area/renderer
area/saves
area/upscaling
beanstalk: approved @ 1697603
beanstalk: approved @ 2c5a62e
beanstalk: approved @ 4fd82b7
beanstalk: approved @ 64d6d09
beanstalk: approved @ 6f91fae
beanstalk: approved @ 70a78f9
beanstalk: approved @ 8d361dc
beanstalk: approved @ 9d8356e
beanstalk: approved @ abf2227
beanstalk: approved @ d82f202
beanstalk: approved @ e5f1e40
beanstalk: approved @ ee8ab5f
ci: approved
good first issue
gpu/amd
gpu/igpu
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
needs measurements
platform/linux
platform/macos
platform/steam-deck
platform/windows
preview
priority
critical
priority
high
priority
low
regression
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
testing wanted
ci: approved
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot#716
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
On a Steam Deck, Longshot launched from desktop mode (the AppImage or the shell launcher - how Deck testers run today) gets no performance treatment at all: the GPU sits at
power_dpm_force_performance_level=auto, the CPU at the amd-pstate-epppowersavegovernor, and gamescope's Game Mode pinning is not in play because there is no gamescope. The renderer already detects the Deck (hw.handheld,vk_main.cpp), so the pieces to notice this are there.Measured on a Steam Deck OLED, same save (Kokiri spawn), same wrapper and protocol across arms (cap 60, vsync off, FSR 3.1, internal 50%, the standard
RX_VK_*switches,RX_VK_READBACK_LATE=newest), install on microSD, one launch and one full protocol per arm, two arms each, fps from the control bridge's rolling average:gamemoderun(SteamOS gamemode 1.8.2, stock config)performance, GPU autohighPinning the GPU clock is worth +23% at the ceiling and costs nothing visually; dukenheimer's Game Mode measurements report a similar +30%. The frame stays CPU-shaped underneath (#402), which is why pinning moves the ceiling rather than the floor - but the ceiling is what players feel at 17 fps.
Mechanism is the open question, and this issue is a proposal, not a design:
gamemodedruns as root and its hooks inherit that) would have to, and packaging one into the AppImage is work.gamemoderunthe idle level stayedautoand the governor stayedpowersave(measured above: zero), and that build's strings report "no cpu governors found" on this image. Upstream gamemode can write amdgpu sysfs through its root daemon viagamemode.inikeys, so a gamemode hook is a plausible vehicle even on SteamOS - but nothing in the stock image sets it up.SteamDeck=1, desktop mode, and whether the level is already forced before touching it, and restore on exit (our test rig restores on every exit path, including kills via a systemd unitExecStopPost).gamemoderunalone with the stock SteamOS config is not the answer (measured: nothing), so the launcher can't just wrap that.Wanted: maintainers' read on whether a privileged launch mechanism belongs in Longshot at all, and if yes, which packaging shape is acceptable (AppImage-adjacent helper, gamemode hook with a config file the package installs, or docs-only). Numbers reproducible on request; the protocol script and raw logs are on this tester's Deck.
Update with the combined arms (same Deck, same protocol as the table above): GPU pinned high + governor performance together, threaded Off, everything else unchanged - still on microSD:
So the launch-state recipe moves the SD install from 17.1-17.6 idle/spin to 21.5-23.8, and walk to ~29. That is the same combination Game Mode's performance layer applies, measured where it currently does not apply. Both settings were restored automatically on stage exit (verified
auto/powersaveafter).Still open, honestly: spin/idle at 22-24 on SD does not reach 25-30; the remaining gap is #386's storage penalty (these exact arms on internal storage should land near 26-28 idle/spin by its measured 1.19x - arithmetic, not measurement) and this is with the CPU-bound submit path (#402) underneath. A mechanism in the launcher would not change either.
A Game Mode data point: at stock, Game Mode doesn't pin the GPU either. Steam Deck OLED, SteamOS 3.9.5, docked in Gaming Mode, Kokiri route, 2 interleaved runs per arm.
Clocks at stock (our sysfs sampler over the measured window; the player's installed build at 1280x800, 100% render, frame generation off):
With less GPU work, the power manager moved the clocks: the GPU went down, the CPU went up, and fps stayed level.
The pin, in Game Mode. Longshot user build 92640867 (main
e7ed2f7a+ Deck patches; output 2048x1152, FSR 3.1 ~50%, frame generation 2x):On the mechanism: on SteamOS 3.9.5,
steamos-priv-write(the helper Steam's performance overlay uses) wrotepower_dpm_force_performance_levelandpp_od_clk_voltageas thedeckuser without a password, from our test harness over ssh. SteamOS itself needs no setuid helper for this. Whether the game should do it is the maintainers' call. It costs power and heat: 19 W at 1600 MHz, against 10-14 W at stock in these runs.