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 d569ce11019..43a50e97c4b 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 00a70e3690f..6dadbf25ac4 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 e2d6796566b..2589488d5a7 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 6274dd76440..4dd0286e81f 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 8367f6e29da..f513c40a6fc 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() {