summaryrefslogtreecommitdiff
path: root/servers/rendering
diff options
context:
space:
mode:
authorYuri Rubinsky <chaosus89@gmail.com>2023-01-13 21:14:00 +0300
committerYuri Rubinsky <chaosus89@gmail.com>2023-01-13 23:25:09 +0300
commit01cddbb12a33c21f308568e0b93ff1bb49dc2e7f (patch)
treee6c52047723e477e532919dd10b866fa7e930181 /servers/rendering
parent228db366bf7eee5cc1623f009d27e88ed80b5d7d (diff)
Clear material arrays to prevent freeing of invalid texture RID
Diffstat (limited to 'servers/rendering')
-rw-r--r--servers/rendering/renderer_rd/storage_rd/material_storage.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
index 66ae1e8d1a..d631a89dd2 100644
--- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
+++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
@@ -2685,6 +2685,14 @@ void MaterialStorage::material_free(RID p_rid) {
Material *material = material_owner.get_or_null(p_rid);
ERR_FAIL_COND(!material);
+ // Need to clear texture arrays to prevent spin locking of their RID's.
+ // This happens when the app is being closed.
+ for (KeyValue<StringName, Variant> &E : material->params) {
+ if (E.value.get_type() == Variant::ARRAY) {
+ Array(E.value).clear();
+ }
+ }
+
material_set_shader(p_rid, RID()); //clean up shader
material->dependency.deleted_notify(p_rid);