@@ -258,6 +258,7 @@ 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 ());
261262}
262263
263264void ShaderRD::_clear_version (Version *p_version) {
@@ -611,6 +612,15 @@ String ShaderRD::_get_cache_file_path(Version *p_version, int p_group, const Str
611612 return shader_cache_dir.path_join (relative_path);
612613}
613614
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+ return ; // Variant is disabled, return.
619+ }
620+
621+ 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);
622+ }
623+
614624bool ShaderRD::_load_from_cache (Version *p_version, int p_group) {
615625 String api_safe_name = String (RD::get_singleton ()->get_device_api_name ()).validate_filename ().to_lower ();
616626 Ref<FileAccess> f;
@@ -662,28 +672,14 @@ bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
662672 p_version->variant_data .write [variant_id] = variant_bytes;
663673 }
664674
665- for (uint32_t i = 0 ; i < variant_count; i++) {
666- int variant_id = group_to_variant_map[p_group][i];
667- if (!variants_enabled[variant_id]) {
668- p_version->variants .write [variant_id] = RID ();
669- continue ;
670- }
671- print_verbose (vformat (" Loading cache for shader %s, variant %d" , name, i));
672- {
673- RID shader = RD::get_singleton ()->shader_create_from_bytecode_with_samplers (p_version->variant_data [variant_id], p_version->variants [variant_id], immutable_samplers);
674- if (shader.is_null ()) {
675- for (uint32_t j = 0 ; j < i; j++) {
676- int variant_free_id = group_to_variant_map[p_group][j];
677- RD::get_singleton ()->free_rid (p_version->variants [variant_free_id]);
678- }
679- ERR_FAIL_COND_V (shader.is_null (), false );
680- }
675+ CompileData compile_data;
676+ compile_data.version = p_version;
677+ compile_data.group = p_group;
681678
682- p_version-> variants . write [variant_id] = shader ;
683- }
684- }
679+ WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton ()-> add_template_group_task ( this , &ShaderRD::_load_variant_from_cache, compile_data, variant_count, - 1 , true , SNAME ( " LoadVariantFromCache " )) ;
680+ p_version-> group_compilation_tasks . write [p_group] = group_task;
681+ p_version-> group_loaded_from_cache . write [p_group] = true ;
685682
686- p_version->valid = true ;
687683 return true ;
688684}
689685
@@ -733,6 +729,7 @@ void ShaderRD::_compile_version_start(Version *p_version, int p_group) {
733729
734730 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" ));
735731 p_version->group_compilation_tasks .write [p_group] = group_task;
732+ p_version->group_loaded_from_cache .write [p_group] = false ;
736733}
737734
738735void ShaderRD::_compile_version_end (Version *p_version, int p_group) {
@@ -772,7 +769,7 @@ void ShaderRD::_compile_version_end(Version *p_version, int p_group) {
772769 return ;
773770 }
774771#if ENABLE_SHADER_CACHE
775- else if (shader_cache_user_dir_valid) {
772+ else if (shader_cache_user_dir_valid && !p_version-> group_loaded_from_cache [p_group] ) {
776773 _save_to_cache (p_version, p_group);
777774 }
778775#endif
0 commit comments