diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index db149ca3d..e4fd9d1e4 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -9,6 +9,27 @@ extern "C" { #include "include/macros.h" } +#define GFX_PARAM_TYPE_INT 'i' +#define GFX_PARAM_TYPE_STR 's' +#define GFX_PARAM_TYPE_PTR 'p' +#define GFX_PARAM_TYPE_VTX 'v' +#define GFX_PARAM_TYPE_TEX 't' +#define GFX_PARAM_TYPE_GFX 'g' + +#define GFX_PARAM_TYPE_IS_POINTER(paramType) ( \ + paramType == GFX_PARAM_TYPE_PTR || \ + paramType == GFX_PARAM_TYPE_VTX || \ + paramType == GFX_PARAM_TYPE_TEX || \ + paramType == GFX_PARAM_TYPE_GFX \ +) + +#define GFX_PARAM_TYPE_IS_INT_OR_CONSTANT(paramType) ( \ + paramType == GFX_PARAM_TYPE_INT || \ + paramType == GFX_PARAM_TYPE_STR \ +) + +typedef char GfxParamType; + static std::map> sGfxCommandCache; static char *sGfxCommandErrorMsg = NULL; static u32 sGfxCommandErrorSize = 0; @@ -426,29 +447,40 @@ s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found) { return 0; } -static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pTokenIndex, const char *aPrefix) { +static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pTokenIndex, const char *aPrefix, const GfxParamType aParamType) { assert(aPrefix != NULL); if (pTokenIndex != NULL) { CHECK_TOKEN_INDEX(*pTokenIndex, 0); } String _Token = (pTokenIndex != NULL ? aNode->mTokens[(*pTokenIndex)++] : ""); String _Arg("%s%s", aPrefix, _Token.begin()); // Integers - bool integerFound = false; - s64 integerValue = DynOS_Misc_ParseInteger(_Arg, &integerFound); - if (integerFound) { - return integerValue; - } + if (GFX_PARAM_TYPE_IS_INT_OR_CONSTANT(aParamType)) { + bool integerFound = false; + s64 integerValue = DynOS_Misc_ParseInteger(_Arg, &integerFound); + if (integerFound) { + return integerValue; + } - bool constantFound = false; - s64 constantValue = DynOS_Gfx_ParseGfxConstants(_Arg, &constantFound); - if (constantFound) { - return constantValue; + bool constantFound = false; + s64 constantValue = DynOS_Gfx_ParseGfxConstants(_Arg, &constantFound); + if (constantFound) { + return constantValue; + } } // Pointers - for (auto& _Node : aGfxData->mRawPointers) { - if (_Arg == _Node->mName) { - return (s64) _Node->mData; + if (GFX_PARAM_TYPE_IS_POINTER(aParamType)) { + + // NULL pointer + if (_Arg == "NULL" || _Arg == "0") { + return (s64) NULL; + } + + // Raw pointers + for (auto& _Node : aGfxData->mRawPointers) { + if (_Arg == _Node->mName) { + return (s64) _Node->mData; + } } } @@ -461,113 +493,127 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke } // Lights - for (auto& _Node : aGfxData->mLights) { - // Light pointer - if (_Arg == _Node->mName) { - return (s64) DynOS_Lights_Parse(aGfxData, _Node)->mData; - } + if (aParamType == GFX_PARAM_TYPE_PTR) { + for (auto& _Node : aGfxData->mLights) { + // Light pointer + if (_Arg == _Node->mName) { + return (s64) DynOS_Lights_Parse(aGfxData, _Node)->mData; + } - // Ambient pointer - String _Ambient("&%s.a", _Node->mName.begin()); - if (_Arg == _Ambient) { - return (s64) &(DynOS_Lights_Parse(aGfxData, _Node)->mData->a); - } + // Ambient pointer + String _Ambient("&%s.a", _Node->mName.begin()); + if (_Arg == _Ambient) { + return (s64) &(DynOS_Lights_Parse(aGfxData, _Node)->mData->a); + } - // Diffuse pointer - String _Diffuse("&%s.l", _Node->mName.begin()); - if (_Arg == _Diffuse) { - return (s64) &(DynOS_Lights_Parse(aGfxData, _Node)->mData->l[0]); + // Diffuse pointer + String _Diffuse("&%s.l", _Node->mName.begin()); + if (_Arg == _Diffuse) { + return (s64) &(DynOS_Lights_Parse(aGfxData, _Node)->mData->l[0]); + } } } // Textures - for (auto& _Node : aGfxData->mTextures) { - if (_Arg == _Node->mName) { - return (s64) DynOS_Tex_Parse(aGfxData, _Node); + if (aParamType == GFX_PARAM_TYPE_TEX) { + for (auto& _Node : aGfxData->mTextures) { + if (_Arg == _Node->mName) { + return (s64) DynOS_Tex_Parse(aGfxData, _Node); + } } } // Vertex arrays - for (auto& _Node : aGfxData->mVertices) { - if (_Arg == _Node->mName) { - auto base = DynOS_Vtx_Parse(aGfxData, _Node)->mData; - auto data = (u8*)base + _Offset; - if (_Offset != 0) { - aGfxData->mPointerOffsetList.Add({ (const void*)data, (const void*)base }); + if (aParamType == GFX_PARAM_TYPE_VTX) { + for (auto& _Node : aGfxData->mVertices) { + if (_Arg == _Node->mName) { + auto base = DynOS_Vtx_Parse(aGfxData, _Node)->mData; + auto data = (u8*)base + _Offset; + if (_Offset != 0) { + aGfxData->mPointerOffsetList.Add({ (const void*)data, (const void*)base }); + } + return (s64) data; } - return (s64) data; } } // Display lists - for (auto& _Node : aGfxData->mDisplayLists) { - if (_Arg == _Node->mName) { - return (s64) DynOS_Gfx_Parse(aGfxData, _Node); + if (aParamType == GFX_PARAM_TYPE_GFX) { + for (auto& _Node : aGfxData->mDisplayLists) { + if (_Arg == _Node->mName) { + return (s64) DynOS_Gfx_Parse(aGfxData, _Node); + } } } - for (auto& _Node : aGfxData->mLight0s) { - // Light pointer - if (_Arg == _Node->mName) { - return (s64) DynOS_Light0_Parse(aGfxData, _Node)->mData; - } - } - - for (auto& _Node : aGfxData->mLightTs) { - // Light pointer - if (_Arg == _Node->mName) { - return (s64) DynOS_LightT_Parse(aGfxData, _Node)->mData; + if (aParamType == GFX_PARAM_TYPE_PTR) { + for (auto& _Node : aGfxData->mLight0s) { + // Light pointer + if (_Arg == _Node->mName) { + return (s64) DynOS_Light0_Parse(aGfxData, _Node)->mData; + } } - // Diffuse pointer - String _Diffuse("&%s.col", _Node->mName.begin()); - if (_Arg == _Diffuse) { - return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->col[0]); + for (auto& _Node : aGfxData->mLightTs) { + // Light pointer + if (_Arg == _Node->mName) { + return (s64) DynOS_LightT_Parse(aGfxData, _Node)->mData; + } + + // Diffuse pointer + String _Diffuse("&%s.col", _Node->mName.begin()); + if (_Arg == _Diffuse) { + return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->col[0]); + } + + // Diffuse copy pointer + String _DiffuseC("&%s.colc", _Node->mName.begin()); + if (_Arg == _DiffuseC) { + return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->colc[0]); + } + + // Dir pointer + String _Dir("&%s.dir", _Node->mName.begin()); + if (_Arg == _Dir) { + return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->dir[0]); + } } - // Diffuse copy pointer - String _DiffuseC("&%s.colc", _Node->mName.begin()); - if (_Arg == _DiffuseC) { - return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->colc[0]); - } + for (auto& _Node : aGfxData->mAmbientTs) { + // Light pointer + if (_Arg == _Node->mName) { + return (s64) DynOS_AmbientT_Parse(aGfxData, _Node)->mData; + } - // Dir pointer - String _Dir("&%s.dir", _Node->mName.begin()); - if (_Arg == _Dir) { - return (s64) &(DynOS_LightT_Parse(aGfxData, _Node)->mData->dir[0]); - } - } + // Diffuse pointer + String _Diffuse("&%s.col", _Node->mName.begin()); + if (_Arg == _Diffuse) { + return (s64) &(DynOS_AmbientT_Parse(aGfxData, _Node)->mData->col[0]); + } - for (auto& _Node : aGfxData->mAmbientTs) { - // Light pointer - if (_Arg == _Node->mName) { - return (s64) DynOS_AmbientT_Parse(aGfxData, _Node)->mData; - } - - // Diffuse pointer - String _Diffuse("&%s.col", _Node->mName.begin()); - if (_Arg == _Diffuse) { - return (s64) &(DynOS_AmbientT_Parse(aGfxData, _Node)->mData->col[0]); - } - - // Diffuse copy pointer - String _DiffuseC("&%s.colc", _Node->mName.begin()); - if (_Arg == _DiffuseC) { - return (s64) &(DynOS_AmbientT_Parse(aGfxData, _Node)->mData->colc[0]); + // Diffuse copy pointer + String _DiffuseC("&%s.colc", _Node->mName.begin()); + if (_Arg == _DiffuseC) { + return (s64) &(DynOS_AmbientT_Parse(aGfxData, _Node)->mData->colc[0]); + } } } // Built-in textures - auto builtinTex = DynOS_Builtin_Tex_GetFromName(_Arg.begin()); - if (builtinTex != NULL) { - return (s64)builtinTex; + if (aParamType == GFX_PARAM_TYPE_TEX) { + auto builtinTex = DynOS_Builtin_Tex_GetFromName(_Arg.begin()); + if (builtinTex != NULL) { + return (s64)builtinTex; + } } // Recursive descent parsing - bool rdSuccess = false; - s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess, DynOS_Gfx_ParseGfxConstants); - if (rdSuccess) { - return rdValue; + if (GFX_PARAM_TYPE_IS_INT_OR_CONSTANT(aParamType)) { + bool rdSuccess = false; + s64 rdValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdSuccess, DynOS_Gfx_ParseGfxConstants); + if (rdSuccess) { + return rdValue; + } } // Unknown @@ -575,11 +621,11 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke return 0; } -#define gfx_arg_with_suffix(argname, suffix) \ +#define gfx_arg_with_suffix(argname, suffix, paramtype) \ CHECK_TOKEN_INDEX(aTokenIndex,); \ const String& argname##_token = aNode->mTokens[aTokenIndex]; \ String _Token##suffix = String("%s%s", argname##_token.begin(), #suffix); \ - s64 argname = ParseGfxSymbolArg(aGfxData, aNode, NULL, _Token##suffix.begin()); \ + s64 argname = ParseGfxSymbolArg(aGfxData, aNode, NULL, _Token##suffix.begin(), paramtype); \ #define STR_VALUE_2(...) #__VA_ARGS__ #define STR_VALUE(...) STR_VALUE_2(__VA_ARGS__) @@ -667,7 +713,7 @@ static Array ParseGfxSetCombineMode(GfxData* aGfxData, DataNode* aNode if (i == n || _Buffer[i] == ' ' || _Buffer[i] == '\t' || _Buffer[i] == ',') { if (_Token.Length() != 0) { String _Arg("%s%s", (_Args.Count() < 4 ? "G_CCMUX_" : "G_ACMUX_"), _Token.begin()); - _Args.Add(ParseGfxSymbolArg(aGfxData, aNode, NULL, _Arg.begin())); + _Args.Add(ParseGfxSymbolArg(aGfxData, aNode, NULL, _Arg.begin(), GFX_PARAM_TYPE_INT)); _Token.Clear(); } } else { @@ -718,52 +764,55 @@ static void ParseGfxSymbol(GfxData* aGfxData, DataNode* aNode, Gfx*& aHead, // Simple symbols // Uses macro iterators to dynamically handle the correct number of parameters -#define HANDLE_PARAM(paramNum) s64 _Arg##paramNum = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); +#define HANDLE_PARAM(paramNum) s64 _Arg##paramNum = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", paramTypes[paramNum - 1]); #define GET_ARG(paramNum) _Arg##paramNum #define CALL_SYMB(symb, ...) symb(__VA_ARGS__) -#define define_gfx_symbol(symb, params, addPtr, ...) \ -if (_Symbol == #symb) { \ - REPEAT(HANDLE_PARAM, params); \ - if (addPtr) { aGfxData->mPointerList.Add(aHead); } \ - Gfx _Gfx[] = { CALL_SYMB(symb, LIST_ARGS(GET_ARG, params)) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ +#define define_gfx_symbol(symb, params, addPtr, ...) \ +if (_Symbol == #symb) { \ + static const GfxParamType paramTypes[] = { __VA_ARGS__ }; \ + REPEAT(HANDLE_PARAM, params); \ + if (addPtr) { aGfxData->mPointerList.Add(aHead); } \ + Gfx _Gfx[] = { CALL_SYMB(symb, LIST_ARGS(GET_ARG, params)) }; \ + memcpy(aHead, _Gfx, sizeof(_Gfx)); \ + aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ + return; \ } +#define define_gfx_symbol_manual(...) #include "gfx_symbols.h" #undef HANDLE_PARAM #undef GET_ARG #undef CALL_SYMB #undef define_gfx_symbol +#undef define_gfx_symbol_manual // Special symbols if (_Symbol == "gsSPTexture") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); gSPTexture(aHead++, _Arg0, _Arg1, _Arg2, _Arg3, _Arg4); return; } if (_Symbol == "gsSPSetGeometryMode") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); gSPSetGeometryMode(aHead++, _Arg0); return; } if (_Symbol == "gsSPClearGeometryMode") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); gSPClearGeometryMode(aHead++, _Arg0); return; } if (_Symbol == "gsSPDisplayList") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_GFX); aGfxData->mPointerList.Add(aHead); gSPDisplayList(aHead++, _Arg0); return; } if (_Symbol == "gsSPBranchList") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_GFX); aGfxData->mPointerList.Add(aHead); gSPBranchList(aHead++, _Arg0); return; @@ -789,7 +838,7 @@ if (_Symbol == #symb) { // Complex symbols if (_Symbol == "gsSPSetLights0") { - Lights0 *_Light = (Lights0 *) ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + Lights0 *_Light = (Lights0 *) ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_PTR); gSPNumLights(aHead++, NUMLIGHTS_0); aGfxData->mPointerList.Add(aHead); gSPLight(aHead++, &_Light->l[0], 1); @@ -798,7 +847,7 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsSPSetLights1") { - Lights1 *_Light = (Lights1 *) ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + Lights1 *_Light = (Lights1 *) ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_PTR); gSPNumLights(aHead++, NUMLIGHTS_1); aGfxData->mPointerList.Add(aHead); gSPLight(aHead++, &_Light->l[0], 1); @@ -817,22 +866,22 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsDPSetCombineLERP") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_"); - s64 _ArgC = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _ArgD = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _ArgE = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); - s64 _ArgF = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_"); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_CCMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgC = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgD = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgE = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); + s64 _ArgF = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "G_ACMUX_", GFX_PARAM_TYPE_INT); Gfx _Gfx = {{ _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(GCCc0w0(_Arg0, _Arg2, _Arg4, _Arg6) | GCCc1w0(_Arg8, _ArgA), 0, 24), (u32) (GCCc0w1(_Arg1, _Arg3, _Arg5, _Arg7) | GCCc1w1(_Arg9, _ArgC, _ArgE, _ArgB, _ArgD, _ArgF)) @@ -843,70 +892,70 @@ if (_Symbol == #symb) { // TexData symbols if (_Symbol == "gsDPSetTextureImage") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_TEX); UpdateTextureInfo(aGfxData, &_Arg3, (s32) _Arg0, (s32) _Arg1, -1, -1); aGfxData->mPointerList.Add(aHead); gDPSetTextureImage(aHead++, _Arg0, _Arg1, _Arg2, _Arg3); return; } if (_Symbol == "gsDPSetTile") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, NULL, (s32) _Arg0, (s32) _Arg1, -1, -1); gDPSetTile(aHead++, _Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6, _Arg7, _Arg8, _Arg9, _ArgA, _ArgB); return; } if (_Symbol == "gsDPLoadTile") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, NULL, -1, -1, (s32) (_Arg3 >> G_TEXTURE_IMAGE_FRAC) + 1, (s32) (_Arg4 >> G_TEXTURE_IMAGE_FRAC) + 1); gDPLoadTile(aHead++, _Arg0, _Arg1, _Arg2, _Arg3, _Arg4); return; } if (_Symbol == "gsDPSetTileSize") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, NULL, -1, -1, (s32) (_Arg3 >> G_TEXTURE_IMAGE_FRAC) + 1, (s32) (_Arg4 >> G_TEXTURE_IMAGE_FRAC) + 1); gDPSetTileSize(aHead++, _Arg0, _Arg1, _Arg2, _Arg3, _Arg4); return; } if (_Symbol == "gsDPLoadTextureBlock") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - gfx_arg_with_suffix(arg2_0, _LOAD_BLOCK); - gfx_arg_with_suffix(arg2_1, _INCR); - gfx_arg_with_suffix(arg2_2, _SHIFT); - gfx_arg_with_suffix(arg2_3, _BYTES); - gfx_arg_with_suffix(arg2_4, _LINE_BYTES); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_TEX); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + gfx_arg_with_suffix(arg2_0, _LOAD_BLOCK, GFX_PARAM_TYPE_INT); + gfx_arg_with_suffix(arg2_1, _INCR, GFX_PARAM_TYPE_INT); + gfx_arg_with_suffix(arg2_2, _SHIFT, GFX_PARAM_TYPE_INT); + gfx_arg_with_suffix(arg2_3, _BYTES, GFX_PARAM_TYPE_INT); + gfx_arg_with_suffix(arg2_4, _LINE_BYTES, GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _ArgB = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, &_Arg0, (s32) _Arg1, (s32) _Arg2, (s32) _Arg3, (s32) _Arg4); aGfxData->mPointerList.Add(aHead); @@ -920,16 +969,16 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsDPLoadTLUTCmd") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); SetCurrentTextureAsPalette(aGfxData); gDPLoadTLUTCmd(aHead++, _Arg0, _Arg1); return; } if (_Symbol == "gsDPLoadTLUT_pal16") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, &_Arg1, G_IM_FMT_RGBA, G_IM_SIZ_16b, -1, -1); SetCurrentTextureAsPalette(aGfxData); @@ -943,7 +992,7 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsDPLoadTLUT_pal256") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, &_Arg0, G_IM_FMT_RGBA, G_IM_SIZ_16b, -1, -1); SetCurrentTextureAsPalette(aGfxData); @@ -957,17 +1006,17 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsDPLoadTextureBlock_4b") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_TEX); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg8 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg9 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _ArgA = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); UpdateTextureInfo(aGfxData, &_Arg0, (s32) _Arg1, G_IM_SIZ_4b, (s32) _Arg2, (s32) _Arg3); aGfxData->mPointerList.Add(aHead); @@ -981,8 +1030,8 @@ if (_Symbol == #symb) { return; } if (_Symbol == "gsSPLightColor") { - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); + s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); + s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, "", GFX_PARAM_TYPE_INT); // due to the function taking in the variable name instead of the actual value // as a parameter, we need to do this. LIGHT_1 to LIGHT_8 go from actual 1-8 // where as G_MWO_a*/G_MWO_b* are hex numbers without a linear pattern of @@ -1129,7 +1178,7 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char switch (paramType) { // Integer - case 'i': return ConvertParam( + case GFX_PARAM_TYPE_INT: return ConvertParam( L, aGfxData, paramIndex, "integer", [] (lua_State *L, u32 paramIndex) { return smlua_to_integer(L, paramIndex); }, @@ -1137,7 +1186,7 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char ); // String - case 's': return ConvertParam( + case GFX_PARAM_TYPE_STR: return ConvertParam( L, aGfxData, paramIndex, "string", [] (lua_State *L, u32 paramIndex) { return smlua_to_string(L, paramIndex); }, @@ -1145,7 +1194,7 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char ); // Vtx pointer - case 'v': return ConvertParam( + case GFX_PARAM_TYPE_VTX: return ConvertParam( L, aGfxData, paramIndex, "Vtx pointer", [] (lua_State *L, u32 paramIndex) { return (Vtx *) smlua_to_cobject(L, paramIndex, LOT_VTX); }, @@ -1153,7 +1202,7 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char ); // Texture pointer - case 't': return ConvertParam( + case GFX_PARAM_TYPE_TEX: return ConvertParam( L, aGfxData, paramIndex, "Texture pointer", [] (lua_State *L, u32 paramIndex) { return (Texture *) smlua_to_cpointer(L, paramIndex, LVT_U8_P); }, @@ -1161,7 +1210,7 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char ); // Gfx pointer - case 'g': return ConvertParam( + case GFX_PARAM_TYPE_GFX: return ConvertParam( L, aGfxData, paramIndex, "Gfx pointer", [] (lua_State *L, u32 paramIndex) { return (Gfx *) smlua_to_cobject(L, paramIndex, LOT_GFX); }, @@ -1172,12 +1221,62 @@ static String ResolveParam(lua_State *L, GfxData *aGfxData, u32 paramIndex, char return ""; } +struct GfxParamInfo { + u8 count; + const GfxParamType *types; +}; + +static const struct GfxParamInfo *GetGfxParamInfo(const char *command) { +#define define_gfx_symbol(symb, params, addPtr, ...) \ + static const GfxParamType types_##symb[] = { __VA_ARGS__ }; \ + static struct GfxParamInfo info_##symb = { .count = params, .types = types_##symb }; \ + static_assert(sizeof(types_##symb) == params, "Parameter count does not match for gfx command."); \ + if (!strncmp(#symb, command, strlen(#symb))) { return &info_##symb; } +#define define_gfx_symbol_manual(...) define_gfx_symbol(__VA_ARGS__) +#include "gfx_symbols.h" +#undef define_gfx_symbol +#undef define_gfx_symbol_manual + return NULL; +} + static std::string ResolveGfxCommand(lua_State *L, GfxData *aGfxData, const char *command) { + const struct GfxParamInfo *paramInfo = GetGfxParamInfo(command); + if (!paramInfo) { PrintDataErrorGfx(" ERROR: Unknown gfx command: %s", command); return ""; } + + // Count parameters + // Find the position of each % to retrieve the correct expected type from the command paramInfo + u8 paramPos[paramInfo->count] = { 0 }; + u8 paramPosIndex = 0; + u8 paramCount = 1; + bool inBrackets = false; + for (const char* str = command; *str; str++) { + if (*str == '(') { inBrackets = true; } + if (*str == ')') { inBrackets = false; } + if (*str == ',' && inBrackets) { paramCount++; } + if (*str == '%' && paramPosIndex < paramInfo->count) { paramPos[paramPosIndex++] = paramCount - 1; } + } + if (paramCount != paramInfo->count) { + PrintDataErrorGfx(" ERROR: Incorrect parameter count. Got %d, expected %d.", paramCount, paramInfo->count); + return ""; + } + std::string output; for (u32 paramIndex = 3; *command; command++) { char c = *command; if (c == '%') { - char paramType = *(++command); + u8 paramNum = paramPos[paramIndex - 3]; + const GfxParamType paramType = *(++command); + const GfxParamType expectedType = paramInfo->types[paramNum]; + if (expectedType == GFX_PARAM_TYPE_PTR) { + PrintDataErrorGfx(" ERROR: Gfx macro has unsupported type, this macro is not usable"); + return ""; + } + if (expectedType != paramType && + (expectedType != GFX_PARAM_TYPE_INT || !GFX_PARAM_TYPE_IS_INT_OR_CONSTANT(paramType)) // Allow strings as constants for integer parameters + ) { + PrintDataErrorGfx(" ERROR: Unexpected value type for parameter %d. Got '%c', expected '%c'", paramNum, paramType, expectedType); + return ""; + } String value = ResolveParam(L, aGfxData, paramIndex++, paramType); if (aGfxData->mErrorCount > 0) { return ""; diff --git a/include/gfx_symbols.h b/include/gfx_symbols.h index 4566428a2..fc205f0f2 100644 --- a/include/gfx_symbols.h +++ b/include/gfx_symbols.h @@ -1,44 +1,78 @@ -// To use this macro, define `define_gfx_symbol` before including this file. +/* +Both define_gfx_symbol and define_gfx_symbol_manual have the same parameters. +1 - Gfx command name +2 - The number of parameters the command should take +3 - Whether or not DynOS should store an internal pointer to this command. +All parameters after are representing the type that parameter should have in the gfx command, specifically for use in gfx_set_command. +Types: +GFX_PARAM_TYPE_INT - integer +GFX_PARAM_TYPE_STR - string +GFX_PARAM_TYPE_PTR - Undefined pointer type +GFX_PARAM_TYPE_VTX - Vtx pointer +GFX_PARAM_TYPE_TEX - Texture pointer +GFX_PARAM_TYPE_GFX - Gfx pointer +*/ define_gfx_symbol(gsDPFullSync, 0, false); define_gfx_symbol(gsDPTileSync, 0, false); define_gfx_symbol(gsDPPipeSync, 0, false); define_gfx_symbol(gsDPLoadSync, 0, false); define_gfx_symbol(gsDPNoOp, 0, false); -define_gfx_symbol(gsDPNoOpTag, 1, false); -define_gfx_symbol(gsDPSetCycleType, 1, false); -define_gfx_symbol(gsSPLight, 2, true); -define_gfx_symbol(gsSPVertex, 3, true); -define_gfx_symbol(gsSP1Triangle, 4, false); -define_gfx_symbol(gsSP2Triangles, 8, false); -define_gfx_symbol(gsSPNumLights, 1, false); -define_gfx_symbol(gsDPSetDepthSource, 1, false); -define_gfx_symbol(gsDPSetTextureLUT, 1, false); -define_gfx_symbol(gsDPLoadBlock, 5, false); -define_gfx_symbol(gsDPSetRenderMode, 2, false); -define_gfx_symbol(gsSPGeometryMode, 2, false); -define_gfx_symbol(gsSPGeometryModeSetFirst, 2, false); -define_gfx_symbol(gsDPSetPrimColor, 6, false); -define_gfx_symbol(gsDPSetEnvColor, 4, false); -define_gfx_symbol(gsDPSetFogColor, 4, false); -define_gfx_symbol(gsSPFogPosition, 2, false); -define_gfx_symbol(gsDPSetAlphaCompare, 1, false); -define_gfx_symbol(gsDPSetTextureFilter, 1, false); -define_gfx_symbol(gsDPSetTexturePersp, 1, false); -define_gfx_symbol(gsDPSetTextureLOD, 1, false); -define_gfx_symbol(gsDPSetTextureConvert, 1, false); -define_gfx_symbol(gsSPCullDisplayList, 2, false); -define_gfx_symbol(gsDPSetAlphaDither, 1, false); -define_gfx_symbol(gsDPSetCombineKey, 1, false); -define_gfx_symbol(gsDPPipelineMode, 1, false); -define_gfx_symbol(gsSPSetOtherMode, 4, false); -define_gfx_symbol(gsDPSetTextureDetail, 1, false); -define_gfx_symbol(gsDPSetColorDither, 1, false); -define_gfx_symbol(gsDPSetPrimDepth, 2, false); -define_gfx_symbol(gsDPSetBlendColor, 4, false); -define_gfx_symbol(gsSPCopyLightEXT, 2, false); -define_gfx_symbol(gsSPCopyLightsPlayerPart, 1, false); -define_gfx_symbol(gsSPFogFactor, 2, false); -define_gfx_symbol(gsMoveWd, 3, false); -define_gfx_symbol(gsSPLoadGeometryMode, 1, false); -define_gfx_symbol(gsSPVertexNonGlobal, 3, true); +define_gfx_symbol(gsDPNoOpTag, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetCycleType, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPLight, 2, true, GFX_PARAM_TYPE_PTR, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPVertex, 3, true, GFX_PARAM_TYPE_VTX, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSP1Triangle, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSP2Triangles, 8, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPNumLights, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetDepthSource, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTextureLUT, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPLoadBlock, 5, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetRenderMode, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPGeometryMode, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPGeometryModeSetFirst, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetPrimColor, 6, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetEnvColor, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetFogColor, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPFogPosition, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetAlphaCompare, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTextureFilter, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTexturePersp, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTextureLOD, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTextureConvert, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPCullDisplayList, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetAlphaDither, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetCombineKey, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPPipelineMode, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPSetOtherMode, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetTextureDetail, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetColorDither, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetPrimDepth, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetBlendColor, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPCopyLightEXT, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPCopyLightsPlayerPart, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPFogFactor, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsMoveWd, 3, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPLoadGeometryMode, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPVertexNonGlobal, 3, true, GFX_PARAM_TYPE_VTX, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); + +define_gfx_symbol_manual(gsSPTexture, 5, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsSPSetGeometryMode, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsSPClearGeometryMode, 1, false, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsSPDisplayList, 1, true, GFX_PARAM_TYPE_GFX); +define_gfx_symbol_manual(gsSPBranchList, 1, true, GFX_PARAM_TYPE_GFX); +define_gfx_symbol_manual(gsSPEndDisplayList, 0, false); +define_gfx_symbol_manual(gsSPSetLights0, 1, true, GFX_PARAM_TYPE_PTR); +define_gfx_symbol_manual(gsSPSetLights1, 1, true, GFX_PARAM_TYPE_PTR); +define_gfx_symbol_manual(gsDPSetCombineMode, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPSetCombineLERP, 16, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPSetTextureImage, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_TEX); +define_gfx_symbol_manual(gsDPSetTile, 12, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTile, 5, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPSetTileSize, 5, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTextureBlock, 12, true, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTLUTCmd, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTLUT_pal16, 2, true, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTLUT_pal256, 1, true, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsDPLoadTextureBlock_4b, 11, true, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol_manual(gsSPLightColor, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT);