gsdump: enum to string mapping thanks to preprocessor magic

This commit is contained in:
Gauvain 'GovanifY' Roussel-Tarbouriech 2021-03-05 21:29:22 +01:00 committed by Kojin
parent f9ee7e01bf
commit 82c99695d7
2 changed files with 102 additions and 132 deletions

View File

@ -40,6 +40,7 @@
#include <wx/dir.h> #include <wx/dir.h>
#include <wx/image.h> #include <wx/image.h>
#include <wx/wfstream.h> #include <wx/wfstream.h>
#include <functional>
using namespace pxSizerFlags; using namespace pxSizerFlags;
@ -406,32 +407,17 @@ void Dialogs::GSDumpDialog::GenPacketList(std::vector<GSData>& dump)
wxTreeItemId mainrootId = m_gif_list->AddRoot("root"); wxTreeItemId mainrootId = m_gif_list->AddRoot("root");
wxTreeItemId rootId = m_gif_list->AppendItem(mainrootId, "0 - VSync"); wxTreeItemId rootId = m_gif_list->AppendItem(mainrootId, "0 - VSync");
for (auto& element : dump) for (auto& element : dump)
{
switch (element.id)
{
case Transfer:
{ {
wxString s; wxString s;
s.Printf("%d - Transfer - %s - %d byte", i, GSTransferPathNames[element.path], element.length); ([&] { return element.id == Transfer; })() ? (s.Printf("%d - %s - %s - %d byte", i, GSTypeNames[element.id], GSTransferPathNames[element.path], element.length)) :
m_gif_list->AppendItem(rootId, s); s.Printf("%d - %s - %d byte", i, GSTypeNames[element.id], element.length);
break; if (element.id == VSync)
}
case VSync:
{ {
wxString s;
s.Printf("%d - VSync - %d byte", i, element.length);
m_gif_list->SetItemText(rootId, s); m_gif_list->SetItemText(rootId, s);
rootId = m_gif_list->AppendItem(mainrootId, "VSync"); rootId = m_gif_list->AppendItem(mainrootId, "VSync");
break;
} }
default: else
{
wxString s;
s.Printf("%d - %s - %d byte", i, GSTypeNames[element.id], element.length);
m_gif_list->AppendItem(rootId, s); m_gif_list->AppendItem(rootId, s);
break;
}
}
i++; i++;
} }
m_gif_list->Delete(rootId); m_gif_list->Delete(rootId);
@ -455,8 +441,7 @@ void Dialogs::GSDumpDialog::GenPacketInfo(GSData& dump)
u8 nloop = tag & ((u64)(1 << 15) - 1); u8 nloop = tag & ((u64)(1 << 15) - 1);
u8 eop = (tag >> 15) & 1; u8 eop = (tag >> 15) & 1;
u8 pre = (tag >> 46) & 1; u8 pre = (tag >> 46) & 1;
u8 prim = (tag >> 47) & ((u64)(1 << 11) - 1); u32 prim = (tag >> 47) & ((u64)(1 << 11) - 1);
//t.prim = GIFPrim.ExtractGIFPrim((uint)GetBit(t.TAG, 47, 11));
u8 flg = ((tag >> 58) & 3); u8 flg = ((tag >> 58) & 3);
u8 nreg = (tag >> 60) & ((u64)(1 << 4) - 1); u8 nreg = (tag >> 60) & ((u64)(1 << 4) - 1);
if (nreg == 0) if (nreg == 0)
@ -492,19 +477,24 @@ void Dialogs::GSDumpDialog::GenPacketInfo(GSData& dump)
} }
} }
prim_infos[0].Printf("Primitive Type = %s", GsPrimNames[(tag & ((u64)(1 << 3) - 1))]); prim_infos[0].Printf("Primitive Type = %s", GsPrimNames[(prim & ((u64)(1 << 3) - 1))]);
prim_infos[1].Printf("IIP = %s", GsIIPNames[((tag >> 3) & 1)]); prim_infos[1].Printf("IIP = %s", GsIIPNames[((prim >> 3) & 1)]);
prim_infos[2].Printf("TME = %s", (bool)((tag >> 4) & 1) ? "True" : "False"); prim_infos[2].Printf("TME = %s", (bool)((prim >> 4) & 1) ? "True" : "False");
prim_infos[3].Printf("FGE = %s", (bool)((tag >> 5) & 1) ? "True" : "False"); prim_infos[3].Printf("FGE = %s", (bool)((prim >> 5) & 1) ? "True" : "False");
prim_infos[4].Printf("FGE = %s", (bool)((tag >> 6) & 1) ? "True" : "False"); prim_infos[4].Printf("FGE = %s", (bool)((prim >> 6) & 1) ? "True" : "False");
prim_infos[5].Printf("AA1 = %s", (bool)((tag >> 7) & 1) ? "True" : "False"); prim_infos[5].Printf("AA1 = %s", (bool)((prim >> 7) & 1) ? "True" : "False");
prim_infos[6].Printf("FST = %s", GsFSTNames[((tag >> 3) & 1)]); prim_infos[6].Printf("FST = %s", GsFSTNames[((prim >> 3) & 1)]);
prim_infos[7].Printf("CTXT = %s", GsCTXTNames[((tag >> 9) & 1)]); prim_infos[7].Printf("CTXT = %s", GsCTXTNames[((prim >> 9) & 1)]);
prim_infos[8].Printf("FIX = %s", GsFIXNames[((tag >> 10) & 1)]); prim_infos[8].Printf("FIX = %s", GsFIXNames[((prim >> 10) & 1)]);
for (auto& el : prim_infos) for (auto& el : prim_infos)
m_gif_packet->AppendItem(primId, el); m_gif_packet->AppendItem(primId, el);
std::vector<u8> arr_regs;
for (int i = 0; i < nreg; i++)
arr_regs.push_back((regs >> (i*4)) & ((u64)(1 << 4) - 1));
//m_gif_packet->AppendItem(trootId, s); //m_gif_packet->AppendItem(trootId, s);
break; break;
} }
@ -532,7 +522,6 @@ void Dialogs::GSDumpDialog::GenPacketInfo(GSData& dump)
void Dialogs::GSDumpDialog::ParsePacket(wxTreeEvent& event) void Dialogs::GSDumpDialog::ParsePacket(wxTreeEvent& event)
{ {
//m_gif_list.GetL event.GetItem();
int id = wxAtoi(m_gif_list->GetItemText(event.GetItem()).BeforeFirst('-')); int id = wxAtoi(m_gif_list->GetItemText(event.GetItem()).BeforeFirst('-'));
GenPacketInfo(m_dump_packets[id]); GenPacketInfo(m_dump_packets[id]);
} }

View File

@ -22,6 +22,68 @@
#include <wx/wizard.h> #include <wx/wizard.h>
#include <wx/treectrl.h> #include <wx/treectrl.h>
#define GSDUMP_GIFREG \
X(PRIM,0x00) \
X(RGBAQ,0x01) \
X(ST,0x02) \
X(UV,0x03) \
X(XYZF2,0x04) \
X(XYZ2,0x05) \
X(TEX0_1,0x06) \
X(TEX0_2,0x07) \
X(CLAMP_1,0x08) \
X(CLAMP_2,0x09) \
X(FOG,0x0a) \
X(XYZF3,0x0c) \
X(XYZ3,0x0d) \
X(AD,0x0e) \
X(NOP,0x0f) \
X(TEX1_1,0x14) \
X(TEX1_2,0x15) \
X(TEX2_1,0x16) \
X(TEX2_2,0x17) \
X(XYOFFSET_1,0x18) \
X(XYOFFSET_2,0x19) \
X(PRMODECONT,0x1a) \
X(PRMODE,0x1b) \
X(TEXCLUT,0x1c) \
X(SCANMSK,0x22) \
X(MIPTBP1_1,0x34) \
X(MIPTBP1_2,0x35) \
X(MIPTBP2_1,0x36) \
X(MIPTBP2_2,0x37) \
X(TEXA,0x3b) \
X(FOGCOL,0x3d) \
X(TEXFLUSH,0x3f) \
X(SCISSOR_1,0x40) \
X(SCISSOR_2,0x41) \
X(ALPHA_1,0x42) \
X(ALPHA_2,0x43) \
X(DIMX,0x44) \
X(DTHE,0x45) \
X(COLCLAMP,0x46) \
X(TEST_1,0x47) \
X(TEST_2,0x48) \
X(PABE,0x49) \
X(FBA_1,0x4a) \
X(FBA_2,0x4b) \
X(FRAME_1,0x4c) \
X(FRAME_2,0x4d) \
X(ZBUF_1,0x4e) \
X(ZBUF_2,0x4f) \
X(BITBLTBUF,0x50) \
X(TRXPOS,0x51) \
X(TRXREG,0x52) \
X(TRXDIR,0x53) \
X(HWREG,0x54) \
X(SIGNAL,0x60) \
X(FINISH,0x61) \
X(LABEL,0x62)
#define X(name, value) name = value,
#define GSDUMP_GIFREG_NAME GIFReg
#define GSDUMP_GIFREG_TYPE u8
class FirstTimeWizard : public wxWizard class FirstTimeWizard : public wxWizard
{ {
@ -184,107 +246,26 @@ namespace Dialogs
"Unfixed", "Unfixed",
"Fixed" "Fixed"
}; };
static constexpr const char* GIFRegDescriptorNames[] = {
"PRIM", // the actual type is defined above thanks to preprocessing magic
"RGBAQ", enum GSDUMP_GIFREG_NAME : GSDUMP_GIFREG_TYPE
"ST", {
"UV", GSDUMP_GIFREG
"XYZF2",
"XYZ2",
"TEX0_1",
"TEX0_2",
"CLAMP_1",
"CLAMP_2",
"FOG",
"",
"XYZF3",
"XYZ3",
"AD",
"NOP",
"",
"",
"",
"",
"TEX1_1",
"TEX1_2",
"TEX2_1",
"TEX2_2",
"XYOFFSET_1",
"XYOFFSET_2",
"PRMODECONT",
"PRMODE",
"TEXCLUT",
"",
"",
"",
"",
"",
"SCANMSK",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"MIPTBP1_1",
"MIPTBP1_2",
"MIPTBP2_1",
"MIPTBP2_2",
"",
"",
"",
"TEXA",
"",
"FOGCOL",
"",
"TEXFLUSH",
"SCISSOR_1",
"SCISSOR_2",
"ALPHA_1",
"ALPHA_2",
"DIMX",
"DTHE",
"COLCLAMP",
"TEST_1",
"TEST_2",
"PABE",
"FBA_1",
"FBA_2",
"FRAME_1",
"FRAME_2",
"ZBUF_1",
"ZBUF_2",
"BITBLTBUF",
"TRXPOS",
"TRXREG",
"TRXDIR",
"HWREG",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"SIGNAL",
"FINISH",
"LABEL",
}; };
#undef X
constexpr auto GIFRegName(GSDUMP_GIFREG_NAME e) noexcept
{
#define X(name, value) \
case (GSDUMP_GIFREG_NAME::name): \
return #name;
switch (e)
{
GSDUMP_GIFREG
}
#undef X
return "UNKNOWN";
}
struct GSEvent struct GSEvent
{ {
ButtonState btn; ButtonState btn;