From 903c83718ae257597e6ef174b2fd4064f9cd223f Mon Sep 17 00:00:00 2001 From: The412Banner Date: Tue, 22 Sep 2026 04:37:16 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20PROGRESS=5FLOG=20(state,=20pipeline,=20?= =?UTF-8?q?0.1=E2=86=920.1.4=20timeline,=20lessons,=20backlog)=20+=20the?= =?UTF-8?q?=200.1.1=E2=80=930.1.4=20release=20notes=20under=20docs/release?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROGRESS_LOG.md | 108 +++++++++++++++++++++++ docs/releases/0.1.1.md | 189 +++++++++++++++++++++++++++++++++++++++++ docs/releases/0.1.2.md | 90 ++++++++++++++++++++ docs/releases/0.1.3.md | 73 ++++++++++++++++ docs/releases/0.1.4.md | 104 +++++++++++++++++++++++ 5 files changed, 564 insertions(+) create mode 100644 PROGRESS_LOG.md create mode 100644 docs/releases/0.1.1.md create mode 100644 docs/releases/0.1.2.md create mode 100644 docs/releases/0.1.3.md create mode 100644 docs/releases/0.1.4.md diff --git a/PROGRESS_LOG.md b/PROGRESS_LOG.md new file mode 100644 index 000000000..2d2dc2d7a --- /dev/null +++ b/PROGRESS_LOG.md @@ -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 --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. diff --git a/docs/releases/0.1.1.md b/docs/releases/0.1.1.md new file mode 100644 index 000000000..d7c40e075 --- /dev/null +++ b/docs/releases/0.1.1.md @@ -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. + + diff --git a/docs/releases/0.1.2.md b/docs/releases/0.1.2.md new file mode 100644 index 000000000..cff8f96ff --- /dev/null +++ b/docs/releases/0.1.2.md @@ -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. + diff --git a/docs/releases/0.1.3.md b/docs/releases/0.1.3.md new file mode 100644 index 000000000..7e5abc984 --- /dev/null +++ b/docs/releases/0.1.3.md @@ -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. + diff --git a/docs/releases/0.1.4.md b/docs/releases/0.1.4.md new file mode 100644 index 000000000..94e4d7704 --- /dev/null +++ b/docs/releases/0.1.4.md @@ -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.