psx_mod_render_local_view() runs a title's draw code in the render-pass
sandbox on a forward netplay frame and keeps the drawn display rect in the
OpenGL presenter's surface only. The authoritative CPU VRAM, guest RAM,
rollback snapshots and digests keep the canonical frame; the presenter shows
this peer's own image. A committed image cancels any local-view crop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A title whose netplay mode draws every seat's view into one frame (so all
peers keep identical guest state) can now ask the present path to show only
this peer's rectangle of the display: psx_netplay_present_local_view(x, y,
w, h), usually picked from psx_netplay_local_slot(). The GL dual-raster
present shows it from the internal-resolution surface, the software present
crops its staged frame, both at 4:3, and the headless present-image ring
records the same rectangle. The request is host-only (never serialized or
guest-visible), lapses PSX_NETPLAY_LOCAL_VIEW_HOLD ticks after its last
renewal so menus fall back to the full frame, survives rollback replays
without moving its stamp backwards, and is ignored offline. It wins over
[netplay] local_viewport.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- psx_netplay_seat_count() and psx_netplay_sim_pad(seat, out): the pad row
last published to SIO for each seat at the current simulation tick,
following delay-sync publication and rollback's sealed overrides, for a
game hook whose title reads more players than its SIO protocol exposes
(R4 Link Battle). Host-only cache, never serialized; republished on
every admitted or replayed tick.
- Load barrier: while a slower peer is still applying a save, neither
mode waits for confirmation from an already-frozen peer (rollback did
this already); after mutual ready, both modes resume on a confirmed
first tick instead of rollback inventing it, so peers cannot run
different inputs from the identical restored state.
From the R4 Link Battle branch; its headless input probe is dropped
because master already honours debug input on headless peers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Trusted game code can register entry hooks and consuming filters that run
only in a netplay session (psx_game_register_netplay_function_entry /
_filter). They live outside the mod package plan, which every online
match clears, so a title's netplay support survives it. Offline they are
inert unless PSX_GAME_FILTER_OFFLINE_PROBE=1. Reimplemented on master's
entry-filter path from the R4 Link Battle branch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mouse policy now folds onto the resolved pad (source included) instead of a discarded capture; no-policy path does no mouse polling.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Non-Windows only reconciled while focused AND captured; focus loss drops capture, so a release outside the window left activation_down_ stuck. Decision moved to LocalMousePolicy::sync_left (tested).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit f012cf1693)
pgxp.cpp now calls gte_geometry_correction_lookup_probe for pre-draw
probes; the session harness links pgxp.cpp without gte.cpp, so give it
the same no-op stub it already has for gte_geometry_correction_lookup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shared GL fixture (test_gl_scale_invariance.c) includes
gpu_gl_renderer.c directly. It now reads psx_cycle_count and
g_psx_vblank_cycles and calls the psx_openxr_* core, none of which the GL
filter/scale runners provided, so gl_texture_filter_test failed to link.
Define the same guest-clock stand-ins as test_gl_readback_region.c and
compile psx_openxr.c (its no-op shims without PSX_OPENXR) into the two
runners, as run_gl_readback_region.py already does.
The shared GL fixture (test_gl_scale_invariance.c) includes
gpu_gl_renderer.c directly. The stereo-pair freshness check added for
render passes reads psx_cycle_count and g_psx_vblank_cycles, which the
fixture never provided, so gl_texture_filter_test failed to link on
Windows (and the non-Windows scale test would too).
Define the same test stand-ins as test_gl_readback_region.c.
Rebase a shadow onto GP0's 11-bit field only when flag bits sit above it;
a plain overflowed number keeps master's exact-agreement check.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Apply committed sector mods during plugin activation, resolve paths through
patched directory records, and bound file size by CD capacity.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Override skips guest-formula PGXP shadows; composition with fov_scale tested and documented.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Pair is fresh only within 24 vblanks of its capture cycle; savestate/session reset already invalidate it.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>