mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Add ZSTD compression for precompiled cache
This commit is contained in:
		
							parent
							
								
									cd86c9b043
								
							
						
					
					
						commit
						8f67d6a444
					
				
					 5 changed files with 103 additions and 0 deletions
				
			
		
							
								
								
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							|  | @ -46,3 +46,6 @@ | ||||||
| [submodule "lodepng"] | [submodule "lodepng"] | ||||||
|     path = externals/lodepng/lodepng |     path = externals/lodepng/lodepng | ||||||
|     url = https://github.com/lvandeve/lodepng.git |     url = https://github.com/lvandeve/lodepng.git | ||||||
|  | [submodule "zstd"] | ||||||
|  |     path = externals/zstd | ||||||
|  |     url = https://github.com/facebook/zstd.git | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								externals/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								externals/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -62,6 +62,10 @@ if (ARCHITECTURE_x86_64) | ||||||
|     target_compile_definitions(xbyak INTERFACE XBYAK_NO_OP_NAMES) |     target_compile_definitions(xbyak INTERFACE XBYAK_NO_OP_NAMES) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | # Zstandard | ||||||
|  | add_subdirectory(zstd/build/cmake EXCLUDE_FROM_ALL) | ||||||
|  | target_include_directories(libzstd_static INTERFACE ./zstd/lib) | ||||||
|  | 
 | ||||||
| # ENet | # ENet | ||||||
| add_subdirectory(enet) | add_subdirectory(enet) | ||||||
| target_include_directories(enet INTERFACE ./enet/include) | target_include_directories(enet INTERFACE ./enet/include) | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								externals/zstd
									
										
									
									
										vendored
									
									
										Submodule
									
								
							
							
						
						
									
										1
									
								
								externals/zstd
									
										
									
									
										vendored
									
									
										Submodule
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Subproject commit 470344d33e1d52a2ada75d278466da8d4ee2faf6 | ||||||
							
								
								
									
										51
									
								
								src/common/zstd_compression.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/common/zstd_compression.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | // Copyright 2019 yuzu Emulator Project
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include <algorithm> | ||||||
|  | #include <zstd.h> | ||||||
|  | 
 | ||||||
|  | #include "common/assert.h" | ||||||
|  | #include "common/zstd_compression.h" | ||||||
|  | 
 | ||||||
|  | namespace Common::Compression { | ||||||
|  | 
 | ||||||
|  | std::vector<u8> CompressDataZSTD(const u8* source, std::size_t source_size, s32 compression_level) { | ||||||
|  |     compression_level = std::clamp(compression_level, 1, ZSTD_maxCLevel()); | ||||||
|  | 
 | ||||||
|  |     const std::size_t max_compressed_size = ZSTD_compressBound(source_size); | ||||||
|  |     std::vector<u8> compressed(max_compressed_size); | ||||||
|  | 
 | ||||||
|  |     const std::size_t compressed_size = | ||||||
|  |         ZSTD_compress(compressed.data(), compressed.size(), source, source_size, compression_level); | ||||||
|  | 
 | ||||||
|  |     if (ZSTD_isError(compressed_size)) { | ||||||
|  |         // Compression failed
 | ||||||
|  |         return {}; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     compressed.resize(compressed_size); | ||||||
|  | 
 | ||||||
|  |     return compressed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::vector<u8> CompressDataZSTDDefault(const u8* source, std::size_t source_size) { | ||||||
|  |     return CompressDataZSTD(source, source_size, ZSTD_CLEVEL_DEFAULT); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::vector<u8> DecompressDataZSTD(const std::vector<u8>& compressed) { | ||||||
|  |     const std::size_t decompressed_size = | ||||||
|  |         ZSTD_getDecompressedSize(compressed.data(), compressed.size()); | ||||||
|  |     std::vector<u8> decompressed(decompressed_size); | ||||||
|  | 
 | ||||||
|  |     const std::size_t uncompressed_result_size = ZSTD_decompress( | ||||||
|  |         decompressed.data(), decompressed.size(), compressed.data(), compressed.size()); | ||||||
|  | 
 | ||||||
|  |     if (decompressed_size != uncompressed_result_size || ZSTD_isError(uncompressed_result_size)) { | ||||||
|  |         // Decompression failed
 | ||||||
|  |         return {}; | ||||||
|  |     } | ||||||
|  |     return decompressed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Common::Compression
 | ||||||
							
								
								
									
										44
									
								
								src/common/zstd_compression.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/common/zstd_compression.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | // Copyright 2019 yuzu Emulator Project
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
|  | #include "common/common_types.h" | ||||||
|  | 
 | ||||||
|  | namespace Common::Compression { | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Compresses a source memory region with Zstandard and returns the compressed data in a vector. | ||||||
|  |  * | ||||||
|  |  * @param source the uncompressed source memory region. | ||||||
|  |  * @param source_size the size in bytes of the uncompressed source memory region. | ||||||
|  |  * @param compression_level the used compression level. Should be between 1 and 22. | ||||||
|  |  * | ||||||
|  |  * @return the compressed data. | ||||||
|  |  */ | ||||||
|  | std::vector<u8> CompressDataZSTD(const u8* source, std::size_t source_size, s32 compression_level); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Compresses a source memory region with Zstandard with the default compression level and returns | ||||||
|  |  * the compressed data in a vector. | ||||||
|  |  * | ||||||
|  |  * @param source the uncompressed source memory region. | ||||||
|  |  * @param source_size the size in bytes of the uncompressed source memory region. | ||||||
|  |  * | ||||||
|  |  * @return the compressed data. | ||||||
|  |  */ | ||||||
|  | std::vector<u8> CompressDataZSTDDefault(const u8* source, std::size_t source_size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Decompresses a source memory region with Zstandard and returns the uncompressed data in a vector. | ||||||
|  |  * | ||||||
|  |  * @param compressed the compressed source memory region. | ||||||
|  |  * | ||||||
|  |  * @return the decompressed data. | ||||||
|  |  */ | ||||||
|  | std::vector<u8> DecompressDataZSTD(const std::vector<u8>& compressed); | ||||||
|  | 
 | ||||||
|  | } // namespace Common::Compression
 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue