Blender V5.0
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 "BLI_assert.h"
6#include "BLI_string_ref.hh"
7#include "BLI_timeit.hh"
8
9#include "DNA_node_types.h"
10
12
13#include "BKE_node.hh"
14
15#include "GPU_debug.hh"
16
18#include "COM_context.hh"
20#include "COM_node_operation.hh"
21#include "COM_operation.hh"
22#include "COM_result.hh"
23#include "COM_scheduler.hh"
24#include "COM_utilities.hh"
25
26namespace blender::compositor {
27
28using namespace nodes::derived_node_tree_types;
29
31{
32 for (const bNodeSocket *output : node->output_sockets()) {
33 if (!is_socket_available(output)) {
34 continue;
35 }
36
38 populate_result(output->identifier, context.create_result(result_type));
39 }
40
41 for (const bNodeSocket *input : node->input_sockets()) {
43 continue;
44 }
45
47 declare_input_descriptor(input->identifier, input_descriptor);
48 }
49}
50
52{
53 if (context().use_gpu()) {
54 GPU_debug_group_begin(node().bnode()->typeinfo->idname.c_str());
55 }
56 const timeit::TimePoint before_time = timeit::Clock::now();
58 const timeit::TimePoint after_time = timeit::Clock::now();
59 if (context().profiler()) {
60 context().profiler()->set_node_evaluation_time(node_.instance_key(), after_time - before_time);
61 }
62 if (context().use_gpu()) {
64 }
65}
66
68{
69 if (bool(context().needed_outputs() & OutputTypes::Previews) && is_node_preview_needed(node())) {
70 const Result *result = get_preview_result();
71 if (result) {
73 }
74 }
75}
76
77Result *NodeOperation::get_preview_result()
78{
79 /* Find the first linked output. */
80 for (const bNodeSocket *output : node()->output_sockets()) {
82 continue;
83 }
84
85 Result &output_result = get_result(output->identifier);
86 if (output_result.should_compute()) {
87 return &output_result;
88 }
89 }
90
91 /* No linked outputs, but no inputs either, so nothing to preview. */
92 if (node()->input_sockets().is_empty()) {
93 return nullptr;
94 }
95
96 /* Find the first allocated input. */
97 for (const bNodeSocket *input : node()->input_sockets()) {
99 continue;
100 }
101
102 Result &input_result = get_input(input->identifier);
103 if (input_result.is_allocated()) {
104 return &input_result;
105 }
106 }
107
109 return nullptr;
110}
111
113{
114 for (const bNodeSocket *output : this->node()->output_sockets()) {
116 continue;
117 }
118
119 const DOutputSocket doutput{node().context(), output};
120
121 const int reference_count = number_of_inputs_linked_to_output_conditioned(
122 doutput, [&](DInputSocket input) { return schedule.contains(input.node()); });
123
124 get_result(doutput->identifier).set_reference_count(reference_count);
125 }
126}
127
129{
130 return node_;
131}
132
134{
135 return *node_;
136}
137
139{
140 return get_result(identifier).should_compute();
141}
142
143} // namespace blender::compositor
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
struct bNodeSocket bNodeSocket
void GPU_debug_group_end()
Definition gpu_debug.cc:33
void GPU_debug_group_begin(const char *name)
Definition gpu_debug.cc:22
bool contains(const Key &key) const
void compute_results_reference_counts(const Schedule &schedule)
bool should_compute_output(StringRef identifier)
NodeOperation(Context &context, DNode node)
Result & get_result(StringRef identifier)
Definition operation.cc:39
void populate_result(StringRef identifier, Result result)
Definition operation.cc:148
Operation(Context &context)
Definition operation.cc:22
#define input
#define output
int number_of_inputs_linked_to_output_conditioned(DOutputSocket output, FunctionRef< bool(DInputSocket)> condition)
Definition utilities.cc:126
VectorSet< DNode > Schedule
void compute_preview(Context &context, const nodes::DNode &node, const Result &input_result)
ResultType get_node_socket_result_type(const bNodeSocket *socket)
Definition utilities.cc:102
InputDescriptor input_descriptor_from_input_socket(const bNodeSocket *socket)
Definition utilities.cc:169
bool is_socket_available(const bNodeSocket *socket)
Definition utilities.cc:27
bool is_node_preview_needed(const DNode &node)
Definition utilities.cc:206
Clock::time_point TimePoint
Definition BLI_timeit.hh:20
static pxr::UsdShadeInput get_input(const pxr::UsdShadeShader &usd_shader, const pxr::TfToken &input_name)