24using namespace nodes::derived_node_tree_types;
33 compile_and_evaluate();
36 for (
const std::unique_ptr<Operation> &operation : operations_stream_) {
41 operation->evaluate();
52 operations_stream_.clear();
53 derived_node_tree_.reset();
58bool Evaluator::validate_node_tree()
60 if (derived_node_tree_->has_link_cycles()) {
65 if (derived_node_tree_->has_undefined_nodes_or_sockets()) {
66 context_.
set_info_message(
"Compositor node tree has undefined nodes or sockets!");
73void Evaluator::compile_and_evaluate()
75 derived_node_tree_ = std::make_unique<DerivedNodeTree>(context_.
get_node_tree());
77 if (!validate_node_tree()) {
89 CompileState compile_state(schedule);
91 for (
const DNode &node : schedule) {
98 if (compile_state.should_compile_pixel_compile_unit(node)) {
99 compile_and_evaluate_pixel_compile_unit(compile_state);
103 compile_state.add_node_to_pixel_compile_unit(node);
106 compile_and_evaluate_node(node, compile_state);
113void Evaluator::compile_and_evaluate_node(DNode node, CompileState &compile_state)
115 NodeOperation *operation = node->typeinfo->get_compositor_operation(context_, node);
117 compile_state.map_node_to_node_operation(node, operation);
119 map_node_operation_inputs_to_their_results(node, operation, compile_state);
124 operations_stream_.append(std::unique_ptr<Operation>(operation));
126 operation->compute_results_reference_counts(compile_state.get_schedule());
128 operation->evaluate();
131void Evaluator::map_node_operation_inputs_to_their_results(DNode node,
132 NodeOperation *operation,
133 CompileState &compile_state)
135 for (
const bNodeSocket *input : node->input_sockets()) {
136 const DInputSocket dinput{node.context(), input};
142 if (dorigin->is_output()) {
143 Result &result = compile_state.get_result_from_output_socket(DOutputSocket(dorigin));
144 operation->map_input_to_result(input->identifier, &result);
152 InputSingleValueOperation *input_operation =
new InputSingleValueOperation(
153 context_, DInputSocket(dorigin));
154 operation->map_input_to_result(input->identifier, &input_operation->get_result());
156 operations_stream_.append(std::unique_ptr<InputSingleValueOperation>(input_operation));
158 input_operation->evaluate();
162void Evaluator::compile_and_evaluate_pixel_compile_unit(CompileState &compile_state)
170 int number_of_outputs = 0;
171 for (
int i : compile_unit.index_range()) {
172 const DNode node = compile_unit[i];
173 number_of_outputs += compile_state.compute_pixel_node_operation_outputs_count(node);
177 if (number_of_outputs <= 8) {
189 const int split_index = compile_unit.
size() / 2;
190 const PixelCompileUnit start_compile_unit(compile_unit.as_span().take_front(split_index));
191 const PixelCompileUnit end_compile_unit(compile_unit.as_span().drop_front(split_index));
193 compile_state.get_pixel_compile_unit() = start_compile_unit;
194 this->compile_and_evaluate_pixel_compile_unit(compile_state);
196 compile_state.get_pixel_compile_unit() = end_compile_unit;
197 this->compile_and_evaluate_pixel_compile_unit(compile_state);
204 const Schedule &schedule = compile_state.get_schedule();
205 PixelOperation *operation =
new ShaderOperation(context_, compile_unit, schedule);
207 for (DNode node : compile_unit) {
208 compile_state.map_node_to_pixel_operation(node, operation);
211 map_pixel_operation_inputs_to_their_results(operation, compile_state);
213 operations_stream_.append(std::unique_ptr<Operation>(operation));
215 operation->compute_results_reference_counts(compile_state.get_schedule());
217 operation->evaluate();
219 compile_state.reset_pixel_compile_unit();
222void Evaluator::map_pixel_operation_inputs_to_their_results(PixelOperation *operation,
223 CompileState &compile_state)
225 for (
const auto item : operation->get_inputs_to_linked_outputs_map().items()) {
226 Result &result = compile_state.get_result_from_output_socket(item.value);
227 operation->map_input_to_result(item.key, &result);
StaticCacheManager & cache_manager()
virtual bool is_canceled() const
virtual const bNodeTree & get_node_tree() const =0
virtual void set_info_message(StringRef message) const =0
virtual Profiler * profiler() const
Evaluator(Context &context)
void finalize(const bNodeTree &node_tree)
bool is_pixel_node(DNode node)
VectorSet< DNode > PixelCompileUnit
VectorSet< DNode > Schedule
Schedule compute_schedule(const Context &context, const DerivedNodeTree &tree)
DSocket get_input_origin_socket(DInputSocket input)