From 969cf67ba8b8b114b613f763a986e45b829f6733 Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Sun, 21 Dec 2014 22:42:15 +0200 Subject: [PATCH] Implemented frame limiter Some errors in unpkg replaced with warnings --- rpcs3/Crypto/unpkg.cpp | 8 ++--- rpcs3/Emu/RSX/RSXThread.cpp | 20 +++++++++++ rpcs3/Emu/RSX/RSXThread.h | 3 ++ rpcs3/Gui/MainFrame.cpp | 9 +++++ rpcs3/Ini.h | 4 +++ rpcs3/emucore.vcxproj.filters | 66 +++++++++++++++++------------------ rpcs3/rpcs3.vcxproj | 3 ++ rpcs3/rpcs3.vcxproj.filters | 3 ++ 8 files changed, 79 insertions(+), 37 deletions(-) diff --git a/rpcs3/Crypto/unpkg.cpp b/rpcs3/Crypto/unpkg.cpp index 39f4bf99a8..5d7846046f 100644 --- a/rpcs3/Crypto/unpkg.cpp +++ b/rpcs3/Crypto/unpkg.cpp @@ -43,13 +43,13 @@ bool CheckHeader(rFile& pkg_f, PKGHeader* m_header) } if (m_header->pkg_size != pkg_f.Length()) { - LOG_ERROR(LOADER, "PKG: File size mismatch."); - return false; + LOG_WARNING(LOADER, "PKG: File size mismatch."); + //return false; } if (m_header->data_size + m_header->data_offset + 0x60 != pkg_f.Length()) { - LOG_ERROR(LOADER, "PKG: Data size mismatch."); - return false; + LOG_WARNING(LOADER, "PKG: Data size mismatch."); + //return false; } return true; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index e3b1281fd6..328b7a7b73 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -335,6 +335,26 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const }); } + auto sync = [&]() + { + double limit; + switch (Ini.GSFrameLimit.GetValue()) + { + case 1: limit = 50.0; break; + case 2: limit = 59.94; break; + case 3: limit = m_fps_limit; break; //TODO + + case 0: + default: + return; + } + + std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - m_timer_sync.GetElapsedTimeInMilliSec()))); + m_timer_sync.Start(); + }; + + sync(); + //Emu.Pause(); } break; diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index e93af15a85..0f132e8c11 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -7,6 +7,7 @@ #include #include "Utilities/SSemaphore.h" #include "Utilities/Thread.h" +#include "Utilities/Timer.h" enum Method { @@ -101,6 +102,8 @@ public: protected: std::stack m_call_stack; CellGcmControl* m_ctrl; + Timer m_timer_sync; + double m_fps_limit = 59.94; public: GcmTileInfo m_tiles[m_tiles_count]; diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index b64f1aad56..6a9ff7013c 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -378,6 +378,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxStaticBoxSizer* s_round_gs_render = new wxStaticBoxSizer(wxVERTICAL, p_graphics, _("Render")); wxStaticBoxSizer* s_round_gs_res = new wxStaticBoxSizer(wxVERTICAL, p_graphics, _("Default resolution")); wxStaticBoxSizer* s_round_gs_aspect = new wxStaticBoxSizer(wxVERTICAL, p_graphics, _("Default aspect ratio")); + wxStaticBoxSizer* s_round_gs_frame_limit = new wxStaticBoxSizer(wxVERTICAL, p_graphics, _("Frame limit")); // Input / Output wxStaticBoxSizer* s_round_io_pad_handler = new wxStaticBoxSizer(wxVERTICAL, p_io, _("Pad Handler")); @@ -402,6 +403,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) 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); + wxComboBox* cbox_gs_frame_limit = new wxComboBox(p_graphics, wxID_ANY); wxComboBox* cbox_pad_handler = new wxComboBox(p_io, wxID_ANY); wxComboBox* cbox_keyboard_handler = new wxComboBox(p_io, wxID_ANY); wxComboBox* cbox_mouse_handler = new wxComboBox(p_io, wxID_ANY); @@ -448,6 +450,9 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_gs_aspect->Append("4:3"); cbox_gs_aspect->Append("16:9"); + for (auto item : { "Off", "50", "59.94", "Auto" }) + cbox_gs_frame_limit->Append(item); + cbox_pad_handler->Append("Null"); cbox_pad_handler->Append("Windows"); #if defined (_WIN32) @@ -523,6 +528,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_gs_render ->SetSelection(Ini.GSRenderMode.GetValue()); cbox_gs_resolution ->SetSelection(ResolutionIdToNum(Ini.GSResolution.GetValue()) - 1); cbox_gs_aspect ->SetSelection(Ini.GSAspectRatio.GetValue() - 1); + cbox_gs_frame_limit ->SetSelection(Ini.GSFrameLimit.GetValue()); cbox_pad_handler ->SetSelection(Ini.PadHandlerMode.GetValue()); cbox_keyboard_handler->SetSelection(Ini.KeyboardHandlerMode.GetValue()); cbox_mouse_handler ->SetSelection(Ini.MouseHandlerMode.GetValue()); @@ -545,6 +551,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) 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()); s_round_gs_aspect->Add(cbox_gs_aspect, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_gs_frame_limit->Add(cbox_gs_frame_limit, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_io_pad_handler->Add(cbox_pad_handler, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_io_keyboard_handler->Add(cbox_keyboard_handler, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -567,6 +574,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel_graphics->Add(s_round_gs_render, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(s_round_gs_res, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(s_round_gs_aspect, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_graphics->Add(s_round_gs_frame_limit, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(chbox_gs_log_prog, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(chbox_gs_dump_depth, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(chbox_gs_dump_color, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -628,6 +636,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.GSRenderMode.SetValue(cbox_gs_render->GetSelection()); Ini.GSResolution.SetValue(ResolutionNumToId(cbox_gs_resolution->GetSelection() + 1)); Ini.GSAspectRatio.SetValue(cbox_gs_aspect->GetSelection() + 1); + Ini.GSFrameLimit.SetValue(cbox_gs_frame_limit->GetSelection()); Ini.GSLogPrograms.SetValue(chbox_gs_log_prog->GetValue()); Ini.GSDumpDepthBuffer.SetValue(chbox_gs_dump_depth->GetValue()); Ini.GSDumpColorBuffers.SetValue(chbox_gs_dump_color->GetValue()); diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index 732d2b43d6..6b3b9b1e02 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -104,6 +104,7 @@ public: IniEntry GSRenderMode; IniEntry GSResolution; IniEntry GSAspectRatio; + IniEntry GSFrameLimit; IniEntry GSLogPrograms; IniEntry GSDumpColorBuffers; IniEntry GSDumpDepthBuffer; @@ -180,6 +181,7 @@ public: GSRenderMode.Init("GS_RenderMode", path); GSResolution.Init("GS_Resolution", path); GSAspectRatio.Init("GS_AspectRatio", path); + GSFrameLimit.Init("GS_FrameLimit", path); GSLogPrograms.Init("GS_LogPrograms", path); GSDumpColorBuffers.Init("GS_DumpColorBuffers", path); GSDumpDepthBuffer.Init("GS_DumpDepthBuffer", path); @@ -252,6 +254,7 @@ public: GSRenderMode.Load(1); GSResolution.Load(4); GSAspectRatio.Load(2); + GSFrameLimit.Load(0); GSLogPrograms.Load(false); GSDumpColorBuffers.Load(false); GSDumpDepthBuffer.Load(false); @@ -325,6 +328,7 @@ public: GSRenderMode.Save(); GSResolution.Save(); GSAspectRatio.Save(); + GSFrameLimit.Save(); GSLogPrograms.Save(); GSDumpColorBuffers.Save(); GSDumpDepthBuffer.Save(); diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index d32c333bf4..9ca5b30f98 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -69,16 +69,16 @@ {1d9e6fc4-9a79-4329-a8b5-081e24822aaa} - + {6674e2ab-90cd-47de-a852-d21643ab18c2} - + {fadb4b36-57af-4583-891d-d22ff369e266} - + {4adca4fa-b90f-4662-9eb0-1d29cf3cd2eb} - + {6f1da5b2-52c5-416b-9b5c-b9897bc1b300} @@ -558,37 +558,37 @@ Emu\SysCalls\Modules - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX Emu\SysCalls\lv2 @@ -1127,58 +1127,58 @@ Emu\SysCalls - GPU\RSX\Null + Emu\GPU\RSX\Null - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX\GL + Emu\GPU\RSX\GL - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX - GPU\RSX + Emu\GPU\RSX Emu\SysCalls\lv2 diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 946b6cb66e..76bec7e9fb 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -231,6 +231,9 @@ {c4a10229-4712-4bd2-b63e-50d93c67a038} + + + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 5fce1aa362..f840ef10d7 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -192,4 +192,7 @@ Gui + + + \ No newline at end of file