Skip to content

Commit

Permalink
Memcard: Track file size globally at open
Browse files Browse the repository at this point in the history
Prevents FSeek64 hits on every retrieval of memcard attributes
  • Loading branch information
RedPanda4552 authored and lightningterror committed Jan 9, 2025
1 parent 77d5a04 commit 333c7ef
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions pcsx2/SIO/Memcard/MemoryCardFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ class FileMemoryCard
{
protected:
std::FILE* m_file[8] = {};
s64 m_fileSize[8] = {};
std::string m_filenames[8] = {};
std::vector<u8> m_currentdata;
u64 m_chksum[8] = {};
Expand Down Expand Up @@ -246,7 +247,13 @@ std::string FileMcd_GetDefaultName(uint slot)
return StringUtil::StdStringFromFormat("Mcd%03u.ps2", slot + 1);
}

FileMemoryCard::FileMemoryCard() = default;
FileMemoryCard::FileMemoryCard()
{
for (u8 slot = 0; slot < 8; slot++)
{
m_fileSize[slot] = -1;
}
}

FileMemoryCard::~FileMemoryCard() = default;

Expand Down Expand Up @@ -314,12 +321,14 @@ void FileMemoryCard::Open()
}
else // Load checksum
{
m_fileSize[slot] = FileSystem::FSize64(m_file[slot]);

Console.WriteLnFmt(Color_Green, "McdSlot {} [File]: {} [{} MB, {}]", slot, Path::GetFileName(fname),
(FileSystem::FSize64(m_file[slot]) + (MCD_SIZE + 1)) / MC2_MBSIZE,
(m_fileSize[slot] + (MCD_SIZE + 1)) / MC2_MBSIZE,
FileMcd_IsMemoryCardFormatted(m_file[slot]) ? "Formatted" : "UNFORMATTED");

m_filenames[slot] = std::move(fname);
m_ispsx[slot] = FileSystem::FSize64(m_file[slot]) == 0x20000;
m_ispsx[slot] = m_fileSize[slot] == 0x20000;
m_chkaddr = 0x210;

if (!m_ispsx[slot] && FileSystem::FSeek64(m_file[slot], m_chkaddr, SEEK_SET) == 0)
Expand Down Expand Up @@ -354,6 +363,7 @@ void FileMemoryCard::Close()
}

m_filenames[slot] = {};
m_fileSize[slot] = -1;
}
}

Expand Down Expand Up @@ -398,7 +408,7 @@ void FileMemoryCard::GetSizeInfo(uint slot, McdSizeInfo& outways)

pxAssert(m_file[slot]);
if (m_file[slot])
outways.McdSizeInSectors = static_cast<u32>(FileSystem::FSize64(m_file[slot])) / (outways.SectorSize + outways.EraseBlockSizeInSectors);
outways.McdSizeInSectors = static_cast<u32>(m_fileSize[slot]) / (outways.SectorSize + outways.EraseBlockSizeInSectors);
else
outways.McdSizeInSectors = 0x4000;

Expand Down Expand Up @@ -525,7 +535,7 @@ u64 FileMemoryCard::GetCRC(uint slot)
if (!Seek(mcfp, 0))
return 0;

const s64 mcfpsize = FileSystem::FSize64(mcfp);
const s64 mcfpsize = m_fileSize[slot];
if (mcfpsize < 0)
return 0;

Expand Down

0 comments on commit 333c7ef

Please sign in to comment.