- A savestate load is not a heavy scene: hold the dynamic-resolution
level for the whole 2 s request and do not arm fast descent, which
dropped 18x -> 11x within a second of every load and climbed back
slowly.
- gl_dxgi_present.c: present the present thread's frames through a DXGI
FLIP_DISCARD swapchain via WGL_NV_DX_interop2 (Present(1,0), one frame
per refresh). Opt-in (PSX_GL_DXGI_PRESENT=1): sharing the HWND with the
GL window surface froze the screen in the first test; needs a child
window before it can be default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The worker only ran inside the emulation thread's pacing idle window, so
heavy scenes (short windows) lost their in-between frames. It now runs
as soon as a job is queued, on its own core, bounded by the job's own
presentation period.
Shared state that made concurrent runs crash or race, now per thread:
- render_pass_mmio_read_allowed could longjmp to the emulation thread's
synchronous-pass jump buffer from the worker (instant crash). The
abort state (s_abort_jmp, s_abort_armed, s_pass_cpu,
s_device_read_fault, s_attempt) is thread-local, and a private
execution aborts its own job through g_psx_execution_abort.
- The VRAM dirty mask: marks from the worker's private snapshot are
dropped (gpu_vram_dirty_set_private_thread).
Plan changes already quiesce (join) the worker before the hook table is
rebuilt.
R4 release, RTX 4080 8K, driven lap, DXGI on-screen count: 4/4 runs
stable (was 1 crash in 2); 50-60 distinct/s on straights.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pt_cb_present tested the composing context's readiness fence with a zero
timeout and dropped any slot whose commands had not finished, guest
frames included. Nothing was swapped, so the screen held the previous
image while emulation ran on: seconds of 1-10 fps on an 8K display while
every counter reported 60. The presenter now makes its GPU queue wait on
a guest frame's fence (glWaitSync; the CPU does not block). Only optional
temporal frames may still be dropped when unready or late.
present_loop counted a dropped image as a present; it now counts swaps
in presents and drops in a new dropped field (debug JSON
present_thread.dropped).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep selector zero stock and seal all choices until the next session restart. Refuse nonzero online activation, scope non-stock save states by frozen choices, and preserve original instruction guards when combined with effective-address adapters. Use overlay ABI34 on current master without the old menu dependency stack.
Extract the audited adapters and card transport onto master without the held selector/menu stack. Keep adapters and codecs tied to mod activation, use overlay ABI 33, retain rejected-load protection on codec registration, and refuse extended-card codecs in netplay before frame zero. Preserve default atomic save publication and guest-visible write failures.
* feat(widescreen): continue framebuffer-feedback sprites into native-wide bands
Titles tag a 15-bit sprite that copies a framebuffer 1:1 (gpu_ws_tag_feedback_rect / psx_mod_tag_feedback_rect). Where it touches the draw area's edge, gpu.c emits band spans and the new optional backend op wide_feedback_rect (GL incl. render thread, software) samples the source buffer's wide surface. Band texels count as bit 15 set, as the centre does once the trail blends.
The software rasterizer now writes the texel's bit 15 into the framebuffer, and wide_full can dump the surface alpha ("alpha":1).
* fix(widescreen): quantise band feedback like packed VRAM
The centre samples 5-bit packed VRAM each frame; the band copy read the 8-bit wide surface and modulated with /128, so the bands drifted ~3 grey levels brighter and left a step at the 4:3 edge. Truncate like PACK_FS and modulate like TEX_FS.
* Reject fully clipped sprites before extending feedback margins
* Complete isolated resident and PGXP fixture collaborators
* Preserve existing line endings in the review fixes
---------
Co-authored-by: Matthew Stanley <1379tech@gmail.com>
Keep temporary keyboard profiles separate from saved bindings. Add optional persistent mouse capture with ordered release/focus/reset handling, and let offline sources represent an unplugged port without falling back to physical input. Existing capture and source defaults remain intact. Beads: beads-9wg8 and beads-eio.19.18.
Renderers that test a 16-bit screen X with an unsigned compare against a width kept in a register (often a loaded clip bound) reject every negative X, so widening the bound only reveals the right band. A screen_x site on sltu now routes through psx_ws_cull_sltu_band: -4m <= (int16)SX < W while widened, identity at 4:3. Four margins keep large near polygons whose corners all lie past one margin; an unbounded left side overflowed a renderer's fixed primitive lists. Covered by ws_cull_screen_x_hi_codegen_test; documented in WIDESCREEN.md.