Summary
This release primarily focuses on refactoring Mupen64 and bringing its code up to a much higher standard, thereby allowing faster development in the future.
Nevertheless, there are some interesting features and bugfixes, particularly Multi-Frame Advance (which also allows frame-advancing backwards), and reduced dispatcher overhead.
Caution
This release contains one or more critical fixes.
Features
- Multi-Frame Advance
- CrashManager Improve crash log
- CrashManager Add backward-cpp trace
- CrashManager Add minidump generation
- DialogService Enhanced dialog answers (#277)
- Lua Extended savestate api (#298)
- Lua Add recompile APIs
- Lua Use inspect.lua for print(), tostringexs()
- Plugin Extended function API
- VCR Save cheats alongside movie
- Improve general error reporting
- Add system DPI awareness
- Manual movie backup creation
- Show country name instead of decimal country code in rom country warning message
- End captures when movie playback stops or loops
- Allow setting mouse buttons as hotkey
- Improve default ffmpeg arguments
- Pure Interpreter x64 support
- Better float exception dialog
- Benchmark API
- Comparison API
- Speed down/up/reset menu items and hotkeys
Bugfixes
- Core Missing MGE functions in core_plugin.h
- Core Add legacy InitiateControllers declaration to core_plugin.h
- Config Backwards-compatibility issues with config (#289)
- Config Use separate config file (config-x64.ini) on x64 builds
- ConfigDialog Various issues with the new plugin configuration dialog
- ConfigDialog Incorrect dimensions for plugin config listbox
- VCR Show_controller_warning using incorrect header ref for warnings
- Savestates Fix unfinished dma being present when loading an old mupen st while st task queue contains save followed by load on pure interp
- Savestates Increment slot before saving slot
- Savestates Undo savestate not being cleared between roms
- VCR Limit length_samples to actual sample count provided by file
- Lua Incorrect return from d2d_overlay_wndproc
- Lua Crash when lua closes during file dialog (#302)
- Lua Os.exit() corrupting program state until exit
- LuaRenderer Use-after-free in overlay wndprocs
- FilePicker Double-free in show_folder_dialog
- FilePicker Handle filters correctly
- MovieDialog Potential stack overflow
- Plugin Fix new config API on non-RSP plugins
- FilePicker Save dialog being an open dialog
- FilePicker Missing default extension
- AVIEncoder Cwd breaking after AVIFileCreateStream call
- Statusbar Incorrect scale computation causing the last segment to be cut off
- Disable fast-forward when frame advancing
- Hotkeys not working on initial window focus
- Flash of black window content before rombrowser creation
- 1f delay when capturing d2d lua graphics
- Incorrect blit order in DCompPresenter::end_present
- SeekCompleted message not being sent
- Recent menus behaving incorrectly
- Lua environments not being destroyed when error happens in the main block
- Overlapping log contents
- Potential crash when capturing with lazy renderer initialization enabled
- Recording over longer avi with shorter one producing merged corrupted file
- save_options() failing during automated capture
- Deadlock in FFmpegEncoder::stop()
- AV when executing dynarec code with DEP enabled
- Stack overflow in find_savestate_for_movie
- Recording or playback being stopped when choosing to back out of movie playback following a warning
- Overwrite prompt blocking ffmpeg execution
- Incorrect string conversions
- Incorrect action mapping for ACTION_LOAD_LATEST_ROM
- Rare crash in D2D or GDI overlay WM_PAINT when stopping scripts
- Controller warning not showing when it should
Security
- CWE-119 in dma_si_read/dma_si_write
- CWE-119 in dma_read_flashram/dma_write_flashram/flashram_command after savestate load
Documentation
- Lua Update mupenapi.lua
Performance
- Dispatcher Faster dispatcher (#293)
- Config Avoid unnecessary copies in ini handling
- Lua Speed up invoke_callbacks_with_key_on_all_instances by 68%
- Lua Bump max text layout cache size to 512
- Lua Cache d2d.get_text_size results
- Lua Use integers instead of strings as callback registry keys
- EncodingManager Avoid DC and Bitmap recreation in readscreen_hybrid
- Add CS_OWNDC to main window style
- Use multimedia timers for invalidation
- Perform interval UI updates in new multimedia timer callback
- Avoid recalculating region on every dacrate changed call
- Use xxhash instead of adler32