[Bf-blender-cvs] [00c6cbb985a] master: Compositor: Add base operation for updating buffer rows

Manuel Castilla noreply at git.blender.org
Mon Jul 5 23:51:56 CEST 2021


Commit: 00c6cbb985adee795270a27676fb1bc6820651a4
Author: Manuel Castilla
Date:   Mon Jul 5 19:37:06 2021 +0200
Branches: master
https://developer.blender.org/rB00c6cbb985adee795270a27676fb1bc6820651a4

Compositor: Add base operation for updating buffer rows

Simplifies code for operations with correlated
coordinates between inputs and output.

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

M	source/blender/compositor/CMakeLists.txt
A	source/blender/compositor/intern/COM_MultiThreadedRowOperation.cc
A	source/blender/compositor/intern/COM_MultiThreadedRowOperation.h

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

diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt
index ac59d832013..c6d52a19e43 100644
--- a/source/blender/compositor/CMakeLists.txt
+++ b/source/blender/compositor/CMakeLists.txt
@@ -82,6 +82,8 @@ set(SRC
   intern/COM_MetaData.h
   intern/COM_MultiThreadedOperation.cc
   intern/COM_MultiThreadedOperation.h
+  intern/COM_MultiThreadedRowOperation.cc
+  intern/COM_MultiThreadedRowOperation.h
   intern/COM_Node.cc
   intern/COM_Node.h
   intern/COM_NodeConverter.cc
diff --git a/source/blender/compositor/intern/COM_MultiThreadedRowOperation.cc b/source/blender/compositor/intern/COM_MultiThreadedRowOperation.cc
new file mode 100644
index 00000000000..6bf318bb96b
--- /dev/null
+++ b/source/blender/compositor/intern/COM_MultiThreadedRowOperation.cc
@@ -0,0 +1,50 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2021, Blender Foundation.
+ */
+
+#include "COM_MultiThreadedRowOperation.h"
+
+namespace blender::compositor {
+
+MultiThreadedRowOperation::PixelCursor::PixelCursor(const int num_inputs)
+    : out(nullptr), out_stride(0), row_end(nullptr), ins(num_inputs), in_strides(num_inputs)
+{
+}
+
+void MultiThreadedRowOperation::update_memory_buffer_partial(MemoryBuffer *output,
+                                                             const rcti &area,
+                                                             Span<MemoryBuffer *> inputs)
+{
+  BLI_assert(output != nullptr);
+  const int width = BLI_rcti_size_x(&area);
+  PixelCursor p(inputs.size());
+  p.out_stride = output->elem_stride;
+  for (int i = 0; i < p.in_strides.size(); i++) {
+    p.in_strides[i] = inputs[i]->elem_stride;
+  }
+
+  for (int y = area.ymin; y < area.ymax; y++) {
+    p.out = output->get_elem(area.xmin, y);
+    for (int i = 0; i < p.ins.size(); i++) {
+      p.ins[i] = inputs[i]->get_elem(area.xmin, y);
+    }
+    p.row_end = p.out + width * p.out_stride;
+    update_memory_buffer_row(p);
+  }
+}
+
+}  // namespace blender::compositor
diff --git a/source/blender/compositor/intern/COM_MultiThreadedRowOperation.h b/source/blender/compositor/intern/COM_MultiThreadedRowOperation.h
new file mode 100644
index 00000000000..3daa9eec474
--- /dev/null
+++ b/source/blender/compositor/intern/COM_MultiThreadedRowOperation.h
@@ -0,0 +1,60 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2021, Blender Foundation.
+ */
+
+#pragma once
+
+#include "COM_MultiThreadedOperation.h"
+
+namespace blender::compositor {
+
+/**
+ * Executes buffer updates per row. To be inherited only by operations with correlated coordinates
+ * between inputs and output.
+ */
+class MultiThreadedRowOperation : public MultiThreadedOperation {
+ protected:
+  struct PixelCursor {
+    float *out;
+    int out_stride;
+    const float *row_end;
+    Array<const float *> ins;
+    Array<int> in_strides;
+
+   public:
+    PixelCursor(int num_inputs);
+
+    void next()
+    {
+      BLI_assert(out < row_end);
+      out += out_stride;
+      for (int i = 0; i < ins.size(); i++) {
+        ins[i] += in_strides[i];
+      }
+    }
+  };
+
+ protected:
+  virtual void update_memory_buffer_row(PixelCursor &p) = 0;
+
+ private:
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) final;
+};
+
+}  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list