feat(windows): pf-vdisplay IDD-push — HDR + pipelined zero-copy capture
HDR (display-driven, matching the WGC path): - CTA-861.3 HDR EDID (BT.2020 primaries + HDR Static Metadata block) so Windows offers "Use HDR" on the virtual display. The host FOLLOWS the display's live advanced-color state, recreating the shared ring at the matching format (FP16 in HDR / BGRA in SDR) on a toggle — no freeze. - Always emit Main10/BT.2020-PQ Rgb10a2 while the display is HDR; the client auto-detects PQ from the HEVC VUI (clients under-report VIDEO_CAP_10BIT). Generic HDR10 mastering SEI on every IDR. - Generation-tagged `latest` (gen<<40|seq<<8|slot) + driver `is_stale` re-attach kill the toggle-time garbage frame and any stale-ring read. Perf: - Pipeline the encode loop (Capturer::pipeline_depth; IDD-push = 2): submit N+1 before polling N so the convert/copy on the 3D engine overlaps the NVENC encode of N on the ASIC. PUNKTFUNK_IDD_DEPTH overrides (1 = synchronous). - Rotating host output ring (OUT_RING) so the in-flight encode and the next convert never touch the same texture. - HDR converts directly from the keyed-mutex slot's SRV into the output ring (drops the redundant slot->fp16 scratch copy); SDR copies the BGRA slot in. The slot mutex is held only across the convert/copy, not the encode. RING_LEN 3->6 for publish headroom. - Capture-health diagnostic: new_fps vs repeat_fps under PUNKTFUNK_PERF (a low new_fps at a high send rate means the source isn't compositing, not an encode stall). Validated live on the RTX box: 5120x1440@240 HDR streams; driver composes ~180 new fps, encode 240 fps @ ~4.3 ms p50. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1454,11 +1454,16 @@ pub mod endpoint {
|
||||
/// close, while a genuinely dead peer is still detected within `MAX_IDLE`.
|
||||
fn stream_transport() -> Arc<quinn::TransportConfig> {
|
||||
use std::time::Duration;
|
||||
const MAX_IDLE: Duration = Duration::from_secs(20);
|
||||
// 8s idle (was 20s): a vanished client is declared dead within 8s instead of 20, so its
|
||||
// session tears down promptly — which the Windows IDD-push path needs so a RECONNECT recreates
|
||||
// a fresh virtual monitor (a reused monitor's IddCx swap-chain dies) instead of joining the
|
||||
// still-lingering old session. Active sessions are unaffected: video keeps the connection live,
|
||||
// and the 4s keep-alive holds it open through quiet control periods.
|
||||
const MAX_IDLE: Duration = Duration::from_secs(8);
|
||||
const KEEP_ALIVE: Duration = Duration::from_secs(4);
|
||||
let mut t = quinn::TransportConfig::default();
|
||||
t.max_idle_timeout(Some(
|
||||
quinn::IdleTimeout::try_from(MAX_IDLE).expect("20s is a valid QUIC idle timeout"),
|
||||
quinn::IdleTimeout::try_from(MAX_IDLE).expect("8s is a valid QUIC idle timeout"),
|
||||
));
|
||||
t.keep_alive_interval(Some(KEEP_ALIVE));
|
||||
Arc::new(t)
|
||||
|
||||
Reference in New Issue
Block a user