diff --git a/design/steam-controller-deck-support.md b/design/steam-controller-deck-support.md index dd5b7b6..cea6a0a 100644 --- a/design/steam-controller-deck-support.md +++ b/design/steam-controller-deck-support.md @@ -693,10 +693,24 @@ configfs) or a kernel USB bus driver — a much larger, less portable lift, and - **The virtual Deck's real value is non-Steam / SDL games on Linux** (emulators, native SDL titles, anything reading the kernel evdev or SDL's HIDAPI Steam driver) — there it delivers grips + trackpads + gyro. It does **not** deliver Steam Input glyphs/bindings. -- **For Steam-Input hosts, the virtual DualSense is the right path** on every platform: Steam *does* - recognize a single-interface DualSense (it needs no interface filtering), giving the client gyro + - a touchpad through Steam Input; the M5 paddle-fold carries the back grips onto standard buttons. - This is why the M6 conflict gate degrades to DualSense, and why `Auto` already prefers it. +- **For Steam-Input hosts, the virtual DualSense is the right path — HARDWARE-VALIDATED (2026-06-29).** + A virtual DualSense (UHID, also `Interface: -1`) run on Bazzite while Steam ran was **fully + promoted**: `controller.txt` logged `Local Device Found type 054c 0ce6 "DualSense Wireless + Controller"`, then **`Controller using HIDAPI driver, vid=0x054c, pid=0x0ce6`** and **loaded + `configset_controller_ps5.vdf`** (it even read back our calibration/pairing/firmware feature blobs). + So the *same* interface `-1` that the Deck is rejected at is **accepted for the DualSense** — proof + the wall is specifically the Deck's multi-interface / interface-2 requirement, *not* a UHID + limitation. The DualSense path therefore delivers **real Steam Input** (gyro + touchpad + glyphs + + bindings) for a streamed Deck/SC client; the M5 paddle-fold carries the back grips onto standard + buttons. This is why the M6 conflict gate degrades to DualSense and `Auto` prefers it. **What the + DualSense identity loses vs a real Deck:** Deck glyphs, the *second* trackpad, and the 4 back grips + as distinct Steam-Input-bindable paddles (they fold to face/shoulder/stick buttons instead). +- **Full Deck-identity Steam Input would need interface 2 → a USB gadget (`dummy_hcd` + configfs HID + functions presenting kbd/mouse/controller, controller on interface 2).** Feasible in principle (it + gives real interface numbers), but heavy and less portable: `dummy_hcd` is not built on Bazzite, the + Deck, or the dev box, so it would have to be built/loaded per-kernel on every Steam host — and an + immutable SteamOS/Bazzite host makes that a package-layer + reboot. The marginal gain over the + validated DualSense path is Deck glyphs + the 2nd trackpad + native back-paddle bindings. - **M7 (a Windows UMDF virtual Steam Deck) is NOT recommended.** Windows Steam applies the same interface filter, and Windows has **no kernel-`hid-steam` evdev fallback** — Windows games consume XInput / RawInput / Windows.Gaming.Input, none of which a non-promoted virtual Deck feeds. So a