GSDumpReplayer: Support no-looping/frame number queries

This commit is contained in:
Connor McLaughlin 2022-06-19 15:44:33 +10:00 committed by refractionpcsx2
parent e7c4894833
commit 5ffcbad18b
2 changed files with 28 additions and 0 deletions

View File

@ -54,6 +54,7 @@ static void GSDumpReplayerCpuClear(u32 addr, u32 size);
static std::unique_ptr<GSDumpFile> s_dump_file; static std::unique_ptr<GSDumpFile> s_dump_file;
static u32 s_current_packet = 0; static u32 s_current_packet = 0;
static u32 s_dump_frame_number = 0; static u32 s_dump_frame_number = 0;
static s32 s_dump_loop_count = 0;
static bool s_dump_running = false; static bool s_dump_running = false;
static bool s_needs_state_loaded = false; static bool s_needs_state_loaded = false;
static u64 s_frame_ticks = 0; static u64 s_frame_ticks = 0;
@ -78,6 +79,11 @@ bool GSDumpReplayer::IsReplayingDump()
return static_cast<bool>(s_dump_file); return static_cast<bool>(s_dump_file);
} }
void GSDumpReplayer::SetLoopCount(s32 loop_count)
{
s_dump_loop_count = loop_count - 1;
}
bool GSDumpReplayer::Initialize(const char* filename) bool GSDumpReplayer::Initialize(const char* filename)
{ {
Common::Timer timer; Common::Timer timer;
@ -99,6 +105,9 @@ bool GSDumpReplayer::Initialize(const char* filename)
CpuVU0 = &gsDumpVU0; CpuVU0 = &gsDumpVU0;
CpuVU1 = &gsDumpVU1; CpuVU1 = &gsDumpVU1;
// loop infinitely by default
s_dump_loop_count = -1;
return true; return true;
} }
@ -144,6 +153,11 @@ u32 GSDumpReplayer::GetDumpCRC()
return s_dump_file->GetCRC(); return s_dump_file->GetCRC();
} }
u32 GSDumpReplayer::GetFrameNumber()
{
return s_dump_frame_number;
}
void GSDumpReplayerCpuReserve() void GSDumpReplayerCpuReserve()
{ {
} }
@ -226,7 +240,16 @@ void GSDumpReplayerCpuStep()
const GSDumpFile::GSData& packet = s_dump_file->GetPackets()[s_current_packet]; const GSDumpFile::GSData& packet = s_dump_file->GetPackets()[s_current_packet];
s_current_packet = (s_current_packet + 1) % static_cast<u32>(s_dump_file->GetPackets().size()); s_current_packet = (s_current_packet + 1) % static_cast<u32>(s_dump_file->GetPackets().size());
if (s_current_packet == 0) if (s_current_packet == 0)
{
s_dump_frame_number = 0; s_dump_frame_number = 0;
if (s_dump_loop_count > 0)
s_dump_loop_count--;
else if (s_dump_loop_count == 0)
{
Host::RequestVMShutdown(false, false, false);
s_dump_running = false;
}
}
switch (packet.id) switch (packet.id)
{ {

View File

@ -23,6 +23,9 @@ namespace GSDumpReplayer
{ {
bool IsReplayingDump(); bool IsReplayingDump();
/// If set, playback will repeat once it reaches the last frame.
void SetLoopCount(s32 loop_count = 0);
bool Initialize(const char* filename); bool Initialize(const char* filename);
void Reset(); void Reset();
void Shutdown(); void Shutdown();
@ -30,5 +33,7 @@ void Shutdown();
std::string GetDumpSerial(); std::string GetDumpSerial();
u32 GetDumpCRC(); u32 GetDumpCRC();
u32 GetFrameNumber();
void RenderUI(); void RenderUI();
} }