@@ -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
264263void 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-
625614bool 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
737739void 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
0 commit comments