mirror of https://github.com/PCSX2/pcsx2.git
VMManager: Make EE rec toggles reliable
Before, it'd swap out the Cpu while it was executing...
This commit is contained in:
parent
e6c8354ec8
commit
4f70fd9583
|
@ -393,6 +393,8 @@ struct Pcsx2Config
|
||||||
void LoadSave(SettingsWrapper& wrap);
|
void LoadSave(SettingsWrapper& wrap);
|
||||||
void ApplySanityCheck();
|
void ApplySanityCheck();
|
||||||
|
|
||||||
|
bool CpusChanged(const CpuOptions& right) const;
|
||||||
|
|
||||||
bool operator==(const CpuOptions& right) const
|
bool operator==(const CpuOptions& right) const
|
||||||
{
|
{
|
||||||
return OpEqu(sseMXCSR) && OpEqu(sseVUMXCSR) && OpEqu(Recompiler);
|
return OpEqu(sseMXCSR) && OpEqu(sseVUMXCSR) && OpEqu(Recompiler);
|
||||||
|
|
|
@ -224,6 +224,14 @@ void Pcsx2Config::RecompilerOptions::LoadSave(SettingsWrapper& wrap)
|
||||||
SettingsWrapBitBool(PreBlockCheckIOP);
|
SettingsWrapBitBool(PreBlockCheckIOP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Pcsx2Config::CpuOptions::CpusChanged(const CpuOptions& right) const
|
||||||
|
{
|
||||||
|
return (Recompiler.EnableEE != right.Recompiler.EnableEE ||
|
||||||
|
Recompiler.EnableIOP != right.Recompiler.EnableIOP ||
|
||||||
|
Recompiler.EnableVU0 != right.Recompiler.EnableVU0 ||
|
||||||
|
Recompiler.EnableVU1 != right.Recompiler.EnableVU1);
|
||||||
|
}
|
||||||
|
|
||||||
Pcsx2Config::CpuOptions::CpuOptions()
|
Pcsx2Config::CpuOptions::CpuOptions()
|
||||||
{
|
{
|
||||||
sseMXCSR.bitmask = DEFAULT_sseMXCSR;
|
sseMXCSR.bitmask = DEFAULT_sseMXCSR;
|
||||||
|
|
|
@ -592,7 +592,10 @@ void SysCpuProviderPack::ApplyConfig() const
|
||||||
// Use this method to reset the recs when important global pointers like the MTGS are re-assigned.
|
// Use this method to reset the recs when important global pointers like the MTGS are re-assigned.
|
||||||
void SysClearExecutionCache()
|
void SysClearExecutionCache()
|
||||||
{
|
{
|
||||||
|
// Done by VMManager in Qt.
|
||||||
|
#ifndef PCSX2_CORE
|
||||||
GetCpuProviders().ApplyConfig();
|
GetCpuProviders().ApplyConfig();
|
||||||
|
#endif
|
||||||
|
|
||||||
Cpu->Reset();
|
Cpu->Reset();
|
||||||
psxCpu->Reset();
|
psxCpu->Reset();
|
||||||
|
|
|
@ -96,6 +96,7 @@ static std::unique_ptr<INISettingsInterface> s_game_settings_interface;
|
||||||
static u64 s_emu_thread_affinity;
|
static u64 s_emu_thread_affinity;
|
||||||
|
|
||||||
static std::atomic<VMState> s_state{VMState::Shutdown};
|
static std::atomic<VMState> s_state{VMState::Shutdown};
|
||||||
|
static std::atomic_bool s_cpu_implementation_changed{false};
|
||||||
|
|
||||||
static std::mutex s_info_mutex;
|
static std::mutex s_info_mutex;
|
||||||
static std::string s_disc_path;
|
static std::string s_disc_path;
|
||||||
|
@ -757,6 +758,8 @@ bool VMManager::Initialize(const VMBootParameters& boot_params)
|
||||||
s_mxcsr_saved = static_cast<u32>(a64_getfpcr());
|
s_mxcsr_saved = static_cast<u32>(a64_getfpcr());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
s_cpu_implementation_changed.store(false);
|
||||||
|
s_cpu_provider_pack->ApplyConfig();
|
||||||
SetCPUState(EmuConfig.Cpu.sseMXCSR, EmuConfig.Cpu.sseVUMXCSR);
|
SetCPUState(EmuConfig.Cpu.sseMXCSR, EmuConfig.Cpu.sseVUMXCSR);
|
||||||
SysClearExecutionCache();
|
SysClearExecutionCache();
|
||||||
memBindConditionalHandlers();
|
memBindConditionalHandlers();
|
||||||
|
@ -1039,6 +1042,15 @@ bool VMManager::IsGSDumpFileName(const std::string& path)
|
||||||
|
|
||||||
void VMManager::Execute()
|
void VMManager::Execute()
|
||||||
{
|
{
|
||||||
|
// Check for interpreter<->recompiler switches.
|
||||||
|
if (s_cpu_implementation_changed.exchange(false))
|
||||||
|
{
|
||||||
|
// We need to switch the cpus out, and reset the new ones if so.
|
||||||
|
s_cpu_provider_pack->ApplyConfig();
|
||||||
|
SysClearExecutionCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute until we're asked to stop.
|
||||||
Cpu->Execute();
|
Cpu->Execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1058,7 +1070,7 @@ const std::string& VMManager::Internal::GetElfOverride()
|
||||||
|
|
||||||
bool VMManager::Internal::IsExecutionInterrupted()
|
bool VMManager::Internal::IsExecutionInterrupted()
|
||||||
{
|
{
|
||||||
return s_state.load() != VMState::Running;
|
return s_state.load() != VMState::Running || s_cpu_implementation_changed.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMManager::Internal::GameStartingOnCPUThread()
|
void VMManager::Internal::GameStartingOnCPUThread()
|
||||||
|
@ -1098,6 +1110,15 @@ void VMManager::CheckForCPUConfigChanges(const Pcsx2Config& old_config)
|
||||||
SetCPUState(EmuConfig.Cpu.sseMXCSR, EmuConfig.Cpu.sseVUMXCSR);
|
SetCPUState(EmuConfig.Cpu.sseMXCSR, EmuConfig.Cpu.sseVUMXCSR);
|
||||||
SysClearExecutionCache();
|
SysClearExecutionCache();
|
||||||
memBindConditionalHandlers();
|
memBindConditionalHandlers();
|
||||||
|
|
||||||
|
// did we toggle recompilers?
|
||||||
|
if (EmuConfig.Cpu.CpusChanged(old_config.Cpu))
|
||||||
|
{
|
||||||
|
// This has to be done asynchronously, since we're still executing the
|
||||||
|
// cpu when this function is called. Break the execution as soon as
|
||||||
|
// possible and reset next time we're called.
|
||||||
|
s_cpu_implementation_changed.store(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMManager::CheckForGSConfigChanges(const Pcsx2Config& old_config)
|
void VMManager::CheckForGSConfigChanges(const Pcsx2Config& old_config)
|
||||||
|
|
Loading…
Reference in New Issue