From bf3e1b4ee17560e60e8ffe7fc5a0c86c34b1c09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Dec 2024 09:59:08 +0100 Subject: [PATCH 1/5] Add Debugger log category --- Common/Log.h | 1 + Common/Log/LogManager.cpp | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Common/Log.h b/Common/Log.h index 98eec178c099..d0199dc02b39 100644 --- a/Common/Log.h +++ b/Common/Log.h @@ -48,6 +48,7 @@ enum class Log { HTTP, Printf, TexReplacement, + Debugger, sceAudio, sceCtrl, diff --git a/Common/Log/LogManager.cpp b/Common/Log/LogManager.cpp index 95183389f8dc..159e371ba3e8 100644 --- a/Common/Log/LogManager.cpp +++ b/Common/Log/LogManager.cpp @@ -89,21 +89,21 @@ static const char * const g_logTypeNames[] = { "HTTP", "PRINTF", "TEXREPLACE", - - "SCEAUDIO", - "SCECTRL", - "SCEDISP", - "SCEFONT", - "SCEGE", - "SCEINTC", - "SCEIO", - "SCEKERNEL", - "SCEMODULE", - "SCENET", - "SCERTC", - "SCESAS", - "SCEUTIL", - "SCEMISC", + "DEBUGGER", + "SCEAUDIO", + "SCECTRL", + "SCEDISP", + "SCEFONT", + "SCEGE", + "SCEINTC", + "SCEIO", + "SCEKERNEL", + "SCEMODULE", + "SCENET", + "SCERTC", + "SCESAS", + "SCEUTIL", + "SCEMISC", }; void LogManager::Init(bool *enabledSetting, bool headless) { From e3aaf93e28aea767e0a88108caf32b0057296cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Dec 2024 10:34:26 +0100 Subject: [PATCH 2/5] Add a new log category --- Common/Log.h | 2 +- GPU/Debugger/Debugger.cpp | 10 +++++----- GPU/Debugger/Playback.cpp | 23 +++++++++++------------ GPU/Debugger/Stepping.cpp | 7 ++++--- GPU/Debugger/Stepping.h | 1 - 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Common/Log.h b/Common/Log.h index d0199dc02b39..158e7e0c191c 100644 --- a/Common/Log.h +++ b/Common/Log.h @@ -48,7 +48,7 @@ enum class Log { HTTP, Printf, TexReplacement, - Debugger, + GeDebugger, sceAudio, sceCtrl, diff --git a/GPU/Debugger/Debugger.cpp b/GPU/Debugger/Debugger.cpp index 0e9fc20097de..ed1729c67990 100644 --- a/GPU/Debugger/Debugger.cpp +++ b/GPU/Debugger/Debugger.cpp @@ -163,7 +163,7 @@ NotifyResult NotifyCommand(u32 pc) { } if (isBreakpoint && pc == g_skipPcOnce) { - INFO_LOG(Log::G3D, "Skipping break at %08x (last break was here)", g_skipPcOnce); + INFO_LOG(Log::GeDebugger, "Skipping GE break at %08x (last break was here)", g_skipPcOnce); g_skipPcOnce = 0; return process ? NotifyResult::Execute : NotifyResult::Skip; } @@ -179,10 +179,10 @@ NotifyResult NotifyCommand(u32 pc) { auto info = gpuDebug->DisassembleOp(pc); if (lastStepTime >= 0.0) { - NOTICE_LOG(Log::G3D, "Waiting at %08x, %s (%fms)", pc, info.desc.c_str(), (time_now_d() - lastStepTime) * 1000.0); + NOTICE_LOG(Log::GeDebugger, "Waiting at %08x, %s (%fms)", pc, info.desc.c_str(), (time_now_d() - lastStepTime) * 1000.0); lastStepTime = -1.0; } else { - NOTICE_LOG(Log::G3D, "Waiting at %08x, %s", pc, info.desc.c_str()); + NOTICE_LOG(Log::GeDebugger, "Waiting at %08x, %s", pc, info.desc.c_str()); } g_skipPcOnce = pc; @@ -199,10 +199,10 @@ void NotifyDraw() { return; if (breakNext == BreakNext::DRAW && !GPUStepping::IsStepping()) { if (lastStepTime >= 0.0) { - NOTICE_LOG(Log::G3D, "Waiting at a draw (%fms)", (time_now_d() - lastStepTime) * 1000.0); + NOTICE_LOG(Log::GeDebugger, "Waiting at a draw (%fms)", (time_now_d() - lastStepTime) * 1000.0); lastStepTime = -1.0; } else { - NOTICE_LOG(Log::G3D, "Waiting at a draw"); + NOTICE_LOG(Log::GeDebugger, "Waiting at a draw"); } g_drawNotified = true; } diff --git a/GPU/Debugger/Playback.cpp b/GPU/Debugger/Playback.cpp index 09db244ce871..1a2b951bb1ab 100644 --- a/GPU/Debugger/Playback.cpp +++ b/GPU/Debugger/Playback.cpp @@ -383,7 +383,7 @@ class DumpExecute { void DumpExecute::SyncStall() { if (execListBuf == 0) { - VERBOSE_LOG(Log::G3D, "SyncStall: No active display list"); + VERBOSE_LOG(Log::GeDebugger, "SyncStall: No active display list"); return; } @@ -411,7 +411,7 @@ void DumpExecute::Registers(u32 ptr, u32 sz) { execListBuf = 0; } if (execListBuf == 0) { - ERROR_LOG(Log::System, "Unable to allocate for display list"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for display list"); return; } @@ -514,7 +514,7 @@ void DumpExecute::Init(u32 ptr, u32 sz) { void DumpExecute::Vertices(u32 ptr, u32 sz) { u32 psp = mapping_.Map(ptr, sz, std::bind(&DumpExecute::SyncStall, this)); if (psp == 0) { - ERROR_LOG(Log::System, "Unable to allocate for vertices"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for vertices"); return; } @@ -528,7 +528,7 @@ void DumpExecute::Vertices(u32 ptr, u32 sz) { void DumpExecute::Indices(u32 ptr, u32 sz) { u32 psp = mapping_.Map(ptr, sz, std::bind(&DumpExecute::SyncStall, this)); if (psp == 0) { - ERROR_LOG(Log::System, "Unable to allocate for indices"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for indices"); return; } @@ -565,7 +565,7 @@ void DumpExecute::Clut(u32 ptr, u32 sz) { } else { u32 psp = mapping_.Map(ptr, sz, std::bind(&DumpExecute::SyncStall, this)); if (psp == 0) { - ERROR_LOG(Log::System, "Unable to allocate for clut"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for clut"); return; } @@ -577,7 +577,7 @@ void DumpExecute::Clut(u32 ptr, u32 sz) { void DumpExecute::TransferSrc(u32 ptr, u32 sz) { u32 psp = mapping_.Map(ptr, sz, std::bind(&DumpExecute::SyncStall, this)); if (psp == 0) { - ERROR_LOG(Log::System, "Unable to allocate for transfer"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for transfer"); return; } @@ -622,7 +622,7 @@ void DumpExecute::Memcpy(u32 ptr, u32 sz) { void DumpExecute::Texture(int level, u32 ptr, u32 sz) { u32 psp = mapping_.Map(ptr, sz, std::bind(&DumpExecute::SyncStall, this)); if (psp == 0) { - ERROR_LOG(Log::System, "Unable to allocate for texture"); + ERROR_LOG(Log::GeDebugger, "Unable to allocate for texture"); return; } @@ -791,7 +791,7 @@ ReplayResult DumpExecute::Run() { break; default: - ERROR_LOG(Log::System, "Unsupported GE dump command: %d", (int)cmd.type); + ERROR_LOG(Log::GeDebugger, "Unsupported GE dump command: %d", (int)cmd.type); return ReplayResult::Error; } } @@ -840,7 +840,7 @@ static u32 LoadReplay(const std::string &filename) { u32 version = header.version; if (memcmp(header.magic, HEADER_MAGIC, sizeof(header.magic)) != 0 || header.version > VERSION || header.version < MIN_VERSION) { - ERROR_LOG(Log::System, "Invalid GE dump or unsupported version"); + ERROR_LOG(Log::GeDebugger, "Invalid GE dump or unsupported version"); pspFileSystem.CloseFile(fp); return 0; } @@ -869,7 +869,7 @@ static u32 LoadReplay(const std::string &filename) { pspFileSystem.CloseFile(fp); if (truncated) { - ERROR_LOG(Log::System, "Truncated GE dump detected - can't replay"); + ERROR_LOG(Log::GeDebugger, "Truncated GE dump detected - can't replay"); return 0; } @@ -921,7 +921,7 @@ ReplayResult RunMountedReplay(const std::string &filename) { } version = LoadReplay(filename); if (!version) { - ERROR_LOG(Log::G3D, "bad version %08x", version); + ERROR_LOG(Log::GeDebugger, "bad version %08x", version); return ReplayResult::Error; } } @@ -971,7 +971,6 @@ ReplayResult RunMountedReplay(const std::string &filename) { u32 execListPos = g_opToExec.param; auto optParam = PSPPointer::Create(0); g_retVal = gpu->EnqueueList(listPC, execListPos, -1, optParam, false, &runList); - INFO_LOG(Log::G3D, "Enqueued: dl=%d", g_retVal); if (runList) { hleSplitSyscallOverGe(); } diff --git a/GPU/Debugger/Stepping.cpp b/GPU/Debugger/Stepping.cpp index d952a23a0baf..122cde8714f3 100644 --- a/GPU/Debugger/Stepping.cpp +++ b/GPU/Debugger/Stepping.cpp @@ -102,7 +102,7 @@ static void RunPauseAction() { return; } - INFO_LOG(Log::G3D, "RunPauseAction: %s", PauseActionToString(pauseAction)); + DEBUG_LOG(Log::GeDebugger, "RunPauseAction: %s", PauseActionToString(pauseAction)); switch (pauseAction) { case PAUSE_BREAK: @@ -141,7 +141,8 @@ static void RunPauseAction() { break; default: - ERROR_LOG(Log::G3D, "Unsupported pause action, forgot to add it to the switch."); + ERROR_LOG(Log::GeDebugger, "Unsupported pause action, forgot to add it to the switch."); + break; } actionComplete = true; @@ -185,7 +186,7 @@ bool ProcessStepping() { if (pauseAction == PAUSE_CONTINUE) { // This is fine, can just mean to run to the next breakpoint/event. - INFO_LOG(Log::G3D, "Continuing..."); + DEBUG_LOG(Log::GeDebugger, "Continuing..."); actionComplete = true; actionWait.notify_all(); coreState = CORE_RUNNING_GE; diff --git a/GPU/Debugger/Stepping.h b/GPU/Debugger/Stepping.h index 38c192b8f340..1393ffc7c74d 100644 --- a/GPU/Debugger/Stepping.h +++ b/GPU/Debugger/Stepping.h @@ -30,7 +30,6 @@ namespace GPUStepping { bool EnterStepping(); bool IsStepping(); void ResumeFromStepping(); - void WaitForAction(); int GetSteppingCounter(); From 8b8489467b288491e90996c44ac7639bdea92db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Dec 2024 10:34:43 +0100 Subject: [PATCH 3/5] Transfer metadata from the state.cpp table to GECommandTable --- GPU/Debugger/GECommandTable.cpp | 330 ++++++++++++++++---------------- GPU/Debugger/GECommandTable.h | 50 +++++ GPU/Debugger/State.h | 42 +--- 3 files changed, 217 insertions(+), 205 deletions(-) diff --git a/GPU/Debugger/GECommandTable.cpp b/GPU/Debugger/GECommandTable.cpp index e0e9573211e0..6c4a3ca8c40c 100644 --- a/GPU/Debugger/GECommandTable.cpp +++ b/GPU/Debugger/GECommandTable.cpp @@ -45,45 +45,45 @@ static constexpr GECmdInfo geCmdInfo[] = { { GE_CMD_FINISH, "finish", GECmdFormat::NONE }, { GE_CMD_BASE, "base", GECmdFormat::HIGH_ADDR_ONLY }, { GE_CMD_UNKNOWN_11, "unknown11", GECmdFormat::NONE }, - { GE_CMD_VERTEXTYPE, "vtype", GECmdFormat::VERTEX_TYPE }, - { GE_CMD_OFFSETADDR, "setoffset", GECmdFormat::OFFSET_ADDR }, + { GE_CMD_VERTEXTYPE, "vtype", GECmdFormat::VERTEX_TYPE, CMD_FMT_VERTEXTYPE }, + { GE_CMD_OFFSETADDR, "setoffset", GECmdFormat::OFFSET_ADDR, CMD_FMT_OFFSETADDR }, { GE_CMD_ORIGIN, "origin", GECmdFormat::NONE }, - { GE_CMD_REGION1, "regionrate", GECmdFormat::X10_Y10 }, - { GE_CMD_REGION2, "regionstop", GECmdFormat::X10_Y10 }, - { GE_CMD_LIGHTINGENABLE, "lighting_on", GECmdFormat::FLAG }, - { GE_CMD_LIGHTENABLE0, "light0_on", GECmdFormat::FLAG }, - { GE_CMD_LIGHTENABLE1, "light1_on", GECmdFormat::FLAG }, - { GE_CMD_LIGHTENABLE2, "light2_on", GECmdFormat::FLAG }, - { GE_CMD_LIGHTENABLE3, "light3_on", GECmdFormat::FLAG }, - { GE_CMD_DEPTHCLAMPENABLE, "zclamp_on", GECmdFormat::FLAG }, - { GE_CMD_CULLFACEENABLE, "cull_on", GECmdFormat::FLAG }, - { GE_CMD_TEXTUREMAPENABLE, "tex_on", GECmdFormat::FLAG }, - { GE_CMD_FOGENABLE, "fog_on", GECmdFormat::FLAG }, - { GE_CMD_DITHERENABLE, "dither_on", GECmdFormat::FLAG }, - { GE_CMD_ALPHABLENDENABLE, "ablend_on", GECmdFormat::FLAG }, - { GE_CMD_ALPHABLENDENABLE, "atest_on", GECmdFormat::FLAG }, - { GE_CMD_ZTESTENABLE, "ztest_on", GECmdFormat::FLAG }, - { GE_CMD_STENCILTESTENABLE, "stest_on", GECmdFormat::FLAG }, - { GE_CMD_ANTIALIASENABLE, "antialias_on", GECmdFormat::FLAG }, - { GE_CMD_PATCHCULLENABLE, "patchcull_on", GECmdFormat::FLAG }, - { GE_CMD_COLORTESTENABLE, "ctest_on", GECmdFormat::FLAG }, - { GE_CMD_LOGICOPENABLE, "logicop_on", GECmdFormat::FLAG }, + { GE_CMD_REGION1, "regionrate", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, GE_CMD_REGION2 }, + { GE_CMD_REGION2, "regionstop", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, }, + { GE_CMD_LIGHTINGENABLE, "lighting_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_LIGHTENABLE0, "light0_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE1, "light1_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE2, "light2_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE3, "light3_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_DEPTHCLAMPENABLE, "zclamp_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_CULLFACEENABLE, "cull_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_TEXTUREMAPENABLE, "tex_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_FOGENABLE, "fog_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_DITHERENABLE, "dither_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_ALPHABLENDENABLE, "ablend_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_ALPHABLENDENABLE, "atest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_ZTESTENABLE, "ztest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_STENCILTESTENABLE, "stest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_ANTIALIASENABLE, "antialias_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_PATCHCULLENABLE, "patchcull_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_COLORTESTENABLE, "ctest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_LOGICOPENABLE, "logicop_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, { GE_CMD_UNKNOWN_29, "unknown29", GECmdFormat::NONE }, - { GE_CMD_BONEMATRIXNUMBER, "bonemtxnum", GECmdFormat::BONE_NUM }, - { GE_CMD_BONEMATRIXDATA, "bonemtxdata", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT0, "morph0", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT1, "morph1", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT2, "morph2", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT3, "morph3", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT4, "morph4", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT5, "morph5", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT6, "morph6", GECmdFormat::FLOAT }, - { GE_CMD_MORPHWEIGHT7, "morph7", GECmdFormat::FLOAT }, + { GE_CMD_BONEMATRIXNUMBER, "bonemtxnum", GECmdFormat::BONE_NUM, CMD_FMT_INTEGER }, + { GE_CMD_BONEMATRIXDATA, "bonemtxdata", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT0, "morph0", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT1, "morph1", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT2, "morph2", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT3, "morph3", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT4, "morph4", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT5, "morph5", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT6, "morph6", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT7, "morph7", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, { GE_CMD_UNKNOWN_34, "unknown34", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_35, "unknown35", GECmdFormat::NONE }, - { GE_CMD_PATCHDIVISION, "patchdivision", GECmdFormat::PATCH_DIVISION }, - { GE_CMD_PATCHPRIMITIVE, "patchprim", GECmdFormat::PATCH_PRIM }, - { GE_CMD_PATCHFACING, "patchreversenormals", GECmdFormat::FLAG }, + { GE_CMD_PATCHDIVISION, "patchdivision", GECmdFormat::PATCH_DIVISION, CMD_FMT_HEX }, + { GE_CMD_PATCHPRIMITIVE, "patchprim", GECmdFormat::PATCH_PRIM, CMD_FMT_PATCHPRIMITIVE }, + { GE_CMD_PATCHFACING, "patchreversenormals", GECmdFormat::FLAG, CMD_FMT_HEX, GE_CMD_PATCHCULLENABLE }, { GE_CMD_UNKNOWN_39, "unknown39", GECmdFormat::NONE }, { GE_CMD_WORLDMATRIXNUMBER, "worldmtxnum", GECmdFormat::MATRIX_NUM }, { GE_CMD_WORLDMATRIXDATA, "worldmtxdata", GECmdFormat::FLOAT }, @@ -93,109 +93,111 @@ static constexpr GECmdInfo geCmdInfo[] = { { GE_CMD_PROJMATRIXDATA, "projmtxdata", GECmdFormat::FLOAT }, { GE_CMD_TGENMATRIXNUMBER, "texgenmtxnum", GECmdFormat::MATRIX_NUM }, { GE_CMD_TGENMATRIXDATA, "texgenmtxdata", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTXSCALE, "vpxscale", GECmdFormat::FLOAT }, + { GE_CMD_VIEWPORTXSCALE, "vpxscale", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYSCALE, GE_CMD_VIEWPORTZSCALE }, { GE_CMD_VIEWPORTYSCALE, "vpyscale", GECmdFormat::FLOAT }, { GE_CMD_VIEWPORTZSCALE, "vpzscale", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTXCENTER, "vpxcenter", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTYCENTER, "vpycenter", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTZCENTER, "vpzcenter", GECmdFormat::FLOAT }, - { GE_CMD_TEXSCALEU, "texscaleu", GECmdFormat::FLOAT }, - { GE_CMD_TEXSCALEV, "texscalev", GECmdFormat::FLOAT }, - { GE_CMD_TEXOFFSETU, "texoffsetu", GECmdFormat::FLOAT }, - { GE_CMD_TEXOFFSETV, "texoffsetv", GECmdFormat::FLOAT }, - { GE_CMD_OFFSETX, "offsetx", GECmdFormat::SUBPIXEL_COORD }, + { GE_CMD_VIEWPORTXCENTER, "vpxcenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, + { GE_CMD_VIEWPORTYCENTER, "vpycenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, + { GE_CMD_VIEWPORTZCENTER, "vpzcenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, + { GE_CMD_TEXSCALEU, "texscaleu", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSCALEV, "texscalev", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXOFFSETU, "texoffsetu", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXOFFSETV, "texoffsetv", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_OFFSETX, "offsetx", GECmdFormat::SUBPIXEL_COORD, CMD_FMT_F16_XY, 0, GE_CMD_OFFSETY }, { GE_CMD_OFFSETY, "offsety", GECmdFormat::SUBPIXEL_COORD }, { GE_CMD_UNKNOWN_4E, "unknown4e", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_4F, "unknown4f", GECmdFormat::NONE }, // Really shade mode, but using gouraud as the default so it can be 1/0. - { GE_CMD_SHADEMODE, "gouraud", GECmdFormat::FLAG }, - { GE_CMD_REVERSENORMAL, "reversenormals", GECmdFormat::FLAG }, + { GE_CMD_SHADEMODE, "gouraud", GECmdFormat::FLAG, CMD_FMT_SHADEMODEL }, + { GE_CMD_REVERSENORMAL, "reversenormals", GECmdFormat::FLAG, CMD_FMT_FLAG }, { GE_CMD_UNKNOWN_52, "unknown52", GECmdFormat::NONE }, - { GE_CMD_MATERIALUPDATE, "materialupdate", GECmdFormat::MATERIAL_UPDATE }, - { GE_CMD_MATERIALEMISSIVE, "materialemissive", GECmdFormat::RGB }, - { GE_CMD_MATERIALAMBIENT, "materialambient", GECmdFormat::RGB }, - { GE_CMD_MATERIALDIFFUSE, "materialdiffuse", GECmdFormat::RGB }, - { GE_CMD_MATERIALSPECULAR, "materialspecular", GECmdFormat::RGB }, - { GE_CMD_MATERIALALPHA, "materialambienta", GECmdFormat::DATA8 }, + { GE_CMD_MATERIALUPDATE, "materialupdate", GECmdFormat::MATERIAL_UPDATE, CMD_FMT_MATERIALUPDATE }, + { GE_CMD_MATERIALEMISSIVE, "materialemissive", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_MATERIALAMBIENT, "materialambient", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_MATERIALDIFFUSE, "materialdiffuse", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_MATERIALSPECULAR, "materialspecular", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_MATERIALALPHA, "materialambienta", GECmdFormat::DATA8, CMD_FMT_HEX8 }, { GE_CMD_UNKNOWN_59, "unknown59", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_5A, "unknown5a", GECmdFormat::NONE }, - { GE_CMD_MATERIALSPECULARCOEF, "specularcoef", GECmdFormat::FLOAT }, - { GE_CMD_AMBIENTCOLOR, "ambient", GECmdFormat::RGB }, - { GE_CMD_AMBIENTALPHA, "ambienta", GECmdFormat::DATA8 }, - { GE_CMD_LIGHTMODE, "lightseparate", GECmdFormat::FLAG }, - { GE_CMD_LIGHTTYPE0, "ltype0", GECmdFormat::LIGHT_TYPE }, - { GE_CMD_LIGHTTYPE1, "ltype1", GECmdFormat::LIGHT_TYPE }, - { GE_CMD_LIGHTTYPE2, "ltype2", GECmdFormat::LIGHT_TYPE }, - { GE_CMD_LIGHTTYPE3, "ltype3", GECmdFormat::LIGHT_TYPE }, - { GE_CMD_LX0, "light0posx", GECmdFormat::FLOAT }, + { GE_CMD_MATERIALSPECULARCOEF, "specularcoef", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_AMBIENTCOLOR, "ambient", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_AMBIENTALPHA, "ambienta", GECmdFormat::DATA8, CMD_FMT_HEX }, + { GE_CMD_LIGHTMODE, "lightseparate", GECmdFormat::FLAG, CMD_FMT_LIGHTMODE, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTTYPE0, "ltype0", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LIGHTTYPE1, "ltype1", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LIGHTTYPE2, "ltype2", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LIGHTTYPE3, "ltype3", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LX0, "light0posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LY0, GE_CMD_LZ0 }, { GE_CMD_LY0, "light0posy", GECmdFormat::FLOAT }, { GE_CMD_LZ0, "light0posz", GECmdFormat::FLOAT }, - { GE_CMD_LX1, "light1posx", GECmdFormat::FLOAT }, + { GE_CMD_LX1, "light1posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LY1, GE_CMD_LZ1 }, { GE_CMD_LY1, "light1posy", GECmdFormat::FLOAT }, { GE_CMD_LZ1, "light1posz", GECmdFormat::FLOAT }, - { GE_CMD_LX2, "light2posx", GECmdFormat::FLOAT }, + { GE_CMD_LX2, "light2posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LY2, GE_CMD_LZ2 }, { GE_CMD_LY2, "light2posy", GECmdFormat::FLOAT }, { GE_CMD_LZ2, "light2posz", GECmdFormat::FLOAT }, - { GE_CMD_LX3, "light3posx", GECmdFormat::FLOAT }, + { GE_CMD_LX3, "light3posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LY3, GE_CMD_LZ3 }, { GE_CMD_LY3, "light3posy", GECmdFormat::FLOAT }, { GE_CMD_LZ3, "light3posz", GECmdFormat::FLOAT }, - { GE_CMD_LDX0, "light0dirx", GECmdFormat::FLOAT }, + { GE_CMD_LDX0, "light0dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LDY0, GE_CMD_LDZ0 }, { GE_CMD_LDY0, "light0diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ0, "light0dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX1, "light1dirx", GECmdFormat::FLOAT }, + { GE_CMD_LDX1, "light1dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LDY1, GE_CMD_LDZ1 }, { GE_CMD_LDY1, "light1diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ1, "light1dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX2, "light2dirx", GECmdFormat::FLOAT }, + { GE_CMD_LDX2, "light2dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LDY2, GE_CMD_LDZ2 }, { GE_CMD_LDY2, "light2diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ2, "light2dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX3, "light3dirx", GECmdFormat::FLOAT }, + { GE_CMD_LDX3, "light3dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LDY3, GE_CMD_LDZ3 }, { GE_CMD_LDY3, "light3diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ3, "light3dirz", GECmdFormat::FLOAT }, - { GE_CMD_LKA0, "light0attpow0", GECmdFormat::FLOAT }, + + { GE_CMD_LKA0, "light0attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LKB0, GE_CMD_LKC0 }, { GE_CMD_LKB0, "light0attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC0, "light0attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA1, "light1attpow0", GECmdFormat::FLOAT }, + { GE_CMD_LKA1, "light1attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LKB1, GE_CMD_LKC1 }, { GE_CMD_LKB1, "light1attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC1, "light1attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA2, "light2attpow0", GECmdFormat::FLOAT }, + { GE_CMD_LKA2, "light2attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LKB2, GE_CMD_LKC2 }, { GE_CMD_LKB2, "light2attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC2, "light2attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA3, "light3attpow0", GECmdFormat::FLOAT }, + { GE_CMD_LKA3, "light3attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LKB3, GE_CMD_LKC3 }, { GE_CMD_LKB3, "light3attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC3, "light3attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKS0, "light0spotexp", GECmdFormat::FLOAT }, - { GE_CMD_LKS1, "light1spotexp", GECmdFormat::FLOAT }, - { GE_CMD_LKS2, "light2spotexp", GECmdFormat::FLOAT }, - { GE_CMD_LKS3, "light3spotexp", GECmdFormat::FLOAT }, - { GE_CMD_LKO0, "light0spotcutoff", GECmdFormat::FLOAT }, - { GE_CMD_LKO1, "light1spotcutoff", GECmdFormat::FLOAT }, - { GE_CMD_LKO2, "light2spotcutoff", GECmdFormat::FLOAT }, - { GE_CMD_LKO3, "light3spotcutoff", GECmdFormat::FLOAT }, - { GE_CMD_LAC0, "light0ambient", GECmdFormat::RGB }, - { GE_CMD_LDC0, "light0diffuse", GECmdFormat::RGB }, - { GE_CMD_LSC0, "light0specular", GECmdFormat::RGB }, - { GE_CMD_LAC1, "light1ambient", GECmdFormat::RGB }, - { GE_CMD_LDC1, "light1diffuse", GECmdFormat::RGB }, - { GE_CMD_LSC1, "light1specular", GECmdFormat::RGB }, - { GE_CMD_LAC2, "light2ambient", GECmdFormat::RGB }, - { GE_CMD_LDC2, "light2diffuse", GECmdFormat::RGB }, - { GE_CMD_LSC2, "light2specular", GECmdFormat::RGB }, - { GE_CMD_LAC3, "light3ambient", GECmdFormat::RGB }, - { GE_CMD_LDC3, "light3diffuse", GECmdFormat::RGB }, - { GE_CMD_LSC3, "light3specular", GECmdFormat::RGB }, - { GE_CMD_CULL, "cullccw", GECmdFormat::FLAG }, - { GE_CMD_FRAMEBUFPTR, "fbptr", GECmdFormat::LOW_ADDR_ONLY }, + + { GE_CMD_LKS0, "light0spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LKS1, "light1spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LKS2, "light2spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LKS3, "light3spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LKO0, "light0spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LKO1, "light1spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LKO2, "light2spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LKO3, "light3spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LAC0, "light0ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LDC0, "light0diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LSC0, "light0specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LAC1, "light1ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LDC1, "light1diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LSC1, "light1specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LAC2, "light2ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LDC2, "light2diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LSC2, "light2specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LAC3, "light3ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LDC3, "light3diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LSC3, "light3specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_CULL, "cullccw", GECmdFormat::FLAG, CMD_FMT_FLAG, CMD_FMT_CULL, GE_CMD_CULLFACEENABLE }, + { GE_CMD_FRAMEBUFPTR, "fbptr", GECmdFormat::LOW_ADDR_ONLY, CMD_FMT_PTRWIDTH, 0, GE_CMD_FRAMEBUFWIDTH }, { GE_CMD_FRAMEBUFWIDTH, "fbstride", GECmdFormat::STRIDE }, - { GE_CMD_ZBUFPTR, "zbptr", GECmdFormat::LOW_ADDR_ONLY }, + { GE_CMD_ZBUFPTR, "zbptr", GECmdFormat::LOW_ADDR_ONLY, CMD_FMT_PTRWIDTH, 0, GE_CMD_ZBUFWIDTH }, { GE_CMD_ZBUFWIDTH, "zbstride", GECmdFormat::STRIDE }, - { GE_CMD_TEXADDR0, "texaddr0low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR1, "texaddr1low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR2, "texaddr2low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR3, "texaddr3low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR4, "texaddr4low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR5, "texaddr5low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR6, "texaddr6low", GECmdFormat::LOW_ADDR }, - { GE_CMD_TEXADDR7, "texaddr7low", GECmdFormat::LOW_ADDR }, + { GE_CMD_TEXADDR0, "texaddr0low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH0 }, + { GE_CMD_TEXADDR1, "texaddr1low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH1 }, + { GE_CMD_TEXADDR2, "texaddr2low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH2 }, + { GE_CMD_TEXADDR3, "texaddr3low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH3 }, + { GE_CMD_TEXADDR4, "texaddr4low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH4 }, + { GE_CMD_TEXADDR5, "texaddr5low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH5 }, + { GE_CMD_TEXADDR6, "texaddr6low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH6 }, + { GE_CMD_TEXADDR7, "texaddr7low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH7 }, { GE_CMD_TEXBUFWIDTH0, "texbufw0", GECmdFormat::STRIDE_HIGH_ADDR }, { GE_CMD_TEXBUFWIDTH1, "texbufw1", GECmdFormat::STRIDE_HIGH_ADDR }, { GE_CMD_TEXBUFWIDTH2, "texbufw2", GECmdFormat::STRIDE_HIGH_ADDR }, @@ -204,80 +206,80 @@ static constexpr GECmdInfo geCmdInfo[] = { { GE_CMD_TEXBUFWIDTH5, "texbufw5", GECmdFormat::STRIDE_HIGH_ADDR }, { GE_CMD_TEXBUFWIDTH6, "texbufw6", GECmdFormat::STRIDE_HIGH_ADDR }, { GE_CMD_TEXBUFWIDTH7, "texbufw7", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_CLUTADDR, "clutaddrlow", GECmdFormat::LOW_ADDR }, + { GE_CMD_CLUTADDR, "clutaddrlow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_CLUTADDRUPPER }, { GE_CMD_CLUTADDRUPPER, "clutaddrhigh", GECmdFormat::HIGH_ADDR }, - { GE_CMD_TRANSFERSRC, "transfersrclow", GECmdFormat::LOW_ADDR }, + { GE_CMD_TRANSFERSRC, "transfersrclow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERSRCW }, { GE_CMD_TRANSFERSRCW, "transfersrcstride", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TRANSFERDST, "transferdstlow", GECmdFormat::LOW_ADDR }, + { GE_CMD_TRANSFERDST, "transferdstlow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERDSTW }, { GE_CMD_TRANSFERDSTW, "transferdststride", GECmdFormat::STRIDE_HIGH_ADDR }, { GE_CMD_UNKNOWN_B6, "unknownb6", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_B7, "unknownb7", GECmdFormat::NONE }, - { GE_CMD_TEXSIZE0, "texsize0", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE1, "texsize1", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE2, "texsize2", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE3, "texsize3", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE4, "texsize4", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE5, "texsize5", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE6, "texsize6", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXSIZE7, "texsize7", GECmdFormat::TEX_SIZE }, - { GE_CMD_TEXMAPMODE, "texmapmode", GECmdFormat::TEX_MAP_MODE }, - { GE_CMD_TEXSHADELS, "texlightsrc", GECmdFormat::TEX_LIGHT_SRC }, - { GE_CMD_TEXMODE, "texmode", GECmdFormat::TEX_MODE }, - { GE_CMD_TEXFORMAT, "texformat", GECmdFormat::TEX_FORMAT }, + { GE_CMD_TEXSIZE0, "texsize0", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE1, "texsize1", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE2, "texsize2", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE3, "texsize3", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE4, "texsize4", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE5, "texsize5", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE6, "texsize6", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE7, "texsize7", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXMAPMODE, "texmapmode", GECmdFormat::TEX_MAP_MODE, CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSHADELS, "texlightsrc", GECmdFormat::TEX_LIGHT_SRC, CMD_FMT_TEXSHADELS, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXMODE, "texmode", GECmdFormat::TEX_MODE, CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXFORMAT, "texformat", GECmdFormat::TEX_FORMAT, CMD_FMT_TEXFMT, GE_CMD_TEXTUREMAPENABLE }, { GE_CMD_LOADCLUT, "loadclut", GECmdFormat::CLUT_BLOCKS }, - { GE_CMD_CLUTFORMAT, "clutformat", GECmdFormat::CLUT_FORMAT }, - { GE_CMD_TEXFILTER, "texfilter", GECmdFormat::TEX_FILTER }, - { GE_CMD_TEXWRAP, "texclamp", GECmdFormat::TEX_CLAMP }, - { GE_CMD_TEXLEVEL, "texlevelmode", GECmdFormat::TEX_LEVEL_MODE }, - { GE_CMD_TEXFUNC, "texfunc", GECmdFormat::TEX_FUNC }, - { GE_CMD_TEXENVCOLOR, "texenv", GECmdFormat::RGB }, + { GE_CMD_CLUTFORMAT, "clutformat", GECmdFormat::CLUT_FORMAT, CMD_FMT_CLUTFMT, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXFILTER, "texfilter", GECmdFormat::TEX_FILTER, CMD_FMT_TEXFILTER, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXWRAP, "texclamp", GECmdFormat::TEX_CLAMP, CMD_FMT_TEXWRAP, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXLEVEL, "texlevelmode", GECmdFormat::TEX_LEVEL_MODE, CMD_FMT_TEXLEVEL, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXFUNC, "texfunc", GECmdFormat::TEX_FUNC, CMD_FMT_TEXFUNC, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXENVCOLOR, "texenv", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_TEXTUREMAPENABLE }, { GE_CMD_TEXFLUSH, "texflush", GECmdFormat::NONE }, { GE_CMD_TEXSYNC, "texsync", GECmdFormat::NONE }, - { GE_CMD_FOG1, "fogend", GECmdFormat::FLOAT }, - { GE_CMD_FOG2, "fogslope", GECmdFormat::FLOAT }, - { GE_CMD_FOGCOLOR, "fogcolor", GECmdFormat::RGB }, - { GE_CMD_TEXLODSLOPE, "texlodslope", GECmdFormat::FLOAT }, + { GE_CMD_FOG1, "fogend", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, + { GE_CMD_FOG2, "fogslope", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, + { GE_CMD_FOGCOLOR, "fogcolor", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_FOGENABLE, }, + { GE_CMD_TEXLODSLOPE, "texlodslope", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, { GE_CMD_UNKNOWN_D1, "unknownd1", GECmdFormat::NONE }, - { GE_CMD_FRAMEBUFPIXFORMAT, "fbformat", GECmdFormat::TEX_FORMAT }, - { GE_CMD_CLEARMODE, "clearmode", GECmdFormat::CLEAR_MODE }, - { GE_CMD_SCISSOR1, "scissor1", GECmdFormat::X10_Y10 }, + { GE_CMD_FRAMEBUFPIXFORMAT, "fbformat", GECmdFormat::TEX_FORMAT, CMD_FMT_TEXFMT }, + { GE_CMD_CLEARMODE, "clearmode", GECmdFormat::CLEAR_MODE, CMD_FMT_CLEARMODE }, + { GE_CMD_SCISSOR1, "scissor1", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, GE_CMD_SCISSOR2 }, { GE_CMD_SCISSOR2, "scissor2", GECmdFormat::X10_Y10 }, - { GE_CMD_MINZ, "minz", GECmdFormat::DATA16 }, - { GE_CMD_MAXZ, "maxz", GECmdFormat::DATA16 }, - { GE_CMD_COLORTEST, "ctestfunc", GECmdFormat::COLOR_TEST_FUNC }, - { GE_CMD_COLORREF, "ctestref", GECmdFormat::RGB }, - { GE_CMD_COLORTESTMASK, "ctestmask", GECmdFormat::RGB }, - { GE_CMD_ALPHATEST, "atest", GECmdFormat::ALPHA_TEST }, - { GE_CMD_STENCILTEST, "stest", GECmdFormat::ALPHA_TEST }, - { GE_CMD_STENCILOP, "stencilop", GECmdFormat::STENCIL_OP }, - { GE_CMD_ZTEST, "ztest", GECmdFormat::DEPTH_TEST_FUNC }, - { GE_CMD_BLENDMODE, "blendmode", GECmdFormat::BLEND_MODE }, - { GE_CMD_BLENDFIXEDA, "blendfixa", GECmdFormat::RGB }, - { GE_CMD_BLENDFIXEDB, "blendfixb", GECmdFormat::RGB }, - { GE_CMD_DITH0, "dither0", GECmdFormat::DITHER_ROW }, - { GE_CMD_DITH1, "dither1", GECmdFormat::DITHER_ROW }, - { GE_CMD_DITH2, "dither2", GECmdFormat::DITHER_ROW }, - { GE_CMD_DITH3, "dither3", GECmdFormat::DITHER_ROW }, - { GE_CMD_LOGICOP, "logicop", GECmdFormat::LOGIC_OP }, - { GE_CMD_ZWRITEDISABLE, "zwrite_off", GECmdFormat::FLAG }, - { GE_CMD_MASKRGB, "rgbmask_block", GECmdFormat::RGB }, - { GE_CMD_MASKALPHA, "swritemask_block", GECmdFormat::DATA8 }, - { GE_CMD_TRANSFERSTART, "transferstart_bpp", GECmdFormat::FLAG }, - { GE_CMD_TRANSFERSRCPOS, "transfersrcpos", GECmdFormat::X10_Y10 }, - { GE_CMD_TRANSFERDSTPOS, "transferdstpos", GECmdFormat::X10_Y10 }, + { GE_CMD_MINZ, "minz", GECmdFormat::DATA16, CMD_FMT_HEX }, + { GE_CMD_MAXZ, "maxz", GECmdFormat::DATA16, CMD_FMT_HEX }, + { GE_CMD_COLORTEST, "ctestfunc", GECmdFormat::COLOR_TEST_FUNC, CMD_FMT_COLORTEST, GE_CMD_COLORTESTENABLE, GE_CMD_COLORREF, GE_CMD_COLORTESTMASK }, + { GE_CMD_COLORREF, "ctestref", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_COLORTESTMASK, "ctestmask", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_ALPHATEST, "atest", GECmdFormat::ALPHA_TEST, CMD_FMT_ALPHATEST, GE_CMD_ALPHATESTENABLE }, + { GE_CMD_STENCILTEST, "stest", GECmdFormat::ALPHA_TEST, CMD_FMT_STENCILTEST, GE_CMD_STENCILTESTENABLE }, + { GE_CMD_STENCILOP, "stencilop", GECmdFormat::STENCIL_OP, CMD_FMT_STENCILOP, GE_CMD_STENCILTESTENABLE }, + { GE_CMD_ZTEST, "ztest", GECmdFormat::DEPTH_TEST_FUNC, CMD_FMT_ZTEST, GE_CMD_ZTESTENABLE }, + { GE_CMD_BLENDMODE, "blendmode", GECmdFormat::BLEND_MODE, CMD_FMT_BLENDMODE, GE_CMD_ALPHABLENDENABLE }, + { GE_CMD_BLENDFIXEDA, "blendfixa", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, + { GE_CMD_BLENDFIXEDB, "blendfixb", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, + { GE_CMD_DITH0, "dither0", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH1, "dither1", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH2, "dither2", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH3, "dither3", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_LOGICOP, "logicop", GECmdFormat::LOGIC_OP, CMD_FMT_LOGICOP, GE_CMD_LOGICOPENABLE }, + { GE_CMD_ZWRITEDISABLE, "zwrite_off", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_MASKRGB, "rgbmask_block", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_MASKALPHA, "swritemask_block", GECmdFormat::DATA8, CMD_FMT_HEX8 }, + { GE_CMD_TRANSFERSTART, "transferstart_bpp", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_TRANSFERSRCPOS, "transfersrcpos", GECmdFormat::X10_Y10, CMD_FMT_XY }, + { GE_CMD_TRANSFERDSTPOS, "transferdstpos", GECmdFormat::X10_Y10, CMD_FMT_XY }, { GE_CMD_UNKNOWN_ED, "unknowned", GECmdFormat::NONE }, - { GE_CMD_TRANSFERSIZE, "transfersize", GECmdFormat::X10_Y10 }, + { GE_CMD_TRANSFERSIZE, "transfersize", GECmdFormat::X10_Y10, CMD_FMT_XY }, { GE_CMD_UNKNOWN_EF, "unknownef", GECmdFormat::NONE }, - { GE_CMD_VSCX, "immx", GECmdFormat::SUBPIXEL_COORD }, + { GE_CMD_VSCX, "immx", GECmdFormat::SUBPIXEL_COORD, CMD_FMT_F16_XY, 0, GE_CMD_VSCY }, { GE_CMD_VSCY, "immy", GECmdFormat::SUBPIXEL_COORD }, - { GE_CMD_VSCZ, "immz", GECmdFormat::DATA16 }, - { GE_CMD_VTCS, "imms", GECmdFormat::FLOAT }, - { GE_CMD_VTCT, "immt", GECmdFormat::FLOAT }, - { GE_CMD_VTCQ, "immq", GECmdFormat::FLOAT }, - { GE_CMD_VCV, "immrgb", GECmdFormat::RGB }, - { GE_CMD_VAP, "imma_prim", GECmdFormat::ALPHA_PRIM }, - { GE_CMD_VFC, "immfog", GECmdFormat::DATA8 }, - { GE_CMD_VSCV, "immrgb1", GECmdFormat::RGB }, + { GE_CMD_VSCZ, "immz", GECmdFormat::DATA16, CMD_FMT_HEX }, + { GE_CMD_VTCS, "imms", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VTCT, GE_CMD_VTCQ }, + { GE_CMD_VTCT, "immt", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_VTCQ, "immq", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, + { GE_CMD_VCV, "immrgb", GECmdFormat::RGB, CMD_FMT_HEX }, + { GE_CMD_VAP, "imma_prim", GECmdFormat::ALPHA_PRIM, CMD_FMT_HEX }, // TODO: format? + { GE_CMD_VFC, "immfog", GECmdFormat::DATA8, CMD_FMT_HEX8 }, + { GE_CMD_VSCV, "immrgb1", GECmdFormat::RGB, CMD_FMT_HEX }, { GE_CMD_UNKNOWN_FA, "unknownfa", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_FB, "unknownfb", GECmdFormat::NONE }, { GE_CMD_UNKNOWN_FC, "unknownfc", GECmdFormat::NONE }, diff --git a/GPU/Debugger/GECommandTable.h b/GPU/Debugger/GECommandTable.h index cced7c243eed..27b338af1c15 100644 --- a/GPU/Debugger/GECommandTable.h +++ b/GPU/Debugger/GECommandTable.h @@ -17,6 +17,7 @@ #pragma once +#include #include "GPU/ge_constants.h" enum class GECmdFormat { @@ -71,10 +72,59 @@ enum class GECmdFormat { ALPHA_PRIM, // 8 bits alpha, 3 bits primitive type, 1 bit antialias, 6 bit clip?, 1 bit shading, 1 bit cullenable, 1 bit cullface, 1 bit tex enable, 1 bit fog, 1 bit dither. }; +// TODO: Merge with the above. +enum CmdFormatType { + CMD_FMT_HEX = 0, + CMD_FMT_NUM, + CMD_FMT_FLOAT24, + CMD_FMT_PTRWIDTH, + CMD_FMT_XY, + CMD_FMT_XYXY, + CMD_FMT_XYZ, + CMD_FMT_XYPLUS1, + CMD_FMT_TEXSIZE, + CMD_FMT_F16_XY, + CMD_FMT_VERTEXTYPE, + CMD_FMT_TEXFMT, + CMD_FMT_CLUTFMT, + CMD_FMT_COLORTEST, + CMD_FMT_ALPHATEST, + CMD_FMT_STENCILTEST, + CMD_FMT_ZTEST, + CMD_FMT_OFFSETADDR, + CMD_FMT_VADDR, + CMD_FMT_IADDR, + CMD_FMT_MATERIALUPDATE, + CMD_FMT_STENCILOP, + CMD_FMT_BLENDMODE, + CMD_FMT_FLAG, + CMD_FMT_CLEARMODE, + CMD_FMT_TEXFUNC, + CMD_FMT_TEXMODE, + CMD_FMT_LOGICOP, + CMD_FMT_TEXWRAP, + CMD_FMT_TEXLEVEL, + CMD_FMT_TEXFILTER, + CMD_FMT_TEXMAPMODE, + CMD_FMT_TEXSHADELS, + CMD_FMT_SHADEMODEL, + CMD_FMT_LIGHTMODE, + CMD_FMT_LIGHTTYPE, + CMD_FMT_CULL, + CMD_FMT_PATCHPRIMITIVE, + CMD_FMT_HEX8 = CMD_FMT_HEX, // TODO + CMD_FMT_INTEGER = CMD_FMT_HEX, +}; + + struct GECmdInfo { GECommand reg; const char *name; GECmdFormat fmt; + CmdFormatType fmtType; + uint8_t enableCmd; + uint8_t otherCmd; + uint8_t otherCmd2; }; bool GECmdInfoByName(const char *name, GECmdInfo &info); diff --git a/GPU/Debugger/State.h b/GPU/Debugger/State.h index 005a23c984ea..e2380fe997db 100644 --- a/GPU/Debugger/State.h +++ b/GPU/Debugger/State.h @@ -6,49 +6,9 @@ #include "Common/CommonTypes.h" +#include "GPU/Debugger/GECommandTable.h" // Extracted from Windows/GE Debugger/TabState.cpp -enum CmdFormatType { - CMD_FMT_HEX = 0, - CMD_FMT_NUM, - CMD_FMT_FLOAT24, - CMD_FMT_PTRWIDTH, - CMD_FMT_XY, - CMD_FMT_XYXY, - CMD_FMT_XYZ, - CMD_FMT_XYPLUS1, - CMD_FMT_TEXSIZE, - CMD_FMT_F16_XY, - CMD_FMT_VERTEXTYPE, - CMD_FMT_TEXFMT, - CMD_FMT_CLUTFMT, - CMD_FMT_COLORTEST, - CMD_FMT_ALPHATEST, - CMD_FMT_STENCILTEST, - CMD_FMT_ZTEST, - CMD_FMT_OFFSETADDR, - CMD_FMT_VADDR, - CMD_FMT_IADDR, - CMD_FMT_MATERIALUPDATE, - CMD_FMT_STENCILOP, - CMD_FMT_BLENDMODE, - CMD_FMT_FLAG, - CMD_FMT_CLEARMODE, - CMD_FMT_TEXFUNC, - CMD_FMT_TEXMODE, - CMD_FMT_LOGICOP, - CMD_FMT_TEXWRAP, - CMD_FMT_TEXLEVEL, - CMD_FMT_TEXFILTER, - CMD_FMT_TEXMAPMODE, - CMD_FMT_TEXSHADELS, - CMD_FMT_SHADEMODEL, - CMD_FMT_LIGHTMODE, - CMD_FMT_LIGHTTYPE, - CMD_FMT_CULL, - CMD_FMT_PATCHPRIMITIVE, -}; - enum VertexListCols { VERTEXLIST_COL_X, VERTEXLIST_COL_Y, From 1b27c2713174dc0c1051df3ba93c6db33ff7ff11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Dec 2024 14:52:27 +0100 Subject: [PATCH 4/5] Merge the command metadata from the debugger to GECommandTable --- GPU/Debugger/GECommandTable.cpp | 452 ++++++++++++++++---------------- GPU/Debugger/GECommandTable.h | 3 +- 2 files changed, 229 insertions(+), 226 deletions(-) diff --git a/GPU/Debugger/GECommandTable.cpp b/GPU/Debugger/GECommandTable.cpp index 6c4a3ca8c40c..aa05978be876 100644 --- a/GPU/Debugger/GECommandTable.cpp +++ b/GPU/Debugger/GECommandTable.cpp @@ -26,266 +26,268 @@ struct GECmdAlias { const char *aliases[3]; }; +// TODO: Merge this and State.cpp with GeDisasm. So many representations of the same thing! + static constexpr GECmdInfo geCmdInfo[] = { - { GE_CMD_NOP, "nop", GECmdFormat::NONE }, - { GE_CMD_VADDR, "setvaddr", GECmdFormat::RELATIVE_ADDR }, - { GE_CMD_IADDR, "setiaddr", GECmdFormat::RELATIVE_ADDR }, - { GE_CMD_UNKNOWN_03, "unknown03", GECmdFormat::NONE }, - { GE_CMD_PRIM, "prim", GECmdFormat::PRIM }, - { GE_CMD_BEZIER, "bezier", GECmdFormat::BEZIER }, - { GE_CMD_SPLINE, "spline", GECmdFormat::SPLINE }, - { GE_CMD_BOUNDINGBOX, "btest", GECmdFormat::PRIM }, - { GE_CMD_JUMP, "jump", GECmdFormat::JUMP }, - { GE_CMD_BJUMP, "bjump", GECmdFormat::JUMP }, - { GE_CMD_CALL, "call", GECmdFormat::JUMP }, - { GE_CMD_RET, "ret", GECmdFormat::NONE }, - { GE_CMD_END, "end", GECmdFormat::DATA16 }, - { GE_CMD_UNKNOWN_0D, "unknown0d", GECmdFormat::NONE }, - { GE_CMD_SIGNAL, "signal", GECmdFormat::SIGNAL }, - { GE_CMD_FINISH, "finish", GECmdFormat::NONE }, - { GE_CMD_BASE, "base", GECmdFormat::HIGH_ADDR_ONLY }, - { GE_CMD_UNKNOWN_11, "unknown11", GECmdFormat::NONE }, - { GE_CMD_VERTEXTYPE, "vtype", GECmdFormat::VERTEX_TYPE, CMD_FMT_VERTEXTYPE }, - { GE_CMD_OFFSETADDR, "setoffset", GECmdFormat::OFFSET_ADDR, CMD_FMT_OFFSETADDR }, - { GE_CMD_ORIGIN, "origin", GECmdFormat::NONE }, - { GE_CMD_REGION1, "regionrate", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, GE_CMD_REGION2 }, - { GE_CMD_REGION2, "regionstop", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, }, - { GE_CMD_LIGHTINGENABLE, "lighting_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_LIGHTENABLE0, "light0_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, - { GE_CMD_LIGHTENABLE1, "light1_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, - { GE_CMD_LIGHTENABLE2, "light2_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, - { GE_CMD_LIGHTENABLE3, "light3_on", GECmdFormat::FLAG, CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, - { GE_CMD_DEPTHCLAMPENABLE, "zclamp_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_CULLFACEENABLE, "cull_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_TEXTUREMAPENABLE, "tex_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_FOGENABLE, "fog_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_DITHERENABLE, "dither_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_ALPHABLENDENABLE, "ablend_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_ALPHABLENDENABLE, "atest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_ZTESTENABLE, "ztest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_STENCILTESTENABLE, "stest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_ANTIALIASENABLE, "antialias_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_PATCHCULLENABLE, "patchcull_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_COLORTESTENABLE, "ctest_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_LOGICOPENABLE, "logicop_on", GECmdFormat::FLAG, CMD_FMT_FLAG }, + { GE_CMD_NOP, "nop", GECmdFormat::NONE, "Nop" }, + { GE_CMD_VADDR, "setvaddr", GECmdFormat::RELATIVE_ADDR, "Vertex addr" }, + { GE_CMD_IADDR, "setiaddr", GECmdFormat::RELATIVE_ADDR, "Index addr" }, + { GE_CMD_UNKNOWN_03, "unknown03", GECmdFormat::NONE, "Unknown03" }, + { GE_CMD_PRIM, "prim", GECmdFormat::PRIM, "Prim" }, + { GE_CMD_BEZIER, "bezier", GECmdFormat::BEZIER, "Bezier" }, + { GE_CMD_SPLINE, "spline", GECmdFormat::SPLINE, "Spline" }, + { GE_CMD_BOUNDINGBOX, "btest", GECmdFormat::PRIM, "BBox" }, + { GE_CMD_JUMP, "jump", GECmdFormat::JUMP, "Jump" }, + { GE_CMD_BJUMP, "bjump", GECmdFormat::JUMP, "BJump" }, + { GE_CMD_CALL, "call", GECmdFormat::JUMP, "Call" }, + { GE_CMD_RET, "ret", GECmdFormat::NONE, "Return" }, + { GE_CMD_END, "end", GECmdFormat::DATA16, "End", CMD_FMT_HEX }, + { GE_CMD_UNKNOWN_0D, "unknown0d", GECmdFormat::NONE, "Unknown0D" }, + { GE_CMD_SIGNAL, "signal", GECmdFormat::SIGNAL, "Signal" }, + { GE_CMD_FINISH, "finish", GECmdFormat::NONE, "Finish" }, + { GE_CMD_BASE, "base", GECmdFormat::HIGH_ADDR_ONLY, "Base" }, + { GE_CMD_UNKNOWN_11, "unknown11", GECmdFormat::NONE, "Unknown 11" }, + { GE_CMD_VERTEXTYPE, "vtype", GECmdFormat::VERTEX_TYPE, "Vertex type", CMD_FMT_VERTEXTYPE}, + { GE_CMD_OFFSETADDR, "setoffset", GECmdFormat::OFFSET_ADDR, "Offset addr", CMD_FMT_OFFSETADDR}, + { GE_CMD_ORIGIN, "origin", GECmdFormat::NONE, "Origin" }, + { GE_CMD_REGION1, "regionrate", GECmdFormat::X10_Y10, "Region", CMD_FMT_XYXY, 0, GE_CMD_REGION2}, + { GE_CMD_REGION2, "regionstop", GECmdFormat::X10_Y10, "Region2", CMD_FMT_XYXY, 0 }, + { GE_CMD_LIGHTINGENABLE, "lighting_on", GECmdFormat::FLAG, "Lighting enable", CMD_FMT_FLAG}, + { GE_CMD_LIGHTENABLE0, "light0_on", GECmdFormat::FLAG, "Light 0 enable", CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE1, "light1_on", GECmdFormat::FLAG, "Light 1 enable", CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE2, "light2_on", GECmdFormat::FLAG, "Light 2 enable", CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_LIGHTENABLE3, "light3_on", GECmdFormat::FLAG, "Light 3 enable", CMD_FMT_FLAG, GE_CMD_LIGHTINGENABLE }, + { GE_CMD_DEPTHCLAMPENABLE, "zclamp_on", GECmdFormat::FLAG, "Depth clamp enable", CMD_FMT_FLAG}, + { GE_CMD_CULLFACEENABLE, "cull_on", GECmdFormat::FLAG, "Cullface enable", CMD_FMT_FLAG}, + { GE_CMD_TEXTUREMAPENABLE, "tex_on", GECmdFormat::FLAG, "Texture enable", CMD_FMT_FLAG}, + { GE_CMD_FOGENABLE, "fog_on", GECmdFormat::FLAG, "Fog enable", CMD_FMT_FLAG}, + { GE_CMD_DITHERENABLE, "dither_on", GECmdFormat::FLAG, "Dither enable", CMD_FMT_FLAG}, + { GE_CMD_ALPHABLENDENABLE, "ablend_on", GECmdFormat::FLAG, "Alpha blend enable", CMD_FMT_FLAG}, + { GE_CMD_ALPHATESTENABLE, "atest_on", GECmdFormat::FLAG, "Alpha test enable", CMD_FMT_FLAG}, + { GE_CMD_ZTESTENABLE, "ztest_on", GECmdFormat::FLAG, "Depth test enable", CMD_FMT_FLAG}, + { GE_CMD_STENCILTESTENABLE, "stest_on", GECmdFormat::FLAG, "Stencil test enable", CMD_FMT_FLAG}, + { GE_CMD_ANTIALIASENABLE, "antialias_on", GECmdFormat::FLAG, "Antialias enable", CMD_FMT_FLAG}, + { GE_CMD_PATCHCULLENABLE, "patchcull_on", GECmdFormat::FLAG, "Patch cull enable", CMD_FMT_FLAG}, + { GE_CMD_COLORTESTENABLE, "ctest_on", GECmdFormat::FLAG, "Color test enable", CMD_FMT_FLAG}, + { GE_CMD_LOGICOPENABLE, "logicop_on", GECmdFormat::FLAG, "Logic op enable", CMD_FMT_FLAG}, { GE_CMD_UNKNOWN_29, "unknown29", GECmdFormat::NONE }, - { GE_CMD_BONEMATRIXNUMBER, "bonemtxnum", GECmdFormat::BONE_NUM, CMD_FMT_INTEGER }, - { GE_CMD_BONEMATRIXDATA, "bonemtxdata", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT0, "morph0", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT1, "morph1", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT2, "morph2", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT3, "morph3", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT4, "morph4", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT5, "morph5", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT6, "morph6", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_MORPHWEIGHT7, "morph7", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_UNKNOWN_34, "unknown34", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_35, "unknown35", GECmdFormat::NONE }, - { GE_CMD_PATCHDIVISION, "patchdivision", GECmdFormat::PATCH_DIVISION, CMD_FMT_HEX }, - { GE_CMD_PATCHPRIMITIVE, "patchprim", GECmdFormat::PATCH_PRIM, CMD_FMT_PATCHPRIMITIVE }, - { GE_CMD_PATCHFACING, "patchreversenormals", GECmdFormat::FLAG, CMD_FMT_HEX, GE_CMD_PATCHCULLENABLE }, - { GE_CMD_UNKNOWN_39, "unknown39", GECmdFormat::NONE }, - { GE_CMD_WORLDMATRIXNUMBER, "worldmtxnum", GECmdFormat::MATRIX_NUM }, - { GE_CMD_WORLDMATRIXDATA, "worldmtxdata", GECmdFormat::FLOAT }, - { GE_CMD_VIEWMATRIXNUMBER, "viewmtxnum", GECmdFormat::MATRIX_NUM }, - { GE_CMD_VIEWMATRIXDATA, "viewmtxdata", GECmdFormat::FLOAT }, - { GE_CMD_PROJMATRIXNUMBER, "projmtxnum", GECmdFormat::MATRIX_NUM }, - { GE_CMD_PROJMATRIXDATA, "projmtxdata", GECmdFormat::FLOAT }, - { GE_CMD_TGENMATRIXNUMBER, "texgenmtxnum", GECmdFormat::MATRIX_NUM }, - { GE_CMD_TGENMATRIXDATA, "texgenmtxdata", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTXSCALE, "vpxscale", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYSCALE, GE_CMD_VIEWPORTZSCALE }, + { GE_CMD_BONEMATRIXNUMBER, "bonemtxnum", GECmdFormat::BONE_NUM, "Bone matrix number", CMD_FMT_INTEGER}, + { GE_CMD_BONEMATRIXDATA, "bonemtxdata", GECmdFormat::FLOAT, "Bone matrix data", CMD_FMT_FLOAT24}, + { GE_CMD_MORPHWEIGHT0, "morph0", GECmdFormat::FLOAT, "Morph weight 0", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT1, "morph1", GECmdFormat::FLOAT, "Morph weight 1", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT2, "morph2", GECmdFormat::FLOAT, "Morph weight 2", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT3, "morph3", GECmdFormat::FLOAT, "Morph weight 3", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT4, "morph4", GECmdFormat::FLOAT, "Morph weight 4", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT5, "morph5", GECmdFormat::FLOAT, "Morph weight 5", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT6, "morph6", GECmdFormat::FLOAT, "Morph weight 6", CMD_FMT_FLOAT24 }, + { GE_CMD_MORPHWEIGHT7, "morph7", GECmdFormat::FLOAT, "Morph weight 7", CMD_FMT_FLOAT24 }, + { GE_CMD_UNKNOWN_34, "unknown34", GECmdFormat::NONE, "Unknown34" }, + { GE_CMD_UNKNOWN_35, "unknown35", GECmdFormat::NONE, "Unknown35" }, + { GE_CMD_PATCHDIVISION, "patchdivision", GECmdFormat::PATCH_DIVISION, "Patch division", CMD_FMT_HEX }, + { GE_CMD_PATCHPRIMITIVE, "patchprim", GECmdFormat::PATCH_PRIM, "Patch primitive", CMD_FMT_PATCHPRIMITIVE }, + { GE_CMD_PATCHFACING, "patchreversenormals", GECmdFormat::FLAG, "Patch facing", CMD_FMT_HEX, GE_CMD_PATCHCULLENABLE }, + { GE_CMD_UNKNOWN_39, "unknown39", GECmdFormat::NONE, "Unknown39" }, + { GE_CMD_WORLDMATRIXNUMBER, "worldmtxnum", GECmdFormat::MATRIX_NUM, "World matrix number" }, + { GE_CMD_WORLDMATRIXDATA, "worldmtxdata", GECmdFormat::FLOAT, "World matrix data" }, + { GE_CMD_VIEWMATRIXNUMBER, "viewmtxnum", GECmdFormat::MATRIX_NUM, "View matrix number"}, + { GE_CMD_VIEWMATRIXDATA, "viewmtxdata", GECmdFormat::FLOAT, "View matrix data" }, + { GE_CMD_PROJMATRIXNUMBER, "projmtxnum", GECmdFormat::MATRIX_NUM, "Proj matrix number" }, + { GE_CMD_PROJMATRIXDATA, "projmtxdata", GECmdFormat::FLOAT, "Proj matrix data" }, + { GE_CMD_TGENMATRIXNUMBER, "texgenmtxnum", GECmdFormat::MATRIX_NUM, "Texgen matrix number" }, + { GE_CMD_TGENMATRIXDATA, "texgenmtxdata", GECmdFormat::FLOAT, "Texgen matrix data" }, + { GE_CMD_VIEWPORTXSCALE, "vpxscale", GECmdFormat::FLOAT, "Viewport Scale", CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYSCALE, GE_CMD_VIEWPORTZSCALE}, { GE_CMD_VIEWPORTYSCALE, "vpyscale", GECmdFormat::FLOAT }, { GE_CMD_VIEWPORTZSCALE, "vpzscale", GECmdFormat::FLOAT }, - { GE_CMD_VIEWPORTXCENTER, "vpxcenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, - { GE_CMD_VIEWPORTYCENTER, "vpycenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, - { GE_CMD_VIEWPORTZCENTER, "vpzcenter", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, - { GE_CMD_TEXSCALEU, "texscaleu", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSCALEV, "texscalev", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXOFFSETU, "texoffsetu", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXOFFSETV, "texoffsetv", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_OFFSETX, "offsetx", GECmdFormat::SUBPIXEL_COORD, CMD_FMT_F16_XY, 0, GE_CMD_OFFSETY }, + { GE_CMD_VIEWPORTXCENTER, "vpxcenter", GECmdFormat::FLOAT, "Viewport Offset", CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER}, + { GE_CMD_VIEWPORTYCENTER, "vpycenter", GECmdFormat::FLOAT }, + { GE_CMD_VIEWPORTZCENTER, "vpzcenter", GECmdFormat::FLOAT }, + { GE_CMD_TEXSCALEU, "texscaleu", GECmdFormat::FLOAT, "Tex scale U", CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXSCALEV, "texscalev", GECmdFormat::FLOAT, "Tex scale V", CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXOFFSETU, "texoffsetu", GECmdFormat::FLOAT, "Tex offset U", CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXOFFSETV, "texoffsetv", GECmdFormat::FLOAT, "Tex offset V", CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_OFFSETX, "offsetx", GECmdFormat::SUBPIXEL_COORD, "Offset", CMD_FMT_F16_XY, 0, GE_CMD_OFFSETY}, { GE_CMD_OFFSETY, "offsety", GECmdFormat::SUBPIXEL_COORD }, - { GE_CMD_UNKNOWN_4E, "unknown4e", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_4F, "unknown4f", GECmdFormat::NONE }, + { GE_CMD_UNKNOWN_4E, "unknown4e", GECmdFormat::NONE, "Unknown4e" }, + { GE_CMD_UNKNOWN_4F, "unknown4f", GECmdFormat::NONE, "Unknown4f" }, // Really shade mode, but using gouraud as the default so it can be 1/0. - { GE_CMD_SHADEMODE, "gouraud", GECmdFormat::FLAG, CMD_FMT_SHADEMODEL }, - { GE_CMD_REVERSENORMAL, "reversenormals", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_UNKNOWN_52, "unknown52", GECmdFormat::NONE }, - { GE_CMD_MATERIALUPDATE, "materialupdate", GECmdFormat::MATERIAL_UPDATE, CMD_FMT_MATERIALUPDATE }, - { GE_CMD_MATERIALEMISSIVE, "materialemissive", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_MATERIALAMBIENT, "materialambient", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_MATERIALDIFFUSE, "materialdiffuse", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_MATERIALSPECULAR, "materialspecular", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_MATERIALALPHA, "materialambienta", GECmdFormat::DATA8, CMD_FMT_HEX8 }, - { GE_CMD_UNKNOWN_59, "unknown59", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_5A, "unknown5a", GECmdFormat::NONE }, - { GE_CMD_MATERIALSPECULARCOEF, "specularcoef", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_AMBIENTCOLOR, "ambient", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_AMBIENTALPHA, "ambienta", GECmdFormat::DATA8, CMD_FMT_HEX }, - { GE_CMD_LIGHTMODE, "lightseparate", GECmdFormat::FLAG, CMD_FMT_LIGHTMODE, GE_CMD_LIGHTINGENABLE }, - { GE_CMD_LIGHTTYPE0, "ltype0", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LIGHTTYPE1, "ltype1", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LIGHTTYPE2, "ltype2", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LIGHTTYPE3, "ltype3", GECmdFormat::LIGHT_TYPE, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_LX0, "light0posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LY0, GE_CMD_LZ0 }, + { GE_CMD_SHADEMODE, "gouraud", GECmdFormat::FLAG, "Shade model", CMD_FMT_SHADEMODEL}, + { GE_CMD_REVERSENORMAL, "reversenormals", GECmdFormat::FLAG, "Reverse normals", CMD_FMT_FLAG}, + { GE_CMD_UNKNOWN_52, "unknown52", GECmdFormat::NONE, "Unknown52" }, + { GE_CMD_MATERIALUPDATE, "materialupdate", GECmdFormat::MATERIAL_UPDATE, "Material update", CMD_FMT_MATERIALUPDATE}, + { GE_CMD_MATERIALEMISSIVE, "materialemissive", GECmdFormat::RGB, "Material emissive", CMD_FMT_HEX}, + { GE_CMD_MATERIALAMBIENT, "materialambient", GECmdFormat::RGB, "Material ambient", CMD_FMT_HEX}, + { GE_CMD_MATERIALDIFFUSE, "materialdiffuse", GECmdFormat::RGB, "Material diffuse", CMD_FMT_HEX}, + { GE_CMD_MATERIALSPECULAR, "materialspecular", GECmdFormat::RGB, "Material specular", CMD_FMT_HEX}, + { GE_CMD_MATERIALALPHA, "materialambienta", GECmdFormat::DATA8, "Material amb. alpha", CMD_FMT_HEX8}, + { GE_CMD_UNKNOWN_59, "unknown59", GECmdFormat::NONE, "Unknown59"}, + { GE_CMD_UNKNOWN_5A, "unknown5a", GECmdFormat::NONE, "Unknown5a"}, + { GE_CMD_MATERIALSPECULARCOEF, "specularcoef", GECmdFormat::FLOAT, "Specular coef", CMD_FMT_FLOAT24}, + { GE_CMD_AMBIENTCOLOR, "ambient", GECmdFormat::RGB, "Ambient color", CMD_FMT_HEX}, + { GE_CMD_AMBIENTALPHA, "ambienta", GECmdFormat::DATA8, "Ambient alpha", CMD_FMT_HEX}, + { GE_CMD_LIGHTMODE, "lightseparate", GECmdFormat::FLAG, "Light mode", CMD_FMT_LIGHTMODE, GE_CMD_LIGHTINGENABLE}, // or separate specular + { GE_CMD_LIGHTTYPE0, "ltype0", GECmdFormat::LIGHT_TYPE, "Light type 0", CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LIGHTTYPE1, "ltype1", GECmdFormat::LIGHT_TYPE, "Light type 1", CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LIGHTTYPE2, "ltype2", GECmdFormat::LIGHT_TYPE, "Light type 2", CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LIGHTTYPE3, "ltype3", GECmdFormat::LIGHT_TYPE, "Light type 3", CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LX0, "light0posx", GECmdFormat::FLOAT, "Light pos 0", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LY0, GE_CMD_LZ0 }, { GE_CMD_LY0, "light0posy", GECmdFormat::FLOAT }, { GE_CMD_LZ0, "light0posz", GECmdFormat::FLOAT }, - { GE_CMD_LX1, "light1posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LY1, GE_CMD_LZ1 }, + { GE_CMD_LX1, "light1posx", GECmdFormat::FLOAT, "Light pos 1", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LY1, GE_CMD_LZ1 }, { GE_CMD_LY1, "light1posy", GECmdFormat::FLOAT }, { GE_CMD_LZ1, "light1posz", GECmdFormat::FLOAT }, - { GE_CMD_LX2, "light2posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LY2, GE_CMD_LZ2 }, + { GE_CMD_LX2, "light2posx", GECmdFormat::FLOAT, "Light pos 2", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LY2, GE_CMD_LZ2 }, { GE_CMD_LY2, "light2posy", GECmdFormat::FLOAT }, { GE_CMD_LZ2, "light2posz", GECmdFormat::FLOAT }, - { GE_CMD_LX3, "light3posx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LY3, GE_CMD_LZ3 }, + { GE_CMD_LX3, "light3posx", GECmdFormat::FLOAT, "Light pos 3", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LY3, GE_CMD_LZ3 }, { GE_CMD_LY3, "light3posy", GECmdFormat::FLOAT }, { GE_CMD_LZ3, "light3posz", GECmdFormat::FLOAT }, - { GE_CMD_LDX0, "light0dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LDY0, GE_CMD_LDZ0 }, + { GE_CMD_LDX0, "light0dirx", GECmdFormat::FLOAT, "Light dir 0", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LDY0, GE_CMD_LDZ0 }, { GE_CMD_LDY0, "light0diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ0, "light0dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX1, "light1dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LDY1, GE_CMD_LDZ1 }, + { GE_CMD_LDX1, "light1dirx", GECmdFormat::FLOAT, "Light dir 1", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LDY1, GE_CMD_LDZ1 }, { GE_CMD_LDY1, "light1diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ1, "light1dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX2, "light2dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LDY2, GE_CMD_LDZ2 }, + { GE_CMD_LDX2, "light2dirx", GECmdFormat::FLOAT, "Light dir 2", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LDY2, GE_CMD_LDZ2 }, { GE_CMD_LDY2, "light2diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ2, "light2dirz", GECmdFormat::FLOAT }, - { GE_CMD_LDX3, "light3dirx", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LDY3, GE_CMD_LDZ3 }, + { GE_CMD_LDX3, "light3dirx", GECmdFormat::FLOAT, "Light dir 3", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LDY3, GE_CMD_LDZ3 }, { GE_CMD_LDY3, "light3diry", GECmdFormat::FLOAT }, { GE_CMD_LDZ3, "light3dirz", GECmdFormat::FLOAT }, - { GE_CMD_LKA0, "light0attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LKB0, GE_CMD_LKC0 }, + { GE_CMD_LKA0, "light0attpow0", GECmdFormat::FLOAT, "Light att 0", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LKB0, GE_CMD_LKC0 }, { GE_CMD_LKB0, "light0attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC0, "light0attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA1, "light1attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LKB1, GE_CMD_LKC1 }, + { GE_CMD_LKA1, "light1attpow0", GECmdFormat::FLOAT, "Light att 1", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LKB1, GE_CMD_LKC1 }, { GE_CMD_LKB1, "light1attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC1, "light1attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA2, "light2attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LKB2, GE_CMD_LKC2 }, + { GE_CMD_LKA2, "light2attpow0", GECmdFormat::FLOAT, "Light att 2", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LKB2, GE_CMD_LKC2 }, { GE_CMD_LKB2, "light2attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC2, "light2attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKA3, "light3attpow0", GECmdFormat::FLOAT, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LKB3, GE_CMD_LKC3 }, + { GE_CMD_LKA3, "light3attpow0", GECmdFormat::FLOAT, "Light att 3", CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LKB3, GE_CMD_LKC3 }, { GE_CMD_LKB3, "light3attpow1", GECmdFormat::FLOAT }, { GE_CMD_LKC3, "light3attpow2", GECmdFormat::FLOAT }, - { GE_CMD_LKS0, "light0spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LKS1, "light1spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LKS2, "light2spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LKS3, "light3spotexp", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_LKO0, "light0spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LKO1, "light1spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LKO2, "light2spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LKO3, "light3spotcutoff", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_LAC0, "light0ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LDC0, "light0diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LSC0, "light0specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { GE_CMD_LAC1, "light1ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LDC1, "light1diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LSC1, "light1specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { GE_CMD_LAC2, "light2ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LDC2, "light2diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LSC2, "light2specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { GE_CMD_LAC3, "light3ambient", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_LDC3, "light3diffuse", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_LSC3, "light3specular", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, - { GE_CMD_CULL, "cullccw", GECmdFormat::FLAG, CMD_FMT_FLAG, CMD_FMT_CULL, GE_CMD_CULLFACEENABLE }, - { GE_CMD_FRAMEBUFPTR, "fbptr", GECmdFormat::LOW_ADDR_ONLY, CMD_FMT_PTRWIDTH, 0, GE_CMD_FRAMEBUFWIDTH }, - { GE_CMD_FRAMEBUFWIDTH, "fbstride", GECmdFormat::STRIDE }, - { GE_CMD_ZBUFPTR, "zbptr", GECmdFormat::LOW_ADDR_ONLY, CMD_FMT_PTRWIDTH, 0, GE_CMD_ZBUFWIDTH }, - { GE_CMD_ZBUFWIDTH, "zbstride", GECmdFormat::STRIDE }, - { GE_CMD_TEXADDR0, "texaddr0low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH0 }, - { GE_CMD_TEXADDR1, "texaddr1low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH1 }, - { GE_CMD_TEXADDR2, "texaddr2low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH2 }, - { GE_CMD_TEXADDR3, "texaddr3low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH3 }, - { GE_CMD_TEXADDR4, "texaddr4low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH4 }, - { GE_CMD_TEXADDR5, "texaddr5low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH5 }, - { GE_CMD_TEXADDR6, "texaddr6low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH6 }, - { GE_CMD_TEXADDR7, "texaddr7low", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH7 }, - { GE_CMD_TEXBUFWIDTH0, "texbufw0", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH1, "texbufw1", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH2, "texbufw2", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH3, "texbufw3", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH4, "texbufw4", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH5, "texbufw5", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH6, "texbufw6", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TEXBUFWIDTH7, "texbufw7", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_CLUTADDR, "clutaddrlow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_CLUTADDRUPPER }, + { GE_CMD_LKS0, "light0spotexp", GECmdFormat::FLOAT, "Light spec. exp 0", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LKS1, "light1spotexp", GECmdFormat::FLOAT, "Light spec. exp 1", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LKS2, "light2spotexp", GECmdFormat::FLOAT, "Light spec. exp 2", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LKS3, "light3spotexp", GECmdFormat::FLOAT, "Light spec. exp 3", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LKO0, "light0spotcutoff", GECmdFormat::FLOAT, "Spotlight cutoff 0", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, + { GE_CMD_LKO1, "light1spotcutoff", GECmdFormat::FLOAT, "Spotlight cutoff 1", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LKO2, "light2spotcutoff", GECmdFormat::FLOAT, "Spotlight cutoff 2", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LKO3, "light3spotcutoff", GECmdFormat::FLOAT, "Spotlight cutoff 3", CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LAC0, "light0ambient", GECmdFormat::RGB, "Light ambient 0", CMD_FMT_HEX, GE_CMD_LIGHTENABLE0}, + { GE_CMD_LDC0, "light0diffuse", GECmdFormat::RGB, "Light diffuse 0", CMD_FMT_HEX, GE_CMD_LIGHTENABLE0}, + { GE_CMD_LSC0, "light0specular", GECmdFormat::RGB, "Light specular 0", CMD_FMT_HEX, GE_CMD_LIGHTENABLE0}, + { GE_CMD_LAC1, "light1ambient", GECmdFormat::RGB, "Light ambient 1", CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LDC1, "light1diffuse", GECmdFormat::RGB, "Light diffuse 1", CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LSC1, "light1specular", GECmdFormat::RGB, "Light specular 1", CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, + { GE_CMD_LAC2, "light2ambient", GECmdFormat::RGB, "Light ambient 2", CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LDC2, "light2diffuse", GECmdFormat::RGB, "Light diffuse 2", CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LSC2, "light2specular", GECmdFormat::RGB, "Light specular 2", CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, + { GE_CMD_LAC3, "light3ambient", GECmdFormat::RGB, "Light ambient 3", CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LDC3, "light3diffuse", GECmdFormat::RGB, "Light diffuse 3", CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_LSC3, "light3specular", GECmdFormat::RGB, "Light specular 3", CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, + { GE_CMD_CULL, "cullccw", GECmdFormat::FLAG, "Cull mode", CMD_FMT_FLAG, CMD_FMT_CULL, GE_CMD_CULLFACEENABLE}, + { GE_CMD_FRAMEBUFPTR, "fbptr", GECmdFormat::LOW_ADDR_ONLY, "Framebuffer", CMD_FMT_PTRWIDTH, 0, GE_CMD_FRAMEBUFWIDTH}, + { GE_CMD_FRAMEBUFWIDTH, "fbstride", GECmdFormat::STRIDE, "Framebuffer stride" }, + { GE_CMD_ZBUFPTR, "zbptr", GECmdFormat::LOW_ADDR_ONLY, "Depth buffer", CMD_FMT_PTRWIDTH, 0, GE_CMD_ZBUFWIDTH}, + { GE_CMD_ZBUFWIDTH, "zbstride", GECmdFormat::STRIDE, "Depth buffer stride" }, + { GE_CMD_TEXADDR0, "texaddr0low", GECmdFormat::LOW_ADDR, "Texture addr 0", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH0 }, + { GE_CMD_TEXADDR1, "texaddr1low", GECmdFormat::LOW_ADDR, "Texture addr 1", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH1 }, + { GE_CMD_TEXADDR2, "texaddr2low", GECmdFormat::LOW_ADDR, "Texture addr 2", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH2 }, + { GE_CMD_TEXADDR3, "texaddr3low", GECmdFormat::LOW_ADDR, "Texture addr 3", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH3 }, + { GE_CMD_TEXADDR4, "texaddr4low", GECmdFormat::LOW_ADDR, "Texture addr 4", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH4 }, + { GE_CMD_TEXADDR5, "texaddr5low", GECmdFormat::LOW_ADDR, "Texture addr 5", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH5 }, + { GE_CMD_TEXADDR6, "texaddr6low", GECmdFormat::LOW_ADDR, "Texture addr 6", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH6 }, + { GE_CMD_TEXADDR7, "texaddr7low", GECmdFormat::LOW_ADDR, "Texture addr 7", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH7 }, + { GE_CMD_TEXBUFWIDTH0, "texbufw0", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 0" }, + { GE_CMD_TEXBUFWIDTH1, "texbufw1", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 1" }, + { GE_CMD_TEXBUFWIDTH2, "texbufw2", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 2" }, + { GE_CMD_TEXBUFWIDTH3, "texbufw3", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 3" }, + { GE_CMD_TEXBUFWIDTH4, "texbufw4", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 4" }, + { GE_CMD_TEXBUFWIDTH5, "texbufw5", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 5" }, + { GE_CMD_TEXBUFWIDTH6, "texbufw6", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 6" }, + { GE_CMD_TEXBUFWIDTH7, "texbufw7", GECmdFormat::STRIDE_HIGH_ADDR, "Texture bufw 7" }, + { GE_CMD_CLUTADDR, "clutaddrlow", GECmdFormat::LOW_ADDR, "Tex CLUT", CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_CLUTADDRUPPER}, { GE_CMD_CLUTADDRUPPER, "clutaddrhigh", GECmdFormat::HIGH_ADDR }, - { GE_CMD_TRANSFERSRC, "transfersrclow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERSRCW }, + { GE_CMD_TRANSFERSRC, "transfersrclow", GECmdFormat::LOW_ADDR, "Transfer src", CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERSRCW}, { GE_CMD_TRANSFERSRCW, "transfersrcstride", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_TRANSFERDST, "transferdstlow", GECmdFormat::LOW_ADDR, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERDSTW }, + { GE_CMD_TRANSFERDST, "transferdstlow", GECmdFormat::LOW_ADDR, "Transfer dst", CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERDSTW}, { GE_CMD_TRANSFERDSTW, "transferdststride", GECmdFormat::STRIDE_HIGH_ADDR }, - { GE_CMD_UNKNOWN_B6, "unknownb6", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_B7, "unknownb7", GECmdFormat::NONE }, - { GE_CMD_TEXSIZE0, "texsize0", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE1, "texsize1", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE2, "texsize2", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE3, "texsize3", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE4, "texsize4", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE5, "texsize5", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE6, "texsize6", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSIZE7, "texsize7", GECmdFormat::TEX_SIZE, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXMAPMODE, "texmapmode", GECmdFormat::TEX_MAP_MODE, CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXSHADELS, "texlightsrc", GECmdFormat::TEX_LIGHT_SRC, CMD_FMT_TEXSHADELS, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXMODE, "texmode", GECmdFormat::TEX_MODE, CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXFORMAT, "texformat", GECmdFormat::TEX_FORMAT, CMD_FMT_TEXFMT, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_LOADCLUT, "loadclut", GECmdFormat::CLUT_BLOCKS }, - { GE_CMD_CLUTFORMAT, "clutformat", GECmdFormat::CLUT_FORMAT, CMD_FMT_CLUTFMT, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXFILTER, "texfilter", GECmdFormat::TEX_FILTER, CMD_FMT_TEXFILTER, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXWRAP, "texclamp", GECmdFormat::TEX_CLAMP, CMD_FMT_TEXWRAP, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXLEVEL, "texlevelmode", GECmdFormat::TEX_LEVEL_MODE, CMD_FMT_TEXLEVEL, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXFUNC, "texfunc", GECmdFormat::TEX_FUNC, CMD_FMT_TEXFUNC, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXENVCOLOR, "texenv", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_TEXFLUSH, "texflush", GECmdFormat::NONE }, - { GE_CMD_TEXSYNC, "texsync", GECmdFormat::NONE }, - { GE_CMD_FOG1, "fogend", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, - { GE_CMD_FOG2, "fogslope", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, - { GE_CMD_FOGCOLOR, "fogcolor", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_FOGENABLE, }, - { GE_CMD_TEXLODSLOPE, "texlodslope", GECmdFormat::FLOAT, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { GE_CMD_UNKNOWN_D1, "unknownd1", GECmdFormat::NONE }, - { GE_CMD_FRAMEBUFPIXFORMAT, "fbformat", GECmdFormat::TEX_FORMAT, CMD_FMT_TEXFMT }, - { GE_CMD_CLEARMODE, "clearmode", GECmdFormat::CLEAR_MODE, CMD_FMT_CLEARMODE }, - { GE_CMD_SCISSOR1, "scissor1", GECmdFormat::X10_Y10, CMD_FMT_XYXY, 0, GE_CMD_SCISSOR2 }, - { GE_CMD_SCISSOR2, "scissor2", GECmdFormat::X10_Y10 }, - { GE_CMD_MINZ, "minz", GECmdFormat::DATA16, CMD_FMT_HEX }, - { GE_CMD_MAXZ, "maxz", GECmdFormat::DATA16, CMD_FMT_HEX }, - { GE_CMD_COLORTEST, "ctestfunc", GECmdFormat::COLOR_TEST_FUNC, CMD_FMT_COLORTEST, GE_CMD_COLORTESTENABLE, GE_CMD_COLORREF, GE_CMD_COLORTESTMASK }, - { GE_CMD_COLORREF, "ctestref", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_COLORTESTMASK, "ctestmask", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_ALPHATEST, "atest", GECmdFormat::ALPHA_TEST, CMD_FMT_ALPHATEST, GE_CMD_ALPHATESTENABLE }, - { GE_CMD_STENCILTEST, "stest", GECmdFormat::ALPHA_TEST, CMD_FMT_STENCILTEST, GE_CMD_STENCILTESTENABLE }, - { GE_CMD_STENCILOP, "stencilop", GECmdFormat::STENCIL_OP, CMD_FMT_STENCILOP, GE_CMD_STENCILTESTENABLE }, - { GE_CMD_ZTEST, "ztest", GECmdFormat::DEPTH_TEST_FUNC, CMD_FMT_ZTEST, GE_CMD_ZTESTENABLE }, - { GE_CMD_BLENDMODE, "blendmode", GECmdFormat::BLEND_MODE, CMD_FMT_BLENDMODE, GE_CMD_ALPHABLENDENABLE }, - { GE_CMD_BLENDFIXEDA, "blendfixa", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, - { GE_CMD_BLENDFIXEDB, "blendfixb", GECmdFormat::RGB, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, - { GE_CMD_DITH0, "dither0", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { GE_CMD_DITH1, "dither1", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { GE_CMD_DITH2, "dither2", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { GE_CMD_DITH3, "dither3", GECmdFormat::DITHER_ROW, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { GE_CMD_LOGICOP, "logicop", GECmdFormat::LOGIC_OP, CMD_FMT_LOGICOP, GE_CMD_LOGICOPENABLE }, - { GE_CMD_ZWRITEDISABLE, "zwrite_off", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_MASKRGB, "rgbmask_block", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_MASKALPHA, "swritemask_block", GECmdFormat::DATA8, CMD_FMT_HEX8 }, - { GE_CMD_TRANSFERSTART, "transferstart_bpp", GECmdFormat::FLAG, CMD_FMT_FLAG }, - { GE_CMD_TRANSFERSRCPOS, "transfersrcpos", GECmdFormat::X10_Y10, CMD_FMT_XY }, - { GE_CMD_TRANSFERDSTPOS, "transferdstpos", GECmdFormat::X10_Y10, CMD_FMT_XY }, - { GE_CMD_UNKNOWN_ED, "unknowned", GECmdFormat::NONE }, - { GE_CMD_TRANSFERSIZE, "transfersize", GECmdFormat::X10_Y10, CMD_FMT_XY }, - { GE_CMD_UNKNOWN_EF, "unknownef", GECmdFormat::NONE }, - { GE_CMD_VSCX, "immx", GECmdFormat::SUBPIXEL_COORD, CMD_FMT_F16_XY, 0, GE_CMD_VSCY }, - { GE_CMD_VSCY, "immy", GECmdFormat::SUBPIXEL_COORD }, - { GE_CMD_VSCZ, "immz", GECmdFormat::DATA16, CMD_FMT_HEX }, - { GE_CMD_VTCS, "imms", GECmdFormat::FLOAT, CMD_FMT_XYZ, 0, GE_CMD_VTCT, GE_CMD_VTCQ }, - { GE_CMD_VTCT, "immt", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_VTCQ, "immq", GECmdFormat::FLOAT, CMD_FMT_FLOAT24 }, - { GE_CMD_VCV, "immrgb", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_VAP, "imma_prim", GECmdFormat::ALPHA_PRIM, CMD_FMT_HEX }, // TODO: format? - { GE_CMD_VFC, "immfog", GECmdFormat::DATA8, CMD_FMT_HEX8 }, - { GE_CMD_VSCV, "immrgb1", GECmdFormat::RGB, CMD_FMT_HEX }, - { GE_CMD_UNKNOWN_FA, "unknownfa", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_FB, "unknownfb", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_FC, "unknownfc", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_FD, "unknownfd", GECmdFormat::NONE }, - { GE_CMD_UNKNOWN_FE, "unknownfe", GECmdFormat::NONE }, - { GE_CMD_NOP_FF, "nopff", GECmdFormat::NONE }, + { GE_CMD_UNKNOWN_B6, "unknownb6", GECmdFormat::NONE, "UnknownB6" }, + { GE_CMD_UNKNOWN_B7, "unknownb7", GECmdFormat::NONE, "UnknownB7" }, + { GE_CMD_TEXSIZE0, "texsize0", GECmdFormat::TEX_SIZE, "Tex size 0", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE1, "texsize1", GECmdFormat::TEX_SIZE, "Tex size 1", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE2, "texsize2", GECmdFormat::TEX_SIZE, "Tex size 2", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE3, "texsize3", GECmdFormat::TEX_SIZE, "Tex size 3", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE4, "texsize4", GECmdFormat::TEX_SIZE, "Tex size 4", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE5, "texsize5", GECmdFormat::TEX_SIZE, "Tex size 5", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE6, "texsize6", GECmdFormat::TEX_SIZE, "Tex size 6", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXSIZE7, "texsize7", GECmdFormat::TEX_SIZE, "Tex size 7", CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, + { GE_CMD_TEXMAPMODE, "texmapmode", GECmdFormat::TEX_MAP_MODE, "Tex mapping mode", CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXSHADELS, "texlightsrc", GECmdFormat::TEX_LIGHT_SRC, "Tex shade srcs", CMD_FMT_TEXSHADELS, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXMODE, "texmode", GECmdFormat::TEX_MODE, "Tex mode", CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXFORMAT, "texformat", GECmdFormat::TEX_FORMAT, "Tex format", CMD_FMT_TEXFMT, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_LOADCLUT, "loadclut", GECmdFormat::CLUT_BLOCKS, "Load CLUT" }, + { GE_CMD_CLUTFORMAT, "clutformat", GECmdFormat::CLUT_FORMAT, "CLUT format", CMD_FMT_CLUTFMT, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXFILTER, "texfilter", GECmdFormat::TEX_FILTER, "Tex filter", CMD_FMT_TEXFILTER, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXWRAP, "texclamp", GECmdFormat::TEX_CLAMP, "Tex wrap mode", CMD_FMT_TEXWRAP, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXLEVEL, "texlevelmode", GECmdFormat::TEX_LEVEL_MODE, "Tex mip level mode", CMD_FMT_TEXLEVEL, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXFUNC, "texfunc", GECmdFormat::TEX_FUNC, "Tex func", CMD_FMT_TEXFUNC, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXENVCOLOR, "texenv", GECmdFormat::RGB, "Tex env color", CMD_FMT_HEX, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_TEXFLUSH, "texflush", GECmdFormat::NONE, "Tex flush", }, + { GE_CMD_TEXSYNC, "texsync", GECmdFormat::NONE, "Tex sync" }, + { GE_CMD_FOG1, "fogend", GECmdFormat::FLOAT, "Fog end", CMD_FMT_FLOAT24, GE_CMD_FOGENABLE}, + { GE_CMD_FOG2, "fogslope", GECmdFormat::FLOAT, "Fog slope", CMD_FMT_FLOAT24, GE_CMD_FOGENABLE}, + { GE_CMD_FOGCOLOR, "fogcolor", GECmdFormat::RGB, "Fog color", CMD_FMT_HEX, GE_CMD_FOGENABLE,}, + { GE_CMD_TEXLODSLOPE, "texlodslope", GECmdFormat::FLOAT, "Tex lod slope", CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE}, + { GE_CMD_UNKNOWN_D1, "unknownd1", GECmdFormat::NONE, "UnknownD1" }, + { GE_CMD_FRAMEBUFPIXFORMAT, "fbformat", GECmdFormat::TEX_FORMAT, "Framebuffer format", CMD_FMT_TEXFMT}, + { GE_CMD_CLEARMODE, "clearmode", GECmdFormat::CLEAR_MODE, "Clear mode", CMD_FMT_CLEARMODE}, + { GE_CMD_SCISSOR1, "scissor1", GECmdFormat::X10_Y10, "Scissor rectangle", CMD_FMT_XYXY, 0, GE_CMD_SCISSOR2}, + { GE_CMD_SCISSOR2, "scissor2", GECmdFormat::X10_Y10, "Scissor2", }, + { GE_CMD_MINZ, "minz", GECmdFormat::DATA16, "Min Z", CMD_FMT_HEX}, + { GE_CMD_MAXZ, "maxz", GECmdFormat::DATA16, "Max Z", CMD_FMT_HEX}, + { GE_CMD_COLORTEST, "ctestfunc", GECmdFormat::COLOR_TEST_FUNC, "Color test", CMD_FMT_COLORTEST, GE_CMD_COLORTESTENABLE, GE_CMD_COLORREF, GE_CMD_COLORTESTMASK}, + { GE_CMD_COLORREF, "ctestref", GECmdFormat::RGB, "Color test ref", CMD_FMT_HEX, }, + { GE_CMD_COLORTESTMASK, "ctestmask", GECmdFormat::RGB, "Color test mask", CMD_FMT_HEX}, + { GE_CMD_ALPHATEST, "atest", GECmdFormat::ALPHA_TEST, "Alpha test mask", CMD_FMT_ALPHATEST, GE_CMD_ALPHATESTENABLE}, + { GE_CMD_STENCILTEST, "stest", GECmdFormat::ALPHA_TEST, "Stencil test", CMD_FMT_STENCILTEST, GE_CMD_STENCILTESTENABLE}, + { GE_CMD_STENCILOP, "stencilop", GECmdFormat::STENCIL_OP, "Stencil op", CMD_FMT_STENCILOP, GE_CMD_STENCILTESTENABLE}, + { GE_CMD_ZTEST, "ztest", GECmdFormat::DEPTH_TEST_FUNC, "Depth test", CMD_FMT_ZTEST, GE_CMD_ZTESTENABLE}, + { GE_CMD_BLENDMODE, "blendmode", GECmdFormat::BLEND_MODE, "Blend mode", CMD_FMT_BLENDMODE, GE_CMD_ALPHABLENDENABLE}, + { GE_CMD_BLENDFIXEDA, "blendfixa", GECmdFormat::RGB, "Blend color A", CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE}, + { GE_CMD_BLENDFIXEDB, "blendfixb", GECmdFormat::RGB, "Blend color B", CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, + { GE_CMD_DITH0, "dither0", GECmdFormat::DITHER_ROW, "Dither pattern 0", CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH1, "dither1", GECmdFormat::DITHER_ROW, "Dither pattern 1", CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH2, "dither2", GECmdFormat::DITHER_ROW, "Dither pattern 2", CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_DITH3, "dither3", GECmdFormat::DITHER_ROW, "Dither pattern 3", CMD_FMT_HEX, GE_CMD_DITHERENABLE }, + { GE_CMD_LOGICOP, "logicop", GECmdFormat::LOGIC_OP, "Logic op", CMD_FMT_LOGICOP, GE_CMD_LOGICOPENABLE}, + { GE_CMD_ZWRITEDISABLE, "zwrite_off", GECmdFormat::FLAG, "Z write disable", CMD_FMT_FLAG, GE_CMD_ZTESTENABLE}, + { GE_CMD_MASKRGB, "rgbmask_block", GECmdFormat::RGB, "Mask RGB", CMD_FMT_HEX}, + { GE_CMD_MASKALPHA, "swritemask_block", GECmdFormat::DATA8, "Mask alpha", CMD_FMT_HEX8}, + { GE_CMD_TRANSFERSTART, "transferstart_bpp", GECmdFormat::FLAG, "Transfer start", CMD_FMT_FLAG}, + { GE_CMD_TRANSFERSRCPOS, "transfersrcpos", GECmdFormat::X10_Y10, "Transfer src pos", CMD_FMT_XY}, + { GE_CMD_TRANSFERDSTPOS, "transferdstpos", GECmdFormat::X10_Y10, "Transfer dst pos", CMD_FMT_XY}, + { GE_CMD_UNKNOWN_ED, "unknowned", GECmdFormat::NONE, "UnknownED" }, + { GE_CMD_TRANSFERSIZE, "transfersize", GECmdFormat::X10_Y10, "Transfer size", CMD_FMT_XY}, + { GE_CMD_UNKNOWN_EF, "unknownef", GECmdFormat::NONE, "UnknownEF" }, + { GE_CMD_VSCX, "immx", GECmdFormat::SUBPIXEL_COORD, "Imm vertex XY", CMD_FMT_F16_XY, 0, GE_CMD_VSCY}, + { GE_CMD_VSCY, "immy", GECmdFormat::SUBPIXEL_COORD, "Imm vertex Y" }, + { GE_CMD_VSCZ, "immz", GECmdFormat::DATA16, "Imm vertex Z", CMD_FMT_HEX}, + { GE_CMD_VTCS, "imms", GECmdFormat::FLOAT, "Imm vertex STQ", CMD_FMT_XYZ, 0, GE_CMD_VTCT, GE_CMD_VTCQ}, + { GE_CMD_VTCT, "immt", GECmdFormat::FLOAT, "Imm vertex T", CMD_FMT_FLOAT24 }, + { GE_CMD_VTCQ, "immq", GECmdFormat::FLOAT, "Imm vertex Q", CMD_FMT_FLOAT24 }, + { GE_CMD_VCV, "immrgb", GECmdFormat::RGB, "Imm vertex RGB", CMD_FMT_HEX}, + { GE_CMD_VAP, "imma_prim", GECmdFormat::ALPHA_PRIM, "Imm vertex alpha", CMD_FMT_HEX}, // TODO: format? + { GE_CMD_VFC, "immfog", GECmdFormat::DATA8, "Imm vertex fog", CMD_FMT_HEX8}, + { GE_CMD_VSCV, "immrgb1", GECmdFormat::RGB, "Imm vertex spec RGB", CMD_FMT_HEX}, + { GE_CMD_UNKNOWN_FA, "unknownfa", GECmdFormat::NONE, "UnknownFA" }, + { GE_CMD_UNKNOWN_FB, "unknownfb", GECmdFormat::NONE, "UnknownFB" }, + { GE_CMD_UNKNOWN_FC, "unknownfc", GECmdFormat::NONE, "UnknownFC" }, + { GE_CMD_UNKNOWN_FD, "unknownfd", GECmdFormat::NONE, "UnknownFD" }, + { GE_CMD_UNKNOWN_FE, "unknownfe", GECmdFormat::NONE, "UnknownFE" }, + { GE_CMD_NOP_FF, "nopff", GECmdFormat::NONE, "NopFF" }, }; static constexpr GECmdAlias geCmdAliases[] = { diff --git a/GPU/Debugger/GECommandTable.h b/GPU/Debugger/GECommandTable.h index 27b338af1c15..75af2ea662ea 100644 --- a/GPU/Debugger/GECommandTable.h +++ b/GPU/Debugger/GECommandTable.h @@ -119,8 +119,9 @@ enum CmdFormatType { struct GECmdInfo { GECommand reg; - const char *name; + const char *name; // scripting / expression name GECmdFormat fmt; + const char *uiName; // friendly name CmdFormatType fmtType; uint8_t enableCmd; uint8_t otherCmd; From e1148485f1fc90e121ed9e22d0415ffebeb3d18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Dec 2024 15:50:48 +0100 Subject: [PATCH 5/5] Refactor the GE state viewers --- GPU/Common/GPUDebugInterface.cpp | 14 +- GPU/Debugger/Breakpoints.h | 1 + GPU/Debugger/GECommandTable.cpp | 28 ++- GPU/Debugger/GECommandTable.h | 17 +- GPU/Debugger/State.cpp | 324 +++++++++++++++---------------- GPU/Debugger/State.h | 17 +- GPU/ge_constants.h | 2 +- UI/ImDebugger/ImGe.cpp | 8 +- Windows/GEDebugger/TabState.cpp | 59 +++--- Windows/GEDebugger/TabState.h | 12 +- 10 files changed, 242 insertions(+), 240 deletions(-) diff --git a/GPU/Common/GPUDebugInterface.cpp b/GPU/Common/GPUDebugInterface.cpp index 55dc644cd79c..7b6cd223e190 100644 --- a/GPU/Common/GPUDebugInterface.cpp +++ b/GPU/Common/GPUDebugInterface.cpp @@ -533,7 +533,7 @@ bool GEExpressionFunctions::parseReference(char *str, uint32_t &referenceIndex) // For now, let's just support the register bits directly. GECmdInfo info; if (GECmdInfoByName(str, info)) { - referenceIndex = info.reg; + referenceIndex = info.cmd; return true; } @@ -599,8 +599,8 @@ bool GEExpressionFunctions::parseFieldReference(const char *ref, const char *fie } for (const auto &entry : fieldNames) { - if (entry.fmt == info.fmt && strcasecmp(field, entry.name) == 0) { - referenceIndex = (info.reg << 12) | (uint32_t)entry.field; + if (entry.fmt == info.cmdFmt && strcasecmp(field, entry.name) == 0) { + referenceIndex = (info.cmd << 12) | (uint32_t)entry.field; return true; } } @@ -624,7 +624,7 @@ bool GEExpressionFunctions::parseSymbol(char *str, uint32_t &symbolValue) { uint32_t GEExpressionFunctions::getReferenceValue(uint32_t referenceIndex) { GPUgstate state = gpu_->GetGState(); if (referenceIndex < 0x100) { - GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex)).fmt; + GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex)).cmdFmt; uint32_t value = state.cmdmem[referenceIndex]; if (fmt == GECmdFormat::FLOAT) return value << 8; @@ -633,7 +633,7 @@ uint32_t GEExpressionFunctions::getReferenceValue(uint32_t referenceIndex) { if (referenceIndex >= (uint32_t)GEReferenceIndex::FIELD_START && referenceIndex <= (uint32_t)GEReferenceIndex::FIELD_END) { uint32_t value = state.cmdmem[referenceIndex >> 12] & 0x00FFFFFF; - GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex >> 12)).fmt; + GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex >> 12)).cmdFmt; return getFieldValue(fmt, GECmdField(referenceIndex & 0xFF), value); } @@ -898,14 +898,14 @@ uint32_t GEExpressionFunctions::getFieldValue(GECmdFormat fmt, GECmdField field, ExpressionType GEExpressionFunctions::getReferenceType(uint32_t referenceIndex) { if (referenceIndex < 0x100) { - GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex)).fmt; + GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex)).cmdFmt; if (fmt == GECmdFormat::FLOAT) return EXPR_TYPE_FLOAT; return EXPR_TYPE_UINT; } if (referenceIndex >= (uint32_t)GEReferenceIndex::FIELD_START && referenceIndex <= (uint32_t)GEReferenceIndex::FIELD_END) { - GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex >> 12)).fmt; + GECmdFormat fmt = GECmdInfoByCmd(GECommand(referenceIndex >> 12)).cmdFmt; return getFieldType(fmt, GECmdField(referenceIndex & 0xFF)); } diff --git a/GPU/Debugger/Breakpoints.h b/GPU/Debugger/Breakpoints.h index 0910a68e92f0..cdb3215abf86 100644 --- a/GPU/Debugger/Breakpoints.h +++ b/GPU/Debugger/Breakpoints.h @@ -17,6 +17,7 @@ #pragma once +#include #include "Common/CommonTypes.h" namespace GPUBreakpoints { diff --git a/GPU/Debugger/GECommandTable.cpp b/GPU/Debugger/GECommandTable.cpp index aa05978be876..3a08a8d19974 100644 --- a/GPU/Debugger/GECommandTable.cpp +++ b/GPU/Debugger/GECommandTable.cpp @@ -19,7 +19,9 @@ #include "Common/Common.h" #include "Common/Log.h" #include "GPU/Debugger/GECommandTable.h" +#include "GPU/Debugger/Breakpoints.h" #include "GPU/ge_constants.h" +#include "StringUtils.h" struct GECmdAlias { GECommand reg; @@ -393,7 +395,7 @@ static constexpr GECmdAlias geCmdAliases[] = { bool GECmdInfoByName(const char *name, GECmdInfo &result) { for (const GECmdInfo &info : geCmdInfo) { - if (strcasecmp(info.name, name) == 0) { + if (equalsNoCase(info.name, name)) { result = info; return true; } @@ -401,7 +403,7 @@ bool GECmdInfoByName(const char *name, GECmdInfo &result) { for (const GECmdAlias &entry : geCmdAliases) { for (const char *alias : entry.aliases) { - if (alias && strcasecmp(alias, name) == 0) { + if (alias && equalsNoCase(alias, name)) { result = GECmdInfoByCmd(entry.reg); return true; } @@ -411,7 +413,27 @@ bool GECmdInfoByName(const char *name, GECmdInfo &result) { return false; } -GECmdInfo GECmdInfoByCmd(GECommand reg) { +const GECmdInfo &GECmdInfoByCmd(GECommand reg) { _assert_msg_((reg & 0xFF) == reg, "Invalid reg"); return geCmdInfo[reg & 0xFF]; } + +bool ToggleBreakpoint(const GECmdInfo &info) { + using namespace GPUBreakpoints; + if (IsCmdBreakpoint(info.cmd)) { + RemoveCmdBreakpoint(info.cmd); + if (info.otherCmd) + RemoveCmdBreakpoint(info.otherCmd); + if (info.otherCmd2) + RemoveCmdBreakpoint(info.otherCmd2); + return false; + } + + AddCmdBreakpoint(info.cmd); + if (info.otherCmd) + AddCmdBreakpoint(info.otherCmd); + if (info.otherCmd2) + AddCmdBreakpoint(info.otherCmd2); + return true; +} + diff --git a/GPU/Debugger/GECommandTable.h b/GPU/Debugger/GECommandTable.h index 75af2ea662ea..4bee175885a9 100644 --- a/GPU/Debugger/GECommandTable.h +++ b/GPU/Debugger/GECommandTable.h @@ -18,6 +18,8 @@ #pragma once #include +#include + #include "GPU/ge_constants.h" enum class GECmdFormat { @@ -116,17 +118,18 @@ enum CmdFormatType { CMD_FMT_INTEGER = CMD_FMT_HEX, }; - struct GECmdInfo { - GECommand reg; - const char *name; // scripting / expression name - GECmdFormat fmt; - const char *uiName; // friendly name - CmdFormatType fmtType; + GECommand cmd; + std::string_view name; // scripting / expression name + GECmdFormat cmdFmt; + std::string_view uiName; // friendly name + CmdFormatType fmt; uint8_t enableCmd; uint8_t otherCmd; uint8_t otherCmd2; }; bool GECmdInfoByName(const char *name, GECmdInfo &info); -GECmdInfo GECmdInfoByCmd(GECommand reg); +const GECmdInfo &GECmdInfoByCmd(GECommand reg); + +bool ToggleBreakpoint(const GECmdInfo &info); diff --git a/GPU/Debugger/State.cpp b/GPU/Debugger/State.cpp index 7bb1ef2d284b..f424f980de48 100644 --- a/GPU/Debugger/State.cpp +++ b/GPU/Debugger/State.cpp @@ -8,179 +8,175 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "Core/System.h" -const TabStateRow g_stateFlagsRows[] = { - { "Lighting enable", GE_CMD_LIGHTINGENABLE, CMD_FMT_FLAG }, - { "Light 0 enable", GE_CMD_LIGHTENABLE0, CMD_FMT_FLAG }, - { "Light 1 enable", GE_CMD_LIGHTENABLE1, CMD_FMT_FLAG }, - { "Light 2 enable", GE_CMD_LIGHTENABLE2, CMD_FMT_FLAG }, - { "Light 3 enable", GE_CMD_LIGHTENABLE3, CMD_FMT_FLAG }, - { "Depth clamp enable", GE_CMD_DEPTHCLAMPENABLE, CMD_FMT_FLAG }, - { "Cullface enable", GE_CMD_CULLFACEENABLE, CMD_FMT_FLAG }, - { "Texture map enable", GE_CMD_TEXTUREMAPENABLE, CMD_FMT_FLAG }, - { "Fog enable", GE_CMD_FOGENABLE, CMD_FMT_FLAG }, - { "Dither enable", GE_CMD_DITHERENABLE, CMD_FMT_FLAG }, - { "Alpha blend enable", GE_CMD_ALPHABLENDENABLE, CMD_FMT_FLAG }, - { "Alpha test enable", GE_CMD_ALPHATESTENABLE, CMD_FMT_FLAG }, - { "Depth test enable", GE_CMD_ZTESTENABLE, CMD_FMT_FLAG }, - { "Stencil test enable", GE_CMD_STENCILTESTENABLE, CMD_FMT_FLAG }, - { "Antialias enable", GE_CMD_ANTIALIASENABLE, CMD_FMT_FLAG }, - { "Patch cull enable", GE_CMD_PATCHCULLENABLE, CMD_FMT_FLAG }, - { "Color test enable", GE_CMD_COLORTESTENABLE, CMD_FMT_FLAG }, - { "Logic op enable", GE_CMD_LOGICOPENABLE, CMD_FMT_FLAG }, - { "Depth write disable", GE_CMD_ZWRITEDISABLE, CMD_FMT_FLAG }, +const GECommand g_stateFlagsRows[] = { + GE_CMD_LIGHTINGENABLE, + GE_CMD_LIGHTENABLE0, + GE_CMD_LIGHTENABLE1, + GE_CMD_LIGHTENABLE2, + GE_CMD_LIGHTENABLE3, + GE_CMD_DEPTHCLAMPENABLE, + GE_CMD_CULLFACEENABLE, + GE_CMD_TEXTUREMAPENABLE, + GE_CMD_FOGENABLE, + GE_CMD_DITHERENABLE, + GE_CMD_ALPHABLENDENABLE, + GE_CMD_ALPHATESTENABLE, + GE_CMD_ZTESTENABLE, + GE_CMD_STENCILTESTENABLE, + GE_CMD_ANTIALIASENABLE, + GE_CMD_PATCHCULLENABLE, + GE_CMD_COLORTESTENABLE, + GE_CMD_LOGICOPENABLE, + GE_CMD_ZWRITEDISABLE, }; const size_t g_stateFlagsRowsSize = ARRAY_SIZE(g_stateFlagsRows); -const TabStateRow g_stateLightingRows[] = { - { "Ambient color", GE_CMD_AMBIENTCOLOR, CMD_FMT_HEX }, - { "Ambient alpha", GE_CMD_AMBIENTALPHA, CMD_FMT_HEX }, - { "Material update", GE_CMD_MATERIALUPDATE, CMD_FMT_MATERIALUPDATE }, - { "Material emissive", GE_CMD_MATERIALEMISSIVE, CMD_FMT_HEX }, - { "Material ambient", GE_CMD_MATERIALAMBIENT, CMD_FMT_HEX }, - { "Material diffuse", GE_CMD_MATERIALDIFFUSE, CMD_FMT_HEX }, - { "Material alpha", GE_CMD_MATERIALALPHA, CMD_FMT_HEX }, - { "Material specular", GE_CMD_MATERIALSPECULAR, CMD_FMT_HEX }, - { "Mat. specular coef", GE_CMD_MATERIALSPECULARCOEF, CMD_FMT_FLOAT24 }, - { "Reverse normals", GE_CMD_REVERSENORMAL, CMD_FMT_FLAG }, - { "Shade model", GE_CMD_SHADEMODE, CMD_FMT_SHADEMODEL }, - { "Light mode", GE_CMD_LIGHTMODE, CMD_FMT_LIGHTMODE, GE_CMD_LIGHTINGENABLE }, - { "Light type 0", GE_CMD_LIGHTTYPE0, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE0 }, - { "Light type 1", GE_CMD_LIGHTTYPE1, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE1 }, - { "Light type 2", GE_CMD_LIGHTTYPE2, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE2 }, - { "Light type 3", GE_CMD_LIGHTTYPE3, CMD_FMT_LIGHTTYPE, GE_CMD_LIGHTENABLE3 }, - { "Light pos 0", GE_CMD_LX0, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LY0, GE_CMD_LZ0 }, - { "Light pos 1", GE_CMD_LX1, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LY1, GE_CMD_LZ1 }, - { "Light pos 2", GE_CMD_LX2, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LY2, GE_CMD_LZ2 }, - { "Light pos 3", GE_CMD_LX3, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LY3, GE_CMD_LZ3 }, - { "Light dir 0", GE_CMD_LDX0, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LDY0, GE_CMD_LDZ0 }, - { "Light dir 1", GE_CMD_LDX1, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LDY1, GE_CMD_LDZ1 }, - { "Light dir 2", GE_CMD_LDX2, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LDY2, GE_CMD_LDZ2 }, - { "Light dir 3", GE_CMD_LDX3, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LDY3, GE_CMD_LDZ3 }, - { "Light att 0", GE_CMD_LKA0, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE0, GE_CMD_LKB0, GE_CMD_LKC0 }, - { "Light att 1", GE_CMD_LKA1, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE1, GE_CMD_LKB1, GE_CMD_LKC1 }, - { "Light att 2", GE_CMD_LKA2, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE2, GE_CMD_LKB2, GE_CMD_LKC2 }, - { "Light att 3", GE_CMD_LKA3, CMD_FMT_XYZ, GE_CMD_LIGHTENABLE3, GE_CMD_LKB3, GE_CMD_LKC3 }, - { "Lightspot coef 0", GE_CMD_LKS0, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, - { "Lightspot coef 1", GE_CMD_LKS1, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, - { "Lightspot coef 2", GE_CMD_LKS2, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, - { "Lightspot coef 3", GE_CMD_LKS3, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, - { "Light angle 0", GE_CMD_LKO0, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE0 }, - { "Light angle 1", GE_CMD_LKO1, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE1 }, - { "Light angle 2", GE_CMD_LKO2, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE2 }, - { "Light angle 3", GE_CMD_LKO3, CMD_FMT_FLOAT24, GE_CMD_LIGHTENABLE3 }, - { "Light ambient 0", GE_CMD_LAC0, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { "Light diffuse 0", GE_CMD_LDC0, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { "Light specular 0", GE_CMD_LSC0, CMD_FMT_HEX, GE_CMD_LIGHTENABLE0 }, - { "Light ambient 1", GE_CMD_LAC1, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { "Light diffuse 1", GE_CMD_LDC1, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { "Light specular 1", GE_CMD_LSC1, CMD_FMT_HEX, GE_CMD_LIGHTENABLE1 }, - { "Light ambient 2", GE_CMD_LAC2, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { "Light diffuse 2", GE_CMD_LDC2, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { "Light specular 2", GE_CMD_LSC2, CMD_FMT_HEX, GE_CMD_LIGHTENABLE2 }, - { "Light ambient 3", GE_CMD_LAC3, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, - { "Light diffuse 3", GE_CMD_LDC3, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, - { "Light specular 3", GE_CMD_LSC3, CMD_FMT_HEX, GE_CMD_LIGHTENABLE3 }, +const GECommand g_stateLightingRows[] = { + GE_CMD_AMBIENTCOLOR, + GE_CMD_AMBIENTALPHA, + GE_CMD_MATERIALUPDATE, + GE_CMD_MATERIALEMISSIVE, + GE_CMD_MATERIALAMBIENT, + GE_CMD_MATERIALDIFFUSE, + GE_CMD_MATERIALALPHA, + GE_CMD_MATERIALSPECULAR, + GE_CMD_MATERIALSPECULARCOEF, + GE_CMD_REVERSENORMAL, + GE_CMD_SHADEMODE, + GE_CMD_LIGHTMODE, + GE_CMD_LIGHTTYPE0, + GE_CMD_LIGHTTYPE1, + GE_CMD_LIGHTTYPE2, + GE_CMD_LIGHTTYPE3, + GE_CMD_LX0, + GE_CMD_LX1, + GE_CMD_LX2, + GE_CMD_LX3, + GE_CMD_LDX0, + GE_CMD_LDX1, + GE_CMD_LDX2, + GE_CMD_LDX3, + GE_CMD_LKA0, + GE_CMD_LKA1, + GE_CMD_LKA2, + GE_CMD_LKA3, + GE_CMD_LKS0, + GE_CMD_LKS1, + GE_CMD_LKS2, + GE_CMD_LKS3, + GE_CMD_LKO0, + GE_CMD_LKO1, + GE_CMD_LKO2, + GE_CMD_LKO3, + GE_CMD_LAC0, + GE_CMD_LDC0, + GE_CMD_LSC0, + GE_CMD_LAC1, + GE_CMD_LDC1, + GE_CMD_LSC1, + GE_CMD_LAC2, + GE_CMD_LDC2, + GE_CMD_LSC2, + GE_CMD_LAC3, + GE_CMD_LDC3, + GE_CMD_LSC3, }; const size_t g_stateLightingRowsSize = ARRAY_SIZE(g_stateLightingRows); -const TabStateRow g_stateTextureRows[] = { - { "Texture L0 addr", GE_CMD_TEXADDR0, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH0 }, - { "Texture L0 size", GE_CMD_TEXSIZE0, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Tex format", GE_CMD_TEXFORMAT, CMD_FMT_TEXFMT, GE_CMD_TEXTUREMAPENABLE }, - { "Tex CLUT", GE_CMD_CLUTADDR, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_CLUTADDRUPPER }, - { "Tex CLUT format", GE_CMD_CLUTFORMAT, CMD_FMT_CLUTFMT, GE_CMD_TEXTUREMAPENABLE }, - - { "Tex U scale", GE_CMD_TEXSCALEU, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { "Tex V scale", GE_CMD_TEXSCALEV, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { "Tex U offset", GE_CMD_TEXOFFSETU, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { "Tex V offset", GE_CMD_TEXOFFSETV, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { "Tex mapping mode", GE_CMD_TEXMAPMODE, CMD_FMT_TEXMAPMODE, GE_CMD_TEXTUREMAPENABLE }, - { "Tex shade srcs", GE_CMD_TEXSHADELS, CMD_FMT_TEXSHADELS, GE_CMD_TEXTUREMAPENABLE }, - { "Tex func", GE_CMD_TEXFUNC, CMD_FMT_TEXFUNC, GE_CMD_TEXTUREMAPENABLE }, - { "Tex env color", GE_CMD_TEXENVCOLOR, CMD_FMT_HEX, GE_CMD_TEXTUREMAPENABLE }, - { "Tex mode", GE_CMD_TEXMODE, CMD_FMT_TEXMODE, GE_CMD_TEXTUREMAPENABLE }, - { "Tex filtering", GE_CMD_TEXFILTER, CMD_FMT_TEXFILTER, GE_CMD_TEXTUREMAPENABLE }, - { "Tex wrapping", GE_CMD_TEXWRAP, CMD_FMT_TEXWRAP, GE_CMD_TEXTUREMAPENABLE }, - { "Tex level/bias", GE_CMD_TEXLEVEL, CMD_FMT_TEXLEVEL, GE_CMD_TEXTUREMAPENABLE }, - { "Tex lod slope", GE_CMD_TEXLODSLOPE, CMD_FMT_FLOAT24, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L1 addr", GE_CMD_TEXADDR1, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH1 }, - { "Texture L2 addr", GE_CMD_TEXADDR2, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH2 }, - { "Texture L3 addr", GE_CMD_TEXADDR3, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH3 }, - { "Texture L4 addr", GE_CMD_TEXADDR4, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH4 }, - { "Texture L5 addr", GE_CMD_TEXADDR5, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH5 }, - { "Texture L6 addr", GE_CMD_TEXADDR6, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH6 }, - { "Texture L7 addr", GE_CMD_TEXADDR7, CMD_FMT_PTRWIDTH, GE_CMD_TEXTUREMAPENABLE, GE_CMD_TEXBUFWIDTH7 }, - { "Texture L1 size", GE_CMD_TEXSIZE1, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L2 size", GE_CMD_TEXSIZE2, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L3 size", GE_CMD_TEXSIZE3, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L4 size", GE_CMD_TEXSIZE4, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L5 size", GE_CMD_TEXSIZE5, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L6 size", GE_CMD_TEXSIZE6, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, - { "Texture L7 size", GE_CMD_TEXSIZE7, CMD_FMT_TEXSIZE, GE_CMD_TEXTUREMAPENABLE }, +const GECommand g_stateTextureRows[] = { + GE_CMD_TEXADDR0, + GE_CMD_TEXSIZE0, + GE_CMD_TEXFORMAT, + GE_CMD_CLUTADDR, + GE_CMD_CLUTFORMAT, + GE_CMD_TEXSCALEU, + GE_CMD_TEXSCALEV, + GE_CMD_TEXOFFSETU, + GE_CMD_TEXOFFSETV, + GE_CMD_TEXMAPMODE, + GE_CMD_TEXSHADELS, + GE_CMD_TEXFUNC, + GE_CMD_TEXENVCOLOR, + GE_CMD_TEXMODE, + GE_CMD_TEXFILTER, + GE_CMD_TEXWRAP, + GE_CMD_TEXLEVEL, + GE_CMD_TEXLODSLOPE, + GE_CMD_TEXADDR1, + GE_CMD_TEXADDR2, + GE_CMD_TEXADDR3, + GE_CMD_TEXADDR4, + GE_CMD_TEXADDR5, + GE_CMD_TEXADDR6, + GE_CMD_TEXADDR7, + GE_CMD_TEXSIZE1, + GE_CMD_TEXSIZE2, + GE_CMD_TEXSIZE3, + GE_CMD_TEXSIZE4, + GE_CMD_TEXSIZE5, + GE_CMD_TEXSIZE6, + GE_CMD_TEXSIZE7, }; const size_t g_stateTextureRowsSize = ARRAY_SIZE(g_stateTextureRows); -const TabStateRow g_stateSettingsRows[] = { - { "Framebuffer", GE_CMD_FRAMEBUFPTR, CMD_FMT_PTRWIDTH, 0, GE_CMD_FRAMEBUFWIDTH }, - { "Framebuffer format", GE_CMD_FRAMEBUFPIXFORMAT, CMD_FMT_TEXFMT }, - { "Depthbuffer", GE_CMD_ZBUFPTR, CMD_FMT_PTRWIDTH, 0, GE_CMD_ZBUFWIDTH }, - { "Viewport Scale", GE_CMD_VIEWPORTXSCALE, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYSCALE, GE_CMD_VIEWPORTZSCALE }, - { "Viewport Offset", GE_CMD_VIEWPORTXCENTER, CMD_FMT_XYZ, 0, GE_CMD_VIEWPORTYCENTER, GE_CMD_VIEWPORTZCENTER }, - { "Scissor", GE_CMD_SCISSOR1, CMD_FMT_XYXY, 0, GE_CMD_SCISSOR2 }, - { "Region", GE_CMD_REGION1, CMD_FMT_XYXY, 0, GE_CMD_REGION2 }, - { "Color test", GE_CMD_COLORTEST, CMD_FMT_COLORTEST, GE_CMD_COLORTESTENABLE, GE_CMD_COLORREF, GE_CMD_COLORTESTMASK }, - { "Alpha test", GE_CMD_ALPHATEST, CMD_FMT_ALPHATEST, GE_CMD_ALPHATESTENABLE }, - { "Clear mode", GE_CMD_CLEARMODE, CMD_FMT_CLEARMODE }, - { "Stencil test", GE_CMD_STENCILTEST, CMD_FMT_STENCILTEST, GE_CMD_STENCILTESTENABLE }, - { "Stencil test op", GE_CMD_STENCILOP, CMD_FMT_STENCILOP, GE_CMD_STENCILTESTENABLE }, - { "Depth test", GE_CMD_ZTEST, CMD_FMT_ZTEST, GE_CMD_ZTESTENABLE }, - { "RGB mask", GE_CMD_MASKRGB, CMD_FMT_HEX }, - { "Stencil/alpha mask", GE_CMD_MASKALPHA, CMD_FMT_HEX }, - { "Transfer src", GE_CMD_TRANSFERSRC, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERSRCW }, - { "Transfer src pos", GE_CMD_TRANSFERSRCPOS, CMD_FMT_XY }, - { "Transfer dst", GE_CMD_TRANSFERDST, CMD_FMT_PTRWIDTH, 0, GE_CMD_TRANSFERDSTW }, - { "Transfer dst pos", GE_CMD_TRANSFERDSTPOS, CMD_FMT_XY }, - { "Transfer size", GE_CMD_TRANSFERSIZE, CMD_FMT_XYPLUS1 }, - { "Vertex type", GE_CMD_VERTEXTYPE, CMD_FMT_VERTEXTYPE }, - { "Offset addr", GE_CMD_OFFSETADDR, CMD_FMT_OFFSETADDR }, - { "Vertex addr", GE_CMD_VADDR, CMD_FMT_VADDR }, - { "Index addr", GE_CMD_IADDR, CMD_FMT_IADDR }, - { "Min Z", GE_CMD_MINZ, CMD_FMT_HEX }, - { "Max Z", GE_CMD_MAXZ, CMD_FMT_HEX }, - { "Offset", GE_CMD_OFFSETX, CMD_FMT_F16_XY, 0, GE_CMD_OFFSETY }, - { "Cull mode", GE_CMD_CULL, CMD_FMT_CULL, GE_CMD_CULLFACEENABLE }, - { "Alpha blend mode", GE_CMD_BLENDMODE, CMD_FMT_BLENDMODE, GE_CMD_ALPHABLENDENABLE }, - { "Blend color A", GE_CMD_BLENDFIXEDA, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, - { "Blend color B", GE_CMD_BLENDFIXEDB, CMD_FMT_HEX, GE_CMD_ALPHABLENDENABLE }, - { "Logic Op", GE_CMD_LOGICOP, CMD_FMT_LOGICOP, GE_CMD_LOGICOPENABLE }, - { "Fog 1", GE_CMD_FOG1, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, - { "Fog 2", GE_CMD_FOG2, CMD_FMT_FLOAT24, GE_CMD_FOGENABLE }, - { "Fog color", GE_CMD_FOGCOLOR, CMD_FMT_HEX, GE_CMD_FOGENABLE }, - { "Morph Weight 0", GE_CMD_MORPHWEIGHT0, CMD_FMT_FLOAT24 }, - { "Morph Weight 1", GE_CMD_MORPHWEIGHT1, CMD_FMT_FLOAT24 }, - { "Morph Weight 2", GE_CMD_MORPHWEIGHT2, CMD_FMT_FLOAT24 }, - { "Morph Weight 3", GE_CMD_MORPHWEIGHT3, CMD_FMT_FLOAT24 }, - { "Morph Weight 4", GE_CMD_MORPHWEIGHT4, CMD_FMT_FLOAT24 }, - { "Morph Weight 5", GE_CMD_MORPHWEIGHT5, CMD_FMT_FLOAT24 }, - { "Morph Weight 6", GE_CMD_MORPHWEIGHT6, CMD_FMT_FLOAT24 }, - { "Morph Weight 7", GE_CMD_MORPHWEIGHT7, CMD_FMT_FLOAT24 }, - // TODO: Format? - { "Patch division", GE_CMD_PATCHDIVISION, CMD_FMT_HEX }, - { "Patch primitive", GE_CMD_PATCHPRIMITIVE, CMD_FMT_PATCHPRIMITIVE }, - // TODO: Format? - { "Patch facing", GE_CMD_PATCHFACING, CMD_FMT_HEX, GE_CMD_PATCHCULLENABLE }, - { "Dither 0", GE_CMD_DITH0, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { "Dither 1", GE_CMD_DITH1, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { "Dither 2", GE_CMD_DITH2, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { "Dither 3", GE_CMD_DITH3, CMD_FMT_HEX, GE_CMD_DITHERENABLE }, - { "Imm vertex XY", GE_CMD_VSCX, CMD_FMT_F16_XY, 0, GE_CMD_VSCY }, - { "Imm vertex Z", GE_CMD_VSCZ, CMD_FMT_HEX }, - { "Imm vertex tex STQ", GE_CMD_VTCS, CMD_FMT_XYZ, 0, GE_CMD_VTCT, GE_CMD_VTCQ }, - { "Imm vertex color0", GE_CMD_VCV, CMD_FMT_HEX }, - { "Imm vertex color1", GE_CMD_VSCV, CMD_FMT_HEX }, - { "Imm vertex fog", GE_CMD_VFC, CMD_FMT_HEX }, - // TODO: Format? - { "Imm vertex prim", GE_CMD_VAP, CMD_FMT_HEX }, +const GECommand g_stateSettingsRows[] = { + GE_CMD_FRAMEBUFPTR, + GE_CMD_FRAMEBUFPIXFORMAT, + GE_CMD_ZBUFPTR, + GE_CMD_VIEWPORTXSCALE, + GE_CMD_VIEWPORTXCENTER, + GE_CMD_SCISSOR1, + GE_CMD_REGION1, + GE_CMD_COLORTEST, + GE_CMD_ALPHATEST, + GE_CMD_CLEARMODE, + GE_CMD_STENCILTEST, + GE_CMD_STENCILOP, + GE_CMD_ZTEST, + GE_CMD_MASKRGB, + GE_CMD_MASKALPHA, + GE_CMD_TRANSFERSRC, + GE_CMD_TRANSFERSRCPOS, + GE_CMD_TRANSFERDST, + GE_CMD_TRANSFERDSTPOS, + GE_CMD_TRANSFERSIZE, + GE_CMD_VERTEXTYPE, + GE_CMD_OFFSETADDR, + GE_CMD_VADDR, + GE_CMD_IADDR, + GE_CMD_MINZ, + GE_CMD_MAXZ, + GE_CMD_OFFSETX, + GE_CMD_CULL, + GE_CMD_BLENDMODE, + GE_CMD_BLENDFIXEDA, + GE_CMD_BLENDFIXEDB, + GE_CMD_LOGICOP, + GE_CMD_FOG1, + GE_CMD_FOG2, + GE_CMD_FOGCOLOR, + GE_CMD_MORPHWEIGHT0, + GE_CMD_MORPHWEIGHT1, + GE_CMD_MORPHWEIGHT2, + GE_CMD_MORPHWEIGHT3, + GE_CMD_MORPHWEIGHT4, + GE_CMD_MORPHWEIGHT5, + GE_CMD_MORPHWEIGHT6, + GE_CMD_MORPHWEIGHT7, + GE_CMD_PATCHDIVISION, + GE_CMD_PATCHPRIMITIVE, + GE_CMD_PATCHFACING, + GE_CMD_DITH0, + GE_CMD_DITH1, + GE_CMD_DITH2, + GE_CMD_DITH3, + GE_CMD_VSCX, + GE_CMD_VSCZ, + GE_CMD_VTCS, + GE_CMD_VCV, + GE_CMD_VSCV, + GE_CMD_VFC, + GE_CMD_VAP, }; const size_t g_stateSettingsRowsSize = ARRAY_SIZE(g_stateSettingsRows); diff --git a/GPU/Debugger/State.h b/GPU/Debugger/State.h index e2380fe997db..916c568b14e5 100644 --- a/GPU/Debugger/State.h +++ b/GPU/Debugger/State.h @@ -24,19 +24,10 @@ enum VertexListCols { class GPUDebugInterface; -struct TabStateRow { - std::string_view title; - uint8_t cmd; - CmdFormatType fmt; - uint8_t enableCmd; - uint8_t otherCmd; - uint8_t otherCmd2; -}; - -extern const TabStateRow g_stateFlagsRows[]; -extern const TabStateRow g_stateLightingRows[]; -extern const TabStateRow g_stateTextureRows[]; -extern const TabStateRow g_stateSettingsRows[]; +extern const GECommand g_stateFlagsRows[]; +extern const GECommand g_stateLightingRows[]; +extern const GECommand g_stateTextureRows[]; +extern const GECommand g_stateSettingsRows[]; extern const size_t g_stateFlagsRowsSize; extern const size_t g_stateLightingRowsSize; extern const size_t g_stateTextureRowsSize; diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index 80db78dfac70..1d123e162093 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -19,7 +19,7 @@ #include -enum GECommand { +enum GECommand : uint8_t { GE_CMD_NOP = 0, GE_CMD_VADDR = 0x1, GE_CMD_IADDR = 0x2, diff --git a/UI/ImDebugger/ImGe.cpp b/UI/ImDebugger/ImGe.cpp index ad2a17f4ba88..c40c2fc1c337 100644 --- a/UI/ImDebugger/ImGe.cpp +++ b/UI/ImDebugger/ImGe.cpp @@ -12,6 +12,7 @@ #include "Core/HW/Display.h" #include "Common/StringUtils.h" #include "GPU/Debugger/State.h" +#include "GPU/Debugger/GECommandTable.h" #include "GPU/Debugger/Breakpoints.h" #include "GPU/Debugger/Debugger.h" #include "GPU/GPUState.h" @@ -337,7 +338,7 @@ void DrawGeStateWindow(ImConfig &cfg, GPUDebugInterface *gpuDebug) { return; } if (ImGui::BeginTabBar("GeRegs", ImGuiTabBarFlags_None)) { - auto buildStateTab = [&](const char *tabName, const TabStateRow *rows, size_t numRows) { + auto buildStateTab = [&](const char *tabName, const GECommand *rows, size_t numRows) { if (ImGui::BeginTabItem(tabName)) { if (ImGui::BeginTable("fpr", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersH)) { ImGui::TableSetupColumn("bkpt", ImGuiTableColumnFlags_WidthFixed); @@ -345,14 +346,15 @@ void DrawGeStateWindow(ImConfig &cfg, GPUDebugInterface *gpuDebug) { ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); for (size_t i = 0; i < numRows; i++) { + const GECmdInfo &info = GECmdInfoByCmd(rows[i]); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("-"); // breakpoint ImGui::TableNextColumn(); - ImGui::TextUnformatted(rows[i].title.data(), rows[i].title.data() + rows[i].title.size()); + ImGui::TextUnformatted(info.uiName.data(), info.uiName.data() + info.uiName.size()); ImGui::TableNextColumn(); char temp[256]; - auto &info = rows[i]; const bool enabled = info.enableCmd == 0 || (gstate.cmdmem[info.enableCmd] & 1) == 1; const u32 value = gstate.cmdmem[info.cmd] & 0xFFFFFF; diff --git a/Windows/GEDebugger/TabState.cpp b/Windows/GEDebugger/TabState.cpp index 54176cc5da0c..ecb9b9f30c6b 100644 --- a/Windows/GEDebugger/TabState.cpp +++ b/Windows/GEDebugger/TabState.cpp @@ -59,38 +59,19 @@ enum StateValuesCols { STATEVALUES_COL_VALUE, }; -static std::vector watchList; +static std::vector watchList; -static void ToggleWatchList(const TabStateRow &info) { +static void ToggleWatchList(const GECommand cmd) { for (size_t i = 0; i < watchList.size(); ++i) { - if (watchList[i].cmd == info.cmd) { + if (watchList[i] == cmd) { watchList.erase(watchList.begin() + i); return; } } - - watchList.push_back(info); -} - -static bool ToggleBreakpoint(const TabStateRow &info) { - if (IsCmdBreakpoint(info.cmd)) { - RemoveCmdBreakpoint(info.cmd); - if (info.otherCmd) - RemoveCmdBreakpoint(info.otherCmd); - if (info.otherCmd2) - RemoveCmdBreakpoint(info.otherCmd2); - return false; - } - - AddCmdBreakpoint(info.cmd); - if (info.otherCmd) - AddCmdBreakpoint(info.otherCmd); - if (info.otherCmd2) - AddCmdBreakpoint(info.otherCmd2); - return true; + watchList.push_back(cmd); } -bool PromptStateValue(const TabStateRow &info, HWND hparent, const char *title, u32 &value) { +bool PromptStateValue(const GECmdInfo &info, HWND hparent, const char *title, u32 &value) { wchar_t wtitle[1024]; ConvertUTF8ToWString(wtitle, ARRAY_SIZE(wtitle), title); @@ -117,7 +98,7 @@ bool PromptStateValue(const TabStateRow &info, HWND hparent, const char *title, return InputBox_GetHex(GetModuleHandle(NULL), hparent, wtitle, value, value); } -CtrlStateValues::CtrlStateValues(const TabStateRow *rows, int rowCount, HWND hwnd) +CtrlStateValues::CtrlStateValues(const GECommand *rows, int rowCount, HWND hwnd) : GenericListControl(hwnd, stateValuesListDef), rows_(rows), rowCount_(rowCount) { SetIconList(12, 12, { (HICON)LoadIcon(GetModuleHandle(nullptr), (LPCWSTR)IDI_BREAKPOINT_SMALL) }); @@ -135,9 +116,11 @@ void CtrlStateValues::GetColumnText(wchar_t *dest, size_t destSize, int row, int break; case STATEVALUES_COL_NAME: - ConvertUTF8ToWString(dest, destSize, rows_[row].title); + { + ConvertUTF8ToWString(dest, destSize, GECmdInfoByCmd(rows_[row]).uiName); break; - + } + case STATEVALUES_COL_VALUE: { if (!gpuDebug) { @@ -145,7 +128,7 @@ void CtrlStateValues::GetColumnText(wchar_t *dest, size_t destSize, int row, int break; } - const auto info = rows_[row]; + const auto info = GECmdInfoByCmd(rows_[row]); const auto state = gpuDebug->GetGState(); const bool enabled = info.enableCmd == 0 || (state.cmdmem[info.enableCmd] & 1) == 1; const u32 value = state.cmdmem[info.cmd] & 0xFFFFFF; @@ -164,7 +147,7 @@ void CtrlStateValues::OnDoubleClick(int row, int column) { return; } - const auto info = rows_[row]; + const GECmdInfo &info = GECmdInfoByCmd(rows_[row]); if (column == STATEVALUES_COL_BREAKPOINT) { bool proceed = true; @@ -192,21 +175,21 @@ void CtrlStateValues::OnDoubleClick(int row, int column) { const auto state = gpuDebug->GetGState(); u32 newValue = state.cmdmem[info.cmd] & 0x00FFFFFF; - snprintf(title, sizeof(title), "New value for %.*s", (int)info.title.size(), info.title.data()); + snprintf(title, sizeof(title), "New value for %.*s", (int)info.uiName.size(), info.uiName.data()); if (PromptStateValue(info, GetHandle(), title, newValue)) { newValue |= state.cmdmem[info.cmd] & 0xFF000000; SetCmdValue(newValue); if (info.otherCmd) { newValue = state.cmdmem[info.otherCmd] & 0x00FFFFFF; - snprintf(title, sizeof(title), "New value for %.*s (secondary)", (int)info.title.size(), info.title.data()); + snprintf(title, sizeof(title), "New value for %.*s (secondary)", (int)info.uiName.size(), info.uiName.data()); if (PromptStateValue(info, GetHandle(), title, newValue)) { newValue |= state.cmdmem[info.otherCmd] & 0xFF000000; SetCmdValue(newValue); if (info.otherCmd2) { newValue = state.cmdmem[info.otherCmd2] & 0x00FFFFFF; - snprintf(title, sizeof(title), "New value for %.*s (tertiary)", (int)info.title.size(), info.title.data()); + snprintf(title, sizeof(title), "New value for %.*s (tertiary)", (int)info.uiName.size(), info.uiName.data()); if (PromptStateValue(info, GetHandle(), title, newValue)) { newValue |= state.cmdmem[info.otherCmd2] & 0xFF000000; SetCmdValue(newValue); @@ -225,7 +208,9 @@ void CtrlStateValues::OnRightClick(int row, int column, const POINT &point) { return; } - const auto info = rows_[row]; + const GECommand cmd = rows_[row]; + const GECmdInfo &info = GECmdInfoByCmd(cmd); + const auto state = gpuDebug->GetGState(); POINT screenPt(point); @@ -292,7 +277,7 @@ void CtrlStateValues::OnRightClick(int row, int column, const POINT &point) { break; case ID_GEDBG_WATCH: - ToggleWatchList(info); + ToggleWatchList(cmd); SendMessage(GetParent(GetParent(GetHandle())), WM_GEDBG_UPDATE_WATCH, 0, 0); break; } @@ -314,7 +299,7 @@ void CtrlStateValues::SetCmdValue(u32 op) { bool CtrlStateValues::RowValuesChanged(int row) { _assert_(gpuDebug != nullptr && row >= 0 && row < rowCount_); - const auto info = rows_[row]; + const auto &info = GECmdInfoByCmd(rows_[row]); const auto state = gpuDebug->GetGState(); const auto lastState = GPUStepping::LastState(); @@ -328,7 +313,7 @@ bool CtrlStateValues::RowValuesChanged(int row) { return false; } -void CtrlStateValues::PromptBreakpointCond(const TabStateRow &info) { +void CtrlStateValues::PromptBreakpointCond(const GECmdInfo &info) { std::string expression; GPUBreakpoints::GetCmdBreakpointCond(info.cmd, &expression); if (!InputBox_GetString(GetModuleHandle(NULL), GetHandle(), L"Expression", expression, expression)) @@ -346,7 +331,7 @@ void CtrlStateValues::PromptBreakpointCond(const TabStateRow &info) { } -TabStateValues::TabStateValues(const TabStateRow *rows, size_t rowCount, LPCSTR dialogID, HINSTANCE _hInstance, HWND _hParent) +TabStateValues::TabStateValues(const GECommand *rows, size_t rowCount, LPCSTR dialogID, HINSTANCE _hInstance, HWND _hParent) : Dialog(dialogID, _hInstance, _hParent) { values = new CtrlStateValues(rows, (int)rowCount, GetDlgItem(m_hDlg, IDC_GEDBG_VALUES)); } diff --git a/Windows/GEDebugger/TabState.h b/Windows/GEDebugger/TabState.h index 61428ac450dd..64c7da4eec8e 100644 --- a/Windows/GEDebugger/TabState.h +++ b/Windows/GEDebugger/TabState.h @@ -20,14 +20,16 @@ #include "Windows/W32Util/DialogManager.h" #include "Windows/W32Util/Misc.h" +#include "GPU/Debugger/GECommandTable.h" + struct TabStateRow; class CtrlStateValues: public GenericListControl { public: - CtrlStateValues(const TabStateRow *rows, int rowCount, HWND hwnd); + CtrlStateValues(const GECommand *rows, int rowCount, HWND hwnd); // Used by watch. - void UpdateRows(const TabStateRow *rows, int rowCount) { + void UpdateRows(const GECommand *rows, int rowCount) { rows_ = rows; rowCount_ = rowCount; } @@ -47,15 +49,15 @@ class CtrlStateValues: public GenericListControl { private: bool RowValuesChanged(int row); void SetCmdValue(u32 op); - void PromptBreakpointCond(const TabStateRow &info); + void PromptBreakpointCond(const GECmdInfo &info); - const TabStateRow *rows_; + const GECommand *rows_; int rowCount_; }; class TabStateValues : public Dialog { public: - TabStateValues(const TabStateRow *rows, size_t rowCount, LPCSTR dialogID, HINSTANCE _hInstance, HWND _hParent); + TabStateValues(const GECommand *rows, size_t rowCount, LPCSTR dialogID, HINSTANCE _hInstance, HWND _hParent); ~TabStateValues(); void Update() override {