Skip to content

Commit

Permalink
Merge pull request #2997 from phire/FixFifoRecorder
Browse files Browse the repository at this point in the history
FifoRecorder: Use Texture Cache to record efb copies correctly.
  • Loading branch information
phire committed Sep 22, 2015
2 parents 79bf939 + aa1fec6 commit a537ca7
Show file tree
Hide file tree
Showing 17 changed files with 145 additions and 212 deletions.
30 changes: 9 additions & 21 deletions Source/Core/Core/FifoPlayer/FifoAnalyzer.cpp
Expand Up @@ -19,34 +19,34 @@ void Init()
VertexLoader_Normal::Init();
}

u8 ReadFifo8(u8 *&data)
u8 ReadFifo8(u8*& data)
{
u8 value = data[0];
data += 1;
return value;
}

u16 ReadFifo16(u8 *&data)
u16 ReadFifo16(u8*& data)
{
u16 value = Common::swap16(data);
data += 2;
return value;
}

u32 ReadFifo32(u8 *&data)
u32 ReadFifo32(u8*& data)
{
u32 value = Common::swap32(data);
data += 4;
return value;
}

void InitBPMemory(BPMemory *bpMem)
void InitBPMemory(BPMemory* bpMem)
{
memset(bpMem, 0, sizeof(BPMemory));
bpMem->bpMask = 0x00FFFFFF;
}

BPCmd DecodeBPCmd(u32 value, const BPMemory &bpMem)
BPCmd DecodeBPCmd(u32 value, const BPMemory& bpMem)
{
//handle the mask register
int opcode = value >> 24;
Expand All @@ -59,7 +59,7 @@ BPCmd DecodeBPCmd(u32 value, const BPMemory &bpMem)
return bp;
}

void LoadBPReg(const BPCmd &bp, BPMemory &bpMem)
void LoadBPReg(const BPCmd& bp, BPMemory& bpMem)
{
((u32*)&bpMem)[bp.address] = bp.newvalue;

Expand All @@ -68,19 +68,7 @@ void LoadBPReg(const BPCmd &bp, BPMemory &bpMem)
bpMem.bpMask = 0xFFFFFF;
}

void GetTlutLoadData(u32 &tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem)
{
tlutAddr = (bpMem.tmem_config.tlut_dest & 0x3FF) << 9;
tlutXferCount = (bpMem.tmem_config.tlut_dest & 0x1FFC00) >> 5;

// TODO - figure out a cleaner way.
if (SConfig::GetInstance().bWii)
memAddr = bpMem.tmem_config.tlut_src << 5;
else
memAddr = (bpMem.tmem_config.tlut_src & 0xFFFFF) << 5;
}

void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
void LoadCPReg(u32 subCmd, u32 value, CPMemory& cpMem)
{
switch (subCmd & 0xF0)
{
Expand Down Expand Up @@ -119,7 +107,7 @@ void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
}
}

u32 CalculateVertexSize(int vatIndex, const CPMemory &cpMem)
u32 CalculateVertexSize(int vatIndex, const CPMemory& cpMem)
{
u32 vertexSize = 0;

Expand All @@ -132,7 +120,7 @@ u32 CalculateVertexSize(int vatIndex, const CPMemory &cpMem)
return vertexSize;
}

void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory &cpMem)
void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory& cpMem)
{
const TVtxDesc &vtxDesc = cpMem.vtxDesc;
const VAT &vtxAttr = cpMem.vtxAttr[vatIndex];
Expand Down
18 changes: 9 additions & 9 deletions Source/Core/Core/FifoPlayer/FifoAnalyzer.h
Expand Up @@ -13,15 +13,15 @@ namespace FifoAnalyzer
{
void Init();

u8 ReadFifo8(u8 *&data);
u16 ReadFifo16(u8 *&data);
u32 ReadFifo32(u8 *&data);
u8 ReadFifo8(u8*& data);
u16 ReadFifo16(u8*& data);
u32 ReadFifo32(u8*& data);

// TODO- move to video common
void InitBPMemory(BPMemory *bpMem);
void InitBPMemory(BPMemory* bpMem);
BPCmd DecodeBPCmd(u32 value, const BPMemory &bpMem);
void LoadBPReg(const BPCmd &bp, BPMemory &bpMem);
void GetTlutLoadData(u32 &tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem);
void LoadBPReg(const BPCmd& bp, BPMemory &bpMem);
void GetTlutLoadData(u32& tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem);

struct CPMemory
{
Expand All @@ -31,8 +31,8 @@ namespace FifoAnalyzer
u32 arrayStrides[16];
};

void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem);
void LoadCPReg(u32 subCmd, u32 value, CPMemory& cpMem);

u32 CalculateVertexSize(int vatIndex, const CPMemory &cpMem);
void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory &cpMem);
u32 CalculateVertexSize(int vatIndex, const CPMemory& cpMem);
void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory& cpMem);
}
15 changes: 10 additions & 5 deletions Source/Core/Core/FifoPlayer/FifoDataFile.cpp
Expand Up @@ -28,6 +28,11 @@ FifoDataFile::~FifoDataFile()
}
}

bool FifoDataFile::HasBrokenEFBCopies() const
{
return version < 2;
}

void FifoDataFile::SetIsWii(bool isWii)
{
SetFlag(FLAG_IS_WII, isWii);
Expand All @@ -38,7 +43,7 @@ bool FifoDataFile::GetIsWii() const
return GetFlag(FLAG_IS_WII);
}

void FifoDataFile::AddFrame(const FifoFrameInfo &frameInfo)
void FifoDataFile::AddFrame(const FifoFrameInfo& frameInfo)
{
m_Frames.push_back(frameInfo);
}
Expand Down Expand Up @@ -126,7 +131,7 @@ bool FifoDataFile::Save(const std::string& filename)
return true;
}

FifoDataFile *FifoDataFile::Load(const std::string &filename, bool flagsOnly)
FifoDataFile* FifoDataFile::Load(const std::string &filename, bool flagsOnly)
{
File::IOFile file;
file.Open(filename, "rb");
Expand Down Expand Up @@ -214,7 +219,7 @@ bool FifoDataFile::GetFlag(u32 flag) const
return !!(m_Flags & flag);
}

u64 FifoDataFile::WriteMemoryUpdates(const std::vector<MemoryUpdate> &memUpdates, File::IOFile &file)
u64 FifoDataFile::WriteMemoryUpdates(const std::vector<MemoryUpdate>& memUpdates, File::IOFile& file)
{
// Add space for memory update list
u64 updateListOffset = file.Tell();
Expand Down Expand Up @@ -244,7 +249,7 @@ u64 FifoDataFile::WriteMemoryUpdates(const std::vector<MemoryUpdate> &memUpdates
return updateListOffset;
}

void FifoDataFile::ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, std::vector<MemoryUpdate> &memUpdates, File::IOFile &file)
void FifoDataFile::ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, std::vector<MemoryUpdate>& memUpdates, File::IOFile& file)
{
memUpdates.resize(numUpdates);

Expand All @@ -255,7 +260,7 @@ void FifoDataFile::ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, std::vector
FileMemoryUpdate srcUpdate;
file.ReadBytes(&srcUpdate, sizeof(FileMemoryUpdate));

MemoryUpdate &dstUpdate = memUpdates[i];
MemoryUpdate& dstUpdate = memUpdates[i];
dstUpdate.address = srcUpdate.address;
dstUpdate.fifoPosition = srcUpdate.fifoPosition;
dstUpdate.size = srcUpdate.dataSize;
Expand Down
12 changes: 7 additions & 5 deletions Source/Core/Core/FifoPlayer/FifoDataFile.h
Expand Up @@ -27,13 +27,13 @@ struct MemoryUpdate
u32 fifoPosition;
u32 address;
u32 size;
u8 *data;
u8* data;
Type type;
};

struct FifoFrameInfo
{
u8 *fifoData;
u8* fifoData;
u32 fifoDataSize;

u32 fifoStart;
Expand All @@ -59,6 +59,7 @@ class FifoDataFile

void SetIsWii(bool isWii);
bool GetIsWii() const;
bool HasBrokenEFBCopies() const;

u32 *GetBPMem() { return m_BPMem; }
u32 *GetCPMem() { return m_CPMem; }
Expand All @@ -71,7 +72,7 @@ class FifoDataFile

bool Save(const std::string& filename);

static FifoDataFile *Load(const std::string &filename, bool flagsOnly);
static FifoDataFile* Load(const std::string &filename, bool flagsOnly);

private:
enum
Expand All @@ -84,15 +85,16 @@ class FifoDataFile
void SetFlag(u32 flag, bool set);
bool GetFlag(u32 flag) const;

u64 WriteMemoryUpdates(const std::vector<MemoryUpdate> &memUpdates, File::IOFile &file);
static void ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, std::vector<MemoryUpdate> &memUpdates, File::IOFile &file);
u64 WriteMemoryUpdates(const std::vector<MemoryUpdate>& memUpdates, File::IOFile &file);
static void ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, std::vector<MemoryUpdate>& memUpdates, File::IOFile& file);

u32 m_BPMem[BP_MEM_SIZE];
u32 m_CPMem[CP_MEM_SIZE];
u32 m_XFMem[XF_MEM_SIZE];
u32 m_XFRegs[XF_REGS_SIZE];

u32 m_Flags;
u32 version;

std::vector<FifoFrameInfo> m_Frames;
};
2 changes: 1 addition & 1 deletion Source/Core/Core/FifoPlayer/FifoFileStruct.h
Expand Up @@ -12,7 +12,7 @@ namespace FifoFileStruct
enum
{
FILE_ID = 0x0d01f1f0,
VERSION_NUMBER = 1,
VERSION_NUMBER = 2,
MIN_LOADER_VERSION = 1,
};

Expand Down
14 changes: 7 additions & 7 deletions Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.cpp
Expand Up @@ -20,21 +20,21 @@ struct CmdData
{
u32 size;
u32 offset;
u8 *ptr;
u8* ptr;
};

FifoPlaybackAnalyzer::FifoPlaybackAnalyzer()
{
FifoAnalyzer::Init();
}

void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile *file, std::vector<AnalyzedFrameInfo> &frameInfo)
void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile* file, std::vector<AnalyzedFrameInfo>& frameInfo)
{
// Load BP memory
u32 *bpMem = file->GetBPMem();
u32* bpMem = file->GetBPMem();
memcpy(&m_BpMem, bpMem, sizeof(BPMemory));

u32 *cpMem = file->GetCPMem();
u32* cpMem = file->GetCPMem();
FifoAnalyzer::LoadCPReg(0x50, cpMem[0x50], m_CpMem);
FifoAnalyzer::LoadCPReg(0x60, cpMem[0x60], m_CpMem);

Expand Down Expand Up @@ -110,7 +110,7 @@ void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile *file, std::vector<Analyze
}
}

void FifoPlaybackAnalyzer::AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrameInfo &frameInfo)
void FifoPlaybackAnalyzer::AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrameInfo& frameInfo)
{
u32 begin = memUpdate.address;
u32 end = memUpdate.address + memUpdate.size;
Expand Down Expand Up @@ -152,9 +152,9 @@ void FifoPlaybackAnalyzer::AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrame
frameInfo.memoryUpdates.push_back(memUpdate);
}

u32 FifoPlaybackAnalyzer::DecodeCommand(u8 *data)
u32 FifoPlaybackAnalyzer::DecodeCommand(u8* data)
{
u8 *dataStart = data;
u8* dataStart = data;

int cmd = ReadFifo8(data);

Expand Down
6 changes: 3 additions & 3 deletions Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.h
Expand Up @@ -22,7 +22,7 @@ class FifoPlaybackAnalyzer
public:
FifoPlaybackAnalyzer();

void AnalyzeFrames(FifoDataFile *file, std::vector<AnalyzedFrameInfo> &frameInfo);
void AnalyzeFrames(FifoDataFile* file, std::vector<AnalyzedFrameInfo>& frameInfo);

private:
struct MemoryRange
Expand All @@ -31,9 +31,9 @@ class FifoPlaybackAnalyzer
u32 end;
};

void AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrameInfo &frameInfo);
void AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrameInfo& frameInfo);

u32 DecodeCommand(u8 *data);
u32 DecodeCommand(u8* data);

void StoreEfbCopyRegion();
void StoreWrittenRegion(u32 address, u32 size);
Expand Down
15 changes: 7 additions & 8 deletions Source/Core/Core/FifoPlayer/FifoPlayer.cpp
Expand Up @@ -63,8 +63,7 @@ bool FifoPlayer::Play()
if (m_File->GetFrameCount() == 0)
return false;

// Currently these is no such thing as a Fifolog without broken EFB copies.
IsPlayingBackFifologWithBrokenEFBCopies = true;
IsPlayingBackFifologWithBrokenEFBCopies = m_File->HasBrokenEFBCopies();

m_CurrentFrame = m_FrameRangeStart;

Expand Down Expand Up @@ -154,7 +153,7 @@ void FifoPlayer::SetFrameRangeEnd(u32 end)
}
}

FifoPlayer &FifoPlayer::GetInstance()
FifoPlayer& FifoPlayer::GetInstance()
{
static FifoPlayer instance;
return instance;
Expand All @@ -174,7 +173,7 @@ FifoPlayer::FifoPlayer() :
m_Loop = SConfig::GetInstance().bLoopFifoReplay;
}

void FifoPlayer::WriteFrame(const FifoFrameInfo &frame, const AnalyzedFrameInfo &info)
void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo& info)
{
// Core timing information
m_CyclesPerFrame = SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate;
Expand Down Expand Up @@ -233,9 +232,9 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo &frame, const AnalyzedFrameInfo
FlushWGP();
}

void FifoPlayer::WriteFramePart(u32 dataStart, u32 dataEnd, u32 &nextMemUpdate, const FifoFrameInfo &frame, const AnalyzedFrameInfo &info)
void FifoPlayer::WriteFramePart(u32 dataStart, u32 dataEnd, u32& nextMemUpdate, const FifoFrameInfo& frame, const AnalyzedFrameInfo& info)
{
u8 *data = frame.fifoData;
u8* data = frame.fifoData;

while (nextMemUpdate < frame.memoryUpdates.size() && dataStart < dataEnd)
{
Expand Down Expand Up @@ -290,7 +289,7 @@ void FifoPlayer::WriteMemory(const MemoryUpdate& memUpdate)
memcpy(mem, memUpdate.data, memUpdate.size);
}

void FifoPlayer::WriteFifo(u8 *data, u32 start, u32 end)
void FifoPlayer::WriteFifo(u8* data, u32 start, u32 end)
{
u32 written = start;
u32 lastBurstEnd = end - 1;
Expand Down Expand Up @@ -453,7 +452,7 @@ void FifoPlayer::LoadXFReg(u16 reg, u32 value)
GPFifo::Write32(value);
}

void FifoPlayer::LoadXFMem16(u16 address, u32 *data)
void FifoPlayer::LoadXFMem16(u16 address, u32* data)
{
// Loads 16 * 4 bytes in xf memory starting at address
GPFifo::Write8(0x10); // load XF reg
Expand Down
8 changes: 4 additions & 4 deletions Source/Core/Core/FifoPlayer/FifoPlayer.h
Expand Up @@ -87,15 +87,15 @@ class FifoPlayer
private:
FifoPlayer();

void WriteFrame(const FifoFrameInfo &frame, const AnalyzedFrameInfo &info);
void WriteFramePart(u32 dataStart, u32 dataEnd, u32 &nextMemUpdate, const FifoFrameInfo &frame, const AnalyzedFrameInfo &info);
void WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo &info);
void WriteFramePart(u32 dataStart, u32 dataEnd, u32 &nextMemUpdate, const FifoFrameInfo& frame, const AnalyzedFrameInfo& info);

void WriteAllMemoryUpdates();
void WriteMemory(const MemoryUpdate &memUpdate);

// writes a range of data to the fifo
// start and end must be relative to frame's fifo data so elapsed cycles are figured correctly
void WriteFifo(u8 *data, u32 start, u32 end);
void WriteFifo(u8* data, u32 start, u32 end);

void SetupFifo();

Expand Down Expand Up @@ -131,7 +131,7 @@ class FifoPlayer
CallbackFunc m_FileLoadedCb;
CallbackFunc m_FrameWrittenCb;

FifoDataFile *m_File;
FifoDataFile* m_File;

std::vector<AnalyzedFrameInfo> m_FrameInfo;
};

0 comments on commit a537ca7

Please sign in to comment.