mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 19:11:08 +00:00
183 lines
9.1 KiB
Markdown
183 lines
9.1 KiB
Markdown
# SteamDeck 0.1
|
||
|
||
**Valve's native ARM64 Linux Steam client, on an Android phone or handheld - and now a Linux
|
||
desktop beside it.** No Wine, and no x86 translation for the client itself: it is ARM code running
|
||
as ARM code, under gamescope, presenting through an in-app Vulkan compositor onto your screen.
|
||
Windows games it launches go through Valve's own ARM64 Proton, which is where FEX comes in.
|
||
|
||
This is the first release. One screen, one button: install the runtime, press **Play**, Big
|
||
Picture comes up.
|
||
|
||
> **Early software.** The Steam client and the desktop have both been run end to end on real
|
||
> hardware, but this is version 0.1 and a great deal of it has been exercised on one or two
|
||
> devices only. Where something has not been tested, this page says so rather than implying it
|
||
> works.
|
||
|
||
---
|
||
|
||
# What it does
|
||
|
||
## The Steam client, natively
|
||
|
||
Sign in, browse your library, install and play. The client is fetched from Valve's own manifest on
|
||
the device at first use - **no Valve software is redistributed here**. Windows games run through
|
||
the ARM64 Proton build Valve ships, downloaded by Steam itself.
|
||
|
||
**Proven on device:** sign-in, Proton ARM64 fetched automatically, a game installed from the
|
||
store and launched - *FlatOut* rendering at 144 Hz.
|
||
|
||
## A Linux desktop
|
||
|
||
A second thing the app can start: **LXQt on labwc**, in the same session and the same compositor,
|
||
with Xwayland for X11 programs. Everything on it is downloaded on request from a catalog hosted
|
||
beside the runtime, so the app stays small.
|
||
|
||
| Package | What it brings |
|
||
|---|---|
|
||
| **Desktop** (406 MB) | labwc, LXQt panel, file manager, terminal, text and image viewers, Firefox, mpv |
|
||
| **Emulators** (694 MB) | PPSSPP and RetroArch with 28 cores, plus ScummVM, DOSBox, Mednafen, Snes9x |
|
||
| **RPCS3 · DuckStation · melonDS** | PS3, PS1, DS - the projects' own ARM64 builds |
|
||
| **PCSX2 · Dolphin · Cemu** | PS2, GameCube/Wii, Wii U - **no ARM64 Linux build exists upstream for any of these three**, so they are compiled from source against the same glibc the runtime uses |
|
||
|
||
Between them: PS1, PS2, PS3, PSP, GameCube, Wii, Wii U, N64, SNES, NES, Game Boy/Color/Advance,
|
||
DS, Genesis, Dreamcast, Saturn, PC Engine, arcade and DOS.
|
||
|
||
**Proven on device:** the desktop starts, panel and wallpaper and file manager all come up, at
|
||
the panel's native resolution, and Firefox browses the live internet at 93 fps.
|
||
**Not yet run on device:** the emulators themselves. They build, publish and install; none has
|
||
been launched with a game yet.
|
||
|
||
## Frame generation
|
||
|
||
Extra frames generated between the real ones **inside the app's compositor**, on gamescope's final
|
||
output - so it works for any game with nothing changed in the runtime. **Win-FG** is built in.
|
||
**LSFG** uses the shader chain from your own copy of Lossless Scaling: install it from the Steam
|
||
client in this app and the app reads its `Lossless.dll` out of the runtime's Steam library (parsed
|
||
as data, never executed; nothing of it is redistributed). Pick an engine and 2×/3×/4× on the main
|
||
screen - it applies immediately, mid-game included.
|
||
|
||
**Proven on device:** LSFG 2× generating in *FlatOut* - 30 → 61, 60 → 118 and 61 → 123 fps
|
||
observed, with the on-screen readout showing `base → generated`.
|
||
|
||
## Controls, pointer and keyboard
|
||
|
||
A physical controller is republished into the session as a synthetic **Xbox 360 pad** - the
|
||
identity SDL and Steam have a mapping for. With nothing attached an **on-screen pad** appears and
|
||
writes into the same rings, so the client sees one pad either way; connect a controller and the
|
||
on-screen one disappears, unplug it and it returns.
|
||
|
||
The app draws the pointer. On the desktop, touch is a **touchpad**: drag anywhere and the pointer
|
||
moves from where it is, tap to click, a second finger tapping while one holds (or a two-finger
|
||
tap) right-clicks, two fingers scroll, hold-then-drag drags. In Steam, touch is **direct** - the
|
||
pointer jumps under your finger. A USB or Bluetooth mouse works as itself.
|
||
|
||
**Keyboard** in the drawer puts the soft keyboard over the session, turned into the key presses
|
||
that would have typed it - Shift included, so capitals and the symbol row arrive as themselves.
|
||
|
||
**Not yet tested on device:** the soft keyboard.
|
||
|
||
## Networking
|
||
|
||
The session uses the phone's network directly - proot creates no network namespace, so **IPv4 and
|
||
IPv6 both pass straight through** - and the app writes the runtime's `/etc/resolv.conf` from the
|
||
active network's own DNS servers every time the link changes.
|
||
|
||
**Proven on device:** name resolution and an HTTPS fetch over both IPv4 and IPv6 from inside
|
||
the session, and Firefox loading live pages.
|
||
|
||
## Starting Steam offline
|
||
|
||
**Start offline** on the main screen brings the client up without signing in to Valve. Installed
|
||
games launch; Proton and the frame generation are local anyway. It lives on the main screen and
|
||
not in the drawer for a reason: the client reads the keys that control this *once*, while it
|
||
starts, so changing it mid-session would do nothing until the next launch. Without an earlier
|
||
successful sign-in the button says so and stays disabled.
|
||
|
||
**Not yet tested on device.** Games with always-online DRM will not start offline, and nothing
|
||
can be installed or updated while offline.
|
||
|
||
## Compatibility tools
|
||
|
||
**Compatibility tools** installs **GE-Proton** or **proton-cachyos** - native ARM64 builds -
|
||
beside the ARM64 Proton Valve ships. The runtime's registrar fetches a requested build at the next
|
||
session start, patches it past pressure-vessel, and it appears in Steam under Properties →
|
||
Compatibility for any game.
|
||
|
||
**Not yet tested in this app.**
|
||
|
||
## Background, foreground and the drawer
|
||
|
||
A session belongs to a **foreground service**, not to the activity, so leaving Big Picture does
|
||
not end it: perceptible priority, a partial wake lock so the guest's threads keep running, and a
|
||
high-performance WiFi lock so a backgrounded download is not throttled to nothing. The
|
||
notification is silent and brings the session back.
|
||
|
||
**Back opens the drawer:** the performance HUD, frame generation, on-screen controls
|
||
(auto/always/never), touch mode, display shape, *Send to background* and *Stop session*. A session
|
||
ends only when you say so.
|
||
|
||
## Foldables and odd panels
|
||
|
||
The main screen scales to whatever panel and density it is given. In a session the display shape
|
||
is either the panel's own or a fixed **16:9** - the default on a foldable, so opening or closing
|
||
the device mid-session changes only the bars, never the picture.
|
||
|
||
**Proven on device:** unfolding and folding a Fold mid-session.
|
||
|
||
---
|
||
|
||
# Installing
|
||
|
||
Download the APK below and install it. On first launch it downloads the Linux runtime (~790 MB,
|
||
once). Then press **Play**.
|
||
|
||
**If Bannerlator is already installed**, the runtime image is the same one - the README shows how
|
||
to copy it across with root and skip the download entirely. The two apps stay independent after
|
||
that: separate Steam installs, separate logins, separate games.
|
||
|
||
**Requirements:** an arm64 Android device with an Adreno GPU (the compositor loads a Turnip
|
||
driver), and roughly 3 GB free for the runtime before any games.
|
||
|
||
---
|
||
|
||
# Known limits
|
||
|
||
- **The desktop composites in software.** wlroots allocates through gbm on a real DRM render node
|
||
and the Adreno stand-in is not one, so labwc runs on pixman. Programs still reach the GPU
|
||
themselves through Vulkan and Turnip - it is the desktop's own compositing that is on the CPU.
|
||
- **Firefox's child-process sandboxes are turned off**, because seccomp and namespace sandboxes
|
||
cannot be set up under proot and its tabs crash otherwise. This is a real reduction in
|
||
isolation: treat browsing here as less protected than on a normal desktop.
|
||
- **Changing the display shape takes effect at the next session**, not immediately - gamescope
|
||
fixes its display size when it starts.
|
||
- **No Switch emulator.** Eden's repository was taken down in February and there is nothing to
|
||
mirror or build from.
|
||
- PS3 (RPCS3) and Wii U (Cemu) are demanding even on desktop hardware; expect only light titles.
|
||
|
||
---
|
||
|
||
<details>
|
||
<summary><b> Credits</b> (tap to expand)</summary>
|
||
|
||
- **The412Banner** - the app, the Wayland compositor, the runtime plumbing and the Steam session.
|
||
- **maxjivi05 (Max)** - the gamescope runtime this is built on: the proot session, the session
|
||
shim, the fake-evdev interposer and the controller work, from WinNative.
|
||
- **Winlator (brunodev85)** - the PulseAudio-on-AAudio audio stack, the gamepad state model and
|
||
the shape of a session's host-side components. WinNative and Bannerlator are both Winlator
|
||
lineage.
|
||
|
||
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
|
||
their own authors'. Valve, Steam, Steam Deck and Proton are trademarks of Valve Corporation; this
|
||
project is not affiliated with Valve, and no Valve software is redistributed - the client is
|
||
fetched from Valve's own manifest on your device.
|
||
|
||
</details>
|
||
|
||
*First release. Nothing to upgrade from.*
|
||
|
||
---
|
||
|
||
**APK** `SteamDeck-0.1.apk` - 15832230 bytes
|
||
`sha256 e181dfcc20957c3f824799ed3ef5ec73ddbf9957b7dbb2224c08b7e34ef8db11`
|
||
Built from `05fc566` by [run 35503326574](https://github.com/The412Banner/SteamDeck/actions/runs/35503326574). Signed with the AOSP test key (v1 + v2 + v3), so it installs over earlier test builds in place.
|