[Bf-blender-cvs] [35caf245dd7] temp-geometry-nodes-evaluator-refactor: progress

Jacques Lucke noreply at git.blender.org
Wed Sep 7 13:02:56 CEST 2022


Commit: 35caf245dd7639811549d1b8a9bdfd971ed9c5b3
Author: Jacques Lucke
Date:   Wed Sep 7 10:21:32 2022 +0200
Branches: temp-geometry-nodes-evaluator-refactor
https://developer.blender.org/rB35caf245dd7639811549d1b8a9bdfd971ed9c5b3

progress

===================================================================

M	source/blender/blenlib/BLI_context_stack.hh
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_geometry_nodes_to_lazy_function_graph.hh
M	source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_context_stack.hh b/source/blender/blenlib/BLI_context_stack.hh
index 5cb6d165c57..d399c13fd5c 100644
--- a/source/blender/blenlib/BLI_context_stack.hh
+++ b/source/blender/blenlib/BLI_context_stack.hh
@@ -81,15 +81,20 @@ class ContextStack {
 class ContextStackBuilder {
  private:
   LinearAllocator<> allocator_;
-  Vector<destruct_ptr<ContextStack>> contexts_;
+  Stack<destruct_ptr<ContextStack>> contexts_;
 
  public:
+  bool is_empty() const
+  {
+    return contexts_.is_empty();
+  }
+
   const ContextStack *current() const
   {
     if (contexts_.is_empty()) {
       return nullptr;
     }
-    return contexts_.last().get();
+    return contexts_.peek().get();
   }
 
   const ContextStackHash hash() const
@@ -102,7 +107,12 @@ class ContextStackBuilder {
   {
     const ContextStack *current = this->current();
     destruct_ptr<T> context = allocator_.construct<T>(current, std::forward<Args>(args)...);
-    contexts_.append(std::move(context));
+    contexts_.push(std::move(context));
+  }
+
+  void pop()
+  {
+    contexts_.pop();
   }
 };
 
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index b562f47d0a9..5f37257aa99 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -108,6 +108,7 @@ using blender::MultiValueMap;
 using blender::MutableSpan;
 using blender::Set;
 using blender::Span;
+using blender::Stack;
 using blender::StringRef;
 using blender::StringRefNull;
 using blender::Vector;
@@ -838,26 +839,23 @@ static Vector<SpaceSpreadsheet *> find_spreadsheet_editors(Main *bmain)
   return spreadsheets;
 }
 
-struct SocketToPreview {
-  blender::ContextStackHash context_hash;
-  const bNodeSocket *bsocket;
-
-  friend bool operator==(const SocketToPreview &a, const SocketToPreview &b)
-  {
-    return a.context_hash == b.context_hash && a.bsocket == b.bsocket;
-  }
-
-  uint64_t hash() const
-  {
-    return blender::get_default_hash_2(this->context_hash, bsocket);
-  }
-};
+static const lf::FunctionNode &find_viewer_lf_node(const bNode &viewer_bnode)
+{
+  return *blender::nodes::ensure_geometry_nodes_lazy_function_graph(viewer_bnode.owner_tree())
+              .mapping.viewer_node_map.lookup(&viewer_bnode);
+}
+static const lf::FunctionNode &find_group_lf_node(const bNode &group_bnode)
+{
+  return *blender::nodes::ensure_geometry_nodes_lazy_function_graph(group_bnode.owner_tree())
+              .mapping.group_node_map.lookup(&group_bnode);
+}
 
-static void find_sockets_to_preview_for_spreadsheet(const SpaceSpreadsheet &sspreadsheet,
-                                                    const NodesModifierData &nmd,
-                                                    const ModifierEvalContext &ctx,
-                                                    const bNodeTree &root_tree,
-                                                    Set<SocketToPreview> &r_sockets_to_preview)
+static void find_side_effect_nodes_for_spreadsheet(
+    const SpaceSpreadsheet &sspreadsheet,
+    const NodesModifierData &nmd,
+    const ModifierEvalContext &ctx,
+    const bNodeTree &root_tree,
+    MultiValueMap<blender::ContextStackHash, const lf::FunctionNode *> &r_side_effect_nodes)
 {
   Vector<SpreadsheetContext *> context_path = sspreadsheet.context_path;
   if (context_path.size() < 3) {
@@ -886,14 +884,15 @@ static void find_sockets_to_preview_for_spreadsheet(const SpaceSpreadsheet &sspr
   blender::ContextStackBuilder context_stack_builder;
   context_stack_builder.push<blender::nodes::ModifierContextStack>(nmd.modifier.name);
 
-  Span<SpreadsheetContextNode *> nested_group_contexts =
+  const Span<SpreadsheetContextNode *> nested_group_contexts =
       context_path.as_span().drop_front(2).drop_back(1).cast<SpreadsheetContextNode *>();
-  SpreadsheetContextNode *last_context = (SpreadsheetContextNode *)context_path.last();
+  const SpreadsheetContextNode *last_context = (SpreadsheetContextNode *)context_path.last();
 
+  Stack<const bNode *> group_node_stack;
   const bNodeTree *group = &root_tree;
   for (SpreadsheetContextNode *node_context : nested_group_contexts) {
     const bNode *found_node = nullptr;
-    for (const bNode *node : group->all_nodes()) {
+    for (const bNode *node : group->nodes_by_type("GeometryNodeGroup")) {
       if (STREQ(node->name, node_context->node_name)) {
         found_node = node;
         break;
@@ -902,33 +901,40 @@ static void find_sockets_to_preview_for_spreadsheet(const SpaceSpreadsheet &sspr
     if (found_node == nullptr) {
       return;
     }
-    if (!found_node->is_group()) {
-      return;
-    }
     if (found_node->id == nullptr) {
       return;
     }
+    group_node_stack.push(found_node);
     group = reinterpret_cast<const bNodeTree *>(found_node->id);
     context_stack_builder.push<blender::nodes::NodeGroupContextStack>(node_context->node_name,
                                                                       group->id.name + 2);
   }
 
+  const bNode *found_viewer_node = nullptr;
   for (const bNode *viewer_node : group->nodes_by_type("GeometryNodeViewer")) {
     if (STREQ(viewer_node->name, last_context->node_name)) {
-      for (const bNodeSocket *input_socket : viewer_node->input_sockets()) {
-        if (input_socket->is_available() && input_socket->is_logically_linked()) {
-          r_sockets_to_preview.add(SocketToPreview{context_stack_builder.hash(), input_socket});
-          context_stack_builder.current()->print_stack(std::cout, input_socket->name);
-        }
-      }
+      found_viewer_node = viewer_node;
+      break;
     }
   }
+  if (found_viewer_node == nullptr) {
+    return;
+  }
+
+  r_side_effect_nodes.add(context_stack_builder.hash(), &find_viewer_lf_node(*found_viewer_node));
+  context_stack_builder.pop();
+  while (!context_stack_builder.is_empty()) {
+    r_side_effect_nodes.add(context_stack_builder.hash(),
+                            &find_group_lf_node(*group_node_stack.pop()));
+    context_stack_builder.pop();
+  }
 }
 
-static void find_sockets_to_preview(const NodesModifierData &nmd,
-                                    const ModifierEvalContext &ctx,
-                                    const bNodeTree &tree,
-                                    Set<SocketToPreview> &r_sockets_to_preview)
+static void find_side_effect_nodes(
+    const NodesModifierData &nmd,
+    const ModifierEvalContext &ctx,
+    const bNodeTree &tree,
+    MultiValueMap<blender::ContextStackHash, const lf::FunctionNode *> &r_side_effect_nodes)
 {
   Main *bmain = DEG_get_bmain(ctx.depsgraph);
 
@@ -936,7 +942,7 @@ static void find_sockets_to_preview(const NodesModifierData &nmd,
    * intermediate geometries cached for display. */
   Vector<SpaceSpreadsheet *> spreadsheets = find_spreadsheet_editors(bmain);
   for (SpaceSpreadsheet *sspreadsheet : spreadsheets) {
-    find_sockets_to_preview_for_spreadsheet(*sspreadsheet, nmd, ctx, tree, r_sockets_to_preview);
+    find_side_effect_nodes_for_spreadsheet(*sspreadsheet, nmd, ctx, tree, r_side_effect_nodes);
   }
 }
 
@@ -1150,6 +1156,9 @@ static GeometrySet compute_geometry(const bNodeTree &btree,
   if (logging_enabled(ctx)) {
     geo_nodes_modifier_data.eval_log = eval_log.get();
   }
+  MultiValueMap<blender::ContextStackHash, const lf::FunctionNode *> r_side_effect_nodes;
+  find_side_effect_nodes(*nmd, *ctx, btree, r_side_effect_nodes);
+  geo_nodes_modifier_data.side_effect_nodes = &r_side_effect_nodes;
   blender::nodes::GeoNodesLFUserData user_data;
   user_data.modifier_data = &geo_nodes_modifier_data;
   blender::nodes::ModifierContextStack modifier_context_stack{nullptr, nmd->modifier.name};
@@ -1181,9 +1190,6 @@ static GeometrySet compute_geometry(const bNodeTree &btree,
     param_outputs[i] = {type, buffer};
   }
 
-  Set<SocketToPreview> sockets_to_preview;
-  find_sockets_to_preview(*nmd, *ctx, btree, sockets_to_preview);
-
   lf::Context lf_context;
   lf_context.storage = graph_executor.init_storage(allocator);
   lf_context.user_data = &user_data;
diff --git a/source/blender/nodes/NOD_geometry_nodes_to_lazy_function_graph.hh b/source/blender/nodes/NOD_geometry_nodes_to_lazy_function_graph.hh
index 2e7b08fbad6..03e3f5c33b3 100644
--- a/source/blender/nodes/NOD_geometry_nodes_to_lazy_function_graph.hh
+++ b/source/blender/nodes/NOD_geometry_nodes_to_lazy_function_graph.hh
@@ -22,6 +22,7 @@ struct GeoNodesModifierData {
   const Object *self_object = nullptr;
   Depsgraph *depsgraph = nullptr;
   geo_eval_log::GeoModifierLog *eval_log = nullptr;
+  const MultiValueMap<ContextStackHash, const lf::FunctionNode *> *side_effect_nodes;
 };
 
 class NodeGroupContextStack : public ContextStack {
@@ -85,6 +86,8 @@ struct GeometryNodeLazyFunctionMapping {
   Map<const bNodeSocket *, lf::Socket *> dummy_socket_map;
   Vector<lf::OutputSocket *> group_input_sockets;
   MultiValueMap<const lf::Socket *, const bNodeSocket *> bsockets_by_lf_socket_map;
+  Map<const bNode *, const lf::FunctionNode *> group_node_map;
+  Map<const bNode *, const lf::FunctionNode *> viewer_node_map;
 };
 
 struct GeometryNodesLazyFunctionGraphInfo {
diff --git a/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc b/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
index 3162fb1066f..d0587390362 100644
--- a/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
+++ b/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
@@ -769,7 +769,7 @@ struct GeometryNodesLazyFunctionGraphBuilder {
     Vector<const bNodeSocket *> used_outputs;
     auto lazy_function = std::make_unique<LazyFunctionForGroupNode>(
         bnode, used_inputs, used_outputs);
-    lf::Node &lf_node = lf_graph_->add_function(*lazy_function);
+    lf::FunctionNode &lf_node = lf_graph_->add_function(*lazy_function);
     lf_graph_info_->functions.append(std::move(lazy_function));
     for (const int i : used_inputs.index_range()) {
       const bNodeSocket &bsocket = *used_inputs[i];
@@ -784,6 +784,7 @@ struct GeometryNodesLazyFunctionGraphBuilder {
       output_socket_map_.add_new(&bsocket, &lf_socket);
       mapping_->bsockets_by_lf_socket_map.add(&lf_socke

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list