feat(host/windows): SudoVDA virtual-display backend (control path)
Windows VirtualDisplay backend driving SudoVDA (the Apollo IDD) via its DeviceIoControl IOCTL protocol: open by interface GUID, ADD at the client's exact WxH@Hz (mode baked into the IOCTL, no EDID seeding), mandatory watchdog ping thread, QueryDisplayConfig name resolution, RAII Drop -> REMOVE. Wired behind the existing VirtualDisplay trait (open()/probe() Windows arms). Validated live on the GPU-less VM (standalone + via the trait, env-gated test): version 0.2.1, ADD 1920x1080@60 -> target, watchdog hold, REMOVE. Monitor activation into a WDDM path (-> capturable \\.\DisplayN) needs a real GPU and is deferred with capture/NVENC. docs/windows-host.md updated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+11
-4
@@ -158,8 +158,10 @@ glass-to-glass / throughput numbers (no perf claim transfers from Linux).
|
||||
## Phased plan (host-first)
|
||||
|
||||
0. **Compile on MSVC** (Step 0 above). GPU-less. ← *start here*
|
||||
1. **SudoVDA `VirtualDisplay` backend** — add/resolve-GDI-name/keepalive/remove + `SetDisplayConfig`
|
||||
mode-set; RAII teardown. *Spike first*: does `ADD` bring up a monitor + mode-set on the VM (WARP)?
|
||||
1. **SudoVDA `VirtualDisplay` backend** — ✅ *control path landed* (`vdisplay/sudovda.rs`:
|
||||
add/keepalive/remove + GDI-name resolution + RAII teardown, behind the existing trait; `open()`
|
||||
returns it on Windows). Compiles + live-tested on the VM. **Remaining:** monitor activation +
|
||||
`\\.\DisplayN` resolution (needs a GPU), then `SetDisplayConfig` mid-stream `Reconfigure`.
|
||||
2. **Capture + SW encode** — DXGI Desktop Duplication (or WGC) → `ID3D11Texture2D` → CPU staging →
|
||||
openh264 → existing FEC/transport. First end-to-end Windows session, GPU-less, against the Linux
|
||||
`punktfunk-client-rs` or the new Windows client.
|
||||
@@ -191,8 +193,13 @@ Structurally a sibling of `crates/punktfunk-client-linux` (GTK4) — same shape,
|
||||
|
||||
1. **`cargo build -p punktfunk-host` on the VM** — count + triage the real MSVC errors before
|
||||
estimating Step 0. (GPU-less.)
|
||||
2. **SudoVDA `ADD` on the VM** — does a virtual monitor come up + mode-set via WARP with no GPU?
|
||||
Confirms the whole Phase 1 backend is VM-developable. (GPU-less.)
|
||||
2. **SudoVDA `ADD` on the VM** — ✅ *done 2026-06-15.* The control path is fully validated on the
|
||||
GPU-less VM, both standalone and through the real `VirtualDisplay` trait (`vdisplay/sudovda.rs`):
|
||||
device open by GUID, `GET_VERSION` (0.2.1), `GET_WATCHDOG` (3 s), `ADD 1920×1080@60` → returns
|
||||
adapter LUID + `target_id`, watchdog ping holds it, RAII `Drop` → `REMOVE`. **Gap:** with no GPU the
|
||||
target does NOT activate into a WDDM display path (`QueryDisplayConfig` active paths stay 0 → no
|
||||
`\\.\DisplayN` to resolve/capture). So **activation + name-resolution + capture defer to a real
|
||||
GPU** (passthrough on the Proxmox VM, or a GPU box) — consistent with capture/NVENC deferring anyway.
|
||||
3. **IDD arbitrary-mode + `Reconfigure` on 24H2/25H2** — does 5120×1440@240 apply, and does a
|
||||
remove+re-add (or re-modeset) hit the ~90 ms budget without a Settings-UI toggle? Make-or-break for
|
||||
"native client resolution, no scaling".
|
||||
|
||||
Reference in New Issue
Block a user