@@ -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,16 @@ 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+ 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+
614625bool ShaderRD::_load_from_cache (Version *p_version, int p_group) {
615626 String api_safe_name = String (RD::get_singleton ()->get_device_api_name ()).validate_filename ().to_lower ();
616627 Ref<FileAccess> f;
@@ -662,28 +673,14 @@ bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
662673 p_version->variant_data .write [variant_id] = variant_bytes;
663674 }
664675
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- }
676+ CompileData compile_data;
677+ compile_data.version = p_version;
678+ compile_data.group = p_group;
681679
682- p_version-> variants . write [variant_id] = shader ;
683- }
684- }
680+ 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 " )) ;
681+ p_version-> group_compilation_tasks . write [p_group] = group_task;
682+ p_version-> group_loaded_from_cache . write [p_group] = true ;
685683
686- p_version->valid = true ;
687684 return true ;
688685}
689686
@@ -733,6 +730,7 @@ void ShaderRD::_compile_version_start(Version *p_version, int p_group) {
733730
734731 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" ));
735732 p_version->group_compilation_tasks .write [p_group] = group_task;
733+ p_version->group_loaded_from_cache .write [p_group] = false ;
736734}
737735
738736void ShaderRD::_compile_version_end (Version *p_version, int p_group) {
@@ -772,7 +770,7 @@ void ShaderRD::_compile_version_end(Version *p_version, int p_group) {
772770 return ;
773771 }
774772#if ENABLE_SHADER_CACHE
775- else if (shader_cache_user_dir_valid) {
773+ else if (shader_cache_user_dir_valid && !p_version-> group_loaded_from_cache [p_group] ) {
776774 _save_to_cache (p_version, p_group);
777775 }
778776#endif
0 commit comments