[Bf-blender-cvs] [a570ad2e1be] compositor-full-frame: Add `MovieClipAttribute` as a constant operation

Manuel Castilla noreply at git.blender.org
Mon Aug 2 23:12:20 CEST 2021


Commit: a570ad2e1be1a10c7dbe2ca9c51a79ccc92b8714
Author: Manuel Castilla
Date:   Mon Aug 2 17:45:05 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rBa570ad2e1be1a10c7dbe2ca9c51a79ccc92b8714

Add `MovieClipAttribute` as a constant operation

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

M	source/blender/compositor/intern/COM_BufferOperation.cc
M	source/blender/compositor/intern/COM_ConstantFolder.cc
M	source/blender/compositor/intern/COM_Debug.cc
M	source/blender/compositor/intern/COM_MemoryBuffer.h
M	source/blender/compositor/operations/COM_ConstantOperation.cc
M	source/blender/compositor/operations/COM_ConstantOperation.h
M	source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc
M	source/blender/compositor/operations/COM_MovieClipAttributeOperation.h
M	source/blender/compositor/operations/COM_SetColorOperation.cc
M	source/blender/compositor/operations/COM_SetColorOperation.h
M	source/blender/compositor/operations/COM_SetValueOperation.cc
M	source/blender/compositor/operations/COM_SetValueOperation.h
M	source/blender/compositor/operations/COM_SetVectorOperation.cc
M	source/blender/compositor/operations/COM_SetVectorOperation.h

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

diff --git a/source/blender/compositor/intern/COM_BufferOperation.cc b/source/blender/compositor/intern/COM_BufferOperation.cc
index 90c97f2a9c7..e1f566b19db 100644
--- a/source/blender/compositor/intern/COM_BufferOperation.cc
+++ b/source/blender/compositor/intern/COM_BufferOperation.cc
@@ -32,6 +32,7 @@ BufferOperation::BufferOperation(MemoryBuffer *buffer, DataType data_type)
   setResolution(resolution);
   addOutputSocket(data_type);
   flags.is_constant_operation = buffer_->is_a_single_elem();
+  flags.is_fullframe_operation = false;
 }
 
 const float *BufferOperation::get_constant_elem()
diff --git a/source/blender/compositor/intern/COM_ConstantFolder.cc b/source/blender/compositor/intern/COM_ConstantFolder.cc
index 5b48ff8fc08..445a9ce7433 100644
--- a/source/blender/compositor/intern/COM_ConstantFolder.cc
+++ b/source/blender/compositor/intern/COM_ConstantFolder.cc
@@ -44,7 +44,9 @@ static bool is_constant_foldable(NodeOperation *operation)
 {
   if (operation->get_flags().can_be_constant && !operation->get_flags().is_constant_operation) {
     for (int i = 0; i < operation->getNumberOfInputSockets(); i++) {
-      if (!operation->get_input_operation(i)->get_flags().is_constant_operation) {
+      NodeOperation *input = operation->get_input_operation(i);
+      if (!input->get_flags().is_constant_operation ||
+          !static_cast<ConstantOperation *>(input)->can_get_constant_elem()) {
         return false;
       }
     }
diff --git a/source/blender/compositor/intern/COM_Debug.cc b/source/blender/compositor/intern/COM_Debug.cc
index 5443974cbb0..a0333cf96cf 100644
--- a/source/blender/compositor/intern/COM_Debug.cc
+++ b/source/blender/compositor/intern/COM_Debug.cc
@@ -178,21 +178,27 @@ int DebugInfo::graphviz_operation(const ExecutionSystem *system,
       }
       len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "<OUT_%p>", socket);
       switch (socket->getDataType()) {
-        case DataType::Value:
-          if (typeid(*operation) == typeid(SetValueOperation)) {
-            const float value = ((SetValueOperation *)operation)->getValue();
+        case DataType::Value: {
+          ConstantOperation *constant = operation->get_flags().is_constant_operation ?
+                                            static_cast<ConstantOperation *>(operation) :
+                                            nullptr;
+          if (constant && constant->can_get_constant_elem()) {
+            const float value = *constant->get_constant_elem();
             len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "Value\\n%12.4g", value);
           }
           else {
             len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "Value");
           }
           break;
-        case DataType::Vector:
+        }
+        case DataType::Vector: {
           len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "Vector");
           break;
-        case DataType::Color:
+        }
+        case DataType::Color: {
           len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "Color");
           break;
+        }
       }
     }
     len += snprintf(str + len, maxlen > len ? maxlen - len : 0, "}");
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h
index ae12c444dc1..310e87b6a4b 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.h
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.h
@@ -260,6 +260,11 @@ class MemoryBuffer {
     return this->m_num_channels;
   }
 
+  uint8_t get_elem_bytes_len() const
+  {
+    return this->m_num_channels * sizeof(float);
+  }
+
   /**
    * Get all buffer elements as a range with no offsets.
    */
diff --git a/source/blender/compositor/operations/COM_ConstantOperation.cc b/source/blender/compositor/operations/COM_ConstantOperation.cc
index f905edbde76..33d51cca432 100644
--- a/source/blender/compositor/operations/COM_ConstantOperation.cc
+++ b/source/blender/compositor/operations/COM_ConstantOperation.cc
@@ -22,7 +22,24 @@ namespace blender::compositor {
 
 ConstantOperation::ConstantOperation()
 {
+  needs_resolution_to_get_constant_ = false;
   flags.is_constant_operation = true;
+  flags.is_fullframe_operation = true;
+}
+
+bool ConstantOperation::can_get_constant_elem() const
+{
+  return !needs_resolution_to_get_constant_ || this->flags.is_resolution_set;
+}
+
+void ConstantOperation::update_memory_buffer(MemoryBuffer *output,
+                                             const rcti &area,
+                                             Span<MemoryBuffer *> UNUSED(inputs))
+{
+  BLI_assert(output->is_a_single_elem());
+  const float *constant = get_constant_elem();
+  float *out = output->get_elem(area.xmin, area.ymin);
+  memcpy(out, constant, output->get_elem_bytes_len());
 }
 
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_ConstantOperation.h b/source/blender/compositor/operations/COM_ConstantOperation.h
index 2709efeebd8..31b8d30254b 100644
--- a/source/blender/compositor/operations/COM_ConstantOperation.h
+++ b/source/blender/compositor/operations/COM_ConstantOperation.h
@@ -22,15 +22,27 @@
 
 namespace blender::compositor {
 
+/* TODO(manzanilla): After removing tiled implementation, implement a default #determineResolution
+ * for all constant operations and make all initialization and deinitilization methods final. */
 /**
- * Base class for primitive constant operations (Color/Vector/Value). The rest of operations that
- * can be constant are evaluated into primitives during constant folding.
+ * Base class for operations that are always constant. Operations that can be constant only when
+ * all their inputs are so, are evaluated into primitive constants (Color/Vector/Value) during
+ * constant folding.
  */
 class ConstantOperation : public NodeOperation {
+ protected:
+  bool needs_resolution_to_get_constant_;
+
  public:
   ConstantOperation();
 
+  /** May require resolution to be already determined. */
   virtual const float *get_constant_elem() = 0;
+  bool can_get_constant_elem() const;
+
+  void update_memory_buffer(MemoryBuffer *output,
+                            const rcti &area,
+                            Span<MemoryBuffer *> inputs) final;
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc
index a9f187258b2..e36e93984fb 100644
--- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc
+++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cc
@@ -29,10 +29,21 @@ MovieClipAttributeOperation::MovieClipAttributeOperation()
   this->m_framenumber = 0;
   this->m_attribute = MCA_X;
   this->m_invert = false;
+  needs_resolution_to_get_constant_ = true;
+  is_value_calculated_ = false;
 }
 
 void MovieClipAttributeOperation::initExecution()
 {
+  if (!is_value_calculated_) {
+    calc_value();
+  }
+}
+
+void MovieClipAttributeOperation::calc_value()
+{
+  BLI_assert(this->get_flags().is_resolution_set);
+  is_value_calculated_ = true;
   if (this->m_clip == nullptr) {
     return;
   }
@@ -83,4 +94,12 @@ void MovieClipAttributeOperation::determineResolution(unsigned int resolution[2]
   resolution[1] = preferredResolution[1];
 }
 
+const float *MovieClipAttributeOperation::get_constant_elem()
+{
+  if (!is_value_calculated_) {
+    calc_value();
+  }
+  return &m_value;
+}
+
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h
index 8507e98d08f..28c39d4dad3 100644
--- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h
+++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h
@@ -18,6 +18,7 @@
 
 #pragma once
 
+#include "COM_ConstantOperation.h"
 #include "COM_NodeOperation.h"
 #include "DNA_movieclip_types.h"
 
@@ -33,13 +34,14 @@ typedef enum MovieClipAttribute {
  * this program converts an input color to an output value.
  * it assumes we are in sRGB color space.
  */
-class MovieClipAttributeOperation : public NodeOperation {
+class MovieClipAttributeOperation : public ConstantOperation {
  private:
   MovieClip *m_clip;
   float m_value;
   int m_framenumber;
   bool m_invert;
   MovieClipAttribute m_attribute;
+  bool is_value_calculated_;
 
  public:
   /**
@@ -56,6 +58,8 @@ class MovieClipAttributeOperation : public NodeOperation {
   void determineResolution(unsigned int resolution[2],
                            unsigned int preferredResolution[2]) override;
 
+  const float *get_constant_elem() override;
+
   void setMovieClip(MovieClip *clip)
   {
     this->m_clip = clip;
@@ -72,6 +76,9 @@ class MovieClipAttributeOperation : public NodeOperation {
   {
     this->m_invert = invert;
   }
+
+ private:
+  void calc_value();
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetColorOperation.cc b/source/blender/compositor/operations/COM_SetColorOperation.cc
index bfe735aab15..dbe45fa60db 100644
--- a/source/blender/compositor/operations/COM_SetColorOperation.cc
+++ b/source/blender/compositor/operations/COM_SetColorOperation.cc
@@ -24,7 +24,6 @@ SetColorOperation::SetColorOperation()
 {
   this->addOutputSocket(DataType::Color);
   flags.is_set_operation = true;
-  flags.is_fullframe_operation = true;
 }
 
 void SetColorOperation::executePixelSampled(float output[4],
@@ -42,13 +41,4 @@ void SetColorOperation::determineResolution(unsigned int resolution[2],
   resolution[1] = preferredResolution[1];
 }
 
-void SetColorOperation::update_memory_buffer(MemoryBuffer *output,
-                                             const rcti &area,
-                                             Span<MemoryBuffer *> UNUSED(inputs))
-{
-  BLI_assert(output->is_a_single_elem());
-  float *out_elem = output->get_elem(area.xmin, area.ymin);
-  copy_v4_v4(out_elem, m_color);
-}
-
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetColorOperation.h b/source/blender/compositor/operat

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list