data_compression: Move LZ4 compression from video_core/gl_shader_disk_cache to common/data_compression
This commit is contained in:
		
							parent
							
								
									f770c17d01
								
							
						
					
					
						commit
						798d76f4c7
					
				| @ -79,6 +79,8 @@ add_library(common STATIC | ||||
|     common_funcs.h | ||||
|     common_paths.h | ||||
|     common_types.h | ||||
|     data_compression.cpp | ||||
|     data_compression.h | ||||
|     file_util.cpp | ||||
|     file_util.h | ||||
|     hash.h | ||||
| @ -136,3 +138,4 @@ endif() | ||||
| create_target_directory_groups(common) | ||||
| 
 | ||||
| target_link_libraries(common PUBLIC Boost::boost fmt microprofile) | ||||
| target_link_libraries(common PRIVATE lz4_static) | ||||
|  | ||||
							
								
								
									
										46
									
								
								src/common/data_compression.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/common/data_compression.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| // Copyright 2019 yuzu Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <lz4.h> | ||||
| 
 | ||||
| #include "data_compression.h" | ||||
| 
 | ||||
| namespace Compression { | ||||
| 
 | ||||
| 
 | ||||
| std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size) { | ||||
|     if (source_size > LZ4_MAX_INPUT_SIZE) { | ||||
|         // Source size exceeds LZ4 maximum input size
 | ||||
|         return {}; | ||||
|     } | ||||
|     const auto source_size_int = static_cast<int>(source_size); | ||||
|     const int max_compressed_size = LZ4_compressBound(source_size_int); | ||||
|     std::vector<u8> compressed(max_compressed_size); | ||||
|     const int compressed_size = LZ4_compress_default(reinterpret_cast<const char*>(source), | ||||
|                                                      reinterpret_cast<char*>(compressed.data()), | ||||
|                                                      source_size_int, max_compressed_size); | ||||
|     if (compressed_size <= 0) { | ||||
|         // Compression failed
 | ||||
|         return {}; | ||||
|     } | ||||
|     compressed.resize(compressed_size); | ||||
|     return compressed; | ||||
| } | ||||
| 
 | ||||
| std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, std::size_t uncompressed_size) { | ||||
|     std::vector<u8> uncompressed(uncompressed_size); | ||||
|     const int size_check = LZ4_decompress_safe(reinterpret_cast<const char*>(compressed.data()), | ||||
|                                                reinterpret_cast<char*>(uncompressed.data()), | ||||
|                                                static_cast<int>(compressed.size()), | ||||
|                                                static_cast<int>(uncompressed.size())); | ||||
|     if (static_cast<int>(uncompressed_size) != size_check) { | ||||
|         // Decompression failed
 | ||||
|         return {}; | ||||
|     } | ||||
|     return uncompressed; | ||||
| } | ||||
| 
 | ||||
| } // namespace Compression
 | ||||
							
								
								
									
										17
									
								
								src/common/data_compression.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/common/data_compression.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| // 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 Compression { | ||||
| 
 | ||||
| std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size); | ||||
| 
 | ||||
| std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, std::size_t uncompressed_size); | ||||
| 
 | ||||
| } // namespace Compression
 | ||||
| @ -137,4 +137,4 @@ endif() | ||||
| create_target_directory_groups(video_core) | ||||
| 
 | ||||
| target_link_libraries(video_core PUBLIC common core) | ||||
| target_link_libraries(video_core PRIVATE glad lz4_static) | ||||
| target_link_libraries(video_core PRIVATE glad) | ||||
|  | ||||
| @ -4,11 +4,11 @@ | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include <fmt/format.h> | ||||
| #include <lz4.h> | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/common_paths.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/data_compression.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "common/scm_rev.h" | ||||
| @ -49,39 +49,6 @@ ShaderCacheVersionHash GetShaderCacheVersionHash() { | ||||
|     return hash; | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| std::vector<u8> CompressData(const T* source, std::size_t source_size) { | ||||
|     if (source_size > LZ4_MAX_INPUT_SIZE) { | ||||
|         // Source size exceeds LZ4 maximum input size
 | ||||
|         return {}; | ||||
|     } | ||||
|     const auto source_size_int = static_cast<int>(source_size); | ||||
|     const int max_compressed_size = LZ4_compressBound(source_size_int); | ||||
|     std::vector<u8> compressed(max_compressed_size); | ||||
|     const int compressed_size = LZ4_compress_default(reinterpret_cast<const char*>(source), | ||||
|                                                      reinterpret_cast<char*>(compressed.data()), | ||||
|                                                      source_size_int, max_compressed_size); | ||||
|     if (compressed_size <= 0) { | ||||
|         // Compression failed
 | ||||
|         return {}; | ||||
|     } | ||||
|     compressed.resize(compressed_size); | ||||
|     return compressed; | ||||
| } | ||||
| 
 | ||||
| std::vector<u8> DecompressData(const std::vector<u8>& compressed, std::size_t uncompressed_size) { | ||||
|     std::vector<u8> uncompressed(uncompressed_size); | ||||
|     const int size_check = LZ4_decompress_safe(reinterpret_cast<const char*>(compressed.data()), | ||||
|                                                reinterpret_cast<char*>(uncompressed.data()), | ||||
|                                                static_cast<int>(compressed.size()), | ||||
|                                                static_cast<int>(uncompressed.size())); | ||||
|     if (static_cast<int>(uncompressed_size) != size_check) { | ||||
|         // Decompression failed
 | ||||
|         return {}; | ||||
|     } | ||||
|     return uncompressed; | ||||
| } | ||||
| 
 | ||||
| } // namespace
 | ||||
| 
 | ||||
| ShaderDiskCacheRaw::ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type, | ||||
| @ -292,7 +259,7 @@ ShaderDiskCacheOpenGL::LoadPrecompiledFile(FileUtil::IOFile& file) { | ||||
|                 return {}; | ||||
|             } | ||||
| 
 | ||||
|             dump.binary = DecompressData(compressed_binary, binary_length); | ||||
|             dump.binary = Compression::DecompressDataLZ4(compressed_binary, binary_length); | ||||
|             if (dump.binary.empty()) { | ||||
|                 return {}; | ||||
|             } | ||||
| @ -321,7 +288,7 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     const std::vector<u8> code = DecompressData(compressed_code, code_size); | ||||
|     const std::vector<u8> code = Compression::DecompressDataLZ4(compressed_code, code_size); | ||||
|     if (code.empty()) { | ||||
|         return {}; | ||||
|     } | ||||
| @ -507,7 +474,8 @@ void ShaderDiskCacheOpenGL::SaveDecompiled(u64 unique_identifier, const std::str | ||||
|     if (!IsUsable()) | ||||
|         return; | ||||
| 
 | ||||
|     const std::vector<u8> compressed_code{CompressData(code.data(), code.size())}; | ||||
|     const std::vector<u8> compressed_code{ | ||||
|         Compression::CompressDataLZ4(reinterpret_cast<const u8*>(code.data()), code.size())}; | ||||
|     if (compressed_code.empty()) { | ||||
|         LOG_ERROR(Render_OpenGL, "Failed to compress GLSL code - skipping shader {:016x}", | ||||
|                   unique_identifier); | ||||
| @ -537,7 +505,9 @@ void ShaderDiskCacheOpenGL::SaveDump(const ShaderDiskCacheUsage& usage, GLuint p | ||||
|     std::vector<u8> binary(binary_length); | ||||
|     glGetProgramBinary(program, binary_length, nullptr, &binary_format, binary.data()); | ||||
| 
 | ||||
|     const std::vector<u8> compressed_binary = CompressData(binary.data(), binary.size()); | ||||
|     const std::vector<u8> compressed_binary = | ||||
|         Compression::CompressDataLZ4(binary.data(), binary.size()); | ||||
| 
 | ||||
|     if (compressed_binary.empty()) { | ||||
|         LOG_ERROR(Render_OpenGL, "Failed to compress binary program in shader={:016x}", | ||||
|                   usage.unique_identifier); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 unknown
						unknown