summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2021-12-01 18:51:21 -0800
committerPokechu22 <Pokechu022@gmail.com>2021-12-01 19:09:24 -0800
commit5af18773bffe99deea9fa2defc5c05475cdf4161 (patch)
treee703045799bdeb731e1624b5f9c0198a62292a71 /Source/Core
parentfc1ed33c11f8ed13463ae2b98e0b5a8d93f0cc62 (diff)
FifoPlayer: Clear EFB before starting playback
This fixes the bad rendering on the first frame when using the software renderer: the software renderer's Z buffer started out at 0, but most games clear it to 0xffffff instead; this means that things don't render correctly except for in the regions where the screen was cleared by an EFB copy earlier in the frame.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/FifoPlayer/FifoPlayer.cpp41
-rw-r--r--Source/Core/Core/FifoPlayer/FifoPlayer.h1
2 files changed, 42 insertions, 0 deletions
diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp
index a1a56dffc8..47b9ac2f87 100644
--- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp
+++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp
@@ -25,6 +25,7 @@
#include "Core/PowerPC/PowerPC.h"
#include "VideoCommon/BPMemory.h"
#include "VideoCommon/CommandProcessor.h"
+#include "VideoCommon/VideoCommon.h"
// We need to include TextureDecoder.h for the texMem array.
// TODO: Move texMem somewhere else so this isn't an issue.
@@ -452,6 +453,45 @@ void FifoPlayer::SetupFifo()
WriteCP(CommandProcessor::CTRL_REGISTER, 17); // enable read & GP link
}
+void FifoPlayer::ClearEfb()
+{
+ // Trigger a bogus EFB copy to clear the screen
+ // The target address is 0, and there shouldn't be anything there,
+ // but even if there is it should be loaded in by LoadTextureMemory afterwards
+ X10Y10 tl;
+ tl.x = 0;
+ tl.y = 0;
+ LoadBPReg(BPMEM_EFB_TL, tl.hex);
+ X10Y10 wh;
+ wh.x = EFB_WIDTH - 1;
+ wh.y = EFB_HEIGHT - 1;
+ LoadBPReg(BPMEM_EFB_WH, wh.hex);
+ LoadBPReg(BPMEM_MIPMAP_STRIDE, 0x140);
+ // The clear color and Z value have already been loaded via LoadRegisters()
+ LoadBPReg(BPMEM_EFB_ADDR, 0);
+ UPE_Copy copy;
+ copy.clamp_top = false;
+ copy.clamp_bottom = false;
+ copy.yuv = false;
+ copy.target_pixel_format = static_cast<u32>(EFBCopyFormat::RGBA8) << 1;
+ copy.gamma = 0;
+ copy.half_scale = false;
+ copy.scale_invert = false;
+ copy.clear = true;
+ copy.frame_to_field = FrameToField::Progressive;
+ copy.copy_to_xfb = false;
+ copy.intensity_fmt = false;
+ copy.auto_conv = false;
+ LoadBPReg(BPMEM_TRIGGER_EFB_COPY, copy.Hex);
+ // Restore existing data - this only works at the start of the fifolog.
+ // In practice most fifologs probably explicitly specify the size each time, but this is still
+ // probably a good idea.
+ LoadBPReg(BPMEM_EFB_TL, m_File->GetBPMem()[BPMEM_EFB_TL]);
+ LoadBPReg(BPMEM_EFB_WH, m_File->GetBPMem()[BPMEM_EFB_WH]);
+ LoadBPReg(BPMEM_MIPMAP_STRIDE, m_File->GetBPMem()[BPMEM_MIPMAP_STRIDE]);
+ LoadBPReg(BPMEM_EFB_ADDR, m_File->GetBPMem()[BPMEM_EFB_ADDR]);
+}
+
void FifoPlayer::LoadMemory()
{
UReg_MSR newMSR;
@@ -469,6 +509,7 @@ void FifoPlayer::LoadMemory()
SetupFifo();
LoadRegisters();
+ ClearEfb();
LoadTextureMemory();
FlushWGP();
}
diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.h b/Source/Core/Core/FifoPlayer/FifoPlayer.h
index f2444e56d2..01ce07c4a0 100644
--- a/Source/Core/Core/FifoPlayer/FifoPlayer.h
+++ b/Source/Core/Core/FifoPlayer/FifoPlayer.h
@@ -123,6 +123,7 @@ private:
void LoadMemory();
void LoadRegisters();
void LoadTextureMemory();
+ void ClearEfb();
void WriteCP(u32 address, u16 value);
void WritePI(u32 address, u32 value);