Depsgraph: clear update flags when skipping through no-op nodes.
As an optimization, dependency graph evaluation skips through no-op nodes at the scheduling stage. However, that leaves update flags enabled on the node, and the most problematic one is the USER_MODIFIED flag, which get flushed to children every time the no-op node is tagged. This in turn can cause simulation caches downstream to be permanently stuck in an outdated state until the depsgraph is rebuilt and the stuck flag cleared out. Differential Revision: https://developer.blender.org/D16868
This commit is contained in:
parent
ebec9eb75e
commit
90f194616b
|
@ -105,8 +105,7 @@ void evaluate_node(const DepsgraphEvalState *state, OperationNode *operation_nod
|
|||
* times.
|
||||
* This is a thread-safe modification as the node's flags are only read for a non-scheduled nodes
|
||||
* and this node has been scheduled. */
|
||||
operation_node->flag &= ~(DEPSOP_FLAG_DIRECTLY_MODIFIED | DEPSOP_FLAG_NEEDS_UPDATE |
|
||||
DEPSOP_FLAG_USER_MODIFIED);
|
||||
operation_node->flag &= ~DEPSOP_FLAG_CLEAR_ON_EVAL;
|
||||
}
|
||||
|
||||
void deg_task_run_func(TaskPool *pool, void *taskdata)
|
||||
|
@ -270,6 +269,10 @@ void schedule_node(DepsgraphEvalState *state,
|
|||
bool is_scheduled = atomic_fetch_and_or_uint8((uint8_t *)&node->scheduled, uint8_t(true));
|
||||
if (!is_scheduled) {
|
||||
if (node->is_noop()) {
|
||||
/* Clear flags to avoid affecting subsequent update propagation.
|
||||
* For normal nodes these are cleared when it is evaluated. */
|
||||
node->flag &= ~DEPSOP_FLAG_CLEAR_ON_EVAL;
|
||||
|
||||
/* skip NOOP node, schedule children right away */
|
||||
schedule_children(state, node, schedule_fn);
|
||||
}
|
||||
|
|
|
@ -224,6 +224,10 @@ enum OperationFlag {
|
|||
|
||||
/* Set of flags which gets flushed along the relations. */
|
||||
DEPSOP_FLAG_FLUSH = (DEPSOP_FLAG_USER_MODIFIED),
|
||||
|
||||
/* Set of flags which get cleared upon evaluation. */
|
||||
DEPSOP_FLAG_CLEAR_ON_EVAL = (DEPSOP_FLAG_DIRECTLY_MODIFIED | DEPSOP_FLAG_NEEDS_UPDATE |
|
||||
DEPSOP_FLAG_USER_MODIFIED),
|
||||
};
|
||||
|
||||
/* Atomic Operation - Base type for all operations */
|
||||
|
|
Loading…
Reference in New Issue