diff --git a/Source/Core/Core/FifoPlayer/FifoAnalyzer.cpp b/Source/Core/Core/FifoPlayer/FifoAnalyzer.cpp index 22358fb501..c5d91cca2c 100644 --- a/Source/Core/Core/FifoPlayer/FifoAnalyzer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoAnalyzer.cpp @@ -27,30 +27,30 @@ void Init() VertexLoader_Normal::Init(); } -u8 ReadFifo8(u8*& data) +u8 ReadFifo8(const u8*& data) { u8 value = data[0]; data += 1; return value; } -u16 ReadFifo16(u8*& data) +u16 ReadFifo16(const u8*& data) { u16 value = Common::swap16(data); data += 2; return value; } -u32 ReadFifo32(u8*& data) +u32 ReadFifo32(const u8*& data) { u32 value = Common::swap32(data); data += 4; return value; } -u32 AnalyzeCommand(u8* data, DecodeMode mode) +u32 AnalyzeCommand(const u8* data, DecodeMode mode) { - u8* dataStart = data; + const u8* dataStart = data; int cmd = ReadFifo8(data); diff --git a/Source/Core/Core/FifoPlayer/FifoAnalyzer.h b/Source/Core/Core/FifoPlayer/FifoAnalyzer.h index 162d1b0b74..1184b5ec00 100644 --- a/Source/Core/Core/FifoPlayer/FifoAnalyzer.h +++ b/Source/Core/Core/FifoPlayer/FifoAnalyzer.h @@ -13,9 +13,9 @@ namespace FifoAnalyzer { void Init(); -u8 ReadFifo8(u8*& data); -u16 ReadFifo16(u8*& data); -u32 ReadFifo32(u8*& data); +u8 ReadFifo8(const u8*& data); +u16 ReadFifo16(const u8*& data); +u32 ReadFifo32(const u8*& data); enum DecodeMode { @@ -23,7 +23,7 @@ enum DecodeMode DECODE_PLAYBACK, }; -u32 AnalyzeCommand(u8* data, DecodeMode mode); +u32 AnalyzeCommand(const u8* data, DecodeMode mode); struct CPMemory { diff --git a/Source/Core/Core/FifoPlayer/FifoDataFile.cpp b/Source/Core/Core/FifoPlayer/FifoDataFile.cpp index cab3816480..92e3769327 100644 --- a/Source/Core/Core/FifoPlayer/FifoDataFile.cpp +++ b/Source/Core/Core/FifoPlayer/FifoDataFile.cpp @@ -18,13 +18,6 @@ FifoDataFile::FifoDataFile() : m_Flags(0) FifoDataFile::~FifoDataFile() { - for (auto& frame : m_Frames) - { - for (auto& update : frame.memoryUpdates) - delete[] update.data; - - delete[] frame.fifoData; - } } bool FifoDataFile::HasBrokenEFBCopies() const @@ -106,17 +99,17 @@ bool FifoDataFile::Save(const std::string& filename) // Write FIFO data file.Seek(0, SEEK_END); u64 dataOffset = file.Tell(); - file.WriteBytes(srcFrame.fifoData, srcFrame.fifoDataSize); + file.WriteBytes(srcFrame.fifoData.data(), srcFrame.fifoData.size()); u64 memoryUpdatesOffset = WriteMemoryUpdates(srcFrame.memoryUpdates, file); FileFrameInfo dstFrame; - dstFrame.fifoDataSize = srcFrame.fifoDataSize; + dstFrame.fifoDataSize = static_cast(srcFrame.fifoData.size()); dstFrame.fifoDataOffset = dataOffset; dstFrame.fifoStart = srcFrame.fifoStart; dstFrame.fifoEnd = srcFrame.fifoEnd; dstFrame.memoryUpdatesOffset = memoryUpdatesOffset; - dstFrame.numMemoryUpdates = (u32)srcFrame.memoryUpdates.size(); + dstFrame.numMemoryUpdates = static_cast(srcFrame.memoryUpdates.size()); // Write frame info u64 frameOffset = frameListOffset + (i * sizeof(FileFrameInfo)); @@ -130,7 +123,7 @@ bool FifoDataFile::Save(const std::string& filename) return true; } -FifoDataFile* FifoDataFile::Load(const std::string& filename, bool flagsOnly) +std::unique_ptr FifoDataFile::Load(const std::string& filename, bool flagsOnly) { File::IOFile file; file.Open(filename, "rb"); @@ -146,7 +139,7 @@ FifoDataFile* FifoDataFile::Load(const std::string& filename, bool flagsOnly) return nullptr; } - FifoDataFile* dataFile = new FifoDataFile; + auto dataFile = std::make_unique(); dataFile->m_Flags = header.flags; dataFile->m_Version = header.file_version; @@ -182,13 +175,12 @@ FifoDataFile* FifoDataFile::Load(const std::string& filename, bool flagsOnly) file.ReadBytes(&srcFrame, sizeof(FileFrameInfo)); FifoFrameInfo dstFrame; - dstFrame.fifoData = new u8[srcFrame.fifoDataSize]; - dstFrame.fifoDataSize = srcFrame.fifoDataSize; + dstFrame.fifoData.resize(srcFrame.fifoDataSize); dstFrame.fifoStart = srcFrame.fifoStart; dstFrame.fifoEnd = srcFrame.fifoEnd; file.Seek(srcFrame.fifoDataOffset, SEEK_SET); - file.ReadBytes(dstFrame.fifoData, srcFrame.fifoDataSize); + file.ReadBytes(dstFrame.fifoData.data(), srcFrame.fifoDataSize); ReadMemoryUpdates(srcFrame.memoryUpdatesOffset, srcFrame.numMemoryUpdates, dstFrame.memoryUpdates, file); @@ -234,12 +226,12 @@ u64 FifoDataFile::WriteMemoryUpdates(const std::vector& memUpdates // Write memory file.Seek(0, SEEK_END); u64 dataOffset = file.Tell(); - file.WriteBytes(srcUpdate.data, srcUpdate.size); + file.WriteBytes(srcUpdate.data.data(), srcUpdate.data.size()); FileMemoryUpdate dstUpdate; dstUpdate.address = srcUpdate.address; dstUpdate.dataOffset = dataOffset; - dstUpdate.dataSize = srcUpdate.size; + dstUpdate.dataSize = static_cast(srcUpdate.data.size()); dstUpdate.fifoPosition = srcUpdate.fifoPosition; dstUpdate.type = srcUpdate.type; @@ -266,11 +258,10 @@ void FifoDataFile::ReadMemoryUpdates(u64 fileOffset, u32 numUpdates, MemoryUpdate& dstUpdate = memUpdates[i]; dstUpdate.address = srcUpdate.address; dstUpdate.fifoPosition = srcUpdate.fifoPosition; - dstUpdate.size = srcUpdate.dataSize; - dstUpdate.data = new u8[srcUpdate.dataSize]; - dstUpdate.type = (MemoryUpdate::Type)srcUpdate.type; + dstUpdate.data.resize(srcUpdate.dataSize); + dstUpdate.type = static_cast(srcUpdate.type); file.Seek(srcUpdate.dataOffset, SEEK_SET); - file.ReadBytes(dstUpdate.data, srcUpdate.dataSize); + file.ReadBytes(dstUpdate.data.data(), srcUpdate.dataSize); } } diff --git a/Source/Core/Core/FifoPlayer/FifoDataFile.h b/Source/Core/Core/FifoPlayer/FifoDataFile.h index 5d21ddcbf7..45dee96dba 100644 --- a/Source/Core/Core/FifoPlayer/FifoDataFile.h +++ b/Source/Core/Core/FifoPlayer/FifoDataFile.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include @@ -26,15 +27,13 @@ struct MemoryUpdate u32 fifoPosition; u32 address; - u32 size; - u8* data; + std::vector data; Type type; }; struct FifoFrameInfo { - u8* fifoData; - u32 fifoDataSize; + std::vector fifoData; u32 fifoStart; u32 fifoEnd; @@ -70,7 +69,7 @@ public: u32 GetFrameCount() const { return static_cast(m_Frames.size()); } bool Save(const std::string& filename); - static FifoDataFile* Load(const std::string& filename, bool flagsOnly); + static std::unique_ptr Load(const std::string& filename, bool flagsOnly); private: enum diff --git a/Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.cpp b/Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.cpp index 6d4e56ccb5..8b1e7f990b 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlaybackAnalyzer.cpp @@ -19,7 +19,7 @@ struct CmdData { u32 size; u32 offset; - u8* ptr; + const u8* ptr; }; void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile* file, @@ -51,10 +51,10 @@ void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile* file, #if LOG_FIFO_CMDS // Debugging - vector prevCmds; + std::vector prevCmds; #endif - while (cmdStart < frame.fifoDataSize) + while (cmdStart < frame.fifoData.size()) { // Add memory updates that have occurred before this point in the frame while (nextMemUpdate < frame.memoryUpdates.size() && diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp index 3078326b1b..41ad65c7cd 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp @@ -28,7 +28,6 @@ bool IsPlayingBackFifologWithBrokenEFBCopies = false; FifoPlayer::~FifoPlayer() { - delete m_File; } bool FifoPlayer::Open(const std::string& filename) @@ -40,7 +39,7 @@ bool FifoPlayer::Open(const std::string& filename) if (m_File) { FifoAnalyzer::Init(); - FifoPlaybackAnalyzer::AnalyzeFrames(m_File, m_FrameInfo); + FifoPlaybackAnalyzer::AnalyzeFrames(m_File.get(), m_FrameInfo); m_FrameRangeEnd = m_File->GetFrameCount(); } @@ -53,8 +52,7 @@ bool FifoPlayer::Open(const std::string& filename) void FifoPlayer::Close() { - delete m_File; - m_File = nullptr; + m_File.reset(); m_FrameRangeStart = 0; m_FrameRangeEnd = 0; @@ -209,7 +207,7 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo& // Core timing information m_CyclesPerFrame = SystemTimers::GetTicksPerSecond() / VideoInterface::GetTargetRefreshRate(); m_ElapsedCycles = 0; - m_FrameFifoSize = frame.fifoDataSize; + m_FrameFifoSize = static_cast(frame.fifoData.size()); // Determine start and end objects u32 numObjects = (u32)(info.objectStarts.size()); @@ -258,7 +256,7 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo& } // Write data after the last object - WriteFramePart(position, frame.fifoDataSize, memoryUpdate, frame, info); + WriteFramePart(position, static_cast(frame.fifoData.size()), memoryUpdate, frame, info); FlushWGP(); @@ -273,7 +271,7 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo& void FifoPlayer::WriteFramePart(u32 dataStart, u32 dataEnd, u32& nextMemUpdate, const FifoFrameInfo& frame, const AnalyzedFrameInfo& info) { - u8* data = frame.fifoData; + const u8* const data = frame.fifoData.data(); while (nextMemUpdate < frame.memoryUpdates.size() && dataStart < dataEnd) { @@ -325,10 +323,10 @@ void FifoPlayer::WriteMemory(const MemoryUpdate& memUpdate) else mem = &Memory::m_pRAM[memUpdate.address & Memory::RAM_MASK]; - memcpy(mem, memUpdate.data, memUpdate.size); + std::copy(memUpdate.data.begin(), memUpdate.data.end(), mem); } -void FifoPlayer::WriteFifo(u8* data, u32 start, u32 end) +void FifoPlayer::WriteFifo(const u8* data, u32 start, u32 end) { u32 written = start; u32 lastBurstEnd = end - 1; diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.h b/Source/Core/Core/FifoPlayer/FifoPlayer.h index 46d1f69b7c..2b5e4b49ea 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.h +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.h @@ -64,7 +64,7 @@ public: // PowerPC state. std::unique_ptr GetCPUCore(); - FifoDataFile* GetFile() { return m_File; } + FifoDataFile* GetFile() { return m_File.get(); } u32 GetFrameObjectCount(); u32 GetCurrentFrameNum() const { return m_CurrentFrame; } const AnalyzedFrameInfo& GetAnalyzedFrameInfo(u32 frame) const { return m_FrameInfo[frame]; } @@ -104,7 +104,7 @@ private: // 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(const u8* data, u32 start, u32 end); void SetupFifo(); @@ -143,7 +143,7 @@ private: CallbackFunc m_FileLoadedCb; CallbackFunc m_FrameWrittenCb; - FifoDataFile* m_File; + std::unique_ptr m_File; std::vector m_FrameInfo; }; diff --git a/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.cpp b/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.cpp index e0e13d4419..c02e04845d 100644 --- a/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.cpp @@ -38,7 +38,7 @@ void FifoRecordAnalyzer::ProcessLoadIndexedXf(u32 val, int array) FifoRecorder::GetInstance().UseMemory(address, size * 4, MemoryUpdate::XF_DATA); } -void FifoRecordAnalyzer::WriteVertexArray(int arrayIndex, u8* vertexData, int vertexSize, +void FifoRecordAnalyzer::WriteVertexArray(int arrayIndex, const u8* vertexData, int vertexSize, int numVertices) { // Skip if not indexed array diff --git a/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.h b/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.h index b0ca59ce97..b5a02e5d21 100644 --- a/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.h +++ b/Source/Core/Core/FifoPlayer/FifoRecordAnalyzer.h @@ -16,5 +16,5 @@ namespace FifoRecordAnalyzer void Initialize(u32* cpMem); void ProcessLoadIndexedXf(u32 val, int array); -void WriteVertexArray(int arrayIndex, u8* vertexData, int vertexSize, int numVertices); +void WriteVertexArray(int arrayIndex, const u8* vertexData, int vertexSize, int numVertices); }; diff --git a/Source/Core/Core/FifoPlayer/FifoRecorder.cpp b/Source/Core/Core/FifoPlayer/FifoRecorder.cpp index 2389562a4f..bd30d7213e 100644 --- a/Source/Core/Core/FifoPlayer/FifoRecorder.cpp +++ b/Source/Core/Core/FifoPlayer/FifoRecorder.cpp @@ -78,10 +78,7 @@ void FifoRecorder::WriteGPCommand(u8* data, u32 size) if (m_FrameEnded && m_FifoData.size() > 0) { - size_t dataSize = m_FifoData.size(); - m_CurrentFrame.fifoDataSize = (u32)dataSize; - m_CurrentFrame.fifoData = new u8[dataSize]; - memcpy(m_CurrentFrame.fifoData, m_FifoData.data(), dataSize); + m_CurrentFrame.fifoData = m_FifoData; { std::lock_guard lk(sMutex); @@ -126,12 +123,11 @@ void FifoRecorder::UseMemory(u32 address, u32 size, MemoryUpdate::Type type, boo MemoryUpdate memUpdate; memUpdate.address = address; memUpdate.fifoPosition = (u32)(m_FifoData.size()); - memUpdate.size = size; memUpdate.type = type; - memUpdate.data = new u8[size]; - memcpy(memUpdate.data, newData, size); + memUpdate.data.resize(size); + std::copy(newData, newData + size, memUpdate.data.begin()); - m_CurrentFrame.memoryUpdates.push_back(memUpdate); + m_CurrentFrame.memoryUpdates.push_back(std::move(memUpdate)); } else if (dynamicUpdate) { diff --git a/Source/Core/DolphinWX/FifoPlayerDlg.cpp b/Source/Core/DolphinWX/FifoPlayerDlg.cpp index 818b9547d2..33d083b61a 100644 --- a/Source/Core/DolphinWX/FifoPlayerDlg.cpp +++ b/Source/Core/DolphinWX/FifoPlayerDlg.cpp @@ -928,7 +928,7 @@ wxString FifoPlayerDlg::CreateRecordingFifoSizeLabel() const { size_t fifoBytes = 0; for (size_t i = 0; i < file->GetFrameCount(); ++i) - fifoBytes += file->GetFrame(i).fifoDataSize; + fifoBytes += file->GetFrame(i).fifoData.size(); return wxString::Format(_("%zu FIFO bytes"), fifoBytes); } @@ -946,8 +946,8 @@ wxString FifoPlayerDlg::CreateRecordingMemSizeLabel() const for (size_t frameNum = 0; frameNum < file->GetFrameCount(); ++frameNum) { const std::vector& memUpdates = file->GetFrame(frameNum).memoryUpdates; - for (auto& memUpdate : memUpdates) - memBytes += memUpdate.size; + for (const auto& memUpdate : memUpdates) + memBytes += memUpdate.data.size(); } return wxString::Format(_("%zu memory bytes"), memBytes);