[Bf-blender-cvs] [670537ed8ac] functions: initial tuple call array execution

Jacques Lucke noreply at git.blender.org
Wed Jul 31 16:20:52 CEST 2019


Commit: 670537ed8ac9b93d6789877a2a5bd998abc1df0f
Author: Jacques Lucke
Date:   Wed Jul 31 11:23:13 2019 +0200
Branches: functions
https://developer.blender.org/rB670537ed8ac9b93d6789877a2a5bd998abc1df0f

initial tuple call array execution

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_functions.hpp
A	source/blender/functions/functions/array_execution.cpp
A	source/blender/functions/functions/array_execution.hpp
M	source/blender/simulations/bparticles/particle_function.cpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 2378765dfc1..4686e1821c6 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -128,6 +128,8 @@ set(SRC
   functions/switch.cpp
   functions/auto_vectorization.hpp
   functions/auto_vectorization.cpp
+  functions/array_execution.hpp
+  functions/array_execution.cpp
   functions/ranges.hpp
   functions/ranges.cpp
   functions/comparisons.hpp
diff --git a/source/blender/functions/FN_functions.hpp b/source/blender/functions/FN_functions.hpp
index 35c5cce64e8..d0e55721d89 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -12,3 +12,4 @@
 #include "functions/comparisons.hpp"
 #include "functions/constants.hpp"
 #include "functions/color.hpp"
+#include "functions/array_execution.hpp"
diff --git a/source/blender/functions/functions/array_execution.cpp b/source/blender/functions/functions/array_execution.cpp
new file mode 100644
index 00000000000..8495447a3a9
--- /dev/null
+++ b/source/blender/functions/functions/array_execution.cpp
@@ -0,0 +1,50 @@
+#include "FN_tuple_call.hpp"
+
+#include "array_execution.hpp"
+
+namespace FN {
+namespace Functions {
+
+TupleCallArrayExecution::TupleCallArrayExecution(SharedFunction function)
+    : m_function(std::move(function))
+{
+  BLI_assert(m_function->has_body<TupleCallBody>());
+  for (SharedType &type : m_function->input_types()) {
+    m_input_sizes.append(type->extension<CPPTypeInfo>().size());
+  }
+  for (SharedType &type : m_function->output_types()) {
+    m_output_sizes.append(type->extension<CPPTypeInfo>().size());
+  }
+}
+
+void TupleCallArrayExecution::call(ArrayRef<uint> indices,
+                                   ArrayRef<void *> input_buffers,
+                                   ArrayRef<void *> output_buffers,
+                                   ExecutionContext &execution_context)
+{
+  uint input_amount = m_function->input_amount();
+  uint output_amount = m_function->output_amount();
+
+  BLI_assert(input_amount == input_buffers.size());
+  BLI_assert(output_amount == output_buffers.size());
+
+  TupleCallBody &body = m_function->body<TupleCallBody>();
+  FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+
+  for (uint index : indices) {
+    for (uint i = 0; i < input_amount; i++) {
+      void *ptr = POINTER_OFFSET(input_buffers[i], index * m_input_sizes[i]);
+      fn_in.copy_in__dynamic(i, ptr);
+    }
+
+    body.call(fn_in, fn_out, execution_context);
+
+    for (uint i = 0; i < output_amount; i++) {
+      void *ptr = POINTER_OFFSET(output_buffers[i], index * m_output_sizes[i]);
+      fn_out.relocate_out__dynamic(i, ptr);
+    }
+  }
+}
+
+}  // namespace Functions
+}  // namespace FN
diff --git a/source/blender/functions/functions/array_execution.hpp b/source/blender/functions/functions/array_execution.hpp
new file mode 100644
index 00000000000..2d8e310cbee
--- /dev/null
+++ b/source/blender/functions/functions/array_execution.hpp
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "FN_core.hpp"
+#include "FN_tuple_call.hpp"
+
+namespace FN {
+namespace Functions {
+
+class TupleCallArrayExecution {
+ private:
+  SharedFunction m_function;
+  Vector<uint> m_input_sizes;
+  Vector<uint> m_output_sizes;
+
+ public:
+  TupleCallArrayExecution(SharedFunction function);
+
+  void call(ArrayRef<uint> indices,
+            ArrayRef<void *> input_buffers,
+            ArrayRef<void *> output_buffers,
+            ExecutionContext &execution_context);
+};
+
+}  // namespace Functions
+}  // namespace FN
diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index 7fe1767202b..35598fd2b8e 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -1,3 +1,5 @@
+#include "FN_functions.hpp"
+
 #include "particle_function.hpp"
 
 namespace BParticles {
@@ -141,10 +143,9 @@ void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
   }
 
   uint parameter_amount = m_parameter_depends_on_particle.size();
-  TupleCallBody &body = m_fn_with_deps->body<TupleCallBody>();
 
   Vector<void *> input_buffers;
-  Vector<uint> input_strides;
+  Vector<uint> input_sizes;
   Vector<uint> inputs_to_free;
 
   for (uint i = 0; i < m_fn_with_deps->input_amount(); i++) {
@@ -155,14 +156,14 @@ void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
     BLI_assert(array.stride > 0);
 
     input_buffers.append(array.buffer);
-    input_strides.append(array.stride);
+    input_sizes.append(array.stride);
     if (array.is_newly_allocated) {
       inputs_to_free.append(i);
     }
   }
 
   Vector<void *> output_buffers;
-  Vector<uint> output_strides;
+  Vector<uint> output_sizes;
 
   for (uint parameter_index = 0; parameter_index < parameter_amount; parameter_index++) {
     if (!m_parameter_depends_on_particle[parameter_index]) {
@@ -180,31 +181,18 @@ void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
     result->m_only_first[parameter_index] = false;
 
     output_buffers.append(output_buffer);
-    output_strides.append(output_stride);
+    output_sizes.append(output_stride);
   }
 
   ExecutionStack stack;
   ExecutionContext execution_context(stack);
 
-  FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
-
-  for (uint pindex : particles.pindices()) {
-    for (uint i = 0; i < input_buffers.size(); i++) {
-      void *ptr = POINTER_OFFSET(input_buffers[i], pindex * input_strides[i]);
-      fn_in.copy_in__dynamic(i, ptr);
-    }
-
-    body.call(fn_in, fn_out, execution_context);
-
-    for (uint i = 0; i < output_buffers.size(); i++) {
-      void *ptr = POINTER_OFFSET(output_buffers[i], pindex * output_strides[i]);
-      fn_out.relocate_out__dynamic(i, ptr);
-    }
-  }
+  FN::Functions::TupleCallArrayExecution array_execution(m_fn_with_deps);
+  array_execution.call(particles.pindices(), input_buffers, output_buffers, execution_context);
 
   for (uint i : inputs_to_free) {
     void *buffer = input_buffers[i];
-    uint stride = input_strides[i];
+    uint stride = input_sizes[i];
     array_allocator.deallocate(buffer, stride);
   }
 }



More information about the Bf-blender-cvs mailing list