Files
punktfunk/clients/linux-session
enricobuehler a02d0a2e9f feat(presenter): VAAPI dmabuf → Vulkan zero-copy import + CSC pass (phase 2)
The decoder's NV12 dmabuf imports per-plane (R8 + GR88, explicit DRM
format modifier, dedicated dup'd-fd import, FOREIGN→graphics acquire)
and a fullscreen-triangle render pass converts it into the presenter's
video image with the CICP-driven coefficients ported from video_gl.rs
(same tests, plus a rows-vs-matrix agreement check). SPIR-V is committed
(shaders/build.sh regenerates) so builds and CI need no toolchain. The
import extension set is probed at device creation; unsupported boxes and
3-failure streaks demote the decoder to software via the existing
force_software contract. The session binary now honors the Settings
decoder preference instead of forcing software.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 23:13:16 +02:00
..

punktfunk-session

The Vulkan session binary: one stream per invocation in an SDL3 window — no UI toolkit, no widgets, terminal stats. The power-user / gamescope stream client, and the stage-2 presenter of the Linux client re-architecture (punktfunk-planning: linux-client-rearchitecture.md).

punktfunk-session --connect host[:port] [--fp HEX] [--launch id] [--fullscreen] [--stats]

Reads the same identity / known-hosts / settings stores as the desktop client (punktfunk-client) — pair there (or via its headless --pair) first; this binary never connects to a host it has no pinned fingerprint for (--fp HEX overrides the store).

Stdout is the machine interface: {"ready":true} after the first presented frame, stats: … once per second (Ctrl+Alt+Shift+S toggles, --stats forces on), one {"error"|"ended": …} JSON line on the way out. Logs go to stderr. Exit codes: 0 clean end, 2 connect failed, 3 trust rejected / pairing required, 4 presenter init failed.

In-stream keys match the desktop client: click captures input (Ctrl+Alt+Shift+Q releases), Ctrl+Alt+Shift+D disconnects, F11 toggles fullscreen; the controller escape chord (L1+R1+Start+Select, hold to disconnect) works the same.

Decode follows the Settings preference: VAAPI frames import zero-copy into Vulkan (per-plane dmabuf + the stream's CICP-driven CSC shader); boxes whose driver can't import (NVIDIA proprietary by design) fall back to software decode automatically — PUNKTFUNK_DECODER=software|vaapi overrides for bisects. HDR/P010 and the Skia console UI (--browse) are later phases of the plan.