diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh index e98ed4533ff..7b5e8933e20 100644 --- a/source/blender/blenkernel/BKE_node_runtime.hh +++ b/source/blender/blenkernel/BKE_node_runtime.hh @@ -190,7 +190,7 @@ class bNodeTreeRuntime : NonCopyable, NonMovable { * evaluate the node group. Caching it here allows us to reuse the preprocessed node tree in case * its used multiple times. */ - Mutex geometry_nodes_lazy_function_graph_info_mutex; + CacheMutex geometry_nodes_lazy_function_graph_info_mutex; std::unique_ptr geometry_nodes_lazy_function_graph_info; diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc index edd4ee49fbb..494e0fd9e23 100644 --- a/source/blender/blenkernel/intern/node_runtime.cc +++ b/source/blender/blenkernel/intern/node_runtime.cc @@ -22,7 +22,7 @@ void preprocess_geometry_node_tree_for_evaluation(bNodeTree &tree_cow) { BLI_assert(tree_cow.type == NTREE_GEOMETRY); /* Rebuild geometry nodes lazy function graph. */ - tree_cow.runtime->geometry_nodes_lazy_function_graph_info.reset(); + tree_cow.runtime->geometry_nodes_lazy_function_graph_info_mutex.tag_dirty(); blender::nodes::ensure_geometry_nodes_lazy_function_graph(tree_cow); } diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index 69ae7d00bc3..c30a5040ceb 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -399,7 +399,7 @@ class NodeTreeMainUpdater { } if (result.output_changed) { - ntree->runtime->geometry_nodes_lazy_function_graph_info.reset(); + ntree->runtime->geometry_nodes_lazy_function_graph_info_mutex.tag_dirty(); } ID *owner_id = BKE_id_owner_get(&ntree->id); diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index cc31aa7d60a..c881f5c9a32 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -1623,9 +1623,8 @@ static void rna_NodeTree_debug_lazy_function_graph(bNodeTree *tree, /* The graph is only stored on the evaluated data. */ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tree = DEG_get_evaluated(depsgraph, tree); - } - std::lock_guard lock{tree->runtime->geometry_nodes_lazy_function_graph_info_mutex}; - if (!tree->runtime->geometry_nodes_lazy_function_graph_info) { + }; + if (tree->runtime->geometry_nodes_lazy_function_graph_info_mutex.is_dirty()) { return; } std::string dot_str = tree->runtime->geometry_nodes_lazy_function_graph_info->graph.to_dot(); @@ -1644,8 +1643,7 @@ static void rna_NodeTree_debug_zone_body_lazy_function_graph( Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); tree = DEG_get_evaluated(depsgraph, tree); } - std::lock_guard lock{tree->runtime->geometry_nodes_lazy_function_graph_info_mutex}; - if (!tree->runtime->geometry_nodes_lazy_function_graph_info) { + if (tree->runtime->geometry_nodes_lazy_function_graph_info_mutex.is_dirty()) { return; } const auto *graph = tree->runtime->geometry_nodes_lazy_function_graph_info diff --git a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc index e26a5f1b4c9..01c3e8ee0d9 100644 --- a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc +++ b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc @@ -4162,11 +4162,12 @@ struct GeometryNodesLazyFunctionBuilder { } }; -const GeometryNodesLazyFunctionGraphInfo *ensure_geometry_nodes_lazy_function_graph( - const bNodeTree &btree) +static std::unique_ptr +ensure_geometry_nodes_lazy_function_graph_impl(const bNodeTree &btree) { btree.ensure_topology_cache(); btree.ensure_interface_cache(); + if (btree.has_available_link_cycle()) { return nullptr; } @@ -4203,23 +4204,20 @@ const GeometryNodesLazyFunctionGraphInfo *ensure_geometry_nodes_lazy_function_gr } } - std::unique_ptr &lf_graph_info_ptr = - btree.runtime->geometry_nodes_lazy_function_graph_info; - - if (lf_graph_info_ptr) { - return lf_graph_info_ptr.get(); - } - std::lock_guard lock{btree.runtime->geometry_nodes_lazy_function_graph_info_mutex}; - if (lf_graph_info_ptr) { - return lf_graph_info_ptr.get(); - } - auto lf_graph_info = std::make_unique(); GeometryNodesLazyFunctionBuilder builder{btree, *lf_graph_info}; builder.build(); + return lf_graph_info; +} - lf_graph_info_ptr = std::move(lf_graph_info); - return lf_graph_info_ptr.get(); +const GeometryNodesLazyFunctionGraphInfo *ensure_geometry_nodes_lazy_function_graph( + const bNodeTree &btree) +{ + btree.runtime->geometry_nodes_lazy_function_graph_info_mutex.ensure([&]() { + btree.runtime->geometry_nodes_lazy_function_graph_info = + ensure_geometry_nodes_lazy_function_graph_impl(btree); + }); + return btree.runtime->geometry_nodes_lazy_function_graph_info.get(); } destruct_ptr GeoNodesUserData::get_local(LinearAllocator<> &allocator)