Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-02-18 18:24:28 +0300
committerHans Goudey <h.goudey@me.com>2022-02-18 18:25:13 +0300
commit734c6a4405f21078270e71a4c2f0e98e74173ad7 (patch)
treefa26ad0ef792ecf3c1f2133611d4d717168db4e9
parentceea3d0f809b0579eb634fc5206a678d996327f6 (diff)
Nodes: Update dependency graph when removing some nodes
When removing a node that has a dependence on an ID, like the object info node, the dependency graph relations weren't updated. This can cause unexpected performance issues if a complex node tree continues to depend on an ID that it doesn't actually use anymore. To fix this case, tag relations for an update if the node has a data-block socket. Fixes part of T88332 Differential Revision: https://developer.blender.org/D14121
-rw-r--r--source/blender/blenkernel/intern/node.cc22
1 files changed, 19 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c8e82302787..ad24b3c0eff 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -1562,13 +1562,15 @@ static void socket_id_user_increment(bNodeSocket *sock)
}
}
-static void socket_id_user_decrement(bNodeSocket *sock)
+/** \return True if the socket had an ID default value. */
+static bool socket_id_user_decrement(bNodeSocket *sock)
{
switch ((eNodeSocketDatatype)sock->type) {
case SOCK_OBJECT: {
bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value;
if (default_value->value != nullptr) {
id_us_min(&default_value->value->id);
+ return true;
}
break;
}
@@ -1576,6 +1578,7 @@ static void socket_id_user_decrement(bNodeSocket *sock)
bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value;
if (default_value->value != nullptr) {
id_us_min(&default_value->value->id);
+ return true;
}
break;
}
@@ -1584,6 +1587,7 @@ static void socket_id_user_decrement(bNodeSocket *sock)
sock->default_value;
if (default_value->value != nullptr) {
id_us_min(&default_value->value->id);
+ return true;
}
break;
}
@@ -1591,6 +1595,7 @@ static void socket_id_user_decrement(bNodeSocket *sock)
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
if (default_value->value != nullptr) {
id_us_min(&default_value->value->id);
+ return true;
}
break;
}
@@ -1598,6 +1603,7 @@ static void socket_id_user_decrement(bNodeSocket *sock)
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
if (default_value->value != nullptr) {
id_us_min(&default_value->value->id);
+ return true;
}
break;
}
@@ -1613,6 +1619,7 @@ static void socket_id_user_decrement(bNodeSocket *sock)
case SOCK_GEOMETRY:
break;
}
+ return false;
}
void nodeModifySocketType(bNodeTree *ntree,
@@ -2972,6 +2979,8 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
* do to ID user refcounting and removal of animdation data then. */
BLI_assert((ntree->id.tag & LIB_TAG_LOCALIZED) == 0);
+ bool node_has_id = false;
+
if (do_id_user) {
/* Free callback for NodeCustomGroup. */
if (node->typeinfo->freefunc_api) {
@@ -2984,13 +2993,14 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
/* Do user counting. */
if (node->id) {
id_us_min(node->id);
+ node_has_id = true;
}
LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
- socket_id_user_decrement(sock);
+ node_has_id |= socket_id_user_decrement(sock);
}
LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
- socket_id_user_decrement(sock);
+ node_has_id |= socket_id_user_decrement(sock);
}
}
@@ -3007,6 +3017,12 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
}
}
+ if (node_has_id) {
+ if (bmain != nullptr) {
+ DEG_relations_tag_update(bmain);
+ }
+ }
+
nodeUnlinkNode(ntree, node);
node_unlink_attached(ntree, node);