diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp index 0ed9c94630..49a89749dd 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp @@ -491,7 +491,10 @@ void FifoPlayer::LoadRegisters() regs = m_File->GetXFRegs(); for (int i = 0; i < FifoDataFile::XF_REGS_SIZE; ++i) - LoadXFReg(i, regs[i]); + { + if (ShouldLoadXF(i)) + LoadXFReg(i, regs[i]); + } } void FifoPlayer::LoadTextureMemory() @@ -571,6 +574,16 @@ bool FifoPlayer::ShouldLoadBP(u8 address) } } +bool FifoPlayer::ShouldLoadXF(u8 reg) +{ + // Ignore unknown addresses + u16 address = reg + 0x1000; + return !(address == XFMEM_UNKNOWN_1007 || + (address >= XFMEM_UNKNOWN_GROUP_1_START && address <= XFMEM_UNKNOWN_GROUP_1_END) || + (address >= XFMEM_UNKNOWN_GROUP_2_START && address <= XFMEM_UNKNOWN_GROUP_2_END) || + (address >= XFMEM_UNKNOWN_GROUP_3_START && address <= XFMEM_UNKNOWN_GROUP_3_END)); +} + bool FifoPlayer::IsIdleSet() { CommandProcessor::UCPStatusReg status = diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.h b/Source/Core/Core/FifoPlayer/FifoPlayer.h index bb36795d47..5302e8cfcb 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.h +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.h @@ -134,6 +134,7 @@ private: void LoadXFMem16(u16 address, const u32* data); bool ShouldLoadBP(u8 address); + bool ShouldLoadXF(u8 address); static bool IsIdleSet(); static bool IsHighWatermarkSet(); diff --git a/Source/Core/VideoCommon/XFMemory.h b/Source/Core/VideoCommon/XFMemory.h index 7efd3d2209..0d16c4f700 100644 --- a/Source/Core/VideoCommon/XFMemory.h +++ b/Source/Core/VideoCommon/XFMemory.h @@ -199,7 +199,8 @@ enum XFMEM_STATE1 = 0x1003, XFMEM_CLOCK = 0x1004, XFMEM_CLIPDISABLE = 0x1005, - XFMEM_SETGPMETRIC = 0x1006, + XFMEM_SETGPMETRIC = 0x1006, // Perf0 according to YAGCD + XFMEM_UNKNOWN_1007 = 0x1007, // Perf1 according to YAGCD XFMEM_VTXSPECS = 0x1008, XFMEM_SETNUMCHAN = 0x1009, XFMEM_SETCHAN0_AMBCOLOR = 0x100a, @@ -211,21 +212,26 @@ enum XFMEM_SETCHAN0_ALPHA = 0x1010, XFMEM_SETCHAN1_ALPHA = 0x1011, XFMEM_DUALTEX = 0x1012, + XFMEM_UNKNOWN_GROUP_1_START = 0x1013, + XFMEM_UNKNOWN_GROUP_1_END = 0x1017, XFMEM_SETMATRIXINDA = 0x1018, XFMEM_SETMATRIXINDB = 0x1019, XFMEM_SETVIEWPORT = 0x101a, XFMEM_SETZSCALE = 0x101c, XFMEM_SETZOFFSET = 0x101f, XFMEM_SETPROJECTION = 0x1020, - // XFMEM_SETPROJECTIONB = 0x1021, - // XFMEM_SETPROJECTIONC = 0x1022, - // XFMEM_SETPROJECTIOND = 0x1023, - // XFMEM_SETPROJECTIONE = 0x1024, - // XFMEM_SETPROJECTIONF = 0x1025, - // XFMEM_SETPROJECTIONORTHO1 = 0x1026, - // XFMEM_SETPROJECTIONORTHO2 = 0x1027, + // XFMEM_SETPROJECTIONB = 0x1021, + // XFMEM_SETPROJECTIONC = 0x1022, + // XFMEM_SETPROJECTIOND = 0x1023, + // XFMEM_SETPROJECTIONE = 0x1024, + // XFMEM_SETPROJECTIONF = 0x1025, + // XFMEM_SETPROJECTIONORTHO = 0x1026, + XFMEM_UNKNOWN_GROUP_2_START = 0x1027, + XFMEM_UNKNOWN_GROUP_2_END = 0x103e, XFMEM_SETNUMTEXGENS = 0x103f, XFMEM_SETTEXMTXINFO = 0x1040, + XFMEM_UNKNOWN_GROUP_3_START = 0x1048, + XFMEM_UNKNOWN_GROUP_3_END = 0x104f, XFMEM_SETPOSTMTXINFO = 0x1050, XFMEM_REGISTERS_END = 0x1058, }; diff --git a/Source/Core/VideoCommon/XFStructs.cpp b/Source/Core/VideoCommon/XFStructs.cpp index 5bdbc9dd4b..9ceaf2edc1 100644 --- a/Source/Core/VideoCommon/XFStructs.cpp +++ b/Source/Core/VideoCommon/XFStructs.cpp @@ -195,8 +195,7 @@ static void XFRegWritten(int transferSize, u32 baseAddress, DataReader src) default: DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::USES_UNKNOWN_XF_COMMAND); - if (newValue != 0) // Ignore writes of zero. - WARN_LOG_FMT(VIDEO, "Unknown XF Reg: {:x}={:x}", address, newValue); + WARN_LOG_FMT(VIDEO, "Unknown XF Reg: {:x}={:x}", address, newValue); break; }