summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2021-03-26 22:35:32 -0700
committerPokechu22 <Pokechu022@gmail.com>2021-04-06 11:54:49 -0700
commitf32b771f7ad81b2e128a4265f797eddba2e99427 (patch)
tree65c09a4607d35716e6bdf24da56db5f0611b7f83 /Source/Core
parentcde6cf2ab583d383601146219d5e199004f51844 (diff)
Skip loading unknown XF registers in the FIFO player
This avoids some warnings, which were originally fixed by ignoring loads with a value of zero (see 636bedb207784db2d58b9986464f6a863677b59e / #3242). Note that FifoCI will report some changes, but only on the first frame; these seem to be timing related as they don't happen if a different write is used to replace skipped ones.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/FifoPlayer/FifoPlayer.cpp15
-rw-r--r--Source/Core/Core/FifoPlayer/FifoPlayer.h1
-rw-r--r--Source/Core/VideoCommon/XFMemory.h22
-rw-r--r--Source/Core/VideoCommon/XFStructs.cpp3
4 files changed, 30 insertions, 11 deletions
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;
}