- 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.
fix(quest): stabilize desktop and Steam layer presentation
Keep Quest SDR scenes and the black backdrop off the Android Vulkan swapchain regardless of session order or HDR preferences. Only report the first frame after client content is submitted.
Add backdrop lifecycle and first-frame regression coverage. Record the user's successful Quest 3 Test 2 result.
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
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>
feat: droiddeckctl pacing reports the frames that reached the screen
Reads SurfaceFlinger's timestats for the game's layer (or the session's
SurfaceView) over a capture: frames on screen, fps on screen, the
present-to-present histogram and how many intervals were off the usual
cadence. Records split by a refresh-rate change are summed. A game's own fps
counter counts frames handed over, so it can't show dropped or doubled frames.
Co-authored-by: angelrenefm <17342133+angelrenefm@users.noreply.github.com>
fix: droiddeckctl reaches builds shipped under a variant package
The provider authority and the start Activity's component were fixed to
com.droiddeck.launcher, so droiddeckctl could not talk to the antutu,
ludashi or pubg builds from tools/release/variants.txt. DROIDDECK_PACKAGE
now picks the package; the Activity's class name stays the same in every
variant.
Co-authored-by: angelrenefm <17342133+angelrenefm@users.noreply.github.com>
fix: build and test on Windows
- .gitattributes keeps the session's scripts LF under core.autocrlf=true;
CRLF scripts made every session exit with status 2.
- runtime_inputs.py and the scrub record / log zip use '/' in relative
paths, which Windows reported with '\' (runtime inputs never matched).
- The read-only-folder scrub test is skipped on Windows, which still
creates files in a read-only directory.
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.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.
Both store modules are rewritten from a protocol-level spec: new Rust engines behind a small JNI surface (nativeCall/nativeInstall) and thin Kotlin facades, with the launcher's own user agent.
Epic: sign-in carries over, library, manifest download with byte-exact verification, assembly, uninstall, launch arguments, achievements.
Amazon: sign-in carries over, library, manifest download with per-file hash checks, path checks, executable detection from fuel.json, uninstall.
On-disk install layout is unchanged, so existing installs keep working.
Store game pages now take controller focus on their lead hero action (Install, Uninstall, Pause, Resume, Get, Buy), fall back to Back, and keep D-pad focus inside the page while it covers the library.
- 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.
Space checks before Epic, GOG and Amazon installs (measured zero vs unknown), clear failure reasons with retry/clear, resume-aware checks, and safe per-file replacement so a failed or cancelled update never breaks an installed game.
Epic installs stream chunks straight into staged files in parallel (most bytes written once, a small budgeted cache for shared chunks, about 1x game size instead of 2x), pace updates by free space, and keep the lookahead, batch and bounded Java writers as hidden alternatives.
Co-authored-by: Juan Marti Mercado <juanma@microsoft.com>
Co-authored-by: The412Banner <the412banner@users.noreply.github.com>
* fix: desktop session: Shift no longer stays held after typing capitals on a physical keyboard
Android repeats a held key as more key presses. Those were forwarded to the
session as more wl_keyboard presses, and KWin's xkb counts every press of a
modifier, so Shift held for a few capitals took several presses and one
release and stayed held: digits typed !@#, letters stayed capital. The same
applied to Ctrl and Alt.
- the compositor no longer sends a press for a key that is already down;
releases always go through (clients repeat keys themselves from the
repeat_info it already sends)
- the app stops forwarding Android's repeat events for keyboard keys
Reported by whatsupbros with a Keychron Q7 over USB - thank you.
* Remove stale comments from statx patch
---------
Co-authored-by: The412Banner <the412banner@users.noreply.github.com>
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
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.
- gamescope 0131: DEVICE_LOCAL|HOST_VISIBLE requests fall back to host-visible
memory (the bridge's unified-memory model lists none with both), with the
request, type bits and memory types logged on failure; 0130's probe pipeline
is kept and skipped when forced.
- Venus: GAMESCOPE_NO_YCBCR_SAMPLERS=1 from the start; virglrenderer ignores
the destroy of a pipeline it never created instead of marking the context
fatal (vtest server exit 137 on a Mali-G615).
- Steam's OpenAL depot (229020) maps to oalinst_dll, so games that list it
(Hotline Miami) get OpenAL in their prefix.
* 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.