You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Add shader baker to project exporter.
Metal Support contributed by Migeran (https://migeran.com) and Stuart Carnie. Co-authored-by: Stuart Carnie <stuart.carnie@gmail.com> Co-authored-by: Gergely Kis <gergely.kis@migeran.com>
This commit is contained in:
@@ -275,41 +275,45 @@ RendererCompositorRD::RendererCompositorRD() {
|
||||
uniform_set_cache = memnew(UniformSetCacheRD);
|
||||
framebuffer_cache = memnew(FramebufferCacheRD);
|
||||
|
||||
{
|
||||
String shader_cache_dir = Engine::get_singleton()->get_shader_cache_path();
|
||||
if (shader_cache_dir.is_empty()) {
|
||||
shader_cache_dir = "user://";
|
||||
bool shader_cache_enabled = GLOBAL_GET("rendering/shader_compiler/shader_cache/enabled");
|
||||
bool compress = GLOBAL_GET("rendering/shader_compiler/shader_cache/compress");
|
||||
bool use_zstd = GLOBAL_GET("rendering/shader_compiler/shader_cache/use_zstd_compression");
|
||||
bool strip_debug = GLOBAL_GET("rendering/shader_compiler/shader_cache/strip_debug");
|
||||
ShaderRD::set_shader_cache_save_compressed(compress);
|
||||
ShaderRD::set_shader_cache_save_compressed_zstd(use_zstd);
|
||||
ShaderRD::set_shader_cache_save_debug(!strip_debug);
|
||||
|
||||
// Shader cache is forcefully enabled when running the editor.
|
||||
if (shader_cache_enabled || Engine::get_singleton()->is_editor_hint()) {
|
||||
// Attempt to create a folder for the shader cache that the user can write to. Shaders will only be attempted to be saved if this path exists.
|
||||
String shader_cache_user_dir = Engine::get_singleton()->get_shader_cache_path();
|
||||
if (shader_cache_user_dir.is_empty()) {
|
||||
shader_cache_user_dir = "user://";
|
||||
}
|
||||
Ref<DirAccess> da = DirAccess::open(shader_cache_dir);
|
||||
if (da.is_null()) {
|
||||
ERR_PRINT("Can't create shader cache folder, no shader caching will happen: " + shader_cache_dir);
|
||||
|
||||
Ref<DirAccess> user_da = DirAccess::open(shader_cache_user_dir);
|
||||
if (user_da.is_null()) {
|
||||
ERR_PRINT("Can't create shader cache folder, no shader caching will happen: " + shader_cache_user_dir);
|
||||
} else {
|
||||
Error err = da->change_dir("shader_cache");
|
||||
Error err = user_da->change_dir("shader_cache");
|
||||
if (err != OK) {
|
||||
err = da->make_dir("shader_cache");
|
||||
err = user_da->make_dir("shader_cache");
|
||||
}
|
||||
|
||||
if (err != OK) {
|
||||
ERR_PRINT("Can't create shader cache folder, no shader caching will happen: " + shader_cache_dir);
|
||||
ERR_PRINT("Can't create shader cache folder, no shader caching will happen: " + shader_cache_user_dir);
|
||||
} else {
|
||||
shader_cache_dir = shader_cache_dir.path_join("shader_cache");
|
||||
|
||||
bool shader_cache_enabled = GLOBAL_GET("rendering/shader_compiler/shader_cache/enabled");
|
||||
if (!Engine::get_singleton()->is_editor_hint() && !shader_cache_enabled) {
|
||||
shader_cache_dir = String(); //disable only if not editor
|
||||
}
|
||||
|
||||
if (!shader_cache_dir.is_empty()) {
|
||||
bool compress = GLOBAL_GET("rendering/shader_compiler/shader_cache/compress");
|
||||
bool use_zstd = GLOBAL_GET("rendering/shader_compiler/shader_cache/use_zstd_compression");
|
||||
bool strip_debug = GLOBAL_GET("rendering/shader_compiler/shader_cache/strip_debug");
|
||||
|
||||
ShaderRD::set_shader_cache_dir(shader_cache_dir);
|
||||
ShaderRD::set_shader_cache_save_compressed(compress);
|
||||
ShaderRD::set_shader_cache_save_compressed_zstd(use_zstd);
|
||||
ShaderRD::set_shader_cache_save_debug(!strip_debug);
|
||||
}
|
||||
shader_cache_user_dir = shader_cache_user_dir.path_join("shader_cache");
|
||||
ShaderRD::set_shader_cache_user_dir(shader_cache_user_dir);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if a directory exists for the shader cache to pull shaders from as read-only. This is used on exported projects with baked shaders.
|
||||
String shader_cache_res_dir = "res://.godot/shader_cache";
|
||||
Ref<DirAccess> res_da = DirAccess::open(shader_cache_res_dir);
|
||||
if (res_da.is_valid()) {
|
||||
ShaderRD::set_shader_cache_res_dir(shader_cache_res_dir);
|
||||
}
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_MSG(singleton != nullptr, "A RendererCompositorRD singleton already exists.");
|
||||
@@ -347,5 +351,6 @@ RendererCompositorRD::~RendererCompositorRD() {
|
||||
singleton = nullptr;
|
||||
memdelete(uniform_set_cache);
|
||||
memdelete(framebuffer_cache);
|
||||
ShaderRD::set_shader_cache_dir(String());
|
||||
ShaderRD::set_shader_cache_user_dir(String());
|
||||
ShaderRD::set_shader_cache_res_dir(String());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user