Commit: 047346224155211ab86faaebc9d31f9dc457f9a7
Author: Hans Goudey
Date:   Thu Jun 23 12:33:58 2022 -0500
Branches: master
https://developer.blender.org/rB047346224155211ab86faaebc9d31f9dc457f9a7

Geometry Nodes: Speed up Separate color node in RGB mode

This applies the same optimization as b8bd304bd45397b8c to the separate
color node. I observed about a 50% improvement with 10 million values
when only extracting one channel-- from about 17ms to 11ms.

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

M       source/blender/nodes/function/nodes/node_fn_separate_color.cc

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

diff --git a/source/blender/nodes/function/nodes/node_fn_separate_color.cc 
b/source/blender/nodes/function/nodes/node_fn_separate_color.cc
index 1701dfdc6fa..19613427835 100644
--- a/source/blender/nodes/function/nodes/node_fn_separate_color.cc
+++ b/source/blender/nodes/function/nodes/node_fn_separate_color.cc
@@ -60,22 +60,41 @@ class SeparateRGBAFunction : public fn::MultiFunction {
   {
     const VArray<ColorGeometry4f> &colors = 
params.readonly_single_input<ColorGeometry4f>(0,
                                                                                
           "Color");
-    MutableSpan<float> red = params.uninitialized_single_output<float>(1, 
"Red");
-    MutableSpan<float> green = params.uninitialized_single_output<float>(2, 
"Green");
-    MutableSpan<float> blue = params.uninitialized_single_output<float>(3, 
"Blue");
+
+    MutableSpan<float> red = 
params.uninitialized_single_output_if_required<float>(1, "Red");
+    MutableSpan<float> green = 
params.uninitialized_single_output_if_required<float>(2, "Green");
+    MutableSpan<float> blue = 
params.uninitialized_single_output_if_required<float>(3, "Blue");
     MutableSpan<float> alpha = 
params.uninitialized_single_output_if_required<float>(4, "Alpha");
 
-    for (int64_t i : mask) {
-      red[i] = colors[i].r;
-      green[i] = colors[i].g;
-      blue[i] = colors[i].b;
+    std::array<MutableSpan<float>, 4> outputs = {red, green, blue, alpha};
+    Vector<int> used_outputs;
+    if (!red.is_empty()) {
+      used_outputs.append(0);
+    }
+    if (!green.is_empty()) {
+      used_outputs.append(1);
+    }
+    if (!blue.is_empty()) {
+      used_outputs.append(2);
     }
-
     if (!alpha.is_empty()) {
-      for (int64_t i : mask) {
-        alpha[i] = colors[i].a;
-      }
+      used_outputs.append(3);
     }
+
+    devirtualize_varray(colors, [&](auto colors) {
+      mask.to_best_mask_type([&](auto mask) {
+        const int used_outputs_num = used_outputs.size();
+        const int *used_outputs_data = used_outputs.data();
+
+        for (const int64_t i : mask) {
+          const ColorGeometry4f &color = colors[i];
+          for (const int out_i : IndexRange(used_outputs_num)) {
+            const int channel = used_outputs_data[out_i];
+            outputs[channel][i] = color[channel];
+          }
+        }
+      });
+    });
   }
 };

_______________________________________________
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