[Bf-blender-cvs] [b848d5cdf5b] master: Compositor: Full frame Double Edge Mask node

Manuel Castilla noreply at git.blender.org
Mon Jul 19 22:06:46 CEST 2021


Commit: b848d5cdf5b6783f8f83ce6b3c063e62829b8245
Author: Manuel Castilla
Date:   Mon Jul 19 18:35:42 2021 +0200
Branches: master
https://developer.blender.org/rBb848d5cdf5b6783f8f83ce6b3c063e62829b8245

Compositor: Full frame Double Edge Mask node

Adds full frame implementation to this node operation.
No functional changes.
No performances changes.

Reviewed By: jbakker

Differential Revision: https://developer.blender.org/D11750

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

M	source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc
M	source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h

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

diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc
index c4099a6d33d..09d75ea7829 100644
--- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc
+++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cc
@@ -1318,6 +1318,7 @@ DoubleEdgeMaskOperation::DoubleEdgeMaskOperation()
   this->m_adjacentOnly = false;
   this->m_keepInside = false;
   this->flags.complex = true;
+  is_output_rendered_ = false;
 }
 
 bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti * /*input*/,
@@ -1382,4 +1383,43 @@ void DoubleEdgeMaskOperation::deinitExecution()
   }
 }
 
+void DoubleEdgeMaskOperation::get_area_of_interest(int UNUSED(input_idx),
+                                                   const rcti &UNUSED(output_area),
+                                                   rcti &r_input_area)
+{
+  r_input_area.xmax = this->getWidth();
+  r_input_area.xmin = 0;
+  r_input_area.ymax = this->getHeight();
+  r_input_area.ymin = 0;
+}
+
+void DoubleEdgeMaskOperation::update_memory_buffer(MemoryBuffer *output,
+                                                   const rcti &UNUSED(area),
+                                                   Span<MemoryBuffer *> inputs)
+{
+  if (!is_output_rendered_) {
+    /* Ensure full buffers to work with no strides. */
+    MemoryBuffer *input_inner_mask = inputs[0];
+    MemoryBuffer *inner_mask = input_inner_mask->is_a_single_elem() ? input_inner_mask->inflate() :
+                                                                      input_inner_mask;
+    MemoryBuffer *input_outer_mask = inputs[1];
+    MemoryBuffer *outer_mask = input_outer_mask->is_a_single_elem() ? input_outer_mask->inflate() :
+                                                                      input_outer_mask;
+
+    BLI_assert(output->getWidth() == this->getWidth());
+    BLI_assert(output->getHeight() == this->getHeight());
+    /* TODO(manzanilla): Once tiled implementation is removed, use execution system to run
+     * multi-threadly where possible. */
+    doDoubleEdgeMask(inner_mask->getBuffer(), outer_mask->getBuffer(), output->getBuffer());
+    is_output_rendered_ = true;
+
+    if (inner_mask != input_inner_mask) {
+      delete inner_mask;
+    }
+    if (outer_mask != input_outer_mask) {
+      delete outer_mask;
+    }
+  }
+}
+
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
index e956e8edc3e..45a80bbbbf0 100644
--- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
+++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h
@@ -18,7 +18,7 @@
 
 #pragma once
 
-#include "COM_NodeOperation.h"
+#include "COM_MultiThreadedOperation.h"
 
 namespace blender::compositor {
 
@@ -31,8 +31,12 @@ class DoubleEdgeMaskOperation : public NodeOperation {
   SocketReader *m_inputInnerMask;
   bool m_adjacentOnly;
   bool m_keepInside;
+
+  /* TODO(manzanilla): To be removed with tiled implementation. */
   float *m_cachedInstance;
 
+  bool is_output_rendered_;
+
  public:
   DoubleEdgeMaskOperation();
 
@@ -66,6 +70,12 @@ class DoubleEdgeMaskOperation : public NodeOperation {
   {
     this->m_keepInside = keepInside;
   }
+
+  void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
+
+  void update_memory_buffer(MemoryBuffer *output,
+                            const rcti &area,
+                            Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list