Commit: 85252f3cbab9c12f06de0e7430815ef1dc2eb9ab
Author: Omar Emara
Date:   Tue Mar 29 21:21:06 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rB85252f3cbab9c12f06de0e7430815ef1dc2eb9ab

Viewport Compositor: Delay mapping input processors

Delay mapping the result of the of the last input processor to the
operation input until after adding all input processors.

===================================================================

M       source/blender/nodes/NOD_compositor_execute.hh
M       source/blender/nodes/intern/node_compositor_execute.cc

===================================================================

diff --git a/source/blender/nodes/NOD_compositor_execute.hh 
b/source/blender/nodes/NOD_compositor_execute.hh
index 3727de90db7..3d107a7f24d 100644
--- a/source/blender/nodes/NOD_compositor_execute.hh
+++ b/source/blender/nodes/NOD_compositor_execute.hh
@@ -447,10 +447,14 @@ class Operation {
    * overridden by node operations to compute results for unlinked sockets. */
   virtual void pre_execute();
 
-  /* Add all the necessary input processors for each input, then evaluate 
them. This is called
-   * before executing the operation to prepare its inputs but after the 
pre_execute method was
-   * called. The class defines a default implementation, but derived class can 
override the method
-   * to have a different implementation, extend the implementation, or remove 
it. */
+  /* First, all the necessary input processors for each input. Then update the 
result mapped to
+   * each input to be that of the last processor for that input if any input 
processors exist for
+   * it. This is done now in a separate step after all processors were added 
because the operation
+   * might use the original mapped results to determine what processors needs 
to be added. Finally,
+   * evaluate all input processors in order. This is called before executing 
the operation to
+   * prepare its inputs but after the pre_execute method was called. The class 
defines a default
+   * implementation, but derived class can override the method to have a 
different
+   * implementation, extend the implementation, or remove it. */
   virtual void evaluate_input_processors();
 
   /* This method should allocate the operation results, execute the operation, 
and compute the
@@ -496,14 +500,11 @@ class Operation {
   /* Add the given input processor operation to the list of input processors 
for the input
    * identified by the given identifier. This will also involve mapping the 
input of the processor
    * to be the result of the last input processor or the result mapped to the 
input if no previous
-   * processors exists. Finally, the result mapped to the input is switched to 
be the result of the
-   * newly added processor. */
+   * processors exists. The result of the last input processor will not be 
mapped to the operation
+   * input in this method, this will be done later, see 
evaluate_input_processors for more
+   * information. */
   void add_input_processor(StringRef identifier, ProcessorOperation 
*processor);
 
-  /* Allocate all input processors in order. This is called before allocating 
the operation but
-   * after the pre_allocate method was called. */
-  void allocate_input_processors();
-
   /* Release the results that are mapped to the inputs of the operation. This 
is called after the
    * evaluation of the operation to declare that the results are no longer 
needed by this
    * operation. */
diff --git a/source/blender/nodes/intern/node_compositor_execute.cc 
b/source/blender/nodes/intern/node_compositor_execute.cc
index bf4537097a0..a6e459f3af3 100644
--- a/source/blender/nodes/intern/node_compositor_execute.cc
+++ b/source/blender/nodes/intern/node_compositor_execute.cc
@@ -421,13 +421,25 @@ void Operation::pre_execute()
 
 void Operation::evaluate_input_processors()
 {
-  /* First add all needed processors for each input. */
+  /* First, add all needed processors for each input. */
   for (const StringRef &identifier : inputs_to_results_map_.keys()) {
     add_implicit_conversion_input_processor_if_needed(identifier);
     add_realize_on_domain_input_processor_if_needed(identifier);
   }
 
-  /* Then evaluate the input processors in order. */
+  /* Then, switch the result mapped for each input of the operation to be that 
of the last
+   * processor for that input if any input processor exist for it. */
+  for (const StringRef &identifier : inputs_to_results_map_.keys()) {
+    Vector<ProcessorOperation *> &processors = 
input_processors_.lookup_or_add_default(identifier);
+    /* No input processors, nothing to do. */
+    if (processors.is_empty()) {
+      continue;
+    }
+    /* Replace the currently mapped result with the result of the last input 
processor. */
+    switch_result_mapped_to_input(identifier, 
&processors.last()->get_result());
+  }
+
+  /* Finally, evaluate the input processors in order. */
   for (const Vector<ProcessorOperation *> &processors : 
input_processors_.values()) {
     for (ProcessorOperation *processor : processors) {
       processor->evaluate();
@@ -530,11 +542,11 @@ void Operation::add_input_processor(StringRef identifier, 
ProcessorOperation *pr
    * processor or not. */
   Result &result = processors.is_empty() ? get_input(identifier) : 
processors.last()->get_result();
 
-  /* Set the input result of the processor, add it to the processors vector, 
and switch the result
-   * mapped to the input to the result of the last processor. */
+  /* Map the input result of the processor and add it to the processors 
vector. No need to map the
+   * result of the processor to the operation input as this will be done later 
in
+   * evaluate_input_processors. */
   processor->map_input_to_result(&result);
   processors.append(processor);
-  switch_result_mapped_to_input(identifier, &processor->get_result());
 }
 
 void Operation::release_inputs()

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to