feat(vita): svc mailbox + video plane + audio over WiFi TCP#169
Draft
doodlewind wants to merge 2 commits into
Draft
feat(vita): svc mailbox + video plane + audio over WiFi TCP#169doodlewind wants to merge 2 commits into
doodlewind wants to merge 2 commits into
Conversation
doodlewind
added a commit
that referenced
this pull request
Jul 23, 2026
…cklist The companion document for the PKNT wire (#168) and the Vita svc/video/ audio host (#169): why one ordered TCP connection, why the RAM ring is a byte-exact .pkst file image, the thread/ownership diagram, the GPU-idle present discipline, and the real-hardware verification checklist (Vita3K has no network stack, so the transport only proves itself on a device). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
force-pushed
the
feat/vita-svc-wifi
branch
from
July 23, 2026 12:50
5c377ca to
f7e6c51
Compare
doodlewind
force-pushed
the
feat/pknt-wire
branch
from
July 23, 2026 12:50
4ea9075 to
91330f1
Compare
doodlewind
added a commit
that referenced
this pull request
Jul 23, 2026
…cklist The companion document for the PKNT wire (#168) and the Vita svc/video/ audio host (#169): why one ordered TCP connection, why the RAM ring is a byte-exact .pkst file image, the thread/ownership diagram, the GPU-idle present discipline, and the real-hardware verification checklist (Vita3K has no network stack, so the transport only proves itself on a device). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
force-pushed
the
feat/vita-svc-wifi
branch
from
July 23, 2026 12:55
f7e6c51 to
ec84d24
Compare
doodlewind
force-pushed
the
feat/pknt-wire
branch
from
July 23, 2026 12:55
91330f1 to
422b512
Compare
The Vita host registered only ops 1–29: no svc channel, no video plane, no audio, no network stack. This implements the whole family (ops 30–38) over the PKNT wire protocol: - net.rs: sceNet init confined to one function (module load, 1 MiB static pool, sceNetCtlInit; failure is remembered and final — Vita3K has no network stack, so svcOpen stays false and emulator e2e never regresses); everything after rides std::net over the newlib shims. Supervisor thread (host.txt override → UDP beacon discovery → connect + handshake → rx loop: CTRL → line queue, FILE → 6 MiB LRU cache, SLOT/CHUNK/MARK → RamStream, PING → PONG) + tx thread draining an mpsc channel. On disconnect the ring is marked ended, 1 s backoff, rediscover. The 60 fps main thread never blocks: its ops pop queues and take short-held mutexes. - svc.rs (ops 30–33): PSP guest semantics verbatim — non-blocking svcOpen the app's connect pump retries, batched svcPoll, side files resolved from the proactive-push cache so the synchronous loadImgFile never waits on the network. - vid.rs (ops 34–37): the PSP vid.rs reader over RamStream::buf() — same epoch/lap/seq-validation logic, same stage-then-present split, minus the IO budget (reads are memcpys). present() commits in the GPU-idle window: Runtime::render now runs begin_frame → vid::present → render_over, and graphics grows update_texture_in_place (rewrites the existing vita2d texture's pixels — the register/recycle path would allocate + drain GXM once per presented frame at 24 fps). The GE race discipline, GXM edition. - audio.rs: the PSP design with sceAudioOut — BGM port at 44.1 kHz, SPSC ring (~743 ms), starvation sleeps, port opened AND released on the main thread (the channel-leak class of bug). Integer ×1/×2/×4 upsampler keeps PSP-profile 22.05 kHz streams playable. - stats.rs + debugStats (op 38): PSP shape + a net section (rxBytes/ txBytes/reconnects/slotsRx/fileEvicts); build.rs bakes the FNV-1a64 bundle hash for the stale-embed tripwire. Validated: full release VPK build (im-main) with the vita toolchain; Vita3K e2e cursor-main 5/5 byte-exact (new modules dormant without svcOpen). The wire/ring logic itself is covered by the engine/core tests (#168); transport verification is real-hardware only (Vita3K has no sceNet). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
added a commit
that referenced
this pull request
Jul 23, 2026
…cklist The companion document for the PKNT wire (#168) and the Vita svc/video/ audio host (#169): why one ordered TCP connection, why the RAM ring is a byte-exact .pkst file image, the thread/ownership diagram, the GPU-idle present discipline, and the real-hardware verification checklist (Vita3K has no network stack, so the transport only proves itself on a device). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
force-pushed
the
feat/vita-svc-wifi
branch
from
July 23, 2026 13:04
ec84d24 to
a90ceb0
Compare
doodlewind
force-pushed
the
feat/pknt-wire
branch
from
July 23, 2026 13:04
422b512 to
0be8712
Compare
First hardware bring-up caught it immediately: the Mac's DHCP lease moved, the ux0:data/pocketjs/host.txt override pointed at a dead address, and because the override took precedence unconditionally the transport retried it forever — beacon discovery could never rescue the session. Connect failures now alternate the next discovery round onto the beacon listener, so a stale override degrades to broadcast discovery instead of wedging. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
added a commit
that referenced
this pull request
Jul 23, 2026
…cklist The companion document for the PKNT wire (#168) and the Vita svc/video/ audio host (#169): why one ordered TCP connection, why the RAM ring is a byte-exact .pkst file image, the thread/ownership diagram, the GPU-idle present discipline, and the real-hardware verification checklist (Vita3K has no network stack, so the transport only proves itself on a device). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 2/2 of the Vita networking series (stacked on #168). The Vita host grows ops 30–38 — the entire svc/video/audio family — over the PKNT wire.
Architecture
RamStream::buf()— same epoch/lap/seq validation, same stage-then-present split.Runtime::render=begin_frame → vid::present → render_over; newgraphics::update_texture_in_placerewrites plane pixels without the per-frame allocate+GXM-drain the recycle path would cost at 24 fps.sceAudioOut(SPSC ring ~743 ms, starvation sleeps, main-thread port release — the channel-leak lesson, ×1/×2/×4 upsampler).net::init()failure is remembered and final →svcOpenfalse → connect screen; no crash paths in emulator runs.debugStats(38) wired with anetsection + bundle FNV-1a64 (stale-embed tripwire) — the throughput instrument for real-HW tuning.Validation
im-main.vpk).cursor-main5/5 byte-exact — new modules are dormant withoutsvcOpen, zero UI regression.🤖 Generated with Claude Code