Browse Source

Add an option to use zstd's recently introduced long range matching (off by default).

Ferenc Arn 8 years ago
parent
commit
f3436a841a
5 changed files with 26 additions and 6 deletions
  1. 1 1
      core/io/SCsub
  2. 16 4
      core/io/compression.cpp
  3. 2 0
      core/io/compression.h
  4. 6 0
      core/project_settings.cpp
  5. 1 1
      thirdparty/README.md

+ 1 - 1
core/io/SCsub

@@ -5,4 +5,4 @@ Import('env')
 env.add_source_files(env.core_sources, "*.cpp")
 
 Export('env')
-env.Append(CCFLAGS="-DZSTD_STATIC_LINKING_ONLY")
+

+ 16 - 4
core/io/compression.cpp

@@ -78,9 +78,16 @@ int Compression::compress(uint8_t *p_dst, const uint8_t *p_src, int p_src_size,
 
 		} break;
 		case MODE_ZSTD: {
-
+			ZSTD_CCtx *cctx = ZSTD_createCCtx();
+			ZSTD_CCtx_setParameter(cctx, ZSTD_p_compressionLevel, zstd_level);
+			if (zstd_long_distance_matching) {
+				ZSTD_CCtx_setParameter(cctx, ZSTD_p_enableLongDistanceMatching, 1);
+				ZSTD_CCtx_setParameter(cctx, ZSTD_p_windowLog, zstd_window_log_size);
+			}
 			int max_dst_size = get_max_compressed_buffer_size(p_src_size, MODE_ZSTD);
-			return ZSTD_compress(p_dst, max_dst_size, p_src, p_src_size, zstd_level);
+			int ret = ZSTD_compressCCtx(cctx, p_dst, max_dst_size, p_src, p_src_size, zstd_level);
+			ZSTD_freeCCtx(cctx);
+			return ret;
 		} break;
 	}
 
@@ -165,8 +172,11 @@ int Compression::decompress(uint8_t *p_dst, int p_dst_max_size, const uint8_t *p
 			return total;
 		} break;
 		case MODE_ZSTD: {
-
-			return ZSTD_decompress(p_dst, p_dst_max_size, p_src, p_src_size);
+			ZSTD_DCtx *dctx = ZSTD_createDCtx();
+			if (zstd_long_distance_matching) ZSTD_DCtx_setMaxWindowSize(dctx, 1 << zstd_window_log_size);
+			int ret = ZSTD_decompressDCtx(dctx, p_dst, p_dst_max_size, p_src, p_src_size);
+			ZSTD_freeDCtx(dctx);
+			return ret;
 		} break;
 	}
 
@@ -176,3 +186,5 @@ int Compression::decompress(uint8_t *p_dst, int p_dst_max_size, const uint8_t *p
 int Compression::zlib_level = Z_DEFAULT_COMPRESSION;
 int Compression::gzip_level = Z_DEFAULT_COMPRESSION;
 int Compression::zstd_level = 3;
+bool Compression::zstd_long_distance_matching = false;
+int Compression::zstd_window_log_size = 27;

+ 2 - 0
core/io/compression.h

@@ -38,6 +38,8 @@ public:
 	static int zlib_level;
 	static int gzip_level;
 	static int zstd_level;
+	static bool zstd_long_distance_matching;
+	static int zstd_window_log_size;
 
 	enum Mode {
 		MODE_FASTLZ,

+ 6 - 0
core/project_settings.cpp

@@ -1036,10 +1036,16 @@ ProjectSettings::ProjectSettings() {
 	GLOBAL_DEF("debug/settings/profiler/max_functions", 16384);
 
 	//assigning here, because using GLOBAL_GET on every block for compressing can be slow
+	Compression::zstd_long_distance_matching = GLOBAL_DEF("compression/formats/zstd/long_distance_matching", false);
+	custom_prop_info["compression/formats/zstd/long_distance_matching"] = PropertyInfo(Variant::BOOL, "compression/formats/zstd/long_distance_matching");
 	Compression::zstd_level = GLOBAL_DEF("compression/formats/zstd/compression_level", 3);
 	custom_prop_info["compression/formats/zstd/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zstd/compression_level", PROPERTY_HINT_RANGE, "1,22,1");
+	Compression::zstd_window_log_size = GLOBAL_DEF("compression/formats/zstd/window_log_size", 27);
+	custom_prop_info["compression/formats/zstd/window_log_size"] = PropertyInfo(Variant::INT, "compression/formats/zstd/window_log_size", PROPERTY_HINT_RANGE, "10,30,1");
+
 	Compression::zlib_level = GLOBAL_DEF("compression/formats/zlib/compression_level", Z_DEFAULT_COMPRESSION);
 	custom_prop_info["compression/formats/zlib/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/zlib/compression_level", PROPERTY_HINT_RANGE, "-1,9,1");
+
 	Compression::gzip_level = GLOBAL_DEF("compression/formats/gzip/compression_level", Z_DEFAULT_COMPRESSION);
 	custom_prop_info["compression/formats/gzip/compression_level"] = PropertyInfo(Variant::INT, "compression/formats/gzip/compression_level", PROPERTY_HINT_RANGE, "-1,9,1");
 

+ 1 - 1
thirdparty/README.md

@@ -416,7 +416,7 @@ Files extracted from upstream source:
 ## zstd
 
 - Upstream: https://github.com/facebook/zstd
-- Version: 1.3.1
+- Version: 1.3.2
 - License: BSD-3-Clause
 
 Files extracted from upstream source: