Skip to content

v1.4.0 "Convergence"

Choose a tag to compare

@github-actions github-actions released this 12 Jul 02:12
658e48a

Added

  • Window Size presets (native only) — View → Window Size offers 1x/2x/3x/4x (100%-400%) of
    the SNES native resolution, matching RustyNES; the app now launches at 3x by default instead of
    a fixed 512x448 window.
  • Libretro peripheral negotiationrustysnes-libretro now offers Mouse (both ports) and
    Super Multitap / Super Scope (port 2) via RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, mirroring
    bsnes's own libretro core's per-port device menu.
  • emu-thread mechanical re-sync — cheats, watchpoints, breakpoints, port2-peripheral
    selection, and per-voice audio mutes now apply in the threaded build too (previously only the
    synchronous drive path saw these changes).
  • emu-thread run-ahead + netplay-aware pause — run-ahead now runs on the emu thread via
    crate::rewind::step_with_run_ahead, only when actually configured (matching the synchronous
    path's own run_ahead > 0 branch, avoiding an avoidable per-frame allocation in the common
    disabled case — caught in PR review); netplay now actually functions under emu-thread (its
    NetplayState::drive call was previously dead code there, so netplay was silently
    non-functional in threaded builds), pausing the emu thread TOCTOU-safely via a new
    EmuControl::netplay_paused flag re-checked under the shared EmuCore lock. PresentBuffer
    now carries the framebuffer's (width, height) alongside its bytes, and the present path tracks
    the dims that actually match its staging buffer (Active::present_dims) rather than the emu's
    live (possibly-moved-on) resolution, so a run-ahead-peeked frame can never publish bytes for one
    resolution against dims from another (also caught in review). emu-thread is now clippy- and
    test-gated in CI for the first time (previously referenced only in a comment). Movies, Lua
    scripting, RetroAchievements, and rewind-recording remain intentionally unported to emu-thread
    — confirmed via RustyNES's own reference implementation, which doesn't port these to its thread
    either.

Fixed

  • Fullscreen crash on monitors wider/taller than 2048pxGfx requested
    wgpu::Limits::downlevel_webgl2_defaults() unconditionally on every target, capping
    max_texture_dimension_2d at 2048 even on native GPUs that support far more. Fullscreening on
    e.g. a 3440x1368 ultrawide made Surface::configure receive an out-of-range request and
    panic/abort (wgpu::Surface::configure has no recoverable error path here). Native now requests
    downlevel_defaults() and both targets call .using_resolution(adapter.limits()), raising the
    floor preset to match the real adapter; the granted limit is tracked at runtime and enforced
    everywhere the old hardcoded 2048 constant was.
  • Open bus during DMA/HDMA transfers (the "Speedy Gonzales stage 6-1" mechanism) — DMA/HDMA
    reads now update the open-bus latch, matching real hardware; writes deliberately do not, per a
    direct cross-check against ares' and bsnes' own CPU::Channel DMA implementation.
    superfx_boots_live_and_deterministic's 24 golden hashes were re-blessed with that citation
    trail as justification — see docs/scheduler.md §Open bus via DMA/HDMA.