Blender V4.3
node_operation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <memory>
6
7#include "BLI_assert.h"
8#include "BLI_map.hh"
9#include "BLI_math_base.h"
10#include "BLI_math_base.hh"
12#include "BLI_string_ref.hh"
13#include "BLI_timeit.hh"
14#include "BLI_vector.hh"
15
16#include "GPU_shader.hh"
17#include "GPU_texture.hh"
18
19#include "DNA_node_types.h"
20
23
24#include "BKE_node.hh"
25
26#include "COM_context.hh"
28#include "COM_node_operation.hh"
29#include "COM_operation.hh"
30#include "COM_result.hh"
31#include "COM_scheduler.hh"
32#include "COM_utilities.hh"
33
35
36using namespace nodes::derived_node_tree_types;
37
38NodeOperation::NodeOperation(Context &context, DNode node) : Operation(context), node_(node)
40 for (const bNodeSocket *output : node->output_sockets()) {
41 const ResultType result_type = get_node_socket_result_type(output);
42 populate_result(output->identifier, context.create_result(result_type));
43 }
44
45 for (const bNodeSocket *input : node->input_sockets()) {
46 const InputDescriptor input_descriptor = input_descriptor_from_input_socket(input);
47 declare_input_descriptor(input->identifier, input_descriptor);
48 }
49}
50
52{
53 const timeit::TimePoint before_time = timeit::Clock::now();
55 const timeit::TimePoint after_time = timeit::Clock::now();
56 if (context().profiler()) {
57 context().profiler()->set_node_evaluation_time(node_.instance_key(), after_time - before_time);
58 }
59}
60
62{
63 if (context().should_compute_node_previews() && is_node_preview_needed(node())) {
64 compute_preview_from_result(context(), node(), *get_preview_result());
65 }
66}
67
68Result *NodeOperation::get_preview_result()
69{
70 /* Find the first linked output. */
71 for (const bNodeSocket *output : node()->output_sockets()) {
72 Result &output_result = get_result(output->identifier);
73 if (output_result.should_compute()) {
74 return &output_result;
75 }
76 }
77
78 /* No linked outputs, find the first allocated input. */
79 for (const bNodeSocket *input : node()->input_sockets()) {
80 Result &input_result = get_input(input->identifier);
81 if (input_result.is_allocated()) {
82 return &input_result;
83 }
84 }
85
87 return nullptr;
88}
89
91{
92 for (const bNodeSocket *output : this->node()->output_sockets()) {
93 const DOutputSocket doutput{node().context(), output};
94
95 const int reference_count = number_of_inputs_linked_to_output_conditioned(
96 doutput, [&](DInputSocket input) { return schedule.contains(input.node()); });
97
98 get_result(doutput->identifier).set_initial_reference_count(reference_count);
99 }
100}
101
102const DNode &NodeOperation::node() const
103{
104 return node_;
105}
106
108{
109 return *node_;
110}
111
113{
114 return get_result(identifier).should_compute();
115}
116
117} // namespace blender::realtime_compositor
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
bool contains(const Key &key) const
const DTreeContext * context() const
NodeOperation(Context &context, DNode node)
void compute_results_reference_counts(const Schedule &schedule)
bool should_compute_output(StringRef identifier)
Result & get_input(StringRef identifier) const
Definition operation.cc:144
Result & get_result(StringRef identifier)
Definition operation.cc:46
void set_node_evaluation_time(bNodeInstanceKey node_instance_key, timeit::Nanoseconds time)
Definition profiler.cc:23
void set_initial_reference_count(int count)
Definition result.cc:587
bool is_node_preview_needed(const DNode &node)
Definition utilities.cc:141
void compute_preview_from_result(Context &context, const DNode &node, Result &input_result)
Definition utilities.cc:190
int number_of_inputs_linked_to_output_conditioned(DOutputSocket output, FunctionRef< bool(DInputSocket)> condition)
Definition utilities.cc:91
ResultType get_node_socket_result_type(const bNodeSocket *socket)
Definition utilities.cc:63
InputDescriptor input_descriptor_from_input_socket(const bNodeSocket *socket)
Definition utilities.cc:109
Clock::time_point TimePoint
Definition BLI_timeit.hh:15