mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 19:11:08 +00:00
docs: PROGRESS_LOG (state, pipeline, 0.1→0.1.4 timeline, lessons, backlog) + the 0.1.1–0.1.4 release notes under docs/releases
This commit is contained in:
1 parent
8e58e8e3eb
commit
903c83718a
5 files changed
+564
No files matched your search
+108
@@ -0,0 +1,108 @@
|
||||
# SteamDeck — Progress Log
|
||||
|
||||
Running engineering log for the SteamDeck app (`com.steamdeck.launcher`). Newest state first, then
|
||||
the timeline, then lessons and backlog. Companion to the README (what the app *does*) and to
|
||||
`docs/releases/` (what each version said) — this is *how it got here and where it stands*.
|
||||
|
||||
---
|
||||
|
||||
## Current state (2026-09-22)
|
||||
|
||||
- **Latest release: 0.1.4** — private: https://github.com/The412Banner/SteamDeck/releases/tag/0.1.4
|
||||
· public: https://github.com/The412Banner/winlator-contents/releases/tag/SteamDeck-0.1.4
|
||||
`main` @ `8e58e8e`, CI run 35682844106, versionCode 5, APK sha256 `4b53ce6a…` (20,957,823 B).
|
||||
- **Runtime:** `linuxfs-r9` on winlator-contents (790 MB), the only runtime release left; desktop
|
||||
packages from `steamdeck-desktop-r1`. The app rewrites its own scripts (`bannerlator-*`), the
|
||||
driver, `bannerlator-netmanager` and the DirectAudio pieces into the installed runtime at every
|
||||
launch, so a fix in those reaches an installed runtime without a re-download.
|
||||
- **Shipped feature set:** the native ARM64 Steam client under gamescope on the in-app Wayland
|
||||
compositor; a LXQt-on-labwc desktop with Firefox and a shelf of emulators; Proton tools
|
||||
(GE / CachyOS) as downloads; graphics drivers importable per mode; DirectAudio + microphone;
|
||||
client/game core masks + four session switches; NetworkManager stand-in (Max's); overlay
|
||||
restored; ROMs folder + Storage bound into the session's home; Bannerlator's File Manager;
|
||||
a cog per launch mode (resolution, shape, HDR10, drivers, touch, OSC/audio, renderer); per-session
|
||||
log folders that survive a crash; leftover-process sweep; frame generation (Win-FG, LSFG).
|
||||
- **Verification level:** every release is CI-green and staged to the maintainer's device. Proven
|
||||
on hardware (Pocket FIT / Fold): sign-in, store, install + launch (FlatOut 144 Hz), frame
|
||||
generation, controllers + OSC, sound, desktop + Firefox, folding mid-session, driver import, the
|
||||
log folder, the ANR fix, the network page. **Not yet proven:** everything 0.1.4 added (ROMs
|
||||
folder inside an emulator, File Manager, resolution cap, HDR10, crash sweep, orphan sweep, the
|
||||
drawer's Steam menu), DirectAudio *voice*, the core masks' effect, offline start, the soft
|
||||
keyboard, any emulator with a game, Adreno 710.
|
||||
- **Open field reports (Thor Pro, 8 Gen 2):** trackpad-mode tap does not click (code sends the
|
||||
click; cause not found by reading); crash after 1–2 min in Ballionaire / Geometry Wars (no log
|
||||
survived — 0.1.4's sweep will leave `crash.log`); a Fold's 10–20 fps client menus (Chromium →
|
||||
ANGLE → Zink on an experimental A8xx Turnip); Fold crash loop (xalia ENOSYS storm — switches
|
||||
shipped, untested); FlatOut shrinking after Resume (gamescope forcing the swapchain extent).
|
||||
|
||||
## Release pipeline (how every version is cut)
|
||||
1. Work on `main`, pushed → `Build APK` runs `assembleRelease` (AOSP test key, v1+v2+v3 re-signed
|
||||
by CI with zipalign + apksigner) → artifact `steamdeck-apk`. Dev builds keep the last release's
|
||||
versionCode/versionName; a release bumps both in `app/build.gradle` in its own commit.
|
||||
2. Verify: `gh run view <id> --json conclusion` (never trust a run listing's first row — a
|
||||
`workflow_dispatch` run gets cancelled by concurrency in favour of the push-triggered one),
|
||||
download the artifact, sha256 it.
|
||||
3. Stage: `cp` to `/sdcard/Download/SteamDeck-rN.apk` (dev) or `SteamDeck-X.Y.Z.apk` (release).
|
||||
Never `pm install` — the maintainer installs.
|
||||
4. Private release `X.Y.Z` targeting the **full 40-char sha** (a short sha is refused), notes from
|
||||
the draft in the session scratchpad, `--latest`. Public release `SteamDeck-X.Y.Z` on
|
||||
winlator-contents with the README-style notes; one public release per version.
|
||||
5. README ledger, this log, memory.
|
||||
|
||||
## Timeline
|
||||
- **2026-09-19 — 0.1 groundwork.** Lifted out of Bannerlator's gamescope runtime on the user's
|
||||
ask: one screen, one button. r2 reached Big Picture sign-in on the Pocket FIT. Package renamed to
|
||||
`com.steamdeck.launcher` (r4), foreground service, test key, on-screen controls.
|
||||
- **2026-09-20 — 0.1.** The Linux Steam client and a desktop; runtime r6→r9 in a day (Proton
|
||||
self-selection, proot shipped, refresh rate, video, first run reaches a game). Public explainer
|
||||
page for non-Linux users.
|
||||
- **2026-09-21 — 0.1.1.** Catch-up with Bannerlator: driver selection (two lists, per mode),
|
||||
overlay restored + GameHub force-stop, DirectAudio + microphone, core masks, four session
|
||||
switches as toggles, per-session log folders with credentials scrubbed, Adreno 710 path via
|
||||
Banners-Turnip r3.
|
||||
- **2026-09-22 — 0.1.2.** The teardown ANR (log collection on the main thread) fixed; two
|
||||
compositor log lines (frame-size change, window rename); README ledger.
|
||||
- **2026-09-22 — 0.1.3.** Max's NetworkManager stand-in ported (the client's network page); shim
|
||||
audit vs WinNative = zero functional drift.
|
||||
- **2026-09-22 — 0.1.4.** ROMs folder + Storage in the session's home; Bannerlator's File Manager
|
||||
ported whole; a cog per mode (railed settings window) with resolution cap, shape, HDR10 gated on
|
||||
the panel, drivers, touch, OSC/audio/renderer; two-column main menu; crash-safe log folders +
|
||||
Session logs toggle; OrphanReaper; drawer Steam menu. Public releases reorganised: one per
|
||||
version, old `Steamdeck` release and runtimes r1–r8 deleted.
|
||||
|
||||
## Architecture (where things live)
|
||||
- `MainActivity` / `ui/MainScreen.kt` — the main screen; `ui/ModeSettingsDialog.kt` the cogs;
|
||||
`ui/*Dialog.kt` the rest.
|
||||
- `SessionActivity` — the Surface, input (touch, touchpad, pads, keyboard), the drawer, the HDR
|
||||
decision, the compositor start (`wayland/CompositorHost`, `wayland/WaylandCompositor`).
|
||||
- `session/SessionService` — proot + gamescope/labwc + PulseAudio + DirectAudio relay + network
|
||||
link; binds (`/root/Storage`, `/root/ROMs`); env for the guest; teardown; `OrphanReaper`;
|
||||
`SessionArtifacts` + `CrashHandler` + `SessionPaths` for the log folders; `SessionPrefs`.
|
||||
- `files/` — Bannerlator's File Manager (`FileManagerScreen.kt` and its helpers), the picker
|
||||
activity and `InAppFilePicker` intent API.
|
||||
- `gpu/` — Turnip (bionic, for the compositor) and Linux Turnip (glibc, for the runtime) managers.
|
||||
- `tools/linuxfs/overlay/usr/local/bin/bannerlator-*` — the guest scripts, staged into the
|
||||
runtime by `SessionFiles` at every launch (CI packages only `bannerlator-*` names).
|
||||
- `app/src/main/cpp/waylandcomp/` — the compositor (shared lineage with Bannerlator).
|
||||
|
||||
## Lessons learned (don't repeat these)
|
||||
- Nothing in teardown may do bulk filesystem work on the main thread (0.1.1's ANR).
|
||||
- A CI closure check on a multi-line variable must flatten it first (`libaaudio.so` refusal).
|
||||
- A runtime script must be named `bannerlator-*` or CI never packages it.
|
||||
- `gh release create --target` needs the full sha.
|
||||
- A proot bind is invisible to a program's "Computer" list; put what users need under home.
|
||||
- The compositor decides its driver and its HDR gate once per app process — anything that changes
|
||||
them applies after the app is fully closed, and the UI must say so.
|
||||
- Bannerlator's File Manager ports mechanically (`port_fm.py` anchors) once the container hooks
|
||||
are cut; do not hand-edit 2,500 lines.
|
||||
- Deleting a release asset on GitHub can drop a sibling asset — re-list and restore.
|
||||
|
||||
## Backlog / next
|
||||
- Device-prove 0.1.4 on the FIT (list above).
|
||||
- Thor Pro: trackpad tap; the 1–2 min in-game crash once a `crash.log` arrives.
|
||||
- Xfce as a second desktop shell (Max's branch runs XFCE 4.20 on labwc) — a catalog package + a
|
||||
shell choice in the Desktop cog; comfort, not performance.
|
||||
- Quick Access Menu for non-Deck pads — no confirmed chord; needs research, not a guess.
|
||||
- FlatOut shrink: try `vk_wsi_force_swapchain_to_current_extent=false` via `steamdeck-env`.
|
||||
- Max's stricter `winnative-directaudio` guards; `winnative-epic-launch` (a feature).
|
||||
- Rename before anything truly public: "SteamDeck" is Valve's mark.
|
||||
@@ -0,0 +1,189 @@
|
||||
# SteamDeck 0.1.1
|
||||
|
||||
**A patch release, and mostly about the two things 0.1 could not do: change a driver, and tell you
|
||||
what went wrong.** Install it over 0.1 — same key, same runtime, nothing to re-download.
|
||||
|
||||
Everything here came out of one day of reports from three devices, which is why so much of it is
|
||||
about being able to *see* a fault rather than a new feature.
|
||||
|
||||
---
|
||||
|
||||
## 🧩 Graphics drivers — a new button on the main screen
|
||||
|
||||
Two lists, because a zip for one cannot serve the other:
|
||||
|
||||
- **Linux runtime driver** — the glibc Turnip everything *inside* the runtime renders on: the Steam
|
||||
client's interface, every game it launches, and in desktop mode every program on the desktop.
|
||||
Import a `-Linux` Turnip zip; an Android or `-Wayland` zip is refused with the reason rather than
|
||||
becoming a black screen. The choice is **per mode**, so Steam and the desktop can run different
|
||||
builds. Nothing inside the runtime is modified — the session is pointed at the imported driver
|
||||
and the runtime's own Turnip is what a removed or unreadable import falls back to.
|
||||
- **Display driver (Android)** — the bionic Turnip the app's compositor puts the frame on the panel
|
||||
with. *Auto* keeps the GPU pick between the two bundled builds; an imported AdrenoTools zip can
|
||||
be chosen instead. It applies after the app is fully closed and reopened, because the compositor
|
||||
loads its driver once per process.
|
||||
|
||||
This is how a driver fix now reaches an installed runtime without a ~790 MB re-download.
|
||||
|
||||
✅ **Proven on device:** an imported Mesa 26.3.0 (Vulkan 1.4.363) glibc Turnip drawing a whole Steam
|
||||
session — gamescope, the client, its UI helpers and Xwayland all on it — with an imported Android
|
||||
Turnip in the compositor in place of the bundled build.
|
||||
|
||||
### 📱 Adreno 710 / 720 / 722
|
||||
|
||||
0.1 cannot start on these at all: Mesa has no entry for them and the session dies at
|
||||
`device (chip_id = 7010000, gpu_id = 710) is unsupported`. There is now a path — import
|
||||
`Turnip-…-710-720-Test.zip` as the **Display driver** and `…-710-720-Test-Linux.zip` as the **Linux
|
||||
runtime driver**, from Banners-Turnip's `v26.3.0-20260921-r3` or newer. Those GPUs also want
|
||||
sysmem rendering, which the app sets on its own when it sees that driver chosen.
|
||||
|
||||
⚠️ **Unverified on real hardware.** Nobody has run this runtime on a 710 yet. If you have one,
|
||||
the session folder is the thing to send.
|
||||
|
||||
---
|
||||
|
||||
## 🔊 Sound, and the microphone
|
||||
|
||||
**DirectAudio for games** replaces Wine's audio driver *inside the games the client launches* with
|
||||
one that talks straight to Android over a socket — no PulseAudio in between, and no resampling.
|
||||
The client itself keeps PulseAudio either way; it is a native Linux program with no other way to
|
||||
make a sound. It pairs only with a Wine 11 Proton (Valve's ARM64 builds, GE-Proton, proton-cachyos)
|
||||
and stays off on anything else rather than play silence, saying so in the log.
|
||||
|
||||
**Microphone** is its own switch: the relay helper opens Android's input stream under the app's own
|
||||
uid — which is what the recording permission is checked against — and PulseAudio exposes it to the
|
||||
client as **DirectAudioMic**, for voice chat. With it off, nothing in the session can record and
|
||||
Android's indicator stays off.
|
||||
|
||||
Both are under **Audio** on the main screen, both off by default, both applying at the next session
|
||||
start. A game's first launch after enabling DirectAudio still uses Proton's own audio — the driver
|
||||
is named in that game's prefix, which does not exist until then — and the second uses DirectAudio.
|
||||
|
||||
⚠️ Built and wired; the microphone reached `DirectAudioMic` only after a fix to the bundled
|
||||
PulseAudio (0.1 shipped a 17.0 build of the module beside a 13.0 daemon, so it could never load).
|
||||
Treat voice as ready to test rather than proven.
|
||||
|
||||
---
|
||||
|
||||
## 🎮 Steam's overlay, and the app that takes your login
|
||||
|
||||
Two deviations from a normal Steam launch, both removed rather than worked around.
|
||||
|
||||
The overlay used to be stripped from every game, because it sat in front of the controller reader.
|
||||
That was an ordering problem — the interposer now goes first and the overlay loads as Valve intends.
|
||||
Every difference between the launch Valve ships and what runs here is a difference this runtime
|
||||
would otherwise have to account for.
|
||||
|
||||
And another Steam client on the same phone signs this one out seconds after every login. The app
|
||||
now asks Android to stop it when a session starts and says so. ⚠️ Where that app restarts itself
|
||||
through boot receivers, a background stop is a race it can win — if the client keeps signing out,
|
||||
uninstall the other one.
|
||||
|
||||
---
|
||||
|
||||
## 🧮 Performance and session fixes
|
||||
|
||||
**Performance** on the main screen, all off by default, all applying at the next session start:
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Steam client cores** | Steam pins its own interface to a subset of cores it chooses — on one device five of eight, leaving out the fastest — which suits a running game and makes the menus sluggish when the client is all there is. Overriding it pins the client, its UI helper and gamescope to the cores you tick, re-applied every few seconds because the UI keeps spawning helpers that inherit Steam's choice |
|
||||
| **Game cores** | the cores a game may run on, applied by exec'ing it through `taskset` so every thread inherits the mask from its first instruction |
|
||||
| **Skip Steam's xalia helper** | `xalia` is an x86 Windows program Proton starts for gamepad navigation. On some devices its system calls are refused in a way it cannot cope with and the session dies seconds after Big Picture appears. Turn this on if a session will not stay up |
|
||||
| **Run proot without seccomp** | proot normally lets most system calls run untraced, which is most of its speed. Some kernels handle that badly and refuse calls that plainly exist. This traces everything instead: slower, but correct |
|
||||
| **Turnip: sysmem rendering** | for an Adreno 8xx that looks glitchy or slow, and required on a 710/720/722 |
|
||||
| **Zink: lazy descriptors** | the client's menus are drawn through Zink; the first thing to try when the menus are slow while games are fast |
|
||||
|
||||
Plus `Download/steamdeck-env`, a file of `KEY=VALUE` lines added to the session's environment, for
|
||||
an experiment that would otherwise need a build per attempt.
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ Logs worth sending
|
||||
|
||||
This is the change that will save the most time. Each session now gets **its own folder**:
|
||||
|
||||
```
|
||||
Download/SteamDeck/session-20260921-161256/
|
||||
device.txt what this device is, and every setting the session ran with
|
||||
network.txt the link, the DNS the runtime was given, and what it means
|
||||
app.log what the app itself decided and reported
|
||||
crash.log Android's crash buffer, as it stood when the session ended
|
||||
audio.log the PulseAudio daemon and the DirectAudio relay helper
|
||||
session.log the guest session: proot, gamescope, the client's own output
|
||||
wayland.log the compositor — what it presented, and how fast
|
||||
steam.log + steam/ the client's own logs (Steam mode)
|
||||
desktop.log labwc, the panel and the programs on it (desktop mode)
|
||||
```
|
||||
|
||||
`device.txt` is written before the session starts, so a session that dies in its first second still
|
||||
says what it ran on: model, SoC, Android and kernel, cores and their ceilings, RAM, the GPU as KGSL
|
||||
names it, the panel, **which driver each half of the session chose**, and every switch in effect.
|
||||
`crash.log` is where a session the *system* killed leaves its only trace.
|
||||
|
||||
**Credentials are scrubbed and nothing identifying is collected.** Steam's logs are filtered line by
|
||||
line on the way in — session tokens, machine-auth GUIDs, WebAPI keys, Guard codes and e-mail
|
||||
addresses are replaced, and a SteamID is masked to its last four digits so lines still correlate.
|
||||
`loginusers.vdf`, `config.vdf` and the `ssfn` files are never copied. No serial number, no device or
|
||||
advertising id, no account name, no network name. **A session folder is meant to be attached to a
|
||||
report exactly as it is.**
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ If Steam dies with nothing in the log
|
||||
|
||||
That is usually not Steam. **Android 12 and later kill the extra processes an app starts for
|
||||
itself** once there are more than a few, and a session is made of dozens — proot, gamescope,
|
||||
Xwayland, the client and its helpers, Wine, FEX. Where that is left on, the OS ends the session and
|
||||
no log of ours says why, because nothing in the session did it.
|
||||
|
||||
Some phones expose it in Developer options as a **"restrict child processes"** switch — turn it off.
|
||||
Otherwise, once per device:
|
||||
|
||||
```sh
|
||||
adb shell settings put global settings_enable_monitor_phantom_procs false
|
||||
```
|
||||
|
||||
`device.txt` records what your phone reports, and the Performance dialog says so when it is not
|
||||
disabled.
|
||||
|
||||
---
|
||||
|
||||
## Still true from 0.1
|
||||
|
||||
VAC-protected games report insecure. Games that ship only a Linux build will not start — install
|
||||
the Windows version instead. The desktop composites in software, and Firefox's child-process
|
||||
sandboxes are off there. No Switch emulator. The emulator packages install but none has been run
|
||||
with a game.
|
||||
|
||||
If a game launches and dies instantly, check **Properties → Compatibility** in the client: a game
|
||||
pointed at the ARM64 Proton needs that depot to have finished downloading, and the session log says
|
||||
so plainly when it has not.
|
||||
|
||||
---
|
||||
|
||||
## Credits
|
||||
|
||||
- **maxjivi05 (Max)** — the gamescope runtime this is built on: the proot session, the session shim,
|
||||
the input interposer and the controller work, from WinNative. The `PROOT_NO_SECCOMP` fallback and
|
||||
the phantom-process finding above are his too.
|
||||
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
|
||||
- **Winlator (brunodev85)** — the PulseAudio-on-AAudio audio stack, the gamepad state model and the
|
||||
shape of a session's host-side components.
|
||||
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
|
||||
|
||||
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
|
||||
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
|
||||
|
||||
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
|
||||
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
|
||||
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
|
||||
|
||||
---
|
||||
|
||||
**APK** `SteamDeck-0.1.1.apk` — 15927028 bytes
|
||||
`sha256 db4b0604ca53c4441bb66d0764ca7ff98b2a9f7bdfc48e3d52c6024b3a4bf78c`
|
||||
versionCode 2, built from `2570562` by [run 35634795441](https://github.com/The412Banner/SteamDeck/actions/runs/35634795441).
|
||||
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1 and the r24–r34 test builds in place.
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
# SteamDeck 0.1.2
|
||||
|
||||
**A fix release. 0.1.1 could hang the app when you left a session — that is fixed, and the two log
|
||||
lines that would have explained it in the first place are in.** Install it over 0.1.1; same key,
|
||||
same runtime, nothing to re-download.
|
||||
|
||||
---
|
||||
|
||||
## 🩹 Leaving a session could hang the app
|
||||
|
||||
0.1.1 collected a session's logs on the main thread as the session stopped — copying the
|
||||
compositor's log, scrubbing every one of the client's logs line by line, then waiting on Android's
|
||||
crash buffer. On a desktop session that was around four and a half seconds of frozen app, and
|
||||
Android ended it as not responding. The collecting now happens on its own thread.
|
||||
|
||||
This was introduced by 0.1.1's own logging, and it is the whole reason for this release.
|
||||
|
||||
`crash.log` was wrong twice over in 0.1.1 as well: it waited for output that arrives on another
|
||||
thread, so it declared the buffer empty every time, and it printed a process id where an exit
|
||||
status belonged. It now waits for the dump to finish and says which of three things happened —
|
||||
could not start, did not finish, or genuinely nothing has crashed.
|
||||
|
||||
## 🔍 Two log lines that were missing
|
||||
|
||||
Both came out of chasing a real report: a game that came back from the Steam menu as a small box in
|
||||
the corner of the screen.
|
||||
|
||||
- **`changed its frame size: 1920x1080 -> …`** — a window that commits frames at a new size has
|
||||
rebuilt its swapchain, and that is exactly what a game shrinking looks like from the compositor's
|
||||
side. The size was previously nowhere in the logs and had to be guessed from a screenshot.
|
||||
- **`renamed "Steam Big Picture Mode" -> "Flat-Out"`** — gamescope keeps one window and renames it
|
||||
as the game takes the screen. That was silent, so the log showed a window *closed* under a name it
|
||||
had never been logged as opening, which looked like a missing event and was really a rename.
|
||||
|
||||
## 📖 A README that matches the app
|
||||
|
||||
The README had grown a section per feature in the order they were written, and the parts describing
|
||||
the whole had fallen behind. The feature ledger now covers the drivers, audio, cores, session fixes
|
||||
and logs, with an honest state against each — including, in plain words, the several that set what
|
||||
they claim but have never been measured on hardware. The architecture diagram shows the audio relay
|
||||
and both Turnip slots. The session-log folder has a section of its own. And **Installing** now
|
||||
mentions the one Android setting that decides whether a session stays up at all.
|
||||
|
||||
---
|
||||
|
||||
## Everything from 0.1.1 is here
|
||||
|
||||
Graphics drivers you can import and choose, per mode · Steam's overlay restored and a competing
|
||||
client asked to stop · DirectAudio for games and the microphone · client and game core masks · four
|
||||
session fixes (xalia, proot without seccomp, Turnip sysmem, Zink lazy descriptors) ·
|
||||
`Download/steamdeck-env` · a folder of logs per session with credentials scrubbed and nothing
|
||||
identifying collected · a path for Adreno 710 / 720 / 722 through imported drivers.
|
||||
|
||||
See the [0.1.1 notes](https://github.com/The412Banner/SteamDeck/releases/tag/0.1.1) for what each
|
||||
of those does, and the README's ledger for what is proven versus merely wired.
|
||||
|
||||
## ⚠️ If the client dies with nothing in its log
|
||||
|
||||
That is usually not the client. **Android 12 and later kill the extra processes an app starts for
|
||||
itself**, and a session is made of dozens. Some phones have a **"restrict child processes"** switch
|
||||
in Developer options — turn it off. Otherwise, once per device:
|
||||
|
||||
```sh
|
||||
adb shell settings put global settings_enable_monitor_phantom_procs false
|
||||
```
|
||||
|
||||
`device.txt` in every session folder records what your phone reports, and the Performance dialog
|
||||
says so when it is not disabled.
|
||||
|
||||
## Credits
|
||||
|
||||
- **maxjivi05 (Max)** — the gamescope runtime this is built on, from WinNative.
|
||||
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
|
||||
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
|
||||
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
|
||||
|
||||
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
|
||||
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
|
||||
|
||||
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
|
||||
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
|
||||
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
|
||||
|
||||
---
|
||||
|
||||
**APK** `SteamDeck-0.1.2.apk` — 15927028 bytes
|
||||
`sha256 a761ba112fe97f4631d598f2a5d0b1898f9b81f4575771ded39c17b743f80825`
|
||||
versionCode 3, built from `1f0292c` by [run 35674235857](https://github.com/The412Banner/SteamDeck/actions/runs/35674235857).
|
||||
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.1 in place.
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# SteamDeck 0.1.3
|
||||
|
||||
**One thing, and it was owed: the client's network page works, and its connection indicator tells
|
||||
the truth.** Install it over 0.1.2; same key, same runtime, nothing to re-download.
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Settings → Internet works, and the header shows a connection
|
||||
|
||||
The Steam client builds its network page and its connection indicator on NetworkManager, and looks
|
||||
for one on the system bus as it starts. This runtime had neither, so the page stopped with
|
||||
*"StartScanningForNetworks is not a function"* under a header that showed no connection even while
|
||||
downloads ran. A user on an Odin 2 reported exactly that in the first day.
|
||||
|
||||
The session now starts a small system bus and a **stand-in that answers for NetworkManager**. It
|
||||
reports what is true and nothing more — one connection that is up while Android has a route out —
|
||||
and refuses what it cannot do, since nothing in this runtime can scan for or join a network. The
|
||||
session log says `network: system bus up, NetworkManager stand-in running` when it is working.
|
||||
|
||||
Both the stand-in and the bus configuration come from the app at every launch, so an installed
|
||||
runtime gets this without a re-download; `dbus-daemon` and `python-gi` were already in it.
|
||||
|
||||
**The stand-in is maxjivi05's**, written for WinNative and carried by Bannerlator since; this app was
|
||||
the only one of the three without it. Credit where it is due, and an apology to the Odin 2 reporter,
|
||||
who was told it was cosmetic and unfixed when it had been fixed upstream for days.
|
||||
|
||||
## 🔍 Where the runtime stands against its sources
|
||||
|
||||
With this release the standalone's runtime scripts are level with Bannerlator's, and its sandbox
|
||||
shims are byte-for-byte the same behaviour as Max's current branch — checked file by file today;
|
||||
every difference is a deliberate rename or an attribution header. What remains on his side and not
|
||||
here is a feature, not a fix: launching Epic games from the native client.
|
||||
|
||||
---
|
||||
|
||||
## Everything from 0.1.2 and 0.1.1 is here
|
||||
|
||||
The hang on leaving a session, fixed · the two compositor log lines that explain a shrinking game ·
|
||||
graphics drivers you can import and choose, per mode · Steam's overlay restored and a competing
|
||||
client asked to stop · DirectAudio for games and the microphone · client and game core masks · four
|
||||
session fixes · `Download/steamdeck-env` · a folder of logs per session with credentials scrubbed ·
|
||||
a path for Adreno 710 / 720 / 722 · a README with an honest ledger of what is proven and what is
|
||||
merely wired.
|
||||
|
||||
## ⚠️ If the client dies with nothing in its log
|
||||
|
||||
Android 12 and later kill the extra processes an app starts for itself, and a session is made of
|
||||
dozens. Some phones have a **"restrict child processes"** switch in Developer options — turn it off.
|
||||
Otherwise, once per device: `adb shell settings put global settings_enable_monitor_phantom_procs
|
||||
false`. `device.txt` in every session folder records what your phone reports.
|
||||
|
||||
## Credits
|
||||
|
||||
- **maxjivi05 (Max)** — the gamescope runtime this is built on, the sandbox shims, and the
|
||||
NetworkManager stand-in in this release, from WinNative.
|
||||
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
|
||||
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
|
||||
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
|
||||
|
||||
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
|
||||
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
|
||||
|
||||
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
|
||||
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
|
||||
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
|
||||
|
||||
---
|
||||
|
||||
**APK** `SteamDeck-0.1.3.apk` — 15931221 bytes
|
||||
`sha256 3f85118755234c5d8b1fb59640f817485d8360db7c63c142072c6b1025606542`
|
||||
versionCode 4, built from `3aa0162` by [run 35676349317](https://github.com/The412Banner/SteamDeck/actions/runs/35676349317).
|
||||
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.2 in place.
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
# SteamDeck 0.1.4
|
||||
|
||||
**The main screen got its shape, the desktop can see the phone, the logs survive a crash, and the
|
||||
file manager is Bannerlator's.** Install it over 0.1.3; same key, same runtime, nothing to
|
||||
re-download.
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ The desktop can see your files — and a ROMs folder
|
||||
|
||||
A file dialog inside the desktop (RPCS3's "Select Game Folder", say) showed only the runtime's own
|
||||
tree. The phone's storage *was* mounted the whole time, at `/storage/emulated/0`; the dialogs
|
||||
just could not show it — they list "Computer" from the mount table, where a proot bind never
|
||||
appears, and open in the home folder, where nothing pointed at the phone.
|
||||
|
||||
The home folder now carries two entries every session: **`Storage`**, all of internal storage, and
|
||||
**`ROMs`**, the folder chosen with the new **ROMs folder** tile — anywhere on the device, an SD
|
||||
card included (it is a bind, not a link). Point an emulator at `/root/ROMs` once. Both are the
|
||||
live folders: a save written next to a ROM lands on the phone.
|
||||
|
||||
## 📁 Files — Bannerlator's File Manager, whole
|
||||
|
||||
The **Files** tile is Bannerlator's File Manager carried over as it is: grid and list, sort,
|
||||
search, multi-select, copy / cut / paste with conflict handling and a cancellable progress bar,
|
||||
rename, delete, new folder, properties (read-only, hidden), favourites, and a locations rail with
|
||||
every mounted card, Downloads, the ROMs folder and the session logs. Its pick mode is what chooses
|
||||
the ROMs folder and imports a driver, in place of Android's document picker. Left out, because
|
||||
they have no meaning without a Wine container: run, add to shortcuts, the C: / Z: drives and the
|
||||
archive unpacker.
|
||||
|
||||
## ⚙️ A cog beside Play and beside Desktop
|
||||
|
||||
Everything that only matters for one mode moved behind that mode's cog — a settings window with
|
||||
a rail of sections: **Display** (resolution up to 1080p by default, 900p, 720p or the panel's own;
|
||||
the shape), **HDR**, the **runtime driver** for that mode, the **display driver**, **touch**, and
|
||||
for Steam the on-screen controls and audio, for the desktop its renderer. The Graphics drivers and
|
||||
Audio tiles are gone into them, and the main screen is a two-column grid: Play, Desktop and Start
|
||||
offline on top, then Runtime · Desktop & apps · Frame generation · Compatibility tools ·
|
||||
Performance · ROMs folder · Files · Session logs.
|
||||
|
||||
**HDR10 output** is a switch that is greyed out, with the reason, on a panel that does not list
|
||||
HDR10. On, the compositor offers `wp_color_manager_v1` with BT.2020 + PQ and 10-bit buffers,
|
||||
gamescope starts with `--hdr-enabled` and games get `DXVK_HDR=1`. The compositor decides this once,
|
||||
when it starts, so like the display driver it applies after the app is fully closed and opened
|
||||
again. ⚠️ Wired end to end; not yet seen on a device from this app.
|
||||
|
||||
## 🩹 Logs that survive a crash, and a session that always starts
|
||||
|
||||
A session's folder used to be finished only at a clean stop; an app crash or an Android kill left
|
||||
it half-written — a user saw the toast name a log that was not there. The folder is now finished
|
||||
three ways: the ordinary stop; the app's own crash handler, which writes `crash-app.txt` and
|
||||
finishes the folder before the process dies; and a sweep at the next app start for any folder
|
||||
without its `.complete` marker (a native crash, a kill), which gets `ended-without-teardown.txt`
|
||||
and Android's crash buffer. **Session logs** on the main screen turns the folder off (it then
|
||||
lives in the cache and is deleted with the session).
|
||||
|
||||
The same user had to force-stop the app before every launch or nothing started: when the app dies,
|
||||
proot, gamescope and Steam outlive it, holding the rootfs, the GPU and Steam's lock. Every session
|
||||
start now kills whatever of ours is still running from before, and `app.log` lists it.
|
||||
|
||||
## 🎮 Steam menu from the drawer
|
||||
|
||||
The in-session drawer has **Steam menu ◉** in Steam mode — the Guide button, for a device whose
|
||||
own home button belongs to Android and a pad the client hides the on-screen controls for. (There is
|
||||
no Quick Access chord on a non-Deck controller that I could confirm, so none is offered.)
|
||||
|
||||
---
|
||||
|
||||
## Everything from 0.1.3 and before is here
|
||||
|
||||
The client's network page · graphics drivers you can import and choose, per mode · Steam's overlay
|
||||
restored and a competing client asked to stop · DirectAudio and the microphone · client and game
|
||||
core masks · four session fixes · a folder of logs per session with credentials scrubbed · a path
|
||||
for Adreno 710 / 720 / 722.
|
||||
|
||||
## ⚠️ If the client dies with nothing in its log
|
||||
|
||||
Android 12 and later kill the extra processes an app starts for itself, and a session is made of
|
||||
dozens. Some phones have a **"restrict child processes"** switch in Developer options — turn it off.
|
||||
Otherwise, once per device: `adb shell settings put global settings_enable_monitor_phantom_procs
|
||||
false`. `device.txt` in every session folder records what your phone reports.
|
||||
|
||||
## Credits
|
||||
|
||||
- **maxjivi05 (Max)** — the gamescope runtime this is built on, the sandbox shims, the controller
|
||||
work and the NetworkManager stand-in, from WinNative.
|
||||
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing, the Steam session and
|
||||
the File Manager (from Bannerlator).
|
||||
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
|
||||
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
|
||||
|
||||
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
|
||||
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
|
||||
|
||||
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
|
||||
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
|
||||
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
|
||||
|
||||
---
|
||||
|
||||
**APK** `SteamDeck-0.1.4.apk` — 20957823 bytes
|
||||
`sha256 4b53ce6a937f2b51a5b9d2639ea32b816993e4f7b2dc33dd0f3198b81f21e9d2`
|
||||
versionCode 5, built from `8e58e8e` by [run 35682844106](https://github.com/The412Banner/SteamDeck/actions/runs/35682844106).
|
||||
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.3 in place.
|
||||
Reference in new issue
Block a user