mirror of
https://github.com/ARMSX2/ARMSX2.git
synced 2026-08-24 16:50:16 -07:00
GS: Replace xz/liblzma with 7zip LZMA SDK
This commit is contained in:
committed by
Connor McLaughlin
parent
907ae642d0
commit
ad81318854
+2
-2
@@ -1,5 +1,5 @@
|
||||
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>, 2024 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ if(WIN32)
|
||||
WINVER=${MIN_WIN32}
|
||||
_WIN32_WINNT=${MIN_WIN32}
|
||||
WIN32_LEAN_AND_MEAN
|
||||
LZMA_API_STATIC
|
||||
WIL_SUPPRESS_EXCEPTIONS
|
||||
)
|
||||
endif(WIN32)
|
||||
@@ -1114,7 +1113,7 @@ target_link_libraries(PCSX2_FLAGS INTERFACE
|
||||
LZ4::LZ4
|
||||
SoundTouch::SoundTouch
|
||||
PNG::PNG
|
||||
LibLZMA::LibLZMA
|
||||
LZMA::LZMA
|
||||
Zstd::Zstd
|
||||
${LIBC_LIBRARIES}
|
||||
)
|
||||
|
||||
+286
-163
File diff suppressed because it is too large
Load Diff
+9
-47
@@ -1,13 +1,11 @@
|
||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
||||
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SaveState.h"
|
||||
#include "GSRegs.h"
|
||||
#include "Renderers/SW/GSVertexSW.h"
|
||||
#include <lzma.h>
|
||||
#include <zstd.h>
|
||||
#include "GS/GSRegs.h"
|
||||
#include "GS/Renderers/SW/GSVertexSW.h"
|
||||
|
||||
/*
|
||||
|
||||
@@ -68,53 +66,17 @@ public:
|
||||
void ReadFIFO(u32 size);
|
||||
void Transfer(int index, const u8* mem, size_t size);
|
||||
bool VSync(int field, bool last, const GSPrivRegSet* regs);
|
||||
};
|
||||
|
||||
class GSDumpUncompressed final : public GSDumpBase
|
||||
{
|
||||
void AppendRawData(const void* data, size_t size) final;
|
||||
void AppendRawData(u8 c) final;
|
||||
|
||||
public:
|
||||
GSDumpUncompressed(const std::string& fn, const std::string& serial, u32 crc,
|
||||
static std::unique_ptr<GSDumpBase> CreateUncompressedDump(
|
||||
const std::string& fn, const std::string& serial, u32 crc,
|
||||
u32 screenshot_width, u32 screenshot_height, const u32* screenshot_pixels,
|
||||
const freezeData& fd, const GSPrivRegSet* regs);
|
||||
virtual ~GSDumpUncompressed() = default;
|
||||
};
|
||||
|
||||
class GSDumpXz final : public GSDumpBase
|
||||
{
|
||||
lzma_stream m_strm;
|
||||
|
||||
std::vector<u8> m_in_buff;
|
||||
|
||||
void Flush();
|
||||
void Compress(lzma_action action, lzma_ret expected_status);
|
||||
void AppendRawData(const void* data, size_t size);
|
||||
void AppendRawData(u8 c);
|
||||
|
||||
public:
|
||||
GSDumpXz(const std::string& fn, const std::string& serial, u32 crc,
|
||||
static std::unique_ptr<GSDumpBase> CreateXzDump(
|
||||
const std::string& fn, const std::string& serial, u32 crc,
|
||||
u32 screenshot_width, u32 screenshot_height, const u32* screenshot_pixels,
|
||||
const freezeData& fd, const GSPrivRegSet* regs);
|
||||
virtual ~GSDumpXz();
|
||||
};
|
||||
|
||||
class GSDumpZst final : public GSDumpBase
|
||||
{
|
||||
ZSTD_CStream* m_strm;
|
||||
|
||||
std::vector<u8> m_in_buff;
|
||||
std::vector<u8> m_out_buff;
|
||||
|
||||
void MayFlush();
|
||||
void Compress(ZSTD_EndDirective action);
|
||||
void AppendRawData(const void* data, size_t size);
|
||||
void AppendRawData(u8 c);
|
||||
|
||||
public:
|
||||
GSDumpZst(const std::string& fn, const std::string& serial, u32 crc,
|
||||
static std::unique_ptr<GSDumpBase> CreateZstDump(
|
||||
const std::string& fn, const std::string& serial, u32 crc,
|
||||
u32 screenshot_width, u32 screenshot_height, const u32* screenshot_pixels,
|
||||
const freezeData& fd, const GSPrivRegSet* regs);
|
||||
virtual ~GSDumpZst();
|
||||
};
|
||||
|
||||
+419
-231
File diff suppressed because it is too large
Load Diff
+8
-67
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
||||
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
|
||||
#pragma once
|
||||
@@ -7,8 +7,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <lzma.h>
|
||||
#include <zstd.h>
|
||||
class Error;
|
||||
|
||||
#define GEN_REG_ENUM_CLASS_CONTENT(ClassName, EntryName, Value) \
|
||||
EntryName = Value,
|
||||
@@ -291,7 +290,7 @@ public:
|
||||
|
||||
virtual ~GSDumpFile();
|
||||
|
||||
static std::unique_ptr<GSDumpFile> OpenGSDump(const char* filename, const char* repack_filename = nullptr);
|
||||
static std::unique_ptr<GSDumpFile> OpenGSDump(const char* filename, Error* error = nullptr);
|
||||
static bool GetPreviewImageFromDump(const char* filename, u32* width, u32* height, std::vector<u32>* pixels);
|
||||
|
||||
__fi const std::string& GetSerial() const { return m_serial; }
|
||||
@@ -301,21 +300,16 @@ public:
|
||||
__fi const ByteArray& GetStateData() const { return m_state_data; }
|
||||
__fi const GSDataArray& GetPackets() const { return m_dump_packets; }
|
||||
|
||||
bool ReadFile();
|
||||
bool ReadFile(Error* error);
|
||||
|
||||
protected:
|
||||
GSDumpFile(FILE* file, FILE* repack_file);
|
||||
GSDumpFile();
|
||||
|
||||
virtual bool Open(std::FILE* fp, Error* error) = 0;
|
||||
virtual bool IsEof() = 0;
|
||||
virtual size_t Read(void* ptr, size_t size) = 0;
|
||||
|
||||
void Repack(void* ptr, size_t size);
|
||||
|
||||
FILE* m_fp = nullptr;
|
||||
|
||||
private:
|
||||
FILE* m_repack_fp = nullptr;
|
||||
|
||||
std::string m_serial;
|
||||
u32 m_crc = 0;
|
||||
|
||||
@@ -326,58 +320,5 @@ private:
|
||||
GSDataArray m_dump_packets;
|
||||
};
|
||||
|
||||
class GSDumpLzma : public GSDumpFile
|
||||
{
|
||||
lzma_stream m_strm;
|
||||
|
||||
size_t m_buff_size;
|
||||
uint8_t* m_area;
|
||||
uint8_t* m_inbuf;
|
||||
|
||||
size_t m_avail;
|
||||
size_t m_start;
|
||||
|
||||
void Decompress();
|
||||
void Initialize();
|
||||
|
||||
public:
|
||||
GSDumpLzma(FILE* file, FILE* repack_file);
|
||||
virtual ~GSDumpLzma();
|
||||
|
||||
bool IsEof() final;
|
||||
size_t Read(void* ptr, size_t size) final;
|
||||
};
|
||||
|
||||
class GSDumpDecompressZst : public GSDumpFile
|
||||
{
|
||||
static constexpr u32 INPUT_BUFFER_SIZE = 512 * _1kb;
|
||||
static constexpr u32 OUTPUT_BUFFER_SIZE = 2 * _1mb;
|
||||
|
||||
ZSTD_DStream* m_strm;
|
||||
ZSTD_inBuffer m_inbuf;
|
||||
|
||||
uint8_t* m_area;
|
||||
|
||||
size_t m_avail;
|
||||
size_t m_start;
|
||||
|
||||
void Decompress();
|
||||
void Initialize();
|
||||
|
||||
public:
|
||||
GSDumpDecompressZst(FILE* file, FILE* repack_file);
|
||||
virtual ~GSDumpDecompressZst();
|
||||
|
||||
bool IsEof() final;
|
||||
size_t Read(void* ptr, size_t size) final;
|
||||
};
|
||||
|
||||
class GSDumpRaw : public GSDumpFile
|
||||
{
|
||||
public:
|
||||
GSDumpRaw(FILE* file, FILE* repack_file);
|
||||
virtual ~GSDumpRaw() = default;
|
||||
|
||||
bool IsEof() final;
|
||||
size_t Read(void* ptr, size_t size) final;
|
||||
};
|
||||
// Initializes CRC tables used by LZMA SDK.
|
||||
void GSInit7ZCRCTables();
|
||||
|
||||
@@ -676,23 +676,23 @@ void GSRenderer::VSync(u32 field, bool registers_written, bool idle_frame)
|
||||
std::string_view compression_str;
|
||||
if (GSConfig.GSDumpCompression == GSDumpCompressionMethod::Uncompressed)
|
||||
{
|
||||
m_dump = std::unique_ptr<GSDumpBase>(new GSDumpUncompressed(m_snapshot, VMManager::GetDiscSerial(),
|
||||
m_dump = GSDumpBase::CreateUncompressedDump(m_snapshot, VMManager::GetDiscSerial(),
|
||||
VMManager::GetDiscCRC(), screenshot_width, screenshot_height,
|
||||
screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs));
|
||||
screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs);
|
||||
compression_str = TRANSLATE_SV("GS", "with no compression");
|
||||
}
|
||||
else if (GSConfig.GSDumpCompression == GSDumpCompressionMethod::LZMA)
|
||||
{
|
||||
m_dump = std::unique_ptr<GSDumpBase>(
|
||||
new GSDumpXz(m_snapshot, VMManager::GetDiscSerial(), VMManager::GetDiscCRC(), screenshot_width,
|
||||
screenshot_height, screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs));
|
||||
m_dump = GSDumpBase::CreateXzDump(m_snapshot, VMManager::GetDiscSerial(),
|
||||
VMManager::GetDiscCRC(), screenshot_width, screenshot_height,
|
||||
screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs);
|
||||
compression_str = TRANSLATE_SV("GS", "with LZMA compression");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dump = std::unique_ptr<GSDumpBase>(
|
||||
new GSDumpZst(m_snapshot, VMManager::GetDiscSerial(), VMManager::GetDiscCRC(), screenshot_width,
|
||||
screenshot_height, screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs));
|
||||
m_dump = GSDumpBase::CreateZstDump(m_snapshot, VMManager::GetDiscSerial(),
|
||||
VMManager::GetDiscCRC(), screenshot_width, screenshot_height,
|
||||
screenshot_pixels.empty() ? nullptr : screenshot_pixels.data(), fd, m_regs);
|
||||
compression_str = TRANSLATE_SV("GS", "with Zstandard compression");
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
||||
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
|
||||
#include "GS.h"
|
||||
@@ -18,7 +18,9 @@
|
||||
|
||||
#include "fmt/core.h"
|
||||
|
||||
#include "common/Error.h"
|
||||
#include "common/FileSystem.h"
|
||||
#include "common/Path.h"
|
||||
#include "common/StringUtil.h"
|
||||
#include "common/Threading.h"
|
||||
#include "common/Timer.h"
|
||||
@@ -87,10 +89,12 @@ bool GSDumpReplayer::Initialize(const char* filename)
|
||||
Common::Timer timer;
|
||||
Console.WriteLn("(GSDumpReplayer) Reading file '%s'...", filename);
|
||||
|
||||
s_dump_file = GSDumpFile::OpenGSDump(filename);
|
||||
if (!s_dump_file || !s_dump_file->ReadFile())
|
||||
Error error;
|
||||
s_dump_file = GSDumpFile::OpenGSDump(filename, &error);
|
||||
if (!s_dump_file || !s_dump_file->ReadFile(&error))
|
||||
{
|
||||
Host::ReportFormattedErrorAsync("GSDumpReplayer", "Failed to open or read '%s'.", filename);
|
||||
Host::ReportErrorAsync("GSDumpReplayer", fmt::format("Failed to open or read '{}': {}",
|
||||
Path::GetFileName(filename), error.GetDescription()));
|
||||
s_dump_file.reset();
|
||||
return false;
|
||||
}
|
||||
@@ -119,10 +123,12 @@ bool GSDumpReplayer::ChangeDump(const char* filename)
|
||||
return false;
|
||||
}
|
||||
|
||||
Error error;
|
||||
std::unique_ptr<GSDumpFile> new_dump(GSDumpFile::OpenGSDump(filename));
|
||||
if (!new_dump || !new_dump->ReadFile())
|
||||
if (!new_dump || !new_dump->ReadFile(&error))
|
||||
{
|
||||
Host::ReportFormattedErrorAsync("GSDumpReplayer", "Failed to open or read '%s'.", filename);
|
||||
Host::ReportErrorAsync("GSDumpReplayer", fmt::format("Failed to open or read '{}': {}",
|
||||
Path::GetFileName(filename), error.GetDescription()));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -36,7 +36,6 @@
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fmt\fmt\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\wil\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\xz\xz\src\liblzma\api</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\zlib</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\lz4\lz4\lib</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\libpng</AdditionalIncludeDirectories>
|
||||
@@ -60,6 +59,7 @@
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\glslang\glslang</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\vulkan-headers\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\d3d12memalloc\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\lzma\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\xbyak</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\zydis\include;$(SolutionDir)3rdparty\zydis\dependencies\zycore\include</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
@@ -810,9 +810,6 @@
|
||||
<ProjectReference Include="$(SolutionDir)3rdparty\soundtouch\SoundTouch.vcxproj">
|
||||
<Project>{e9b51944-7e6d-4bcd-83f2-7bbd5a46182d}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)3rdparty\xz\liblzma.vcxproj">
|
||||
<Project>{12728250-16ec-4dc6-94d7-e21dd88947f8}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(SolutionDir)3rdparty\libchdr\libchdr.vcxproj">
|
||||
<Project>{a0d2b3ad-1f72-4ee3-8b5c-f2c358da35f0}</Project>
|
||||
</ProjectReference>
|
||||
@@ -849,6 +846,9 @@
|
||||
<ProjectReference Include="..\3rdparty\lz4\lz4.vcxproj">
|
||||
<Project>{39098635-446a-4fc3-9b1c-8609d94598a8}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\3rdparty\lzma\lzma.vcxproj">
|
||||
<Project>{a4323327-3f2b-4271-83d9-7f9a3c66b6b2}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\3rdparty\rainterface\rainterface.vcxproj">
|
||||
<Project>{95dd0a0c-d14d-4cff-a593-820ef26efcc8}</Project>
|
||||
</ProjectReference>
|
||||
|
||||
Reference in New Issue
Block a user