Skip to content
Snippets Groups Projects
Commit c791192d authored by unknown's avatar unknown Committed by FreddyFunk
Browse files

Addressed feedback

parent 6a1a2d4a
No related branches found
No related tags found
No related merge requests found
...@@ -79,8 +79,6 @@ add_library(common STATIC ...@@ -79,8 +79,6 @@ add_library(common STATIC
common_funcs.h common_funcs.h
common_paths.h common_paths.h
common_types.h common_types.h
data_compression.cpp
data_compression.h
file_util.cpp file_util.cpp
file_util.h file_util.h
hash.h hash.h
...@@ -93,6 +91,8 @@ add_library(common STATIC ...@@ -93,6 +91,8 @@ add_library(common STATIC
logging/log.h logging/log.h
logging/text_formatter.cpp logging/text_formatter.cpp
logging/text_formatter.h logging/text_formatter.h
lz4_compression.cpp
lz4_compression.h
math_util.h math_util.h
memory_hook.cpp memory_hook.cpp
memory_hook.h memory_hook.h
......
// 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 {
// Compresses a source memory region with LZ4 and returns the compressed data in an vector. If
// use_LZ4_high_compression is true, the LZ4 subalgortihmn LZ4HC is used with the highst possible
// compression level. This results in a smaller compressed size, but requires more CPU time for
// compression. Data compressed with LZ4HC can also be decompressed with the default LZ4
// decompression function.
std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size,
bool use_LZ4_high_compression);
std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, std::size_t uncompressed_size);
} // namespace Compression
\ No newline at end of file
...@@ -4,41 +4,63 @@ ...@@ -4,41 +4,63 @@
#pragma once #pragma once
#include <algorithm>
#include <lz4hc.h> #include <lz4hc.h>
#include "data_compression.h" #include "common/assert.h"
#include "common/lz4_compression.h"
namespace Compression { namespace Common::Compression {
std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size, std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size) {
bool use_LZ4_high_compression) { ASSERT_MSG(source_size <= LZ4_MAX_INPUT_SIZE, "Source size exceeds LZ4 maximum input size");
if (source_size > LZ4_MAX_INPUT_SIZE) {
// Source size exceeds LZ4 maximum input size 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 {}; return {};
} }
compressed.resize(compressed_size);
return compressed;
}
std::vector<u8> CompressDataLZ4HC(const u8* source, std::size_t source_size,
s32 compression_level) {
ASSERT_MSG(source_size <= LZ4_MAX_INPUT_SIZE, "Source size exceeds LZ4 maximum input size");
compression_level = std::clamp(compression_level, LZ4HC_CLEVEL_MIN, LZ4HC_CLEVEL_MAX);
const auto source_size_int = static_cast<int>(source_size); const auto source_size_int = static_cast<int>(source_size);
const int max_compressed_size = LZ4_compressBound(source_size_int); const int max_compressed_size = LZ4_compressBound(source_size_int);
std::vector<u8> compressed(max_compressed_size); std::vector<u8> compressed(max_compressed_size);
int compressed_size = 0;
const int compressed_size = LZ4_compress_HC(
if (use_LZ4_high_compression) { reinterpret_cast<const char*>(source), reinterpret_cast<char*>(compressed.data()),
compressed_size = LZ4_compress_HC(reinterpret_cast<const char*>(source), source_size_int, max_compressed_size, compression_level);
reinterpret_cast<char*>(compressed.data()),
source_size_int, max_compressed_size, LZ4HC_CLEVEL_MAX);
} else {
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) { if (compressed_size <= 0) {
// Compression failed // Compression failed
return {}; return {};
} }
compressed.resize(compressed_size); compressed.resize(compressed_size);
return compressed; return compressed;
} }
std::vector<u8> CompressDataLZ4HCMax(const u8* source, std::size_t source_size) {
return CompressDataLZ4HC(source, source_size, LZ4HC_CLEVEL_MAX);
}
std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed,
std::size_t uncompressed_size) { std::size_t uncompressed_size) {
std::vector<u8> uncompressed(uncompressed_size); std::vector<u8> uncompressed(uncompressed_size);
...@@ -53,4 +75,4 @@ std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, ...@@ -53,4 +75,4 @@ std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed,
return uncompressed; return uncompressed;
} }
} // namespace Compression } // namespace Common::Compression
// Copyright 2019 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include <vector>
#include "common/common_types.h"
namespace Common::Compression {
/**
* Compresses a source memory region with LZ4 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> CompressDataLZ4(const u8* source, std::size_t source_size);
/**
* Utilizes the LZ4 subalgorithm LZ4HC with the specified compression level. Higher compression
* levels result in a smaller compressed size, but require more CPU time for compression. The
* compression level has almost no impact on decompression speed. Data compressed with LZ4HC can
* also be decompressed with the default LZ4 decompression.
*
* @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 3 and 12.
*
* @return the compressed data.
*/
std::vector<u8> CompressDataLZ4HC(const u8* source, std::size_t source_size, s32 compression_level);
/**
* Utilizes the LZ4 subalgorithm LZ4HC with the highest possible compression level.
*
* @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> CompressDataLZ4HCMax(const u8* source, std::size_t source_size);
/**
* Decompresses a source memory region with LZ4 and returns the uncompressed data in a vector.
*
* @param compressed the compressed source memory region.
* @param uncompressed_size the size in bytes of the uncompressed data.
*
* @return the decompressed data.
*/
std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed, std::size_t uncompressed_size);
} // namespace Common::Compression
\ No newline at end of file
...@@ -5,11 +5,11 @@ ...@@ -5,11 +5,11 @@
#include <cinttypes> #include <cinttypes>
#include <vector> #include <vector>
#include "common/data_compression.h"
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/file_util.h" #include "common/file_util.h"
#include "common/hex_util.h" #include "common/hex_util.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/lz4_compression.h"
#include "common/swap.h" #include "common/swap.h"
#include "core/core.h" #include "core/core.h"
#include "core/file_sys/patch_manager.h" #include "core/file_sys/patch_manager.h"
...@@ -37,10 +37,10 @@ static_assert(sizeof(MODHeader) == 0x1c, "MODHeader has incorrect size."); ...@@ -37,10 +37,10 @@ static_assert(sizeof(MODHeader) == 0x1c, "MODHeader has incorrect size.");
std::vector<u8> DecompressSegment(const std::vector<u8>& compressed_data, std::vector<u8> DecompressSegment(const std::vector<u8>& compressed_data,
const NSOSegmentHeader& header) { const NSOSegmentHeader& header) {
const std::vector<u8> uncompressed_data = const std::vector<u8> uncompressed_data =
Compression::DecompressDataLZ4(compressed_data, header.size); Common::Compression::DecompressDataLZ4(compressed_data, header.size);
ASSERT_MSG(uncompressed_data.size() == static_cast<int>(header.size), ASSERT_MSG(uncompressed_data.size() == static_cast<int>(header.size), "{} != {}", header.size,
"{} != {}", header.size, uncompressed_data.size()); uncompressed_data.size());
return uncompressed_data; return uncompressed_data;
} }
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
#include "common/assert.h" #include "common/assert.h"
#include "common/common_paths.h" #include "common/common_paths.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/data_compression.h"
#include "common/file_util.h" #include "common/file_util.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/lz4_compression.h"
#include "common/scm_rev.h" #include "common/scm_rev.h"
#include "core/core.h" #include "core/core.h"
...@@ -259,7 +259,7 @@ ShaderDiskCacheOpenGL::LoadPrecompiledFile(FileUtil::IOFile& file) { ...@@ -259,7 +259,7 @@ ShaderDiskCacheOpenGL::LoadPrecompiledFile(FileUtil::IOFile& file) {
return {}; return {};
} }
dump.binary = Compression::DecompressDataLZ4(compressed_binary, binary_length); dump.binary = Common::Compression::DecompressDataLZ4(compressed_binary, binary_length);
if (dump.binary.empty()) { if (dump.binary.empty()) {
return {}; return {};
} }
...@@ -288,7 +288,7 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn ...@@ -288,7 +288,7 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
return {}; return {};
} }
const std::vector<u8> code = Compression::DecompressDataLZ4(compressed_code, code_size); const std::vector<u8> code = Common::Compression::DecompressDataLZ4(compressed_code, code_size);
if (code.empty()) { if (code.empty()) {
return {}; return {};
} }
...@@ -474,8 +474,8 @@ void ShaderDiskCacheOpenGL::SaveDecompiled(u64 unique_identifier, const std::str ...@@ -474,8 +474,8 @@ void ShaderDiskCacheOpenGL::SaveDecompiled(u64 unique_identifier, const std::str
if (!IsUsable()) if (!IsUsable())
return; return;
const std::vector<u8> compressed_code{ const std::vector<u8> compressed_code{Common::Compression::CompressDataLZ4HCMax(
Compression::CompressDataLZ4(reinterpret_cast<const u8*>(code.data()), code.size(), true)}; reinterpret_cast<const u8*>(code.data()), code.size())};
if (compressed_code.empty()) { if (compressed_code.empty()) {
LOG_ERROR(Render_OpenGL, "Failed to compress GLSL code - skipping shader {:016x}", LOG_ERROR(Render_OpenGL, "Failed to compress GLSL code - skipping shader {:016x}",
unique_identifier); unique_identifier);
...@@ -506,7 +506,7 @@ void ShaderDiskCacheOpenGL::SaveDump(const ShaderDiskCacheUsage& usage, GLuint p ...@@ -506,7 +506,7 @@ void ShaderDiskCacheOpenGL::SaveDump(const ShaderDiskCacheUsage& usage, GLuint p
glGetProgramBinary(program, binary_length, nullptr, &binary_format, binary.data()); glGetProgramBinary(program, binary_length, nullptr, &binary_format, binary.data());
const std::vector<u8> compressed_binary = const std::vector<u8> compressed_binary =
Compression::CompressDataLZ4(binary.data(), binary.size(), true); Common::Compression::CompressDataLZ4HCMax(binary.data(), binary.size());
if (compressed_binary.empty()) { if (compressed_binary.empty()) {
LOG_ERROR(Render_OpenGL, "Failed to compress binary program in shader={:016x}", LOG_ERROR(Render_OpenGL, "Failed to compress binary program in shader={:016x}",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment