mirror of https://github.com/PCSX2/pcsx2.git
gsdump: implement basics of the packet browser
This commit is contained in:
parent
de38219927
commit
3beb47f8d9
|
@ -54,7 +54,7 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
|
||||||
, m_selected_dump(new wxString(""))
|
, m_selected_dump(new wxString(""))
|
||||||
, m_debug_mode(new wxCheckBox(this, wxID_ANY, _("Debug Mode")))
|
, m_debug_mode(new wxCheckBox(this, wxID_ANY, _("Debug Mode")))
|
||||||
, m_renderer_overrides(new wxRadioBox())
|
, m_renderer_overrides(new wxRadioBox())
|
||||||
, m_gif_list(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(250, 200), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS))
|
, m_gif_list(new wxTreeCtrl(this, ID_SEL_PACKET, wxDefaultPosition, wxSize(250, 200), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS))
|
||||||
, m_gif_packet(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(250, 200), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS))
|
, m_gif_packet(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(250, 200), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS))
|
||||||
{
|
{
|
||||||
const float scale = MSW_GetDPIScale();
|
const float scale = MSW_GetDPIScale();
|
||||||
|
@ -126,6 +126,7 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent)
|
||||||
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::StepPacket, this, ID_RUN_STEP);
|
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::StepPacket, this, ID_RUN_STEP);
|
||||||
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToCursor, this, ID_RUN_CURSOR);
|
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToCursor, this, ID_RUN_CURSOR);
|
||||||
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToVSync, this, ID_RUN_VSYNC);
|
Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToVSync, this, ID_RUN_VSYNC);
|
||||||
|
Bind(wxEVT_TREE_SEL_CHANGED, &Dialogs::GSDumpDialog::ParsePacket, this, ID_SEL_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialogs::GSDumpDialog::GetDumpsList()
|
void Dialogs::GSDumpDialog::GetDumpsList()
|
||||||
|
@ -185,7 +186,7 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
|
|
||||||
int ssi = ss;
|
int ssi = ss;
|
||||||
freezeData fd = {0, (s8*)state_data};
|
freezeData fd = {0, (s8*)state_data};
|
||||||
std::vector<GSData> dump;
|
m_dump_packets.clear();
|
||||||
|
|
||||||
while (dump_file.Tell() < dump_file.Length())
|
while (dump_file.Tell() < dump_file.Length())
|
||||||
{
|
{
|
||||||
|
@ -202,23 +203,23 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
char* transfer_data = (char*)malloc(size);
|
char* transfer_data = (char*)malloc(size);
|
||||||
dump_file.Read(transfer_data, size);
|
dump_file.Read(transfer_data, size);
|
||||||
GSData data = {id, transfer_data, size, id_transfer};
|
GSData data = {id, transfer_data, size, id_transfer};
|
||||||
dump.push_back(data);
|
m_dump_packets.push_back(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VSync:
|
case VSync:
|
||||||
{
|
{
|
||||||
u8 vsync = 0;
|
u8 vsync = 0;
|
||||||
dump_file.Read(&vsync, 1);
|
dump_file.Read(&vsync, 1);
|
||||||
GSData data = {id, (char*)&vsync, 1, Dummy};
|
GSData data = {id, (char*)vsync, 1, Dummy};
|
||||||
dump.push_back(data);
|
m_dump_packets.push_back(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ReadFIFO2:
|
case ReadFIFO2:
|
||||||
{
|
{
|
||||||
u32 fifo = 0;
|
u32 fifo = 0;
|
||||||
dump_file.Read(&fifo, 4);
|
dump_file.Read(&fifo, 4);
|
||||||
GSData data = {id, (char*)&fifo, 4, Dummy};
|
GSData data = {id, (char*)fifo, 4, Dummy};
|
||||||
dump.push_back(data);
|
m_dump_packets.push_back(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Registers:
|
case Registers:
|
||||||
|
@ -226,14 +227,14 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
char regs_tmp[8192];
|
char regs_tmp[8192];
|
||||||
dump_file.Read(®s, 8192);
|
dump_file.Read(®s, 8192);
|
||||||
GSData data = {id, regs_tmp, 8192, Dummy};
|
GSData data = {id, regs_tmp, 8192, Dummy};
|
||||||
dump.push_back(data);
|
m_dump_packets.push_back(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_debug_mode->GetValue())
|
if (m_debug_mode->GetValue())
|
||||||
GenPacketList(dump);
|
GenPacketList(m_dump_packets);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -268,7 +269,7 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
switch (m_button_events[0].index)
|
switch (m_button_events[0].index)
|
||||||
{
|
{
|
||||||
case Step:
|
case Step:
|
||||||
if (debug_idx >= dump.size())
|
if (debug_idx >= m_dump_packets.size())
|
||||||
debug_idx = 0;
|
debug_idx = 0;
|
||||||
RunTo = debug_idx;
|
RunTo = debug_idx;
|
||||||
break;
|
break;
|
||||||
|
@ -278,11 +279,11 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
debug_idx = 0;
|
debug_idx = 0;
|
||||||
break;
|
break;
|
||||||
case RunVSync:
|
case RunVSync:
|
||||||
if (debug_idx >= dump.size())
|
if (debug_idx >= m_dump_packets.size())
|
||||||
debug_idx = 1;
|
debug_idx = 1;
|
||||||
auto it = std::find_if(dump.begin() + debug_idx, dump.end(), [](const GSData& gs) { return gs.id == Registers; });
|
auto it = std::find_if(m_dump_packets.begin() + debug_idx, m_dump_packets.end(), [](const GSData& gs) { return gs.id == Registers; });
|
||||||
if (it != std::end(dump))
|
if (it != std::end(m_dump_packets))
|
||||||
RunTo = std::distance(dump.begin(), it);
|
RunTo = std::distance(m_dump_packets.begin(), it);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_button_events.erase(m_button_events.begin());
|
m_button_events.erase(m_button_events.begin());
|
||||||
|
@ -291,10 +292,10 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
while (debug_idx <= RunTo)
|
while (debug_idx <= RunTo)
|
||||||
{
|
{
|
||||||
ProcessDumpEvent(dump[debug_idx++], regs);
|
ProcessDumpEvent(m_dump_packets[debug_idx++], regs);
|
||||||
}
|
}
|
||||||
auto it = std::find_if(dump.begin() + debug_idx, dump.end(), [](const GSData& gs) { return gs.id == Registers; });
|
auto it = std::find_if(m_dump_packets.begin() + debug_idx, m_dump_packets.end(), [](const GSData& gs) { return gs.id == Registers; });
|
||||||
if (it != std::end(dump))
|
if (it != std::end(m_dump_packets))
|
||||||
ProcessDumpEvent(*it, regs);
|
ProcessDumpEvent(*it, regs);
|
||||||
|
|
||||||
debug_idx--;
|
debug_idx--;
|
||||||
|
@ -306,14 +307,14 @@ void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (i < dump.size())
|
while (i < m_dump_packets.size())
|
||||||
{
|
{
|
||||||
ProcessDumpEvent(dump[i++], regs);
|
ProcessDumpEvent(m_dump_packets[i++], regs);
|
||||||
|
|
||||||
if (dump[i].id == VSync)
|
if (m_dump_packets[i].id == VSync)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i >= dump.size())
|
if (i >= m_dump_packets.size())
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -403,7 +404,7 @@ void Dialogs::GSDumpDialog::GenPacketList(std::vector<GSData>& dump)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
m_gif_list->DeleteAllItems();
|
m_gif_list->DeleteAllItems();
|
||||||
wxTreeItemId mainrootId = m_gif_list->AddRoot("root");
|
wxTreeItemId mainrootId = m_gif_list->AddRoot("root");
|
||||||
wxTreeItemId rootId = m_gif_list->AppendItem(mainrootId, "VSync");
|
wxTreeItemId rootId = m_gif_list->AppendItem(mainrootId, "0 - VSync");
|
||||||
for (auto& element : dump)
|
for (auto& element : dump)
|
||||||
{
|
{
|
||||||
switch (element.id)
|
switch (element.id)
|
||||||
|
@ -469,4 +470,40 @@ void Dialogs::GSDumpDialog::GenPacketList(std::vector<GSData>& dump)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
m_gif_list->Delete(rootId);
|
m_gif_list->Delete(rootId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Dialogs::GSDumpDialog::GenPacketInfo(GSData& dump)
|
||||||
|
{
|
||||||
|
m_gif_packet->DeleteAllItems();
|
||||||
|
wxTreeItemId rootId = m_gif_packet->AddRoot("root");
|
||||||
|
switch (dump.id)
|
||||||
|
{
|
||||||
|
case VSync:
|
||||||
|
{
|
||||||
|
wxString s;
|
||||||
|
s.Printf("Field = %d", (u8)dump.data);
|
||||||
|
m_gif_packet->AppendItem(rootId, s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ReadFIFO2:
|
||||||
|
{
|
||||||
|
wxString s;
|
||||||
|
s.Printf("ReadFIFO2: Size = %d byte", dump.length);
|
||||||
|
m_gif_packet->AppendItem(rootId, s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Registers:
|
||||||
|
{
|
||||||
|
m_gif_packet->AppendItem(rootId, "Registers");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dialogs::GSDumpDialog::ParsePacket(wxTreeEvent& event)
|
||||||
|
{
|
||||||
|
//m_gif_list.GetL event.GetItem();
|
||||||
|
int id = wxAtoi(m_gif_list->GetItemText(event.GetItem()).BeforeFirst('-'));
|
||||||
|
GenPacketInfo(m_dump_packets[id]);
|
||||||
}
|
}
|
|
@ -100,6 +100,7 @@ namespace Dialogs
|
||||||
void StepPacket(wxCommandEvent& event);
|
void StepPacket(wxCommandEvent& event);
|
||||||
void ToCursor(wxCommandEvent& event);
|
void ToCursor(wxCommandEvent& event);
|
||||||
void ToVSync(wxCommandEvent& event);
|
void ToVSync(wxCommandEvent& event);
|
||||||
|
void ParsePacket(wxTreeEvent& event);
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ID_DUMP_LIST,
|
ID_DUMP_LIST,
|
||||||
|
@ -107,7 +108,8 @@ namespace Dialogs
|
||||||
ID_RUN_START,
|
ID_RUN_START,
|
||||||
ID_RUN_STEP,
|
ID_RUN_STEP,
|
||||||
ID_RUN_CURSOR,
|
ID_RUN_CURSOR,
|
||||||
ID_RUN_VSYNC
|
ID_RUN_VSYNC,
|
||||||
|
ID_SEL_PACKET
|
||||||
};
|
};
|
||||||
enum GSType : u8
|
enum GSType : u8
|
||||||
{
|
{
|
||||||
|
@ -143,8 +145,10 @@ namespace Dialogs
|
||||||
int index;
|
int index;
|
||||||
};
|
};
|
||||||
std::vector<GSEvent> m_button_events;
|
std::vector<GSEvent> m_button_events;
|
||||||
|
std::vector<GSData> m_dump_packets;
|
||||||
void ProcessDumpEvent(GSData event, char* regs);
|
void ProcessDumpEvent(GSData event, char* regs);
|
||||||
void GenPacketList(std::vector<GSData>& dump);
|
void GenPacketList(std::vector<GSData>& dump);
|
||||||
|
void GenPacketInfo(GSData& dump);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue