27using namespace nodes::derived_node_tree_types;
36 if (context_.profiler()) {
37 context_.profiler()->finalize(context_.get_node_tree());
41 derived_node_tree_ = std::make_unique<DerivedNodeTree>(context_.get_node_tree());
43 if (!this->validate_node_tree()) {
47 if (context_.is_canceled()) {
48 this->cancel_evaluation();
56 for (
const DNode &node : schedule) {
57 if (context_.is_canceled()) {
58 this->cancel_evaluation();
63 this->evaluate_pixel_compile_unit(compile_state);
70 this->evaluate_node(node, compile_state);
75bool Evaluator::validate_node_tree()
77 if (derived_node_tree_->has_link_cycles()) {
82 if (derived_node_tree_->has_undefined_nodes_or_sockets()) {
83 context_.
set_info_message(
"Compositor node tree has undefined nodes or sockets!");
87 for (
const bNodeTree *node_tree : derived_node_tree_->used_btrees()) {
88 for (
const bNode *node : node_tree->all_nodes()) {
92 if (
STR_ELEM(node->idname,
"CompositorNodeRLayers",
"CompositorNodeCryptomatteV2")) {
96 const char *disabled_hint =
nullptr;
97 if (!node->typeinfo->poll(node->typeinfo, node_tree, &disabled_hint)) {
98 context_.set_info_message(
"Compositor node tree has unsupported nodes.");
109 NodeOperation *operation = node->typeinfo->get_compositor_operation(context_, node);
111 compile_state.map_node_to_node_operation(node, operation);
113 map_node_operation_inputs_to_their_results(node, operation, compile_state);
118 operations_stream_.append(std::unique_ptr<Operation>(operation));
120 operation->compute_results_reference_counts(compile_state.get_schedule());
122 operation->evaluate();
125void Evaluator::map_node_operation_inputs_to_their_results(
DNode node,
130 const DInputSocket dinput{node.context(),
input};
140 if (dorigin->is_output()) {
141 Result &
result = compile_state.get_result_from_output_socket(DOutputSocket(dorigin));
142 operation->map_input_to_result(
input->identifier, &
result);
150 InputSingleValueOperation *input_operation =
new InputSingleValueOperation(
151 context_, DInputSocket(dorigin));
152 operation->map_input_to_result(
input->identifier, &input_operation->get_result());
154 operations_stream_.append(std::unique_ptr<InputSingleValueOperation>(input_operation));
156 input_operation->evaluate();
176void Evaluator::evaluate_pixel_compile_unit(CompileState &compile_state)
184 int number_of_outputs = 0;
185 for (
int i : compile_unit.index_range()) {
186 const DNode node = compile_unit[
i];
187 number_of_outputs += compile_state.compute_pixel_node_operation_outputs_count(node);
201 const int split_index = compile_unit.size() / 2;
202 const PixelCompileUnit start_compile_unit(compile_unit.as_span().take_front(split_index));
203 const PixelCompileUnit end_compile_unit(compile_unit.as_span().drop_front(split_index));
205 compile_state.get_pixel_compile_unit() = start_compile_unit;
206 this->evaluate_pixel_compile_unit(compile_state);
208 compile_state.get_pixel_compile_unit() = end_compile_unit;
209 this->evaluate_pixel_compile_unit(compile_state);
218 for (DNode node : compile_unit) {
219 compile_state.map_node_to_pixel_operation(node, operation);
222 map_pixel_operation_inputs_to_their_results(operation, compile_state);
224 operations_stream_.append(std::unique_ptr<Operation>(operation));
226 operation->compute_results_reference_counts(compile_state.get_schedule());
228 operation->evaluate();
230 compile_state.reset_pixel_compile_unit();
233void Evaluator::map_pixel_operation_inputs_to_their_results(
PixelOperation *operation,
236 for (
const auto item : operation->get_inputs_to_linked_outputs_map().items()) {
237 Result &
result = compile_state.get_result_from_output_socket(item.value);
238 operation->map_input_to_result(item.key, &
result);
243 const int internal_reference_count = operation->get_internal_input_reference_count(item.key);
244 result.decrement_reference_count(internal_reference_count - 1);
247 for (
const auto item : operation->get_implicit_inputs_to_input_identifiers_map().items()) {
248 ImplicitInputOperation *input_operation =
new ImplicitInputOperation(context_, item.key);
249 operation->map_input_to_result(item.value, &input_operation->get_result());
251 operations_stream_.append(std::unique_ptr<ImplicitInputOperation>(input_operation));
253 input_operation->evaluate();
257void Evaluator::cancel_evaluation()
259 context_.cache_manager().skip_next_reset();
260 for (
const std::unique_ptr<Operation> &operation : operations_stream_) {
261 operation->free_results();
#define BLI_SCOPED_DEFER(function_to_defer)
struct bNodeSocket bNodeSocket
PixelCompileUnit & get_pixel_compile_unit()
void add_node_to_pixel_compile_unit(DNode node)
bool should_compile_pixel_compile_unit(DNode node)
bool is_pixel_compile_unit_single_value()
const Schedule & get_schedule()
virtual void set_info_message(StringRef message) const
Evaluator(Context &context)
static int maximum_number_of_outputs(Context &context)
DSocket get_input_origin_socket(DInputSocket input)
VectorSet< DNode > Schedule
VectorSet< DNode > PixelCompileUnit
static PixelOperation * create_pixel_operation(Context &context, CompileState &compile_state)
Schedule compute_schedule(const Context &context, const DerivedNodeTree &tree)
bool is_pixel_node(DNode node)
bool is_socket_available(const bNodeSocket *socket)