[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