From 6425f9995f5cf6737c97cbaf35e33d0732b402ba Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 11 Jun 2026 17:52:57 +0000 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20=C2=A710=20HDR=20parked=20(ups?= =?UTF-8?q?tream=20compositor=20blocker)=20+=20Bazzite=20dynamic-resolutio?= =?UTF-8?q?n=20landed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §10: HDR/10-bit is blocked at the capture source, not our stack — gamescope's PipeWire node is hardcoded 8-bit (BGRx/NV12; confirmed in src/pipewire.cpp on the box's c31743d build), issue #2126 open+unstarted; PipeWire >=1.6 needs Fedora 44 (Bazzite F44 is testing-only with a confirmed NVIDIA Game-Mode crash, so a rebase clears only the PipeWire wall). The realistic route is KWin MR !8293 (HDR PipeWire capture, draft), i.e. the desktop path. Records the settled constraints (NVENC 10-bit max, HDR⟹HEVC Main10, AV1 can't HDR on VideoToolbox) + the ready-to-build downstream design. Also notes the landed Bazzite dynamic-resolution work (host-managed gamescope-session at the client's exact res+refresh, c894c6f) + the macOS/iPad input and 4K/5K UDP-buffer freeze fixes in the Done summary. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/roadmap.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 3239417..cdca982 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -10,10 +10,16 @@ against FFmpeg 7 **or** 8; gamescope capture → zero-copy NVENC, sub-ms latency **Unified host:** `serve --native` runs the GameStream host + the punktfunk/1 QUIC host in one process, with native pairing driven from the **web console** (arm → show PIN), not the service log. Advanced DualSense (audio-driven voice-coil) haptics **scoped NO-GO** (`docs/dualsense-haptics.md`). +**Bazzite dynamic resolution (`c894c6f`):** the host now *manages* a headless `gamescope-session-plus` +Steam session at the **client's exact resolution + refresh** — games see it (via injected +`--nested-refresh` + generated CVT modes, not the box's TV EDID), relaunched per-connection on a mode +change, reused (no Steam restart) on the same mode. Plus macOS/iPad input fixes (NSEvent motion + +iPad pointer-lock) and a 4K/5K one-frame-freeze fix (grow the UDP socket buffers). **Next:** **§8 pairing & trust hardening** (mandatory PIN by default + delegated approval), the M4 client presenter + iOS (§6), and a Windows host (§7 — now **de-risked via SudoVDA**, no custom -signed driver needed). +signed driver needed). **§10 HDR/10-bit is parked — blocked upstream at the compositor** (no +gamescope/KWin PipeWire 10-bit producer yet). ## 1. Reliable headless KDE/compositor spawning ✅ *(done — Phase 1 + 2)* @@ -180,3 +186,32 @@ value) instead of guesswork that ends in a stuttering stream. - Reuse the existing `Session`/FEC plumbing — a probe is just a non-video AU stream the client byte-counts + times; no new transport. Pairs with bitrate negotiation (bitrate in Hello/Welcome, alongside the mode renegotiation already in place). + +## 10. HDR + 10-bit color *(parked — blocked upstream at the compositor producer)* + +Opt-in HDR10 (BT.2020 + PQ, 10-bit) streaming. Designed end to end; **blocked at capture, not in our +stack** — the compositor doesn't emit a 10-bit/HDR PipeWire frame on any shipping build. Spiked + +researched 2026-06-11 (memory: `hdr-blocked-gamescope-pipewire`); the downstream design is ready to +build the moment a producer lands. + +- **The wall — gamescope capture is 8-bit.** gamescope composites HDR for a *display* + (`--hdr-enabled`, `--hdr-debug-force-output`), but its PipeWire capture node offers only `BGRx`/ + `NV12` (8-bit) — confirmed by reading `src/pipewire.cpp` `build_format_params()` on upstream master + AND the box's exact build (`c31743d`); color is capped BT.601/709. Issue **#2126** ("pipewire: add + HDR streams") is OPEN + unstarted (no PR). Forcing HDR output does not change the capture format. +- **PipeWire ≥1.6** is the other prerequisite (HDR colortype transport). Fedora 43 ships 1.4.x; + Fedora 44 ships **1.6.6** — but Bazzite F44 `deck-nvidia` is **testing-only** (`:stable` is still + F43; `:testing` has a confirmed NVIDIA Game-Mode crash). Rebasing now clears *only* the PipeWire + wall while gamescope stays 8-bit → **no-go** for HDR; revisit a rebase when F44 promotes to stable + (for its own sake), not for HDR. +- **The realistic route is KWin, not gamescope:** **KWin MR !8293** is a live draft adding HDR + PipeWire capture. That pulls HDR onto the *desktop* (KWin) path — trading away gamescope's + Steam-Deck-UI polish + the dynamic-resolution work (§ above). Track #2126 and !8293. +- **Constraints (settled):** NVENC tops out at **10-bit** → no Main12, no 12-bit AV1. **HDR ⟹ HEVC + Main10** (Apple VideoToolbox decodes 10-bit HEVC but **not** 10-bit AV1). Static HDR10 SEI + (BT.2020-PQ default) since the compositor won't surface per-frame metadata. Opt-in negotiation via + the Hello/Welcome trailing-byte pattern (SDR default; client declares HDR want; host master toggle). +- **Downstream design (ready when capture unblocks):** add P010 + `ColorInfo` to capture; 10-bit + zero-copy import (`GL_RGB10_A2`/float dest for RGB10, or P010 straight through the Vulkan→CUDA + path); `hevc_nvenc -profile main10` + color/SEI metadata; opt-in Hello/Welcome + C ABI; Apple + VideoToolbox Main10 decode + `wantsExtendedDynamicRangeContent` EDR present + SDR fallback.