GSDumpGUI: Add framelimiter

This commit is contained in:
TellowKrinkle 2021-10-21 23:16:09 -05:00 committed by lightningterror
parent 5ec5fb17ca
commit 8d4ffc0713
2 changed files with 50 additions and 4 deletions

View File

@ -39,6 +39,7 @@
#include <wx/button.h> #include <wx/button.h>
#include <wx/treectrl.h> #include <wx/treectrl.h>
#include <wx/checkbox.h> #include <wx/checkbox.h>
#include <wx/spinctrl.h>
#include <wx/dir.h> #include <wx/dir.h>
#include <wx/image.h> #include <wx/image.h>
#include <wx/wfstream.h> #include <wx/wfstream.h>
@ -184,6 +185,7 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
, m_preview_image(new wxStaticBitmap(this, wxID_ANY, wxBitmap(EmbeddedImage<res_NoIcon>().Get()), wxDefaultPosition, wxSize(400,250))) , m_preview_image(new wxStaticBitmap(this, wxID_ANY, wxBitmap(EmbeddedImage<res_NoIcon>().Get()), wxDefaultPosition, wxSize(400,250)))
, m_debug_mode(new wxCheckBox(this, ID_DEBUG_MODE, _("Debug Mode"))) , m_debug_mode(new wxCheckBox(this, ID_DEBUG_MODE, _("Debug Mode")))
, m_renderer_overrides(new wxRadioBox()) , m_renderer_overrides(new wxRadioBox())
, m_framerate_selector(new wxSpinCtrl(this, ID_FRAMERATE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 999, 0))
, m_gif_list(new wxTreeCtrl(this, ID_SEL_PACKET, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT)) , m_gif_list(new wxTreeCtrl(this, ID_SEL_PACKET, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT))
, m_gif_packet(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT)) , m_gif_packet(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT))
, m_start(new wxButton(this, ID_RUN_START, _("Go to Start"), wxDefaultPosition, wxSize(150,50))) , m_start(new wxButton(this, ID_RUN_START, _("Go to Start"), wxDefaultPosition, wxSize(150,50)))
@ -201,6 +203,9 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
wxBoxSizer* dbg_actions = new wxBoxSizer(wxVERTICAL); wxBoxSizer* dbg_actions = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* gif = new wxBoxSizer(wxVERTICAL); wxBoxSizer* gif = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* dumps_list = new wxBoxSizer(wxVERTICAL); wxBoxSizer* dumps_list = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* framerate_sel = new wxBoxSizer(wxHORIZONTAL);
framerate_sel->Add(new wxStaticText(this, wxID_ANY, _("Framerate:")), wxSizerFlags().Centre());
framerate_sel->Add(m_framerate_selector, wxSizerFlags(1).Expand());
m_run->SetDefault(); m_run->SetDefault();
wxArrayString rdoverrides; wxArrayString rdoverrides;
@ -228,6 +233,7 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
dumps_list->Add(new wxStaticText(this, wxID_ANY, _("GS Dumps List")), StdExpand()); dumps_list->Add(new wxStaticText(this, wxID_ANY, _("GS Dumps List")), StdExpand());
dumps_list->Add(m_dump_list, StdExpand()); dumps_list->Add(m_dump_list, StdExpand());
dump_info->Add(m_renderer_overrides, StdExpand()); dump_info->Add(m_renderer_overrides, StdExpand());
dump_info->Add(framerate_sel, StdExpand());
dump_info->Add(m_settings, StdExpand()); dump_info->Add(m_settings, StdExpand());
dump_info->Add(m_run, StdExpand()); dump_info->Add(m_run, StdExpand());
dump_preview->Add(new wxStaticText(this, wxID_ANY, _("Preview")), StdExpand()); dump_preview->Add(new wxStaticText(this, wxID_ANY, _("Preview")), StdExpand());
@ -269,7 +275,10 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::OpenSettings, this, ID_SETTINGS); Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::OpenSettings, this, ID_SETTINGS);
Bind(wxEVT_TREE_SEL_CHANGED, &Dialogs::GSDumpDialog::ParsePacket, this, ID_SEL_PACKET); Bind(wxEVT_TREE_SEL_CHANGED, &Dialogs::GSDumpDialog::ParsePacket, this, ID_SEL_PACKET);
Bind(wxEVT_CHECKBOX, &Dialogs::GSDumpDialog::CheckDebug, this, ID_DEBUG_MODE); Bind(wxEVT_CHECKBOX, &Dialogs::GSDumpDialog::CheckDebug, this, ID_DEBUG_MODE);
Bind(wxEVT_SPINCTRL, &Dialogs::GSDumpDialog::UpdateFramerate, this, ID_FRAMERATE);
Bind(EVT_CLOSE_DUMP, &Dialogs::GSDumpDialog::CloseDump, this); Bind(EVT_CLOSE_DUMP, &Dialogs::GSDumpDialog::CloseDump, this);
UpdateFramerate(m_framerate_selector->GetValue());
} }
void Dialogs::GSDumpDialog::GetDumpsList() void Dialogs::GSDumpDialog::GetDumpsList()
@ -299,6 +308,19 @@ void Dialogs::GSDumpDialog::GetDumpsList()
m_dump_list->InsertItem(i, dumps[i]); m_dump_list->InsertItem(i, dumps[i]);
} }
void Dialogs::GSDumpDialog::UpdateFramerate(int val)
{
if (val)
m_thread->m_frame_ticks = (GetTickFrequency() + (val/2)) / val;
else
m_thread->m_frame_ticks = 0;
}
void Dialogs::GSDumpDialog::UpdateFramerate(wxCommandEvent& evt)
{
UpdateFramerate(evt.GetInt());
}
void Dialogs::GSDumpDialog::SelectedDump(wxListEvent& evt) void Dialogs::GSDumpDialog::SelectedDump(wxListEvent& evt)
{ {
wxString filename_preview = g_Conf->Folders.Snapshots.ToAscii() + ("/" + evt.GetText()) + ".png"; wxString filename_preview = g_Conf->Folders.Snapshots.ToAscii() + ("/" + evt.GetText()) + ".png";
@ -1021,9 +1043,27 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread()
} }
else if (m_root_window->m_dump_packets.size()) else if (m_root_window->m_dump_packets.size())
{ {
do while (i < m_root_window->m_dump_packets.size())
m_root_window->ProcessDumpEvent(m_root_window->m_dump_packets[i++], regs); {
while (i < m_root_window->m_dump_packets.size() && m_root_window->m_dump_packets[i].id != GSType::VSync); GSData& packet = m_root_window->m_dump_packets[i++];
m_root_window->ProcessDumpEvent(packet, regs);
if (packet.id == GSType::VSync)
{
if (m_frame_ticks)
{
// Frame limiter
u64 now = GetCPUTicks();
s64 ms = GetTickFrequency() / 1000;
s64 sleep = m_next_frame_time - now - ms;
if (sleep > ms)
Threading::Sleep(sleep / ms);
while ((now = GetCPUTicks()) < m_next_frame_time)
ShortSpin();
m_next_frame_time = std::max(now, m_next_frame_time + m_frame_ticks);
}
break;
}
}
if (i >= m_root_window->m_dump_packets.size()) if (i >= m_root_window->m_dump_packets.size())
i = 0; i = 0;

View File

@ -108,6 +108,7 @@ namespace Dialogs
wxString m_selected_dump; wxString m_selected_dump;
wxCheckBox* m_debug_mode; wxCheckBox* m_debug_mode;
wxRadioBox* m_renderer_overrides; wxRadioBox* m_renderer_overrides;
wxSpinCtrl* m_framerate_selector;
wxTreeCtrl* m_gif_list; wxTreeCtrl* m_gif_list;
wxTreeCtrl* m_gif_packet; wxTreeCtrl* m_gif_packet;
wxButton* m_start; wxButton* m_start;
@ -120,6 +121,8 @@ namespace Dialogs
wxFileSystemWatcher m_fs_watcher; wxFileSystemWatcher m_fs_watcher;
void GetDumpsList(); void GetDumpsList();
void UpdateFramerate(int val);
void UpdateFramerate(wxCommandEvent& evt);
void SelectedDump(wxListEvent& evt); void SelectedDump(wxListEvent& evt);
void RunDump(wxCommandEvent& event); void RunDump(wxCommandEvent& event);
void ToStart(wxCommandEvent& event); void ToStart(wxCommandEvent& event);
@ -140,7 +143,8 @@ namespace Dialogs
ID_RUN_VSYNC, ID_RUN_VSYNC,
ID_SEL_PACKET, ID_SEL_PACKET,
ID_DEBUG_MODE, ID_DEBUG_MODE,
ID_SETTINGS ID_SETTINGS,
ID_FRAMERATE,
}; };
// clang-format off // clang-format off
@ -275,6 +279,8 @@ namespace Dialogs
public: public:
int m_renderer = 0; int m_renderer = 0;
u64 m_frame_ticks = 0;
u64 m_next_frame_time = 0;
bool m_debug = false; bool m_debug = false;
size_t m_debug_index; size_t m_debug_index;
std::unique_ptr<GSDumpFile> m_dump_file; std::unique_ptr<GSDumpFile> m_dump_file;