From 719326df65707519f7b1e041f87cefeb676e2842 Mon Sep 17 00:00:00 2001 From: Fiora Date: Wed, 15 Oct 2014 06:45:49 -0700 Subject: [PATCH] Make EnableBATs an option instead of disabling it entirely --- Source/Core/Core/BootManager.cpp | 5 ++++- Source/Core/Core/CoreParameter.cpp | 4 +++- Source/Core/Core/CoreParameter.h | 1 + Source/Core/Core/HW/MemmapFunctions.cpp | 14 ++++++++------ Source/Core/DolphinWX/ISOProperties.cpp | 5 +++++ Source/Core/DolphinWX/ISOProperties.h | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index e6d14c28f7..76d174d79d 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -47,7 +47,7 @@ namespace BootManager // Apply fire liberally struct ConfigCache { - bool valid, bCPUThread, bSkipIdle, bEnableFPRF, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread, + bool valid, bCPUThread, bSkipIdle, bEnableFPRF, bBAT, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread, bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2, bProgressive; int iCPUCore, Volume; int iWiimoteSource[MAX_BBMOTES]; @@ -114,6 +114,7 @@ bool BootCore(const std::string& _rFilename) config_cache.bSkipIdle = StartUp.bSkipIdle; config_cache.iCPUCore = StartUp.iCPUCore; config_cache.bEnableFPRF = StartUp.bEnableFPRF; + config_cache.bBAT = StartUp.bBAT; config_cache.bMMU = StartUp.bMMU; config_cache.bDCBZOFF = StartUp.bDCBZOFF; config_cache.bVBeamSpeedHack = StartUp.bVBeamSpeedHack; @@ -156,6 +157,7 @@ bool BootCore(const std::string& _rFilename) core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread); core_section->Get("SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle); core_section->Get("EnableFPRF", &StartUp.bEnableFPRF, StartUp.bEnableFPRF); + core_section->Get("BAT", &StartUp.bEnableFPRF, StartUp.bBAT); core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU); core_section->Get("DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF); core_section->Get("VBeam", &StartUp.bVBeamSpeedHack, StartUp.bVBeamSpeedHack); @@ -282,6 +284,7 @@ void Stop() StartUp.bSkipIdle = config_cache.bSkipIdle; StartUp.iCPUCore = config_cache.iCPUCore; StartUp.bEnableFPRF = config_cache.bEnableFPRF; + StartUp.bBAT = config_cache.bBAT; StartUp.bMMU = config_cache.bMMU; StartUp.bDCBZOFF = config_cache.bDCBZOFF; StartUp.bVBeamSpeedHack = config_cache.bVBeamSpeedHack; diff --git a/Source/Core/Core/CoreParameter.cpp b/Source/Core/Core/CoreParameter.cpp index 299c26219d..d92277013e 100644 --- a/Source/Core/Core/CoreParameter.cpp +++ b/Source/Core/Core/CoreParameter.cpp @@ -39,7 +39,8 @@ SCoreStartupParameter::SCoreStartupParameter() bMergeBlocks(false), bEnableMemcardSaving(true), bDPL2Decoder(false), iLatency(14), bRunCompareServer(false), bRunCompareClient(false), - bMMU(false), bDCBZOFF(false), iBBDumpPort(0), bVBeamSpeedHack(false), + bMMU(false), bBAT(false), bDCBZOFF(false), + iBBDumpPort(0), bVBeamSpeedHack(false), bSyncGPU(false), bFastDiscSpeed(false), SelectedLanguage(0), bWii(false), bConfirmStop(false), bHideCursor(false), @@ -73,6 +74,7 @@ void SCoreStartupParameter::LoadDefaults() bDSPThread = true; bFastmem = true; bEnableFPRF = false; + bBAT = false; bMMU = false; bDCBZOFF = false; iBBDumpPort = -1; diff --git a/Source/Core/Core/CoreParameter.h b/Source/Core/Core/CoreParameter.h index 23376c9799..35250a9fad 100644 --- a/Source/Core/Core/CoreParameter.h +++ b/Source/Core/Core/CoreParameter.h @@ -160,6 +160,7 @@ struct SCoreStartupParameter bool bRunCompareServer; bool bRunCompareClient; + bool bBAT; bool bMMU; bool bDCBZOFF; int iBBDumpPort; diff --git a/Source/Core/Core/HW/MemmapFunctions.cpp b/Source/Core/Core/HW/MemmapFunctions.cpp index e58a99ed4e..79755c213a 100644 --- a/Source/Core/Core/HW/MemmapFunctions.cpp +++ b/Source/Core/Core/HW/MemmapFunctions.cpp @@ -966,12 +966,14 @@ u32 TranslateAddress(const u32 _Address, const XCheckTLBFlag _Flag) // Check MSR[DR] bit before translating data addresses //if (((_Flag == FLAG_READ) || (_Flag == FLAG_WRITE)) && !(MSR & (1 << (31 - 27)))) return _Address; - // Technically we should do this, but no known games, even heavy MMU ones, use any custom BATs whatsoever, - // so it's a waste of time and should never succeed (given the default BATs are already handled in - // ReadFromHardware/WriteToHardware). - //u32 tlb_addr = TranslateBlockAddress(_Address, _Flag); - //if (!tlb_addr) - // return tlb_addr; + // Technically we should do this, but almost no games, even heavy MMU ones, use any custom BATs whatsoever, + // so only do it where it's really needed. + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bBAT) + { + u32 tlb_addr = TranslateBlockAddress(_Address, _Flag); + if (tlb_addr) + return tlb_addr; + } return TranslatePageAddress(_Address, _Flag); } } // namespace diff --git a/Source/Core/DolphinWX/ISOProperties.cpp b/Source/Core/DolphinWX/ISOProperties.cpp index 6e6ca80818..a43eada9b4 100644 --- a/Source/Core/DolphinWX/ISOProperties.cpp +++ b/Source/Core/DolphinWX/ISOProperties.cpp @@ -389,6 +389,8 @@ void CISOProperties::CreateGUIControls(bool IsWad) SkipIdle = new wxCheckBox(m_GameConfig, ID_IDLESKIP, _("Enable Idle Skipping"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "SkipIdle")); MMU = new wxCheckBox(m_GameConfig, ID_MMU, _("Enable MMU"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "MMU")); MMU->SetToolTip(_("Enables the Memory Management Unit, needed for some games. (ON = Compatible, OFF = Fast)")); + BAT = new wxCheckBox(m_GameConfig, ID_MMU, _("Enable BAT"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "BAT")); + BAT->SetToolTip(_("Enables Block Address Translation, needed for a few games. Requires MMU. (ON = Compatible, OFF = Fast)")); DCBZOFF = new wxCheckBox(m_GameConfig, ID_DCBZOFF, _("Skip DCBZ clearing"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "DCBZ")); DCBZOFF->SetToolTip(_("Bypass the clearing of the data cache by the DCBZ instruction. Usually leave this option disabled.")); VBeam = new wxCheckBox(m_GameConfig, ID_VBEAM, _("VBeam Speed Hack"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "VBeam")); @@ -419,6 +421,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) new wxStaticBoxSizer(wxVERTICAL, m_GameConfig, _("Core")); sbCoreOverrides->Add(CPUThread, 0, wxLEFT, 5); sbCoreOverrides->Add(SkipIdle, 0, wxLEFT, 5); + sbCoreOverrides->Add(BAT, 0, wxLEFT, 5); sbCoreOverrides->Add(MMU, 0, wxLEFT, 5); sbCoreOverrides->Add(DCBZOFF, 0, wxLEFT, 5); sbCoreOverrides->Add(VBeam, 0, wxLEFT, 5); @@ -1002,6 +1005,7 @@ void CISOProperties::LoadGameConfig() SetCheckboxValueFromGameini("Core", "CPUThread", CPUThread); SetCheckboxValueFromGameini("Core", "SkipIdle", SkipIdle); SetCheckboxValueFromGameini("Core", "MMU", MMU); + SetCheckboxValueFromGameini("Core", "BAT", BAT); SetCheckboxValueFromGameini("Core", "DCBZ", DCBZOFF); SetCheckboxValueFromGameini("Core", "VBeam", VBeam); SetCheckboxValueFromGameini("Core", "SyncGPU", SyncGPU); @@ -1075,6 +1079,7 @@ bool CISOProperties::SaveGameConfig() SaveGameIniValueFrom3StateCheckbox("Core", "CPUThread", CPUThread); SaveGameIniValueFrom3StateCheckbox("Core", "SkipIdle", SkipIdle); SaveGameIniValueFrom3StateCheckbox("Core", "MMU", MMU); + SaveGameIniValueFrom3StateCheckbox("Core", "BAT", BAT); SaveGameIniValueFrom3StateCheckbox("Core", "DCBZ", DCBZOFF); SaveGameIniValueFrom3StateCheckbox("Core", "VBeam", VBeam); SaveGameIniValueFrom3StateCheckbox("Core", "SyncGPU", SyncGPU); diff --git a/Source/Core/DolphinWX/ISOProperties.h b/Source/Core/DolphinWX/ISOProperties.h index 506c2960fa..8112146136 100644 --- a/Source/Core/DolphinWX/ISOProperties.h +++ b/Source/Core/DolphinWX/ISOProperties.h @@ -67,7 +67,7 @@ private: DECLARE_EVENT_TABLE(); // Core - wxCheckBox *CPUThread, *SkipIdle, *MMU, *DCBZOFF; + wxCheckBox *CPUThread, *SkipIdle, *MMU, *BAT, *DCBZOFF; wxCheckBox *VBeam, *SyncGPU, *FastDiscSpeed, *BlockMerging, *DSPHLE; // Wii wxCheckBox *EnableWideScreen;