@@ -2636,7 +2636,7 @@ bool System::AllocateMemoryStates(size_t state_count, bool recycle_old_textures)
26362636
26372637 // Allocate CPU buffers.
26382638 // TODO: Maybe look at host memory limits here...
2639- const size_t size = GetMaxMemorySaveStateSize ();
2639+ const size_t size = GetMaxMemorySaveStateSize (g_settings. cpu_enable_8mb_ram , CPU::PGXP::ShouldSavePGXPState () );
26402640 for (MemorySaveState& mss : s_state.memory_save_states )
26412641 {
26422642 mss.state_size = 0 ;
@@ -2904,18 +2904,17 @@ bool System::SetBootMode(BootMode new_boot_mode, DiscRegion disc_region, Error*
29042904 return true ;
29052905}
29062906
2907- size_t System::GetMaxSaveStateSize ()
2907+ size_t System::GetMaxSaveStateSize (bool enable_8mb_ram )
29082908{
29092909 // 5 megabytes is sufficient for now, at the moment they're around 4.3MB, or 10.3MB with 8MB RAM enabled.
29102910 static constexpr u32 MAX_2MB_SAVE_STATE_SIZE = 5 * 1024 * 1024 ;
29112911 static constexpr u32 MAX_8MB_SAVE_STATE_SIZE = 11 * 1024 * 1024 ;
2912- const bool is_8mb_ram = (System::IsValid () ? (Bus::g_ram_size > Bus::RAM_2MB_SIZE) : g_settings.cpu_enable_8mb_ram );
2913- return is_8mb_ram ? MAX_8MB_SAVE_STATE_SIZE : MAX_2MB_SAVE_STATE_SIZE;
2912+ return enable_8mb_ram ? MAX_8MB_SAVE_STATE_SIZE : MAX_2MB_SAVE_STATE_SIZE;
29142913}
29152914
2916- size_t System::GetMaxMemorySaveStateSize ()
2915+ size_t System::GetMaxMemorySaveStateSize (bool enable_8mb_ram, bool pgxp )
29172916{
2918- return GetMaxSaveStateSize () + CPU::PGXP::GetStateSize ();
2917+ return GetMaxSaveStateSize (enable_8mb_ram ) + (pgxp ? CPU::PGXP::GetStateSize () : 0 );
29192918}
29202919
29212920std::string System::GetMediaPathFromSaveState (const char * path)
@@ -3448,7 +3447,7 @@ bool System::SaveStateToBuffer(SaveStateBuffer* buffer, Error* error, u32 screen
34483447
34493448 // write data
34503449 if (buffer->state_data .empty ())
3451- buffer->state_data .resize (GetMaxSaveStateSize ());
3450+ buffer->state_data .resize (GetMaxSaveStateSize (Bus::g_ram_size > Bus::RAM_2MB_SIZE ));
34523451
34533452 return SaveStateDataToBuffer (buffer->state_data , &buffer->state_size , error);
34543453}
@@ -4559,6 +4558,8 @@ void System::CheckForSettingsChanges(const Settings& old_settings)
45594558 g_settings.gpu_max_queued_frames != old_settings.gpu_max_queued_frames ||
45604559 g_settings.gpu_use_software_renderer_for_readbacks !=
45614560 old_settings.gpu_use_software_renderer_for_readbacks ||
4561+ g_settings.gpu_use_software_renderer_for_memory_states !=
4562+ old_settings.gpu_use_software_renderer_for_memory_states ||
45624563 g_settings.gpu_scaled_interlacing != old_settings.gpu_scaled_interlacing ||
45634564 g_settings.gpu_force_round_texcoords != old_settings.gpu_force_round_texcoords ||
45644565 g_settings.gpu_texture_filter != old_settings.gpu_texture_filter ||
@@ -4596,9 +4597,19 @@ void System::CheckForSettingsChanges(const Settings& old_settings)
45964597 GPUThread::UpdateSettings (true , false , false );
45974598
45984599 // NOTE: Must come after the GPU thread settings update, otherwise it allocs the wrong size textures.
4599- const bool use_existing_textures = (g_settings.gpu_resolution_scale == old_settings.gpu_resolution_scale );
4600+ const bool use_existing_textures = (g_settings.gpu_resolution_scale == old_settings.gpu_resolution_scale &&
4601+ g_settings.gpu_use_software_renderer_for_memory_states ==
4602+ old_settings.gpu_use_software_renderer_for_memory_states );
46004603 FreeMemoryStateStorage (false , true , use_existing_textures);
4601- ClearMemorySaveStates (true , true );
4604+
4605+ if (g_settings.rewind_enable == old_settings.rewind_enable &&
4606+ g_settings.rewind_save_frequency == old_settings.rewind_save_frequency &&
4607+ g_settings.rewind_save_slots == old_settings.rewind_save_slots &&
4608+ g_settings.runahead_frames == old_settings.runahead_frames )
4609+ {
4610+ // done below if rewind settings changed
4611+ ClearMemorySaveStates (true , true );
4612+ }
46024613
46034614 if (IsPaused ())
46044615 {
@@ -4633,7 +4644,15 @@ void System::CheckForSettingsChanges(const Settings& old_settings)
46334644 FreeMemoryStateStorage (false , true , false );
46344645 StopMediaCapture ();
46354646 GPUThread::UpdateSettings (true , true , g_settings.gpu_use_thread != old_settings.gpu_use_thread );
4636- ClearMemorySaveStates (true , false );
4647+
4648+ if (g_settings.rewind_enable == old_settings.rewind_enable &&
4649+ g_settings.rewind_save_frequency == old_settings.rewind_save_frequency &&
4650+ g_settings.rewind_save_slots == old_settings.rewind_save_slots &&
4651+ g_settings.runahead_frames == old_settings.runahead_frames )
4652+ {
4653+ // done below if rewind settings changed
4654+ ClearMemorySaveStates (true , false );
4655+ }
46374656
46384657 if (IsPaused ())
46394658 {
@@ -5019,12 +5038,16 @@ void System::LogUnsafeSettingsToConsole(const SmallStringBase& messages)
50195038 WARNING_LOG (console_messages);
50205039}
50215040
5022- void System::CalculateRewindMemoryUsage (u32 num_saves, u32 resolution_scale, u64 * ram_usage, u64 * vram_usage)
5041+ void System::CalculateRewindMemoryUsage (u32 num_saves, u32 resolution_scale, u32 multisamples,
5042+ bool use_software_renderer, bool enable_8mb_ram, u64 * ram_usage,
5043+ u64 * vram_usage)
50235044{
5024- const u64 real_resolution_scale = std::max<u64 >(g_settings.gpu_resolution_scale , 1u );
5025- *ram_usage = GetMaxMemorySaveStateSize () * static_cast <u64 >(num_saves);
5026- *vram_usage = ((VRAM_WIDTH * real_resolution_scale) * (VRAM_HEIGHT * real_resolution_scale) * 4 ) *
5027- static_cast <u64 >(g_settings.gpu_multisamples ) * static_cast <u64 >(num_saves);
5045+ const u32 real_resolution_scale = std::max<u32 >(resolution_scale, 1u );
5046+ *ram_usage = GetMaxMemorySaveStateSize (enable_8mb_ram, false ) * static_cast <u64 >(num_saves);
5047+ *vram_usage = use_software_renderer ? 0 :
5048+ ((static_cast <u64 >(VRAM_WIDTH * real_resolution_scale) *
5049+ static_cast <u64 >(VRAM_HEIGHT * real_resolution_scale) * 4 ) *
5050+ static_cast <u64 >(multisamples) * static_cast <u64 >(num_saves));
50285051}
50295052
50305053void System::UpdateMemorySaveStateSettings ()
@@ -5048,7 +5071,9 @@ void System::UpdateMemorySaveStateSettings()
50485071 num_slots = g_settings.rewind_save_slots ;
50495072
50505073 u64 ram_usage, vram_usage;
5051- CalculateRewindMemoryUsage (g_settings.rewind_save_slots , g_settings.gpu_resolution_scale , &ram_usage, &vram_usage);
5074+ CalculateRewindMemoryUsage (g_settings.rewind_save_slots , g_settings.gpu_resolution_scale ,
5075+ g_settings.gpu_multisamples , g_settings.gpu_use_software_renderer_for_memory_states ,
5076+ g_settings.cpu_enable_8mb_ram , &ram_usage, &vram_usage);
50525077 INFO_LOG (" Rewind is enabled, saving every {} frames, with {} slots and {}MB RAM and {}MB VRAM usage" ,
50535078 std::max (s_state.rewind_save_frequency , 1 ), g_settings.rewind_save_slots , ram_usage / 1048576 ,
50545079 vram_usage / 1048576 );
0 commit comments