diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 63d86ac28b..7a824b30ec 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -150,9 +150,15 @@ void PPUThread::DoRun() case 1: case 2: + { auto ppui = new PPUInterpreter(*this); m_dec = new PPUDecoder(ppui); + } break; + + default: + ConLog.Error("Invalid CPU decoder mode: %d", Ini.CPUDecoderMode.GetValue()); + Emu.Pause(); } } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index f93e39f4d5..395a203f45 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -69,22 +69,19 @@ u64 SPUThread::GetFreeStackSize() const void SPUThread::DoRun() { - switch(Ini.CPUDecoderMode.GetValue()) + switch(Ini.SPUDecoderMode.GetValue()) { - case 0: - //m_dec = new SPUDecoder(*new SPUDisAsm()); - break; - case 1: - m_dec = new SPURecompilerCore(*this); - break; - case 2: m_dec = new SPUDecoder(*new SPUInterpreter(*this)); break; - } + case 2: + m_dec = new SPURecompilerCore(*this); + break; - //Pause(); - //Emu.Pause(); + default: + ConLog.Error("Invalid SPU decoder mode: %d", Ini.SPUDecoderMode.GetValue()); + Emu.Pause(); + } } void SPUThread::DoResume() diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index c6e2338d30..93fc4a6453 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -333,8 +333,9 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxBoxSizer* s_subpanel_io(new wxBoxSizer(wxVERTICAL)); wxBoxSizer* s_subpanel_hle(new wxBoxSizer(wxVERTICAL)); - // CPU settings - wxStaticBoxSizer* s_round_cpu_decoder( new wxStaticBoxSizer( wxVERTICAL, p_cpu, _("Decoder") ) ); + // CPU/SPU settings + wxStaticBoxSizer* s_round_cpu_decoder( new wxStaticBoxSizer( wxVERTICAL, p_cpu, _("CPU") ) ); + wxStaticBoxSizer* s_round_spu_decoder( new wxStaticBoxSizer( wxVERTICAL, p_cpu, _("SPU") ) ); // Graphics wxStaticBoxSizer* s_round_gs_render( new wxStaticBoxSizer( wxVERTICAL, p_graphics, _("Render") ) ); @@ -356,6 +357,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxStaticBoxSizer* s_round_sys_lang( new wxStaticBoxSizer( wxVERTICAL, p_system, _("Language") ) ); wxComboBox* cbox_cpu_decoder = new wxComboBox(p_cpu, wxID_ANY); + wxComboBox* cbox_spu_decoder = new wxComboBox(p_cpu, wxID_ANY); wxComboBox* cbox_gs_render = new wxComboBox(p_graphics, wxID_ANY); wxComboBox* cbox_gs_resolution = new wxComboBox(p_graphics, wxID_ANY); wxComboBox* cbox_gs_aspect = new wxComboBox(p_graphics, wxID_ANY); @@ -381,6 +383,9 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_cpu_decoder->Append("Interpreter & DisAsm"); cbox_cpu_decoder->Append("Interpreter"); + cbox_spu_decoder->Append("Interpreter"); + cbox_spu_decoder->Append("Recompiler"); + for(int i=1; iAppend(wxString::Format("%dx%d", ResolutionTable[i].width.ToLE(), ResolutionTable[i].height.ToLE())); @@ -447,6 +452,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) chbox_hle_exitonstop->SetValue(Ini.HLEExitOnStop.GetValue()); cbox_cpu_decoder->SetSelection(Ini.CPUDecoderMode.GetValue() ? Ini.CPUDecoderMode.GetValue() - 1 : 0); + cbox_spu_decoder->SetSelection(Ini.SPUDecoderMode.GetValue() ? Ini.SPUDecoderMode.GetValue() - 1 : 0); cbox_gs_render->SetSelection(Ini.GSRenderMode.GetValue()); cbox_gs_resolution->SetSelection(ResolutionIdToNum(Ini.GSResolution.GetValue()) - 1); cbox_gs_aspect->SetSelection(Ini.GSAspectRatio.GetValue() - 1); @@ -465,6 +471,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_spu_decoder->Add(cbox_spu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_gs_render->Add(cbox_gs_render, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_gs_res->Add(cbox_gs_resolution, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -482,7 +489,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) // Core s_subpanel_cpu->Add(s_round_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); - s_subpanel_cpu->Add(chbox_cpu_ignore_rwerrors, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_cpu_decoder->Add(chbox_cpu_ignore_rwerrors, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_cpu->Add(s_round_spu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); // Graphics s_subpanel_graphics->Add(s_round_gs_render, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -532,6 +540,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) { Ini.CPUDecoderMode.SetValue(cbox_cpu_decoder->GetSelection() + 1); Ini.CPUIgnoreRWErrors.SetValue(chbox_cpu_ignore_rwerrors->GetValue()); + Ini.SPUDecoderMode.SetValue(cbox_spu_decoder->GetSelection() + 1); Ini.GSRenderMode.SetValue(cbox_gs_render->GetSelection()); Ini.GSResolution.SetValue(ResolutionNumToId(cbox_gs_resolution->GetSelection() + 1)); Ini.GSAspectRatio.SetValue(cbox_gs_aspect->GetSelection() + 1); diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index a83c26f7bd..893decb327 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -97,6 +97,7 @@ private: public: IniEntry CPUDecoderMode; + IniEntry SPUDecoderMode; IniEntry CPUIgnoreRWErrors; IniEntry GSRenderMode; IniEntry GSResolution; @@ -150,6 +151,7 @@ public: path = DefPath + "/" + "CPU"; CPUDecoderMode.Init("DecoderMode", path); CPUIgnoreRWErrors.Init("IgnoreRWErrors", path); + SPUDecoderMode.Init("SPUDecoderMode", path); path = DefPath + "/" + "GS"; GSRenderMode.Init("RenderMode", path); @@ -211,6 +213,7 @@ public: { CPUDecoderMode.Load(2); CPUIgnoreRWErrors.Load(false); + SPUDecoderMode.Load(1); GSRenderMode.Load(1); GSResolution.Load(4); GSAspectRatio.Load(2); @@ -260,6 +263,7 @@ public: { CPUDecoderMode.Save(); CPUIgnoreRWErrors.Save(); + SPUDecoderMode.Save(); GSRenderMode.Save(); GSResolution.Save(); GSAspectRatio.Save();