Skip to content

Commit 4e346d0

Browse files
committed
Revert "Merge pull request godotengine#119123 from blueskythlikesclouds/group-task-for-shader-cache-load"
This reverts commit 9700abd, reversing changes made to fcfc285.
1 parent fe49429 commit 4e346d0

4 files changed

Lines changed: 43 additions & 54 deletions

File tree

core/io/compression.cpp

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -40,34 +40,11 @@
4040
#include <brotli/decode.h>
4141
#endif
4242

43-
namespace {
44-
struct ZstdDecompressorContext {
45-
ZSTD_DCtx *zstd_d_ctx = nullptr;
46-
bool zstd_long_distance_matching = false;
47-
int zstd_window_log_size = 0;
48-
49-
~ZstdDecompressorContext() {
50-
if (zstd_d_ctx) {
51-
ZSTD_freeDCtx(zstd_d_ctx);
52-
}
53-
}
54-
55-
void invalidate(bool p_zstd_long_distance_matching, int p_zstd_window_log_size) {
56-
if (!zstd_d_ctx || zstd_long_distance_matching != p_zstd_long_distance_matching || zstd_window_log_size != p_zstd_window_log_size) {
57-
if (zstd_d_ctx) {
58-
ZSTD_freeDCtx(zstd_d_ctx);
59-
}
60-
61-
zstd_d_ctx = ZSTD_createDCtx();
62-
if (p_zstd_long_distance_matching) {
63-
ZSTD_DCtx_setParameter(zstd_d_ctx, ZSTD_d_windowLogMax, p_zstd_window_log_size);
64-
}
65-
zstd_long_distance_matching = p_zstd_long_distance_matching;
66-
zstd_window_log_size = p_zstd_window_log_size;
67-
}
68-
}
69-
};
70-
} //namespace
43+
// Caches for zstd.
44+
static BinaryMutex mutex;
45+
static ZSTD_DCtx *current_zstd_d_ctx = nullptr;
46+
static bool current_zstd_long_distance_matching;
47+
static int current_zstd_window_log_size;
7148

7249
int64_t Compression::compress(uint8_t *p_dst, const uint8_t *p_src, int64_t p_src_size, Mode p_mode) {
7350
switch (p_mode) {
@@ -220,10 +197,22 @@ int64_t Compression::decompress(uint8_t *p_dst, int64_t p_dst_max_size, const ui
220197
return total;
221198
} break;
222199
case MODE_ZSTD: {
223-
thread_local ZstdDecompressorContext decompressor_ctx;
224-
decompressor_ctx.invalidate(zstd_long_distance_matching, zstd_window_log_size);
200+
MutexLock lock(mutex);
201+
202+
if (!current_zstd_d_ctx || current_zstd_long_distance_matching != zstd_long_distance_matching || current_zstd_window_log_size != zstd_window_log_size) {
203+
if (current_zstd_d_ctx) {
204+
ZSTD_freeDCtx(current_zstd_d_ctx);
205+
}
206+
207+
current_zstd_d_ctx = ZSTD_createDCtx();
208+
if (zstd_long_distance_matching) {
209+
ZSTD_DCtx_setParameter(current_zstd_d_ctx, ZSTD_d_windowLogMax, zstd_window_log_size);
210+
}
211+
current_zstd_long_distance_matching = zstd_long_distance_matching;
212+
current_zstd_window_log_size = zstd_window_log_size;
213+
}
225214

226-
size_t ret = ZSTD_decompressDCtx(decompressor_ctx.zstd_d_ctx, p_dst, p_dst_max_size, p_src, p_src_size);
215+
size_t ret = ZSTD_decompressDCtx(current_zstd_d_ctx, p_dst, p_dst_max_size, p_src, p_src_size);
227216
return (int64_t)ret;
228217
} break;
229218
}

servers/rendering/renderer_rd/shader_rd.cpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,6 @@ void ShaderRD::_initialize_version(Version *p_version) {
258258
p_version->variants.resize_initialized(variant_defines.size());
259259
p_version->variant_data.resize(variant_defines.size());
260260
p_version->group_compilation_tasks.resize_initialized(group_enabled.size());
261-
p_version->group_loaded_from_cache.resize_initialized(group_enabled.size());
262261
}
263262

264263
void ShaderRD::_clear_version(Version *p_version) {
@@ -612,16 +611,6 @@ String ShaderRD::_get_cache_file_path(Version *p_version, int p_group, const Str
612611
return shader_cache_dir.path_join(relative_path);
613612
}
614613

615-
void ShaderRD::_load_variant_from_cache(uint32_t p_variant, CompileData p_data) {
616-
uint32_t variant = group_to_variant_map[p_data.group][p_variant];
617-
if (!variants_enabled[variant]) {
618-
p_data.version->variants.write[variant] = RID();
619-
return; // Variant is disabled, return.
620-
}
621-
622-
p_data.version->variants.write[variant] = RD::get_singleton()->shader_create_from_bytecode_with_samplers(p_data.version->variant_data[variant], p_data.version->variants[variant], immutable_samplers);
623-
}
624-
625614
bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
626615
String api_safe_name = String(RD::get_singleton()->get_device_api_name()).validate_filename().to_lower();
627616
Ref<FileAccess> f;
@@ -674,14 +663,28 @@ bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
674663
p_version->variant_data.write[variant_id] = variant_bytes;
675664
}
676665

677-
CompileData compile_data;
678-
compile_data.version = p_version;
679-
compile_data.group = p_group;
666+
for (uint32_t i = 0; i < variant_count; i++) {
667+
int variant_id = group_to_variant_map[p_group][i];
668+
if (!variants_enabled[variant_id]) {
669+
p_version->variants.write[variant_id] = RID();
670+
continue;
671+
}
672+
print_verbose(vformat("Loading cache for shader %s, variant %d", name, i));
673+
{
674+
RID shader = RD::get_singleton()->shader_create_from_bytecode_with_samplers(p_version->variant_data[variant_id], p_version->variants[variant_id], immutable_samplers);
675+
if (shader.is_null()) {
676+
for (uint32_t j = 0; j < i; j++) {
677+
int variant_free_id = group_to_variant_map[p_group][j];
678+
RD::get_singleton()->free_rid(p_version->variants[variant_free_id]);
679+
}
680+
ERR_FAIL_COND_V(shader.is_null(), false);
681+
}
680682

681-
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &ShaderRD::_load_variant_from_cache, compile_data, variant_count, -1, true, "LoadVariantFromCache");
682-
p_version->group_compilation_tasks.write[p_group] = group_task;
683-
p_version->group_loaded_from_cache.write[p_group] = true;
683+
p_version->variants.write[variant_id] = shader;
684+
}
685+
}
684686

687+
p_version->valid = true;
685688
return true;
686689
}
687690

@@ -731,7 +734,6 @@ void ShaderRD::_compile_version_start(Version *p_version, int p_group) {
731734

732735
WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &ShaderRD::_compile_variant, compile_data, group_to_variant_map[p_group].size(), -1, true, SNAME("ShaderCompilation"));
733736
p_version->group_compilation_tasks.write[p_group] = group_task;
734-
p_version->group_loaded_from_cache.write[p_group] = false;
735737
}
736738

737739
void ShaderRD::_compile_version_end(Version *p_version, int p_group) {
@@ -771,7 +773,7 @@ void ShaderRD::_compile_version_end(Version *p_version, int p_group) {
771773
return;
772774
}
773775
#if ENABLE_SHADER_CACHE
774-
else if (shader_cache_user_dir_valid && !p_version->group_loaded_from_cache[p_group]) {
776+
else if (shader_cache_user_dir_valid) {
775777
_save_to_cache(p_version, p_group);
776778
}
777779
#endif

servers/rendering/renderer_rd/shader_rd.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ class ShaderRD {
8282
HashMap<StringName, CharString> code_sections;
8383
Vector<CharString> custom_defines;
8484
Vector<WorkerThreadPool::GroupID> group_compilation_tasks;
85-
Vector<bool> group_loaded_from_cache;
8685

8786
Vector<Vector<uint8_t>> variant_data;
8887
Vector<RID> variants;
@@ -179,7 +178,6 @@ class ShaderRD {
179178
String _version_get_sha1(Version *p_version) const;
180179
String _get_cache_file_relative_path(Version *p_version, int p_group, const String &p_api_name);
181180
String _get_cache_file_path(Version *p_version, int p_group, const String &p_api_name, bool p_user_dir);
182-
void _load_variant_from_cache(uint32_t p_variant, CompileData p_data);
183181
bool _load_from_cache(Version *p_version, int p_group);
184182
void _save_to_cache(Version *p_version, int p_group);
185183
void _initialize_cache();

servers/rendering/rendering_device.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4156,6 +4156,8 @@ RID RenderingDevice::shader_create_from_bytecode(const Vector<uint8_t> &p_shader
41564156
}
41574157

41584158
RID RenderingDevice::shader_create_from_bytecode_with_samplers(const Vector<uint8_t> &p_shader_binary, RID p_placeholder, const Vector<PipelineImmutableSampler> &p_immutable_samplers) {
4159+
_THREAD_SAFE_METHOD_
4160+
41594161
Ref<RenderingShaderContainer> shader_container = driver->get_shader_container_format().create_container();
41604162
ERR_FAIL_COND_V(shader_container.is_null(), RID());
41614163

@@ -4179,8 +4181,6 @@ RID RenderingDevice::shader_create_from_bytecode_with_samplers(const Vector<uint
41794181
RDD::ShaderID shader_id = driver->shader_create_from_container(shader_container, driver_immutable_samplers);
41804182
ERR_FAIL_COND_V(!shader_id, RID());
41814183

4182-
_THREAD_SAFE_METHOD_
4183-
41844184
// All good, let's create modules.
41854185

41864186
RID id;

0 commit comments

Comments
 (0)