Axel's Tab S9 FE still drew its display with the PanVK Android half, set by an earlier build, and
stalled at "Waiting for Steam's first frame" on Mali gralloc's format probes. Under Auto a Mali's
display now goes to Android's own loader whatever was set before (DriverMenus resets it, and the
compositor's driver choice ignores a pair's Android half), with no HAL path to find first. A pair
counts as in use when its runtime half is. A manual pick of the PanVK display is kept.
When audio.log shows AAUDIO_ERROR_DISCONNECTED, the report and the client-sink line say Android
refused the output and that rebooting the phone usually fixes it.
- 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.
Built by build-gamescope.yml run 38335744351 from 0136fb61 and published as a component release
of The412Banner/droiddeck-nonadreno-drivers; the apk build fetches it by tag and checks the sha.
Adds tools/gamescope/patches/0126 (GAMESCOPE_DISABLE_EXPLICIT_SYNC=1 for the nested backends) and
sets it on a GPU that is not an Adreno when the kernel is older than 6.6 (no
DRM_IOCTL_SYNCOBJ_EVENTFD) or the guest's render node is Mali's stand-in. The graphics report
lists it with the rest of the guest's graphics environment.
On the S24 FE the daemon stopped after DirectAudio's failed low-latency load: the second
DirectAudio load in the same daemon never returned, so nothing after it ran and pactl never
connected. The daemon now loads only the plain AAudio sink (no low latency) after DirectAudio,
inside .nofail, and sets whichever exists as the default.
The S24 FE's session still had no sound: its AAudio refuses DirectAudio's low-latency stream with
AAUDIO_ERROR_DISCONNECTED, and the sink guard never got to retry because pactl did not reach the
daemon in time ("the daemon did not answer in 15 s"). On a GPU that is not an Adreno the daemon's
own start-up script now asks DirectAudio again without low latency and loads the plain AAudio sink
underneath it, so a default sink exists whatever pactl does. device.txt and graphics-report.txt
name the build label and source commit, so a log says which build it came from.
- Testers' Mali pairs got the guest drawing (gamescope on the stand-in node, Zink on PanVK) but
the compositor's PanVK Android half failed on Mali gralloc: it probes AHB formats 0x38/0x3b that
mali_gralloc does not have, and "vkCreateImage w/ native buffer failed". Under Auto a Mali pair
now leaves the display on the phone's own Vulkan driver (dma-buf, modifiers and AHB all pass the
testers' checks) and runs the pair's PanVK in the guest; the Android half stays installed for a
manual pick. "Pair in use" now follows the runtime half.
- A session after one whose Xwayland crashed (segfault, then gamescope's X11 I/O error) starts
Xwayland with XWAYLAND_NO_GLAMOR=1 on a non-Adreno device, and says so in app.log.
- graphics-report.txt names the display driver the compositor used, and keeps gralloc, dma-buf,
modifier and import lines from app.log and Xwayland's own lines from the session log.
A Galaxy S24 FE's session had no sound at all: the DirectAudio sink's AAudio stream opened with
AAUDIO_ERROR_DISCONNECTED while the output route was still changing at session start, and the
plain AAudio fallback failed the same moment. The sink guard now retries DirectAudio, then the
plain sink, five times over ten seconds and says which one it got. graphics-report.txt keeps the
client-sink and kbase lines, and explains a KBASE_IOCTL_MEM_EXEC_INIT EPERM as the kbase driver's
own answer rather than the session's sandbox.
- 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.
The system route took vulkan.samsung.so as Samsung's Xclipse, but an Exynos 1280/1380 (Galaxy Tab
S9 FE: Mali-G68) may name its HAL the same; with /dev/mali0 present that HAL is not the system
route's, and the device is detected as the Mali it is. The chip table adds the Exynos 1380 and
1280 (s5e8835, s5e8825: Mali-G68).
A tester's Galaxy S24 FE (Xclipse 940) boots to Steam with the RADV-Xclipse pair, where the
system-driver route fails at Steam's OpenGL (glamor and GLX cannot load a driver). Auto now
downloads and selects RADV on an Xclipse like the Mali pairs, and falls back to the system route
only when RADV is not published. #570's reset of both drivers at each start no longer undoes an
open driver pair. PowerVR (vulkan.powervr.so) keeps the system driver as before.
- Auto on Jim's Dimensity 9300+ chose the bridge: the GPU had no name (the app had not asked
Vulkan yet and kbase's gpuinfo is unreadable under SELinux), so a Mali-G720 counted as a Mali
no build covers. The name now falls back to the GPU the chip is known to carry (Dimensity,
Helio, Kompanio, Tensor); and when nothing names it, Auto asks the vendor Vulkan driver off the
main thread before it settles for the bridge. Auto logs what it decided and why.
- An open Mali driver pair gets /dev/mali0 as the guest's render node, as the bridge does
(bindGpuNode, BL_DRM_STANDIN): gamescope needs the node the driver reports. The session shim
only answers libdrm's PRIME and GEM-close calls on it, which PanVK on kbase never makes.
- A PanVK or RADV runtime half is installed as libvulkan_panfrost.so / libvulkan_radeon.so rather
than under Turnip's name; Turnip keeps libvulkan_freedreno.so.
- graphics-report.txt names the render node the guest got, adds the session script's driver lines
and flags a failed Mali-bridge self-test at the top.
- 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.
The412Banner/droiddeck-nonadreno-drivers adds panvk-mali-kbase: one PanVK build for
G57/G68/G77/G78, G610/G710, G615/G715, G720/G725 and G925, whose display half needs Android 15.
On Android 15+ Auto prefers it for every Mali it covers; below 15, and whenever its release is
not listed, Auto falls back to the GPU generation's own pair. G52/G76 keep the Job Manager
build; a G715/G725/G925 below Android 15, or any Mali no pair covers, draws through the bridge.
Every pair stays selectable by hand.
Auto now picks an open driver pair for the GPU, the way it does for Adreno:
- Mali (no KGSL, /dev/mali0): the GPU's name ("Mali-G720-Immortalis MC12", from the vendor
Vulkan driver or kbase's gpuinfo) picks the PanVK build: G52-G78 (Job Manager), G610/G710,
G615 or G720. A Mali none of them covers (G925...), or one whose pair is not published yet,
draws through the Mali bridge, switched on by Auto.
- Xclipse keeps the system-driver path as Auto; the RADV pair is offered as a manual choice.
- The pairs come from The412Banner/droiddeck-nonadreno-drivers (one pre-release per driver,
each a DriverBundle zip). Only a device without an Adreno reads that repo.
- The importers accept PanVK and RADV libraries (libvulkan_panfrost / libvulkan_radeon).
- An open driver pair and the Mali bridge are alternatives: a selected pair turns the bridge off.
- TU_DEBUG is only set for Turnip, on an Adreno.
Every new branch is reached only when the device has no Adreno; an Adreno's detection, release
sources, Auto choice and session environment are unchanged.
- 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.
#602 adds output checks to tools/dxvk/build.sh; tools/powervr/fetch.py pins the exact
recipe the published PowerVR DXVK was built from, so the branch carries #570's copy.
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.
* feat(): gog & epic achievements UI
* feat(): AI-generated translations - Please get review for these
* build_local: run on macOS hosts with Docker Desktop
Two steps of tools/build_local.sh failed on a Mac:
- The uruntime staging runs on the host, where macOS's BSD install has
no -D, so `install -Dm644` stopped with "No such file or directory".
The folders are now made first and the files copied with install -m644.
- Inside the cross-compile container, Docker Desktop's VirtioFS share
now and then refuses the chmod that install -m makes (EPERM, on a
different file each run, e.g. "setting permissions for
.../droiddeck-esync: Operation not permitted"). The overlay and
desktop scripts are copied with a plain write instead. Nothing is
lost: the APK keeps no file modes, and the app sets them when it
stages the runtime.
* feat(): adjust the store
* feat(): store-achievements adjustment for UI
* feat(): translation fixes and separate hidden achievements
* Show all achievements directly on store game details
---------
Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
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).
* docs: draft 0.4.0 release notes
* docs: add Thor store and launcher media for 0.4.0
* docs: show Steam switching to KDE on Thor
* docs: show Castle Crashers touch layouts and controller choices
* docs: add Amazon game install view
* docs: add trimmed user recording of store downloads
* docs: smoother touch controller recording, GOG sign-in and per-game profile screenshots
* docs: clean desktop round-trip recording replaces the KDE gif and file explorer still
* docs: add multi-controller and Steam Controller media, rebuild desktop gif without glitch frames
* docs: add foldable touch gamepad screenshots from its PR
* docs: add the Discord badge to the 0.4.0 notes and tidy contributor lines
* docs: fold fixes to new 0.4.0 features into their entries, add Follow screen shots, point the changelog at the 0.4.0 tag
* docs: add the Add a game dialog to the non-Steam games entry
* docs: add a TL;DR for Mr. Sujano to the 0.4.0 notes
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.
* feat: a store game's page floods out of its card onto its own hero art, and draws back from it
* fix: installs interrupted by the app closing show in Downloads with Resume and Clear
* feat: finished and interrupted downloads share the running card's art look, and the queue sits under what is running
* fix: the download queue outlives the app: queued, running and paused downloads come back after a restart
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: components list newest first, Steam's sheet opens on its Steam tab with offline mode, and Setup's overview drops the account group
* fix: chip selections stretch across on every move, drawn over the chips instead of behind them