Allow shader containers to be loaded in parallel.
This commit is contained in:
+31
-20
@@ -40,11 +40,34 @@
|
||||
#include <brotli/decode.h>
|
||||
#endif
|
||||
|
||||
// Caches for zstd.
|
||||
static BinaryMutex mutex;
|
||||
static ZSTD_DCtx *current_zstd_d_ctx = nullptr;
|
||||
static bool current_zstd_long_distance_matching;
|
||||
static int current_zstd_window_log_size;
|
||||
namespace {
|
||||
struct ZstdDecompressorContext {
|
||||
ZSTD_DCtx *zstd_d_ctx = nullptr;
|
||||
bool zstd_long_distance_matching = false;
|
||||
int zstd_window_log_size = 0;
|
||||
|
||||
~ZstdDecompressorContext() {
|
||||
if (zstd_d_ctx) {
|
||||
ZSTD_freeDCtx(zstd_d_ctx);
|
||||
}
|
||||
}
|
||||
|
||||
void invalidate(bool p_zstd_long_distance_matching, int p_zstd_window_log_size) {
|
||||
if (!zstd_d_ctx || zstd_long_distance_matching != p_zstd_long_distance_matching || zstd_window_log_size != p_zstd_window_log_size) {
|
||||
if (zstd_d_ctx) {
|
||||
ZSTD_freeDCtx(zstd_d_ctx);
|
||||
}
|
||||
|
||||
zstd_d_ctx = ZSTD_createDCtx();
|
||||
if (p_zstd_long_distance_matching) {
|
||||
ZSTD_DCtx_setParameter(zstd_d_ctx, ZSTD_d_windowLogMax, p_zstd_window_log_size);
|
||||
}
|
||||
zstd_long_distance_matching = p_zstd_long_distance_matching;
|
||||
zstd_window_log_size = p_zstd_window_log_size;
|
||||
}
|
||||
}
|
||||
};
|
||||
} //namespace
|
||||
|
||||
int64_t Compression::compress(uint8_t *p_dst, const uint8_t *p_src, int64_t p_src_size, Mode p_mode) {
|
||||
switch (p_mode) {
|
||||
@@ -197,22 +220,10 @@ int64_t Compression::decompress(uint8_t *p_dst, int64_t p_dst_max_size, const ui
|
||||
return total;
|
||||
} break;
|
||||
case MODE_ZSTD: {
|
||||
MutexLock lock(mutex);
|
||||
thread_local ZstdDecompressorContext decompressor_ctx;
|
||||
decompressor_ctx.invalidate(zstd_long_distance_matching, zstd_window_log_size);
|
||||
|
||||
if (!current_zstd_d_ctx || current_zstd_long_distance_matching != zstd_long_distance_matching || current_zstd_window_log_size != zstd_window_log_size) {
|
||||
if (current_zstd_d_ctx) {
|
||||
ZSTD_freeDCtx(current_zstd_d_ctx);
|
||||
}
|
||||
|
||||
current_zstd_d_ctx = ZSTD_createDCtx();
|
||||
if (zstd_long_distance_matching) {
|
||||
ZSTD_DCtx_setParameter(current_zstd_d_ctx, ZSTD_d_windowLogMax, zstd_window_log_size);
|
||||
}
|
||||
current_zstd_long_distance_matching = zstd_long_distance_matching;
|
||||
current_zstd_window_log_size = zstd_window_log_size;
|
||||
}
|
||||
|
||||
size_t ret = ZSTD_decompressDCtx(current_zstd_d_ctx, p_dst, p_dst_max_size, p_src, p_src_size);
|
||||
size_t ret = ZSTD_decompressDCtx(decompressor_ctx.zstd_d_ctx, p_dst, p_dst_max_size, p_src, p_src_size);
|
||||
return (int64_t)ret;
|
||||
} break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user