diff --git a/CLAUDE.md b/CLAUDE.md index b931bdbd..2b03a565 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -113,20 +113,25 @@ Low-latency desktop/game streaming stack, Linux-first, with a shared Rust protoc presenter (wp_presentation feedback, tearing-control, Vulkan Video on NVIDIA) — **wgpu/winit rejected** (no dmabuf import / presentation feedback / shortcuts-inhibit). **Windows stage 1 done 2026-06-15** (`crates/punktfunk-client-windows`, binary - `punktfunk-client`): pure-Rust **winit + Direct3D11 flip-model swapchain** present (WARP - fallback for the GPU-less dev box; runtime-compiled fullscreen-triangle shaders, Contain-fit - letterbox), **FFmpeg software HEVC decode** (D3D11VA hw decode is the follow-up), **WASAPI** - shared-mode render + mic capture, keyboard (physical-`KeyCode`→VK) + absolute mouse + wheel - capture (Moonlight-style click-to-capture, Ctrl+Alt+Shift+Q release), **SDL3** gamepads - (rumble/lightbar/DualSense, built from source), `mdns-sd` discovery, shared client identity - + TOFU + SPAKE2 PIN pairing (`--connect`/`--discover`/`--pair`/`--headless`). Builds + clippy - + fmt + tests green on `x86_64-pc-windows-msvc` (built on the dev VM). **UI = winit + raw - D3D11, NOT WinUI3/Reactor** — a research pass confirmed windows-rs Reactor ships no - `SwapChainPanel`/`SetSwapChain` escape hatch, so it can't host the presenter (the bootstrap - doc's sanctioned fallback). Gotcha: `CARGO_HOME` must be an ASCII path — the `ü` in the dev - box's username breaks SDL3's MSVC precompiled-header build. Next: live host validation - (no GPU on the dev box → glass-to-glass defers to the RTX box), D3D11VA hw decode + 10-bit/HDR - present, a native host-list/settings GUI, and RAWINPUT relative-mouse pointer-lock. + `punktfunk-client`): pure-Rust **WinUI 3** UI via **windows-reactor** (a declarative React-like + framework backed by WinUI; PR #4499 added the `SwapChainPanel` widget + `set_swap_chain`). The + video is a **`SwapChainPanel`** bound to a **D3D11 composition swapchain** (WARP fallback for + the GPU-less dev box; runtime-compiled fullscreen-triangle shaders, Contain-fit letterbox), + driven by reactor's per-frame `on_rendering`. **FFmpeg software HEVC decode** (D3D11VA hw decode + is the follow-up), **WASAPI** render + mic capture, **SDL3** gamepads (rumble/lightbar/DualSense), + `mdns-sd` discovery, and the full trust surface — all **in-app**: host list (live mDNS + saved + + manual), settings (resolution/refresh/mic), SPAKE2 PIN pairing screen, TOFU, pinned-fp-mismatch + re-pair. **Stream input** is Win32 low-level hooks (`WH_KEYBOARD_LL`/`WH_MOUSE_LL`) — reactor + exposes no raw key/pointer events; native Windows VK + absolute mouse (client-rect Contain-fit) + + wheel, Ctrl+Alt+Shift+Q capture toggle. `--headless`/`--discover` keep CLI paths. Builds + clippy + + fmt green on `x86_64-pc-windows-msvc` (on the dev VM). **windows-reactor is unpublished** (git + dep pinned to commit `b4129fcc`; `windows` pinned to the SAME commit so `IDXGISwapChain1` unifies + with `set_swap_chain`); its `build.rs` downloads the Win App SDK NuGets + needs `CARGO_WORKSPACE_DIR` + set (in the VM build env; `/temp`+`/winmd` gitignored). Gotcha: `CARGO_HOME` must be an ASCII path + — the `ü` in the dev box's username breaks SDL3's MSVC precompiled-header build. Next: **on-glass + validation** (the dev VM is headless/Session-0 → the WinUI window needs a display: RDP or the RTX + box), D3D11VA hw decode + 10-bit/HDR present, RAWINPUT relative-mouse pointer-lock, and a per-host + speed test in the UI. 2. **Sub-frame pipelining**: overlap encode and transmit within a frame. Requires a direct NVENC SDK wrapper (libavcodec only emits whole AUs) — the next big latency lever (~2–4 ms at high res). diff --git a/docs-site/content/docs/clients.md b/docs-site/content/docs/clients.md index 79a94e5e..34c2c663 100644 --- a/docs-site/content/docs/clients.md +++ b/docs-site/content/docs/clients.md @@ -57,16 +57,17 @@ punktfunk-client --connect :9777 # skip the picker, start a session imme ## Windows desktop client (in development) `punktfunk-client` for Windows (`crates/punktfunk-client-windows`) is the native graphical client -for Windows — pure Rust, the same `punktfunk/1` core as the Apple and Linux apps, with a winit + -Direct3D11 present surface, WASAPI audio, FFmpeg decode, SDL3 controllers, network discovery, and -PIN pairing. It builds on `x86_64-pc-windows-msvc` and runs the connect/decode/present/input path; -hardware (D3D11VA) decode, 10-bit/HDR present, and a native host-list/settings window are in -progress, so it is not yet packaged. For now it is driven from the command line: +for Windows — pure Rust, the same `punktfunk/1` core as the Apple and Linux apps, with a **WinUI 3** +UI (host list, settings, PIN pairing) and the video on a `SwapChainPanel`, plus WASAPI audio, FFmpeg +decode, SDL3 controllers, network discovery, and PIN pairing. Launch it and pick a host from the +list, just like the Apple and Linux apps. It builds on `x86_64-pc-windows-msvc`; hardware (D3D11VA) +decode, 10-bit/HDR present, and packaging are in progress, so it is not yet shipped. A headless CLI +path exists for scripting/measurement: ```sh -punktfunk-client --discover # list hosts on the network -punktfunk-client --connect :9777 # stream (trust-on-first-use) -punktfunk-client --connect :9777 --pair 1234 # pair with the PIN the host shows +punktfunk-client # open the WinUI 3 window (host list / settings) +punktfunk-client --discover # list hosts on the network +punktfunk-client --headless --connect :9777 # no window: connect, count frames, print stats ``` Until it ships, **Moonlight** remains the recommended way to stream to Windows (see below).