diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index 61bd110cc0..e22eda26d3 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -32,6 +32,7 @@ void SCoreStartupParameter::LoadDefaults() bEnableDebugging = false; bUseJIT = false; bUseDualCore = false; + bSkipIdle = false; bRunCompareServer = false; bLockThreads = true; bWii = false; diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index d0eda4e2d7..04eaff8965 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -37,6 +37,7 @@ struct SCoreStartupParameter bool bEnableDebugging; bool bUseJIT; bool bUseDualCore; + bool bSkipIdle; bool bNTSC; bool bHLEBios; bool bUseFastMem; diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp index 5ef1afbbc3..112126d180 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp @@ -80,20 +80,27 @@ namespace Jit64 // TODO(ector): Make it dynamically enable/disable idle skipping where appropriate // Will give nice boost to dual core mode + // (mb2): I agree, + // IMHO those Idles should be always skipped and replaced by a more controlable "native" Idle methode + // ... maybe the throttle one already do that :p // if (CommandProcessor::AllowIdleSkipping() && PixelEngine::AllowIdleSkipping()) - if (!Core::GetStartupParameter().bUseDualCore && + if (Core::GetStartupParameter().bSkipIdle && inst.OPCD == 32 && (inst.hex & 0xFFFF0000) == 0x800D0000 && Memory::ReadUnchecked_U32(js.compilerPC + 4) == 0x28000000 && Memory::ReadUnchecked_U32(js.compilerPC + 8) == 0x4182fff8) { - gpr.Flush(FLUSH_ALL); - fpr.Flush(FLUSH_ALL); - ABI_CallFunctionC((void *)&PowerPC::OnIdle, PowerPC::ppcState.gpr[a] + (s32)(s16)inst.SIMM_16); - MOV(32, M(&PowerPC::ppcState.pc), Imm32(js.compilerPC + 12)); - JMP(Asm::testExceptions, true); - js.compilerPC += 8; - return; + + gpr.Flush(FLUSH_ALL); + fpr.Flush(FLUSH_ALL); + if (Core::GetStartupParameter().bUseDualCore) + CALL(&PowerPC::OnIdleDC); + else + ABI_CallFunctionC((void *)&PowerPC::OnIdle, PowerPC::ppcState.gpr[a] + (s32)(s16)inst.SIMM_16); + MOV(32, M(&PowerPC::ppcState.pc), Imm32(js.compilerPC + 12)); + JMP(Asm::testExceptions, true); + js.compilerPC += 8; + return; } s32 offset = (s32)(s16)inst.SIMM_16; diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.cpp b/Source/Core/Core/Src/PowerPC/PowerPC.cpp index 31d3c46c91..7058f4ec17 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.cpp +++ b/Source/Core/Core/Src/PowerPC/PowerPC.cpp @@ -290,5 +290,10 @@ namespace PowerPC CoreTiming::Idle(); } } + //DualCore OnIdle + void OnIdleDC(void) + { + CoreTiming::Idle(); + } } diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.h b/Source/Core/Core/Src/PowerPC/PowerPC.h index 8b841e6cac..531edd320a 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.h +++ b/Source/Core/Core/Src/PowerPC/PowerPC.h @@ -92,6 +92,7 @@ namespace PowerPC void Stop(); void OnIdle(u32 _uThreadAddr); + void OnIdleDC(void); } // Special registers diff --git a/Source/Core/DolphinWX/Src/BootManager.cpp b/Source/Core/DolphinWX/Src/BootManager.cpp index 3de87842da..e0a70f5664 100644 --- a/Source/Core/DolphinWX/Src/BootManager.cpp +++ b/Source/Core/DolphinWX/Src/BootManager.cpp @@ -81,6 +81,7 @@ bool BootCore(const std::string& _rFilename) if (unique_id.size() == 6 && ini.Load(("Patches/" + unique_id + ".ini").c_str())) { ini.Get("Core", "UseDualCore", &StartUp.bUseDualCore, StartUp.bUseDualCore); + ini.Get("Core", "SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle); ini.Get("Core", "OptimizeQuantizers", &StartUp.bOptimizeQuantizers, StartUp.bOptimizeQuantizers); } if(main_frame) diff --git a/Source/Core/DolphinWX/Src/Config.cpp b/Source/Core/DolphinWX/Src/Config.cpp index caa6b8b0b4..b717603f63 100644 --- a/Source/Core/DolphinWX/Src/Config.cpp +++ b/Source/Core/DolphinWX/Src/Config.cpp @@ -67,6 +67,7 @@ void SConfig::SaveSettings() ini.Set("Core", "HLEBios", m_LocalCoreStartupParameter.bHLEBios); ini.Set("Core", "UseDynarec", m_LocalCoreStartupParameter.bUseJIT); ini.Set("Core", "UseDualCore", m_LocalCoreStartupParameter.bUseDualCore); + ini.Set("Core", "SkipIdle", m_LocalCoreStartupParameter.bSkipIdle); ini.Set("Core", "LockThreads", m_LocalCoreStartupParameter.bLockThreads); ini.Set("Core", "DefaultGCM", m_LocalCoreStartupParameter.m_strDefaultGCM); ini.Set("Core", "OptimizeQuantizers", m_LocalCoreStartupParameter.bOptimizeQuantizers); @@ -118,6 +119,7 @@ void SConfig::LoadSettings() ini.Get("Core", "HLEBios", &m_LocalCoreStartupParameter.bHLEBios, true); ini.Get("Core", "UseDynarec", &m_LocalCoreStartupParameter.bUseJIT, true); ini.Get("Core", "UseDualCore", &m_LocalCoreStartupParameter.bUseDualCore, false); + ini.Get("Core", "SkipIdle", &m_LocalCoreStartupParameter.bSkipIdle, true); ini.Get("Core", "LockThreads", &m_LocalCoreStartupParameter.bLockThreads, true); ini.Get("Core", "DefaultGCM", &m_LocalCoreStartupParameter.m_strDefaultGCM); ini.Get("Core", "OptimizeQuantizers", &m_LocalCoreStartupParameter.bOptimizeQuantizers, true); diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 8032d81207..a246ea58ed 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -96,6 +96,7 @@ EVT_MENU(IDM_BROWSE, CFrame::OnBrowse) EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard) EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen) EVT_MENU(IDM_TOGGLE_DUALCORE, CFrame::OnToggleDualCore) +EVT_MENU(IDM_TOGGLE_SKIPIDLE, CFrame::OnToggleSkipIdle) EVT_MENU(IDM_TOGGLE_TOOLBAR, CFrame::OnToggleToolbar) EVT_MENU(IDM_TOGGLE_STATUSBAR, CFrame::OnToggleStatusbar) EVT_MENU(IDM_LOADSLOT1, CFrame::OnLoadState) @@ -222,6 +223,8 @@ void CFrame::CreateMenu() pOptionsMenu->Append(IDM_TOGGLE_FULLSCREEN, _T("&Fullscreen\tAlt+Enter")); pOptionsMenu->AppendCheckItem(IDM_TOGGLE_DUALCORE, _T("Dual-&core (unstable!)")); pOptionsMenu->Check(IDM_TOGGLE_DUALCORE, SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore); + pOptionsMenu->AppendCheckItem(IDM_TOGGLE_SKIPIDLE, _T("Idle s&kipping")); + pOptionsMenu->Check(IDM_TOGGLE_SKIPIDLE, SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle); m_pMenuBar->Append(pOptionsMenu, _T("&Options")); // misc menu @@ -555,6 +558,11 @@ void CFrame::OnToggleDualCore(wxCommandEvent& WXUNUSED (event)) SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore = !SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore; SConfig::GetInstance().SaveSettings(); } +void CFrame::OnToggleSkipIdle(wxCommandEvent& WXUNUSED (event)) +{ + SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle = !SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle; + SConfig::GetInstance().SaveSettings(); +} void CFrame::OnLoadState(wxCommandEvent& event) { diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index daa3e44ea6..61423e49ca 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -66,6 +66,7 @@ class CFrame void OnMemcard(wxCommandEvent& event); void OnToggleFullscreen(wxCommandEvent& event); void OnToggleDualCore(wxCommandEvent& event); + void OnToggleSkipIdle(wxCommandEvent& event); void OnToggleThrottle(wxCommandEvent& event); void OnToggleToolbar(wxCommandEvent& event); void OnToggleStatusbar(wxCommandEvent& event); diff --git a/Source/Core/DolphinWX/Src/Globals.h b/Source/Core/DolphinWX/Src/Globals.h index 3f8aff4e54..2759025d90 100644 --- a/Source/Core/DolphinWX/Src/Globals.h +++ b/Source/Core/DolphinWX/Src/Globals.h @@ -57,6 +57,7 @@ enum IDM_CONFIG_PAD_PLUGIN, IDM_TOGGLE_FULLSCREEN, IDM_TOGGLE_DUALCORE, + IDM_TOGGLE_SKIPIDLE, IDM_TOGGLE_TOOLBAR, IDM_TOGGLE_STATUSBAR, IDM_NOTIFYMAPLOADED,