mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 06:39:46 -06:00
DSP: New non-threaded mode for the LLE plugin, with some idle skipping enabled. Use Dolphin Main config to set it. Some minor optimization and some spelling fixes.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2937 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -63,7 +63,7 @@ void SConfig::SaveSettings()
|
||||
ini.Set("General", tmp, m_ISOFolder[i]);
|
||||
}
|
||||
|
||||
ini.Set("General", "RecersiveGCMPaths", m_RecersiveISOFolder);
|
||||
ini.Set("General", "RecersiveGCMPaths", m_RecursiveISOFolder);
|
||||
}
|
||||
|
||||
|
||||
@ -87,6 +87,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", "DSPThread", m_LocalCoreStartupParameter.bDSPThread);
|
||||
ini.Set("Core", "SkipIdle", m_LocalCoreStartupParameter.bSkipIdle);
|
||||
ini.Set("Core", "LockThreads", m_LocalCoreStartupParameter.bLockThreads);
|
||||
ini.Set("Core", "DefaultGCM", m_LocalCoreStartupParameter.m_strDefaultGCM);
|
||||
@ -168,7 +169,7 @@ void SConfig::LoadSettings()
|
||||
}
|
||||
}
|
||||
|
||||
ini.Get("General", "RecersiveGCMPaths", &m_RecersiveISOFolder, false);
|
||||
ini.Get("General", "RecersiveGCMPaths", &m_RecursiveISOFolder, false);
|
||||
}
|
||||
|
||||
{
|
||||
@ -188,11 +189,12 @@ void SConfig::LoadSettings()
|
||||
ini.Get("Interface", "ShowConsole", &m_InterfaceConsole, false);
|
||||
|
||||
// Core
|
||||
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", "HLEBios", &m_LocalCoreStartupParameter.bHLEBios, true);
|
||||
ini.Get("Core", "UseDynarec", &m_LocalCoreStartupParameter.bUseJIT, true);
|
||||
ini.Get("Core", "DSPThread", &m_LocalCoreStartupParameter.bDSPThread, 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", "DVDRoot", &m_LocalCoreStartupParameter.m_strDVDRoot);
|
||||
ini.Get("Core", "OptimizeQuantizers", &m_LocalCoreStartupParameter.bOptimizeQuantizers, true);
|
||||
|
@ -50,8 +50,8 @@ struct SConfig
|
||||
std::string m_LastFilename;
|
||||
|
||||
// gcm folder
|
||||
std::vector<std::string>m_ISOFolder;
|
||||
bool m_RecersiveISOFolder;
|
||||
std::vector<std::string> m_ISOFolder;
|
||||
bool m_RecursiveISOFolder;
|
||||
|
||||
SCoreStartupParameter m_LocalCoreStartupParameter;
|
||||
|
||||
|
@ -414,6 +414,7 @@ THREAD_RETURN EmuThread(void *pArg)
|
||||
dspInit.pGetAudioStreaming = AudioInterface::Callback_GetStreaming;
|
||||
dspInit.pEmulatorState = (int *)PowerPC::GetStatePtr();
|
||||
dspInit.bWii = _CoreParameter.bWii;
|
||||
dspInit.bOnThread = _CoreParameter.bDSPThread;
|
||||
// May be needed for Stop and Start
|
||||
#ifdef SETUP_FREE_DSP_PLUGIN_ON_BOOT
|
||||
Plugins.FreeDSP();
|
||||
|
@ -41,6 +41,7 @@ void SCoreStartupParameter::LoadDefaults()
|
||||
bUseDualCore = false;
|
||||
bSkipIdle = false;
|
||||
bRunCompareServer = false;
|
||||
bDSPThread = true;
|
||||
bLockThreads = true;
|
||||
bWii = false;
|
||||
SelectedLanguage = 0;
|
||||
|
@ -57,6 +57,7 @@ struct SCoreStartupParameter
|
||||
bool bJITBranchOff;
|
||||
|
||||
bool bUseDualCore;
|
||||
bool bDSPThread;
|
||||
bool bSkipIdle;
|
||||
bool bNTSC;
|
||||
bool bHLEBios;
|
||||
|
@ -210,7 +210,7 @@ void DecrementerCallback(u64 userdata, int cyclesLate)
|
||||
void DecrementerSet()
|
||||
{
|
||||
u32 decValue = PowerPC::ppcState.spr[SPR_DEC];
|
||||
fakeDec = decValue*TIMER_RATIO;
|
||||
fakeDec = decValue * TIMER_RATIO;
|
||||
CoreTiming::RemoveEvent(et_Dec);
|
||||
CoreTiming::ScheduleEvent(decValue * TIMER_RATIO, et_Dec);
|
||||
}
|
||||
@ -221,8 +221,8 @@ void AdvanceCallback(int cyclesExecuted)
|
||||
return;
|
||||
|
||||
fakeDec -= cyclesExecuted;
|
||||
u64 timebase_ticks = CoreTiming::GetTicks() / TIMER_RATIO; //works since we are little endian and TL comes first :)
|
||||
*(u64*)&TL = timebase_ticks + startTimeBaseTicks;
|
||||
u64 timebase_ticks = CoreTiming::GetTicks() / TIMER_RATIO;
|
||||
*(u64*)&TL = timebase_ticks + startTimeBaseTicks; //works since we are little endian and TL comes first :)
|
||||
if (fakeDec >= 0)
|
||||
PowerPC::ppcState.spr[SPR_DEC] = (u32)fakeDec / TIMER_RATIO;
|
||||
}
|
||||
@ -243,10 +243,15 @@ void Init()
|
||||
CPU_CORE_CLOCK = 729000000u;
|
||||
VI_PERIOD = GetTicksPerSecond() / (60*120);
|
||||
SI_PERIOD = GetTicksPerSecond() / 60; // once a frame is good for controllers
|
||||
|
||||
// These are the big question marks IMHO :)
|
||||
|
||||
if (!Core::GetStartupParameter().bDSPThread) {
|
||||
DSP_PERIOD = 12000; // TO BE TWEAKED
|
||||
} else {
|
||||
DSP_PERIOD = (int)(GetTicksPerSecond() * 0.003f);
|
||||
}
|
||||
|
||||
// This is the biggest question mark.
|
||||
AI_PERIOD = GetTicksPerSecond() / 80;
|
||||
DSP_PERIOD = (int)(GetTicksPerSecond() * 0.003f);
|
||||
|
||||
IPC_HLE_PERIOD = (int)(GetTicksPerSecond() * 0.003f);
|
||||
}
|
||||
@ -255,10 +260,15 @@ void Init()
|
||||
CPU_CORE_CLOCK = 486000000;
|
||||
VI_PERIOD = GetTicksPerSecond() / (60*120);
|
||||
SI_PERIOD = GetTicksPerSecond() / 60; // once a frame is good for controllers
|
||||
|
||||
// These are the big question marks IMHO :)
|
||||
|
||||
if (!Core::GetStartupParameter().bDSPThread) {
|
||||
DSP_PERIOD = 12000; // TO BE TWEAKED
|
||||
} else {
|
||||
DSP_PERIOD = (int)(GetTicksPerSecond() * 0.005f);
|
||||
}
|
||||
|
||||
// This is the biggest question mark.
|
||||
AI_PERIOD = GetTicksPerSecond() / 80;
|
||||
DSP_PERIOD = (int)(GetTicksPerSecond() * 0.005f);
|
||||
}
|
||||
Common::Timer::IncreaseResolution();
|
||||
// store and convert localtime at boot to timebase ticks
|
||||
|
@ -49,6 +49,7 @@ EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_ALLWAYS_HLEBIOS, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_USEDYNAREC, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_USEDUALCORE, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_DSPTHREAD, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_LOCKTHREADS, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_OPTIMIZEQUANTIZERS, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_IDLESKIP, CConfigMain::CoreSettingsChanged)
|
||||
@ -131,7 +132,7 @@ void CConfigMain::UpdateGUI()
|
||||
if(Core::GetState() != Core::CORE_UNINITIALIZED)
|
||||
{
|
||||
// Disable the Core stuff on GeneralPage
|
||||
AllwaysHLEBIOS->Disable();
|
||||
AlwaysUseHLEBIOS->Disable();
|
||||
UseDynaRec->Disable();
|
||||
UseDualCore->Disable();
|
||||
LockThreads->Disable();
|
||||
@ -182,13 +183,15 @@ void CConfigMain::CreateGUIControls()
|
||||
// Core Settings - Basic
|
||||
UseDualCore = new wxCheckBox(GeneralPage, ID_USEDUALCORE, wxT("Enable Dual Core"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
UseDualCore->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore);
|
||||
DSPThread = new wxCheckBox(GeneralPage, ID_DSPTHREAD, wxT("LLE DSP on thread"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
DSPThread->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread);
|
||||
SkipIdle = new wxCheckBox(GeneralPage, ID_IDLESKIP, wxT("Enable Idle Skipping"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
SkipIdle->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle);
|
||||
EnableCheats = new wxCheckBox(GeneralPage, ID_ENABLECHEATS, wxT("Enable Cheats"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
EnableCheats->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats);
|
||||
// Core Settings - Advanced
|
||||
AllwaysHLEBIOS = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLEBIOS, wxT("HLE the BIOS all the time"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
AllwaysHLEBIOS->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios);
|
||||
AlwaysUseHLEBIOS = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLEBIOS, wxT("HLE the BIOS all the time"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
AlwaysUseHLEBIOS->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios);
|
||||
UseDynaRec = new wxCheckBox(GeneralPage, ID_USEDYNAREC, wxT("Enable the JIT dynarec"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
UseDynaRec->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT);
|
||||
LockThreads = new wxCheckBox(GeneralPage, ID_LOCKTHREADS, wxT("Lock threads to cores"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
@ -260,10 +263,11 @@ void CConfigMain::CreateGUIControls()
|
||||
sCore = new wxBoxSizer(wxHORIZONTAL);
|
||||
sbBasic = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("Basic Settings"));
|
||||
sbBasic->Add(UseDualCore, 0, wxALL, 5);
|
||||
sbBasic->Add(DSPThread, 0, wxALL, 5);
|
||||
sbBasic->Add(SkipIdle, 0, wxALL, 5);
|
||||
sbBasic->Add(EnableCheats, 0, wxALL, 5);
|
||||
sbAdvanced = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("Advanced Settings"));
|
||||
sbAdvanced->Add(AllwaysHLEBIOS, 0, wxALL, 5);
|
||||
sbAdvanced->Add(AlwaysUseHLEBIOS, 0, wxALL, 5);
|
||||
sbAdvanced->Add(UseDynaRec, 0, wxALL, 5);
|
||||
sbAdvanced->Add(LockThreads, 0, wxALL, 5);
|
||||
sbAdvanced->Add(OptimizeQuantizers, 0, wxALL, 5);
|
||||
@ -443,7 +447,7 @@ void CConfigMain::CreateGUIControls()
|
||||
RemoveISOPath = new wxButton(PathsPage, ID_REMOVEISOPATH, wxT("Remove"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
RemoveISOPath->Enable(false);
|
||||
RecersiveISOPath = new wxCheckBox(PathsPage, ID_RECERSIVEISOPATH, wxT("Search Subfolders"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
RecersiveISOPath->SetValue(SConfig::GetInstance().m_RecersiveISOFolder);
|
||||
RecersiveISOPath->SetValue(SConfig::GetInstance().m_RecursiveISOFolder);
|
||||
DefaultISOText = new wxStaticText(PathsPage, ID_DEFAULTISO_TEXT, wxT("Default ISO:"), wxDefaultPosition, wxDefaultSize);
|
||||
DefaultISO = new wxFilePickerCtrl(PathsPage, ID_DEFAULTISO, wxEmptyString, wxT("Choose a default ISO:"),
|
||||
wxString::Format(wxT("All GC/Wii images (gcm, iso, gcz)|*.gcm;*.iso;*.gcz|All files (%s)|%s"), wxFileSelectorDefaultWildcardStr, wxFileSelectorDefaultWildcardStr),
|
||||
@ -611,7 +615,7 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event)
|
||||
break;
|
||||
|
||||
case ID_ALLWAYS_HLEBIOS: // Core
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios = AllwaysHLEBIOS->IsChecked();
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios = AlwaysUseHLEBIOS->IsChecked();
|
||||
break;
|
||||
case ID_USEDYNAREC:
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT = UseDynaRec->IsChecked();
|
||||
@ -619,6 +623,9 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event)
|
||||
case ID_USEDUALCORE:
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore = UseDualCore->IsChecked();
|
||||
break;
|
||||
case ID_DSPTHREAD:
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread = DSPThread->IsChecked();
|
||||
break;
|
||||
case ID_LOCKTHREADS:
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bLockThreads = LockThreads->IsChecked();
|
||||
break;
|
||||
@ -843,7 +850,7 @@ void CConfigMain::AddRemoveISOPaths(wxCommandEvent& event)
|
||||
|
||||
void CConfigMain::RecursiveDirectoryChanged(wxCommandEvent& WXUNUSED (event))
|
||||
{
|
||||
SConfig::GetInstance().m_RecersiveISOFolder = RecersiveISOPath->IsChecked();
|
||||
SConfig::GetInstance().m_RecursiveISOFolder = RecersiveISOPath->IsChecked();
|
||||
bRefreshList = true;
|
||||
}
|
||||
|
||||
|
@ -60,9 +60,10 @@ class CConfigMain
|
||||
|
||||
wxBoxSizer* sCore;
|
||||
wxStaticBoxSizer* sbBasic, *sbAdvanced, *sbInterface;
|
||||
wxCheckBox* AllwaysHLEBIOS;
|
||||
wxCheckBox* AlwaysUseHLEBIOS;
|
||||
wxCheckBox* UseDynaRec;
|
||||
wxCheckBox* UseDualCore;
|
||||
wxCheckBox* DSPThread;
|
||||
wxCheckBox* LockThreads;
|
||||
wxCheckBox* OptimizeQuantizers;
|
||||
wxCheckBox* SkipIdle;
|
||||
@ -213,6 +214,7 @@ class CConfigMain
|
||||
ID_ALLWAYS_HLEBIOS,
|
||||
ID_USEDYNAREC,
|
||||
ID_USEDUALCORE,
|
||||
ID_DSPTHREAD,
|
||||
ID_LOCKTHREADS,
|
||||
ID_OPTIMIZEQUANTIZERS,
|
||||
ID_IDLESKIP,
|
||||
|
@ -375,7 +375,7 @@ void CGameListCtrl::ScanForISOs()
|
||||
m_ISOFiles.clear();
|
||||
CFileSearch::XStringVector Directories(SConfig::GetInstance().m_ISOFolder);
|
||||
|
||||
if (SConfig::GetInstance().m_RecersiveISOFolder)
|
||||
if (SConfig::GetInstance().m_RecursiveISOFolder)
|
||||
{
|
||||
for (u32 i = 0; i < Directories.size(); i++)
|
||||
{
|
||||
|
Reference in New Issue
Block a user