Revert "Update to ZSTD"

This reverts commit f3a175c640.
This commit is contained in:
GabsPuNs
2026-06-05 20:21:06 -04:00
parent f3a175c640
commit 90cf815860
12 changed files with 131 additions and 65 deletions

View File

@@ -1,6 +1,16 @@
#include "compression.h"
#if defined __ORBIS__ || defined __PS3__ || defined _DURANGO || defined _WINDOWS64
#include "..\Minecraft.Client\Common\Libs\zlib\inc\zlib.h"
#endif
#ifdef _WINDOWS64
#include "..\Minecraft.Client\Windows64\Libs\zstd\inc\zstd.h"
#endif
#if defined __PSVITA__
#include "..\Minecraft.Client\PSVita\PSVitaExtras\zlib.h"
#elif defined __PS3__
#include "..\Minecraft.Client\PS3\PS3Extras\EdgeZLib.h"
#endif //__PS3__
DWORD Compression::tlsIdx = 0;
Compression::ThreadStorage *Compression::tlsDefault = nullptr;
@@ -45,7 +55,7 @@ Compression *Compression::getCompression()
return tls->compression;
}
HRESULT Compression::CompressZSTDRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
HRESULT Compression::CompressLZXRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
{
EnterCriticalSection(&rleCompressLock);
//static unsigned char rleBuf[1024*100];
@@ -114,7 +124,7 @@ HRESULT Compression::CompressZSTDRLE(void *pDestination, unsigned int *pDestSize
PIXEndNamedEvent();
PIXBeginNamedEvent(0,"Secondary compression");
Compression::Compress(pDestination, pDestSize, rleBuf, rleSize);
Compress(pDestination, pDestSize, rleBuf, rleSize);
PIXEndNamedEvent();
if(dynamicRleBuf != nullptr) delete [] dynamicRleBuf;
@@ -211,7 +221,7 @@ HRESULT Compression::CompressRLE(void *pDestination, unsigned int *pDestSize, vo
return S_OK;
}
HRESULT Compression::DecompressZSTDRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
{
EnterCriticalSection(&rleDecompressLock);
// 4J Stu - Fix for #13676 - Crash: Crash while attempting to load a world after updating TU
@@ -242,18 +252,18 @@ HRESULT Compression::DecompressZSTDRLE(void *pDestination, unsigned int *pDestSi
{
rleSize = safeRleSize;
dynamicRleBuf = new unsigned char[rleSize];
decompressResult = Compression::Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize);
decompressResult = Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize);
pucIn = (unsigned char *)dynamicRleBuf;
}
else
{
decompressResult = Compression::Decompress(rleDecompressBuf, &rleSize, pSource, SrcSize);
decompressResult = Decompress(rleDecompressBuf, &rleSize, pSource, SrcSize);
pucIn = static_cast<unsigned char*>(rleDecompressBuf);
}
if(decompressResult != S_OK)
{
app.DebugPrintf("*** DecompressZSTDRLE: Decompress FAILED hr=0x%08X srcSize=%u expectedDest=%u rleSize=%u\n",
app.DebugPrintf("*** DecompressLZXRLE: zlib Decompress FAILED hr=0x%08X srcSize=%u expectedDest=%u rleSize=%u\n",
decompressResult, SrcSize, *pDestSize, rleSize);
if(dynamicRleBuf != nullptr) delete [] dynamicRleBuf;
*pDestSize = 0;
@@ -379,9 +389,11 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize,
HRESULT Compression::Compress(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
{
// ZSTD for Windows
/*
// Use zstd for Windows
#ifdef _WINDOWS64
size_t destSize = static_cast<size_t>(*pDestSize);
const size_t res = ZSTD_compress(pDestination, destSize, pSource, SrcSize, 6);
const size_t res = ZSTD_compress(pDestination, destSize, pSource, SrcSize, 3);
if (ZSTD_isError(res))
return -1;
@@ -389,65 +401,65 @@ HRESULT Compression::Compress(void *pDestination, unsigned int *pDestSize, void
*pDestSize = static_cast<unsigned int>(res);
return S_OK;
/*
// ZLIB
*/
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
#if defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ || defined _WINDOWS64
SIZE_T destSize = (SIZE_T)(*pDestSize);
const int res = ::compress(static_cast<Bytef *>(pDestination), (uLongf *)&destSize, static_cast<Bytef *>(pSource), SrcSize);
*pDestSize = static_cast<unsigned int>(destSize);
return ( ( res == Z_OK ) ? S_OK : -1 );
// PS3 a stubbed non-compressing version of ZLIB
#elif defined __PS3__
uint32_t destSize = (uint32_t)(*pDestSize);
bool res = EdgeZLib::Compress(pDestination, &destSize, pSource, SrcSize);
*pDestSize = (unsigned int)destSize;
return ( ( res ) ? S_OK : -1 );
// 360 is using native 360 compression
#else
SIZE_T destSize = (SIZE_T)(*pDestSize);
HRESULT res = XMemCompress(compressionContext, pDestination, &destSize, pSource, SrcSize);
*pDestSize = (unsigned int)destSize;
return res;
*/
#endif
}
HRESULT Compression::Decompress(void *pDestination, unsigned int *pDestSize, void *pSource, unsigned int SrcSize)
{
if(m_decompressType != m_localDecompressType) // check if we're decompressing data from a different platform
{
// only used for loading a save from a different platform (Sony cloud storage cross play)
return DecompressWithType(pDestination, pDestSize, pSource, SrcSize);
}
// ZSTD for Windows
/*
// Use zstd for Windows
#ifdef _WINDOWS64
size_t destSize = static_cast<size_t>(*pDestSize);
const size_t res = ZSTD_decompress(pDestination, destSize, pSource, SrcSize);
if (ZSTD_isError(res))
return -1;
return -1;
*pDestSize = static_cast<unsigned int>(res);
return S_OK;
/*
// ZLIB
*/
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
#if defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ || defined _WINDOWS64
SIZE_T destSize = (SIZE_T)(*pDestSize);
const int res = ::uncompress(static_cast<Bytef *>(pDestination), (uLongf *)&destSize, static_cast<Bytef *>(pSource), SrcSize);
*pDestSize = static_cast<unsigned int>(destSize);
return ( ( res == Z_OK ) ? S_OK : -1 );
*/
/*
// PS3 a stubbed non-compressing version of ZLIB
#elif defined __PS3__
uint32_t destSize = (uint32_t)(*pDestSize);
bool res = EdgeZLib::Decompress(pDestination, &destSize, pSource, SrcSize);
*pDestSize = (unsigned int)destSize;
return ( ( res ) ? S_OK : -1 );
// 360 is using native 360 compression
#else
SIZE_T destSize = (SIZE_T)(*pDestSize);
HRESULT res = XMemDecompress(decompressionContext, pDestination, (SIZE_T *)&destSize, pSource, SrcSize);
*pDestSize = (unsigned int)destSize;
return res;
*/
#endif
}
// MGH - same as VirtualDecompress in PSVitaStubs, but for use on other platforms (so no virtual mem stuff)
@@ -498,19 +510,27 @@ HRESULT Compression::DecompressWithType(void *pDestination, unsigned int *pDestS
return S_OK;
case eCompressionType_LZXRLE:
{
#if (defined _XBOX || defined _DURANGO || defined _WINDOWS64)
SIZE_T destSize = (SIZE_T)(*pDestSize);
const HRESULT res = XMemDecompress(decompressionContext, pDestination, (SIZE_T *)&destSize, pSource, SrcSize);
*pDestSize = static_cast<unsigned int>(destSize);
return res;
#else
assert(0);
#endif
}
break;
case eCompressionType_ZLIBRLE:
#if (defined __ORBIS__ || defined __PS3__ || defined _DURANGO || defined _WINDOWS64)
if (pDestination != nullptr)
return ::uncompress(static_cast<PBYTE>(pDestination), (unsigned long *) pDestSize, static_cast<PBYTE>(pSource), SrcSize); // Decompress
else
break; // Cannot decompress when destination is nullptr
else break; // Cannot decompress when destination is nullptr
#else
assert(0);
break;
#endif
case eCompressionType_PS3ZLIB:
#if (defined __ORBIS__ || defined __PSVITA__ || defined _DURANGO || defined _WINDOWS64)
// Note that we're missing the normal zlib header and footer so we'll use inflate to
// decompress the payload and skip all the CRC checking, etc
if (pDestination != nullptr)
@@ -562,20 +582,27 @@ HRESULT Compression::DecompressWithType(void *pDestination, unsigned int *pDestS
delete uncompr.data;
return S_OK;
}
else
break; // Cannot decompress when destination is nullptr
else break; // Cannot decompress when destination is nullptr
#else
assert(0);
#endif
case eCompressionType_ZSTDRLE:
#ifdef _WINDOWS64
if (pDestination != nullptr)
return ZSTD_decompress(static_cast<PBYTE>(pDestination), (SIZE_T)pDestSize, static_cast<PBYTE>(pSource), SrcSize);
else
break; // Cannot decompress when destination is nullptr
else break; // Cannot decompress when destination is nullptr
#else
assert(0);
break;
#endif
}
assert(false);
return -1;
}
Compression::Compression()
{
// Using zlib for x64 compression - 360 is using native 360 compression and PS3 a stubbed non-compressing version of this
@@ -591,10 +618,15 @@ Compression::Compression()
XMemCreateDecompressionContext(XMEMCODEC_LZX,&params,0,&decompressionContext);
#endif
//X360: eCompressionType_LZXRLE. PS3: eCompressionType_PS3ZLIB.
//Other Consoles: eCompressionType_ZLIBRLE.
m_localDecompressType = eCompressionType_ZSTDRLE;
#if defined _XBOX
m_localDecompressType = eCompressionType_LZXRLE;
#elif defined __PS3__
m_localDecompressType = eCompressionType_PS3ZLIB;
//#elif defined _WINDOWS64
// m_localDecompressType = eCompressionType_ZSTDRLE;
#else
m_localDecompressType = eCompressionType_ZLIBRLE;
#endif
m_decompressType = m_localDecompressType;
InitializeCriticalSection(&rleCompressLock);
@@ -612,6 +644,8 @@ Compression::~Compression()
DeleteCriticalSection(&rleDecompressLock);
}
void Compression::SetDecompressionType(ESavePlatform platform)
{
switch(platform)
@@ -625,10 +659,11 @@ void Compression::SetDecompressionType(ESavePlatform platform)
case SAVE_FILE_PLATFORM_XBONE:
case SAVE_FILE_PLATFORM_PS4:
case SAVE_FILE_PLATFORM_PSVITA:
case SAVE_FILE_PLATFORM_WIN64:
Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZLIBRLE);
break;
case SAVE_FILE_PLATFORM_WIN64:
Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZSTDRLE);
// case SAVE_FILE_PLATFORM_WIN64:
// Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_ZSTDRLE);
break;
default:
assert(0);
@@ -636,4 +671,6 @@ void Compression::SetDecompressionType(ESavePlatform platform)
}
}
/*Compression gCompression;*/
/*Compression gCompression;*/