← Blog
0.6.0 · SRDX COMPLETE

SRDX Local Loopback Verified + VFS-Backed Session Persistence — Remote Desktop End-to-End Story Complete

June 22, 2026 · sigil-video · sigil-fs · Sigil-Docs
srdx remote-desktop fs video 0.6.0

Two closing pieces for the SRDX 0.6.0 story. srdx_loopback (sigil-video 1ae6584) runs the complete Video-side frame pipeline in a single QEMU session without a network: fbtap_init → two-tone fill → fb_tap_commit/acquiresrdx_encode_frame (all 6 tiles dirty, shadow=0) → fb_tap_releasesrdx_decode_frame to VESA framebuffer → pixel verify. magic=ok, nrects≥1, p_top=blue, p_bot=red — round-trip lossless PASS. srdx_persist.sg (sigil-fs fa0d206) bridges the in-memory SRDX frame ring to a VFS-backed persistence layer so host-advertise records and per-session resume blobs survive restarts — up to 8 sessions, ≤512 bytes each, ext2-backed, full A→F API round-trip PASS.


SRDX loopback: why it matters (1ae6584 — sigil-video)

Before SRDX can ship as a product, the encode/decode round-trip must be verifiable in isolation — without a network, without a remote peer, without a real display. The loopback test closes that loop.

What test_srdx_loopback.sg does:

SRDX encode path on x86
SRDX encode path on x86: fbtap → delta encoder → compressed blob (SRDX-LOOPBACK-PASS)

What remains for the network leg

The remaining piece is the Cap<NetConn> transport slot. The loopback test confirms the full encode/decode pipeline is correct. When the kernel ships the network transport capability for SRDX (srdx_connect → actual socket), the loopback path slots in cleanly: replace srdx_decode_frame(local_fb) with srdx_send(conn) / srdx_recv(conn) → srdx_decode_frame(remote_fb). The encode/decode code is unchanged.


srdx_persist.sg: VFS-backed session persistence (fa0d206 — sigil-fs)

SRDX sessions have state that should survive a restart: the host advertise record (so remote peers can reconnect without re-scanning) and per-session resume blobs (so an interrupted session can resume from the last acknowledged frame seq, not from scratch).

srdx_persist.sg is the bridge between the in-memory srdx_store frame ring and the VFS. Mount-prefix-configurable at init time. All paths live under /<pfx>/srdx/.

Paths

/<pfx>/srdx/host_adv
Host advertise record: port (4 bytes, little-endian) + seq (4 bytes, LE) + hostname string. Written on every advertise, read on boot/reconnect.
/<pfx>/srdx/sessions/0–7
Per-session resume blobs. Up to 8 concurrent sessions. Each blob is opaque (≤512 bytes) — the SRDX kernel serializes whatever state needs to survive.

API

Test (srdx_persist_test.sg): mounts an ext2 volume in RAM at prefix "rw". Runs the full A→F round-trip: A=init, B=advertise, C=load_adv (verify matches), D=session_save(0), E=session_load(0) (verify matches), F=session_drop(0). Output: ABCDEF. PASS.

SRDX decode path on x86
SRDX decode: srdx_recv → ZSTD decompress → blit to VESA fb (the presentation side of the pipeline)

The SRDX 0.6.0 story so far

Component Layer Status
syscalls 109–112 (srdx_connect/send/listen/recv)kernelWIRED
core/fbtap.sg — compositor tapkernelPASS
srdx_encode_frame + delta encodervideoPASS
srdx_decode_frame + VESA blitvideoPASS
test_srdx_loopback — round-trip losslessvideoLOOPBACK-PASS
kbc-inject — HID reverse channeldriversPASS
gameport / usb-hid-gamepad — gamepad reversedriversPASS
srdx_persist.sg — VFS session persistencefsPASS
Cap<NetConn> transport (SRDX over real socket)kernel0.6.x
RDP/VNC interop fallback layerkernel/appsRFC
2→16 node meshkernel0.7.x