- Mali bridge: the self-test fails "memory sharing" when the server offers
no host-visible memory type (no sharing method passed, RP4 Pro G77); the
session then falls back to the PanVK pair like a failed draw, and Setup
says the bridge cannot share memory with that driver. Without a pair to
fall back on, the log says so.
- Mali bridge: a guarded driver crash now logs the sub-command it was in,
the fault address and pc (library + offset via dladdr), the command
buffer's level, begin flags, pool flags and state, and the last 32
replayed commands. Begin on an executable buffer from a pool without
RESET_COMMAND_BUFFER_BIT is logged once (implicit reset).
- Venus: vulkan-summary.txt gets the device extension list and key
features (full vulkaninfo in vulkan-full.txt); a failed GL probe runs
once with VN_DEBUG=init,result, ZINK_DEBUG=mem, MESA_LOG_LEVEL=debug and
the layer trace into glprobe-trace.txt. The Mali compatibility layer's
trace covers every pre-device query (devices, memory, queue families,
formats, image formats, external handles) and names the extensions.
- Venus: off when the phone's driver reports Vulkan below 1.2 (gamescope
skips such a device); Setup and the graphics report say why and the
session uses the PanVK pair.
- Compositor: libwayland's own disconnect reasons go to wayland.log, and a
client's buffer may grow to 1 MB before a slow reader is dropped. A
session that ended without teardown records Android's exit reasons.
- Drivers: RADV-Xclipse upstream (radv-xclipse-upstream) is a manual
choice for Xclipse; Auto keeps radv-xclipse.
Conflicts resolved keeping both sides: main's comment cleanup (#764) taken
where only comments differed; the test branch's code kept everywhere else.
ensureAuto runs main's Quest auto drivers before the Mali paths;
vkp_update_map keeps the Quest layer path and the completion-unknown check
(pass_begin goes through it); gamescope backend selection plus main's
steam-mode cursor composite; droiddeck-session's watcher is main's shared
loop with the Venus GL probe after it; SessionFiles/runtime_inputs/build.yml
carry both the Xclipse layer and main's VR assets. Main's GPU detection
test follows the non-Adreno support text; the Steam presentation test
finds its block by code, not by a removed comment.
DroidDeck-Proton is now built and released on Droid-Deck/DroidDeck-Proton
(11-9.1 is Latest there), so the Components page, the update check and the
guest installer read releases from the org repo instead of The412Banner's.
* fix: Steam can restart more than twice in a session
Every exit 42 counted toward the cap that stops an update which will
not install, and the count was never cleared, so the third restart of
a session ended it however far apart they were. A client that ran for
a minute before asking is not that loop: the count starts again.
* fix: measure the client's run time as it exits
The time spent collecting logs and checking FEX after the client exits
counted toward its run, so a slow cleanup could make a quick exit 42
look like a long one and clear the count.
---------
Co-authored-by: Kirk <12691869+KirkPatrickJunsay@users.noreply.github.com>
Co-authored-by: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com>
* fix: redist markers a replaced registry lost are seeded again
droiddeck-seed-redists recorded what it seeded in .droiddeck-redists and
trusted that record from then on. A Proton update replaces its
default_pfx system.reg but leaves our record beside it, and every new
prefix copies both, so new games got a record of markers their registry
never had: Steam then ran their install scripts for real. Batman: Arkham
City's AMD Dual-Core Optimizer installer hangs there, leaving the game
on "Running install script" on every launch.
Each recorded marker is now looked up in the registry, in both views
where both were written, and seeded again when it is gone; a record of
markers nobody wants any more is rewritten without them.
* Check every VC runtime architecture before keeping the vcrt marker
vcrt writes Installed for x86, x64 and arm64 in both registry views, but
present() only looked at x86. If only an x64 or arm64 value was gone the
runtime would not be seeded again. Require all six values and test the
loss of the arm64 Wow6432Node one.
Arkham City (BatmanAC.exe) stopped with Unreal's "Fatal error!" about
1.5 s after start: an access violation in BatmanAC.exe right after
steam.dll loads. The game leans on x87 and needs full precision under
FEX (FEX wiki), while the default FEX preset sets
FEX_X87REDUCEDPRECISION=1. Engine fixes sit above the shared preset and
below the player's own game profile, so a fix keyed on BatmanAC.exe
beside the started exe (BatmanAC.exe or BmLauncher.exe) restores
x87 precision for this game only. Arkham Asylum, which shares
BmLauncher.exe but not BatmanAC.exe, keeps the preset.
install() replaces an existing cache entry by calling detach(old), which
destroys the listing when no reader holds it, and then reads old->wd to
decide whether to release the watch. When the old listing has no readers,
that read happens after the free.
Two threads that enumerate the same uncached directory at the same time
reach this path: both build a listing, the first installs an entry with
no readers, and the second replaces it.
Save the watch descriptor before detaching, as drop() already does.
- vkbridge server: every command buffer a device hands out is tracked; Begin,
End (stream replay) and QueueSubmit refuse one it never allocated or has
freed (VK_ERROR_DEVICE_LOST, logged) instead of passing it to the driver,
where Mali's vkBeginCommandBuffer crashed the app (SIGSEGV 0x10, Steam's
Zink on an Edge 60 and a Tab S11).
- vkbridge server: a fault inside the driver while serving a request cuts
that client off (SIGSEGV/SIGBUS guard per request) and leaves its objects
alone; the app and the other clients carry on. Other faults go to the
previous handler.
- vkbridge server: the pipeline cache directory is copied; the JNI string it
pointed at was freed (garbage in the cache path).
- Venus: DROIDDECK_MALI_COMPAT_TRACE=1 makes the Mali compatibility layer log
what an application queries before vkCreateDevice; a failed glprobe adds a
traced run and vulkaninfo --summary under the same environment.
- PowerVR: mangoapp draws with llvmpipe (Zink could not make it a swapchain
and it crashed at every start).
- Setup: an Xclipse GPU reads "Experimental: RADV or the system Xclipse
driver", not the PowerVR line.
droiddeck-msi-install: a DuplicateFile entry onto the file itself (dotnet.exe in the .NET host MSI) is skipped like Windows Installer does, instead of stopping the whole install with SameFileError. Fixes .NET Desktop 3/6/7/8, .NET Core 3 and .NET 5. Thanks to whatsupbros for finding and tracing it.
* Add opt-in zRAM compression for the Steam client while a game runs
A "zRAM compression" toggle under Steam > Settings > Session, below
"Keep downloads running". Off by default, kept once set, and disabled
on devices without swap or with a kernel older than 5.4.
When on, the session watches for Steam's reaper. 20 s into a game the
client and its web helpers page their private anonymous memory out to
the device's zram with MADV_PAGEOUT from inside their own process
(libblsession zram.c, SIGURG), again every 5 minutes, and read every
swapped page back once the game exits. No root is needed: only a
process itself may do this without CAP_SYS_NICE. With the toggle off
nothing is installed or started.
RedMagic NP06J, Palworld: Steam's resident memory fell from ~1.7 GB to
~1.1 GB with ~560 MB in zram, available memory during play rose by
~0.5-0.8 GB, and ~2 MB was left in zram after the read-back.
* Turn zRAM compression on by default below 12 GB of RAM
Until the toggle is changed, it follows the device: on when the kernel
supports it and the device has less than 12 GB of RAM, read from the
advertised memory size on Android 14+ and from total memory before that.
Turning it off is kept.
---------
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
- drm.c: PR #570's current PRIME ownership check (F_DUPFD_QUERY, then kcmp,
then the F_SETOWN_EX owner marker): on a kernel before 6.10 with kcmp
blocked, drmPrimeFDToHandle answered EOPNOTSUPP for every PowerVR import
(Pixel 10, Android 17: Zink "failed drmPrimeFDToHandle", Xwayland error 7,
gamescope X11 I/O error). The Mali stand-in node is kept.
- A /sys/class/thermal the kernel will not list gets an empty directory, so
mangoapp no longer aborts on it.
- gamescope 0132: a hung-up waitable is named before the abort; 0133: the
bridge's flippable images use supported-but-unexportable modifiers instead
of asserting.
- Venus: when Zink does not start, the loader's view is logged and Zink is
retried without ZINK_DEBUG=compact, with ZINK_DESCRIPTORS=auto and without
kopper before falling back to llvmpipe.
* feat: add Cardboard mode with side-by-side lens-distorted eyes and 3DoF head tracking
* fix: derive the Cardboard field of view from the panel and recentre fully when far from upright
* feat: share the Cardboard head pose with the guest and add a SteamVR driver for it
* feat: run SteamVR's compositor on Turnip/KGSL with a display-extension layer and a driver-direct HMD
* feat: show SteamVR frames in Cardboard mode through a driver-side presenter and a fake direct-mode display
* feat: install and start SteamVR for Cardboard mode from the session drawer
* docs: describe Cardboard mode and the SteamVR path
* feat: drive SteamVR hands from the game pad and keep the Cardboard headset out of standby
* docs: record where the SteamVR dashboard stops
* fix: map Cardboard head tracking to the screen's axes and keep turns about the real vertical as yaw
* fix: give Cardboard its previous picture back when SteamVR stops
* fix: report sem_otime from emulated SysV semaphores so SteamVR's web helper can start
* fix: bridge SteamVR's shared semaphores across processes and keep Steam alive while SteamVR runs
* feat: present SteamVR straight to DroidDeck's compositor at panel resolution
* docs: update Cardboard VR notes for the dashboard, semaphore bridge and direct presenter
* fix: keep Wine and FEX signal handlers in the VR layer; add semaphore tracing
* fix: clear a stale SteamVR active marker on status
* fix: clear only an old SteamVR active marker
* fix: unblock SteamVR clients on Turnip and keep Steam's web helper alive across SteamVR runs
* fix: judge shared waits before a submit's own signals and on Vulkan 1.0 devices
* docs: record VR games, SteamVR Home and OpenXR results on the Thor
* docs: add Cardboard VR learnings from the Thor bring-up
* docs: add Cardboard VR screenshots from the Thor
* fix: keep the VR layer's display stand-in to SteamVR runs and clear a leftover marker at session start
* fix: report SteamVR start and stop failures from the helper's exit code
- Setup's "Steam interface: GPU drawing" is hidden on Mali and a saved "on" is
cleared: with PanVK it rebooted an Edge 60 (G615) as steamwebhelper started.
Kept for Xclipse.
- gamescope 0130: a composite pipeline refused at start-up is retried with a
layout without immutable YCbCr samplers (G615 through Venus refused every
composite shader; their SPIR-V has no Float16, so fp16 was not the cause).
- Venus: droiddeck-glprobe opens GL through GLX the way the Steam client does,
with the loader's reasons logged; when it fails the client's GL goes to
llvmpipe.
- vkbridge self-test: the draw check waits for the render pass's stores before
copying out (a tiler read zeros without the dependency).
- vkbridge: the memory model skips lazily allocated types. Mali-G615 lists
DEVICE_LOCAL|LAZILY_ALLOCATED first; taken as the device-local type it left
images with no memory type (self-test "image clear/draw: setup" FAIL,
gamescope "No compatible image memory type").
- Session: a bridge self-test that fails images or draws falls back to the
runtime's driver pair for that session (BL_VKBRIDGE_FALLBACK_ICD); Setup
and the graphics report say so.
- Venus: the Mali compatibility layer runs in every process but gamescope
(DROIDDECK_MALI_COMPAT=1), so Zink in Steam and Xwayland gets
nullDescriptor; null texel-buffer views get stand-ins too. Without
nullDescriptor the session's GL goes to llvmpipe.
- gamescope 0129: a refused compute pipeline is named with its SPIR-V
capabilities.
- Compositor: a buffer on two surfaces at once (gamescope's planes while a
notification is up) is released only when the last one lets go.
- Open driver pairs: processes.txt timeline for the first three minutes;
Setup "Steam interface: GPU drawing" turns off software web compositing.
- gamescope 0128: VK_EXT_robustness2 is optional. A Mali driver through Venus has none, and
gamescope stopped at "Missing required extension: VK_EXT_robustness2" (the wayland_surface error
after it was only the knock-on). Without it, unused descriptor slots point at a 1x1 texture
instead of VK_NULL_HANDLE. (David Cimo's Pixel 9 driver has robustness2, so his build never
needed this.) gamescope component rebuilt and pinned by sha.
- Open-files limit: on a GPU that is not an Adreno the session script raises the soft limit to the
hard limit for the whole session tree (a PanVK-kbase session froze on "Too many open files"
after ten minutes) and graphics-report.txt shows before and after. A stopgap; the driver leak is
fixed separately.
- The Mali bridge switch is honoured: when on and usable it wins over a PanVK pair for the
session (Venus still wins over it). Selecting a pair no longer switches the bridge off, which is
why the switch did not survive an app restart (Auto re-selected the pair at start). Setup says
when this phone cannot use the bridge at all.
- Driver switching: picking a Mali pair by hand keeps the display on the phone's own driver, as
Auto does (a PanVK Android display stalls on Mali gralloc at "Waiting for Steam's first frame",
and stayed set after switching back); installing a bundle again replaces it instead of adding a
"-2" copy beside the old one.
- graphics-report.txt names the runtime driver's folder and libraries, and the previous session's
drivers, flagged when they changed.
From DavidCimo/droiddeck-mali, branch mali-venus @ 4f838891 (prototype 13; his 12 commits on top
of DroidDeck 0.3.1, GPL-3.0), by David Cimo:
- tools/venus: Mesa Venus vtest patch (incl. the per-queue submit_mutex fix and the cached-memory
frame readback), virglrenderer Android patch, the Mali compatibility layer (the six features
DXVK needs: fill modes, multi-viewport, robustness2, clip/cull distance, BC1-BC7) and his tools.
- tools/linuxfs/preload/venus.c: keeps Zink's kopper under Venus.
- tools/gamescope/patches/0127 (his 0114): shm buffers uploaded on every commit.
- docs/development/mali-venus.md: his design notes.
- tools/venus/ci-build.sh and build-venus.yml: his build recipes as one CI job that packs the
component (vtest server, ICD, layer) as venus.tzst for the apk.
Co-authored-by: Dersim Abbas <derabb0620@gmail.com>
- With a PanVK or RADV pair (BL_OPEN_DRIVER=1), droiddeck-game-env drops the app-wide
VKD3D_FEATURE_LEVEL=12_2 and VKD3D_SHADER_MODEL=6_9 so vkd3d-proton reports what the driver has
(an Unreal DX12 game crashed at start on PanVK with the overrides); a game's own setting still
wins, and launch.txt records DROIDDECK_VKD3D_CAPS=driver.
- The compositor traces, on a GPU that is not an Adreno, the first 400 dma-buf attaches and buffer
releases by wl_buffer id and sending line, and logs any release of a buffer already released
and not attached again (gamescope's "Compositor released us but we were not acquired" on G925).
- Per-game logs no longer set MESA_DEBUG=silent, which kept mesa.log empty.
- The S24 FE (US) daemon hung loading the plain AAudio sink from default.pa (its AAudio open
blocks rather than fails), so it never finished starting. default.pa is back to DirectAudio
alone inside .nofail; the fallbacks are loaded from the app once the daemon answers, each pactl
bounded by its timeout (DirectAudio, then the plain sink with and without low latency). The
guard waits 30 s and logs, with timestamps, how long the daemon took, whether its socket and
pactl exist, and what it finally got.
- With an open driver pair on a GPU that is not an Adreno, Steam's CEF composites in software
(-cef-disable-gpu-compositing) with GPU raster kept: RADV on Xclipse showed stale, half-written
tiles, as #570 saw on PowerVR. The session log says so.
- Auto looks online again when its saved release list predates this device's open drivers, so a
Samsung or Mali phone gets its pair without pressing refresh first.
- A Samsung Xclipse is labelled "Samsung Xclipse" (not PowerVR), with its own support line.
- Per-game logs add audio-streams.txt: PulseAudio's sink inputs 20 s and 60 s into the launch,
so a silent game shows whether its stream reached Pulse.
- graphics-report.txt states the frame-generation setting and keeps the LSFG gate, FrameGen and
audio lines from app.log.
- graphics-report.txt in every session folder: the graphics path the session draws with and why
(Turnip, system Vulkan #570, Mali bridge #517, or an open driver pair with its release), the
driver mode and choices, what Auto would pick, the GPU (family, Vulkan device name, kbase
gpuinfo, Android, SoC, kernel), the GPU nodes the app can see (access, device numbers, SELinux
label; nothing is opened) and the guest's graphics environment. At the end it adds the
compositor's driver lines from app.log and the game launches that were logged.
- vulkan-summary.txt: the session's own vulkaninfo --summary with the driver as exported, in the
background with a 10 s timeout.
- Per-game logs under games/<time>-<appid>/: Proton's log, DXVK's and vkd3d-proton's, Mesa's and
PanVK's startup messages and the launch environment, from droiddeck-game-env. Each file is cut
to 20 MB and the folder to 120 MB at the session's end.
- The per-game logs and the Vulkan summary are on for a GPU that is not an Adreno, and on an
Adreno only with Setup's new "Detailed graphics logs" switch. Share logs already takes the
whole session folder, so all of it is in the zip, scrubbed as before.
- tools/dxvk/build.sh: #602's copy (its output checks) and the PowerVR pin in
tools/powervr/release.json moved to that file's hash; the recipe's outputs are unchanged.
- droiddeck-session: the presentation block sets _bl_cef for #570's PowerVR path, and the UI
block keeps main's order, defaulting to -cef-use-angle=vulkan when the block has not run.
- Compositor test harnesses: AHardwareBuffer stubs for #570's AHB import, and a stub for
vkp_effects_forget_image (main #597) that #561's caller harness predates.
Squash of Droid-Deck/DroidDeck#517 (ASEbrahim/DroidDeck mali-bridge @ 6b823341): the Vulkan
bridge (tools/vkbridge) that runs the guest's Vulkan on the phone's own driver, with BC1-BC7,
clip/cull distance, vertex-divisor and depth-clip emulation and dma-heap memory sharing for Mali.
All of the bridge is ASEbrahim's work; squashed only to carry it on this test branch.
Combined with #570 on this branch, a device draws through exactly one path:
- Adreno: Turnip, unchanged (checked first; the bridge setting is ignored there).
- PowerVR / Xclipse with the system HAL and a render node: the system-Vulkan path (#570).
- Anything else with the Setup toggle on (Mali): the bridge.
A game that closes as soon as it starts can be tripped by Proton's Steam
setup (steam.exe, the Steam registry entries, the Steam client bridge).
The Games page of the session drawer gets a per-game Start without Steam
switch, stored as DROIDDECK_NO_STEAM=1 in the game's environment and listed
in its profile summary.
droiddeck-game-env acts on it for a game launch only: a Proton with umu's
launch (GE-Proton, Proton-CachyOS, DroidDeck-Proton) gets UMU_ID, so it
runs umu.exe in place of steam.exe and still sets up the prefix; a Steam
game keeps its protonfixes under its own id, an added game gets 0. Any
other Proton runs the game straight in the prefix (runinprefix).
The chain copy that clears the emulated textureCompressionBC only knew a
handful of structure sizes, so a valid chain such as
VkPhysicalDeviceTimelineSemaphoreFeatures -> VkPhysicalDeviceFeatures2 was
passed on unchanged and the compat layer refused the bit. Size every
structure that may extend VkDeviceCreateInfo from a table generated from the
Vulkan registry (gen_device_chain.py, Vulkan-Headers 1.3.275, the headers
the build compiles with), and copy onto the heap instead of a fixed buffer.
Only a structure newer than those headers still passes the chain unchanged.
Add a regression test that runs the layer between a simulated loader and a
mock driver: the timeline-semaphore chain, pEnabledFeatures, an unknown
structure, the caller's structures left untouched, per-device YCbCr sampler
tracking with handle reuse, and the KHR calibrated-timestamp forwarding. CI
installs libvulkan-dev for it.
- Clear textureCompressionBC in a copy of the device-create chain (every
structure up to the VkPhysicalDeviceFeatures2 that enables it) instead of
writing the caller's structure; a chain led by a structure of unknown size
is passed on unchanged.
- Track YCbCr samplers per device in a growable list, drop them on
vkDestroySampler and device teardown, and fail sampler creation rather
than leave one untracked when the list cannot grow.
- Fail descriptor set layout creation with VK_ERROR_OUT_OF_HOST_MEMORY when
a replacement sampler array cannot be allocated, instead of passing the
original YCbCr samplers to the driver.
Detect Samsung's Vulkan HAL (vulkan.samsung.so) and its sgpu render node
alongside PowerVR, and run Xclipse through the same libhybris bridge:
- VK_LAYER_DROIDDECK_xclipse (tools/linuxfs/xclipse-layer), built with the
glibc preloads and enabled only on Xclipse: sets bionic's environ for the
driver's shader compiler, avoids immutable YCbCr samplers in compute
layouts, forwards the KHR calibrated-timestamp entry points to the EXT
ones, and reports textureCompressionBC and BC4/BC5 filtering over the
compat layer's BC emulation.
- Upstream DXVK 2.6.2, pinned as a tar.gz component and selected on Xclipse:
the driver has 128 bytes of push constants, DXVK 3 needs 256.
- android_wlegl accepts a zero stride and passes it through unchanged:
Samsung's gralloc records none for GPU-only buffers.
Tested on a Galaxy A56 (Xclipse 540, driver 24.0.560): Steam Big Picture
and PICO PARK (D3D9).
* feat(profiles): add persistent per-game compatibility profiles
* fix(profiles): show Windows component overrides
Include per-game Windows component selections in the resolved profile summary so the session overlay marks those games as custom and shows the selected components.
* fix(session): detect Proton games across runtime paths
* fix(profiles): select the active Gamescope game
* fix(profiles): improve per-game reset feedback
* fix(profiles): align session components with game overrides
* fix(session): prefer selected Steam game during refresh
* fix(session): resume profile following when reopening games
* chore: keep local dev testing outside the repository
* test(session): remove local dev package path
* fix(session): preserve profiles when refresh fails
* fix(session): reject empty game profile reset scope
* perf(session): cache drawer inventory by refresh revision
* fix(profiles): align game presets and profile reset behavior
* fix(profiles): preserve originals and normalize shortcut ids
* fix(profiles): keep editor scope stable after rebase
* fix(tests): host Compose tests in both build variants
* fix(profiles): recover interrupted component selection saves
---------
Co-authored-by: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com>
* fix: Red Dead Redemption 2 launches again, its Vulkan runtime installer is left to run
droiddeck-seed-redists marked every process in every game's install script
as already run, Red Dead Redemption 2's VulkanRT-1.1.108.0 installer
included. Steam's compat config for the game says nativevulkanloader, so
Proton loads vulkan-1.dll native only, and Khronos' loader is in the prefix
only once that installer has run. Without it the Rockstar launcher starts
RDR2.exe and it exits with STATUS_DLL_NOT_FOUND (0xc0000135) before it
opens a window.
A Vulkan runtime installer is now left out of the seeding, and a marker an
earlier seeding wrote for one comes out of each prefix and Proton template
once (dates kept), so the client runs the installer on the next launch.
The installer finishes in a few seconds under FEX.
* fix: Steam's screensaver no longer covers a running game
The client's defaults show screensavers while a game runs, after 300 s on
AC power without a button press - and a held stick or trigger is no press.
Red Dead Redemption 2's intro runs longer than that: the slideshow covered
the game, and the button that woke it reached the game too (B asked to
quit to the desktop). Customization/Screensaver/WhileInGame is seeded "0"
in config.vdf once, like the UI scale and native resolution, so turning it
back on in Settings stays the user's choice.
On the RedMagic: 18 minutes from the last button press through the intro
and riding, focus never left the game and no screensaver was created.
* fix: Rockstar's hidden launcher no longer takes cores from its game
The Rockstar Games Launcher keeps drawing its Chromium interface
(SocialClubHelper.exe: renderers, and a GPU process compositing through
DXVK) for as long as the game runs, hidden behind it - and Wine passes
Chromium's priorities on, so those threads ran above the game's (the GPU
process at nice -10), across every core. With Red Dead Redemption 2 in
front that was 1.3 to 2.5 cores under FEX for a page nobody sees.
droiddeck-launcher-cores follows gamescope's focus from the agent's
focus.json: while a game window has it, every SocialClubHelper thread runs
on the last core of the slowest cluster at nice 19; when the launcher's own
window has focus again each thread gets its own mask and priority back
(also on exit). Stopping the helpers would not hold - proot resumes a
stopped tracee. Started for Steam sessions; BL_LAUNCHER_CORES=0 turns it off.
RedMagic, RDR2 all Low, riding at the thermal limit, same spot and session:
released 46.5 fps, 1% low 27.5, p99 31.8 ms, CPU 89%, 2200 MHz;
held 48.7 fps, 1% low 32.6, p99 27.6 ms, CPU 79%, 2638 MHz.
* fix: sessions clean up what earlier ones left in /tmp
The guest's /tmp is a directory in the rootfs that no boot ever empties,
and Android ends sessions by killing them. Every session left a
/tmp/mangohud.XXXXXXXX (mktemp, never removed), and the Steam client, its
web helper, Chromium apps, dbus-run-session, AppImage runs and KDE their
own temporary files and sockets: 1,422 entries on the RedMagic.
mangoapp's config is now one fixed file rewritten each session, and the
session's first pass sweeps each kind of leftover while nothing that could
own one is running, with a single find. On the device that cleared 1,391
entries over two sessions, leaving 38.
Setup > Proton versions lists DroidDeck-Proton (The412Banner/DroidDeck-Proton) beside
GE-Proton and proton-cachyos: same aarch64 tarball pattern as GE, verified against its
sha512 file, installed by droiddeck-proton-extra (also as "droiddeck" in the session queue)
and adopted by steam-compatibility like any other extra, so it shows as
"DroidDeck-Proton <ver> (Compatible)". Its folder has a space; nothing in the install,
adopt, esync or components paths splits on it.
Update checks: each source's newest full release is looked up at app start and when the
page opens, at most every 6 h (offline keeps the last answer). A newer release shows
"Update available -> <tag>" with Update; it installs beside the old build, which stays
until removed ("Remove old ... versions"), since games are mapped to it by name.
Installed builds are ordered by their version numbers (11-9 before 11-10), not by name,
and the tag each was installed from is recorded. Prereleases and drafts are skipped.