From fce34f22a2a1f266b676e3371260b1039faca8f1 Mon Sep 17 00:00:00 2001 From: clayjohn Date: Fri, 6 Dec 2024 15:31:42 -0800 Subject: [PATCH] Avoid error spam when shaders fail to compile by freeing shader_data version when compilation fails --- .../render_forward_clustered.cpp | 2 +- .../scene_shader_forward_clustered.cpp | 9 ++++++++- .../forward_mobile/render_forward_mobile.cpp | 2 +- .../scene_shader_forward_mobile.cpp | 9 ++++++++- .../renderer_rd/renderer_canvas_render_rd.cpp | 18 ++++++++++++++---- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index d569ce1101..43a50e97c4 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -4642,7 +4642,7 @@ void RenderForwardClustered::mesh_generate_pipelines(RID p_mesh, bool p_backgrou void *mesh_surface = mesh_storage->mesh_get_surface(p_mesh, i); void *mesh_surface_shadow = mesh_surface; SceneShaderForwardClustered::MaterialData *material = static_cast(material_storage->material_get_data(materials[i], RendererRD::MaterialStorage::SHADER_TYPE_3D)); - if (material == nullptr) { + if (material == nullptr || !material->shader_data->is_valid()) { continue; } diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index 00a70e3690..6dadbf25ac 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -143,7 +143,14 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) { MutexLock lock(SceneShaderForwardClustered::singleton_mutex); Error err = SceneShaderForwardClustered::singleton->compiler.compile(RS::SHADER_SPATIAL, code, &actions, path, gen_code); - ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed."); + + if (err != OK) { + if (version.is_valid()) { + SceneShaderForwardClustered::singleton->shader.version_free(version); + version = RID(); + } + ERR_FAIL_MSG("Shader compilation failed."); + } if (version.is_null()) { version = SceneShaderForwardClustered::singleton->shader.version_create(); diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index e2d6796566..2589488d5a 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -294,7 +294,7 @@ void RenderForwardMobile::mesh_generate_pipelines(RID p_mesh, bool p_background_ void *mesh_surface = mesh_storage->mesh_get_surface(p_mesh, i); void *mesh_surface_shadow = mesh_surface; SceneShaderForwardMobile::MaterialData *material = static_cast(material_storage->material_get_data(materials[i], RendererRD::MaterialStorage::SHADER_TYPE_3D)); - if (material == nullptr) { + if (material == nullptr || !material->shader_data->is_valid()) { continue; } diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index 6274dd7644..4dd0286e81 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -143,7 +143,14 @@ void SceneShaderForwardMobile::ShaderData::set_code(const String &p_code) { MutexLock lock(SceneShaderForwardMobile::singleton_mutex); Error err = SceneShaderForwardMobile::singleton->compiler.compile(RS::SHADER_SPATIAL, code, &actions, path, gen_code); - ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed."); + + if (err != OK) { + if (version.is_valid()) { + SceneShaderForwardMobile::singleton->shader.version_free(version); + version = RID(); + } + ERR_FAIL_MSG("Shader compilation failed."); + } if (version.is_null()) { version = SceneShaderForwardMobile::singleton->shader.version_create(); diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 8367f6e29d..f513c40a6f 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1517,7 +1517,13 @@ void RendererCanvasRenderRD::CanvasShaderData::set_code(const String &p_code) { MutexLock lock(canvas_singleton->shader.mutex); Error err = canvas_singleton->shader.compiler.compile(RS::SHADER_CANVAS_ITEM, code, &actions, path, gen_code); - ERR_FAIL_COND_MSG(err != OK, "Shader compilation failed."); + if (err != OK) { + if (version.is_valid()) { + canvas_singleton->shader.canvas_shader.version_free(version); + version = RID(); + } + ERR_FAIL_MSG("Shader compilation failed."); + } uses_screen_texture_mipmaps = gen_code.uses_screen_texture_mipmaps; uses_screen_texture = gen_code.uses_screen_texture; @@ -1593,9 +1599,13 @@ uint64_t RendererCanvasRenderRD::CanvasShaderData::get_vertex_input_mask(ShaderV } bool RendererCanvasRenderRD::CanvasShaderData::is_valid() const { - RendererCanvasRenderRD *canvas_singleton = static_cast(RendererCanvasRender::singleton); - MutexLock lock(canvas_singleton->shader.mutex); - return canvas_singleton->shader.canvas_shader.version_is_valid(version); + if (version.is_valid()) { + RendererCanvasRenderRD *canvas_singleton = static_cast(RendererCanvasRender::singleton); + MutexLock lock(canvas_singleton->shader.mutex); + return canvas_singleton->shader.canvas_shader.version_is_valid(version); + } else { + return false; + } } RendererCanvasRenderRD::CanvasShaderData::CanvasShaderData() {