[Bf-blender-cvs] [f7908bda064] devirtualizer: support execute materialized

Jacques Lucke noreply at git.blender.org
Sun Apr 10 16:00:28 CEST 2022


Commit: f7908bda064209fb9010a5d3622aa62b5b9f20ed
Author: Jacques Lucke
Date:   Sun Apr 10 15:17:57 2022 +0200
Branches: devirtualizer
https://developer.blender.org/rBf7908bda064209fb9010a5d3622aa62b5b9f20ed

support execute materialized

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

M	source/blender/blenlib/BLI_virtual_array_devirtualize.hh
M	source/blender/blenlib/tests/BLI_virtual_array_test.cc

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

diff --git a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
index 3164dcf459b..2293b55b663 100644
--- a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
+++ b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
@@ -37,6 +37,9 @@ struct DevirtualizeSpan {
 struct DevirtualizeSingle {
 };
 
+template<typename TagsTuple, size_t I>
+using BaseType = typename std::tuple_element_t<I, TagsTuple>::BaseType;
+
 template<typename Fn, typename... Args> class ArrayDevirtualizer {
  private:
   using TagsTuple = std::tuple<Args...>;
@@ -69,7 +72,63 @@ template<typename Fn, typename... Args> class ArrayDevirtualizer {
     return this->try_execute_devirtualized_impl();
   }
 
+  void execute_materialized()
+  {
+    BLI_assert(!executed_);
+    this->execute_materialized_impl(std::make_index_sequence<sizeof...(Args)>{});
+  }
+
  private:
+  template<size_t... I> void execute_materialized_impl(std::index_sequence<I...> /* indices */)
+  {
+    static constexpr int64_t MaxChunkSize = 32;
+    const int64_t mask_size = mask_.size();
+    std::tuple<TypedBuffer<BaseType<TagsTuple, I>, MaxChunkSize>...> buffers_owner;
+    std::tuple<MutableSpan<BaseType<TagsTuple, I>>...> buffers = {
+        MutableSpan{std::get<I>(buffers_owner).ptr(), std::min(mask_size, MaxChunkSize)}...};
+
+    for (int64_t chunk_start = 0; chunk_start < mask_size; chunk_start += MaxChunkSize) {
+      const int64_t chunk_size = std::min(mask_size - chunk_start, MaxChunkSize);
+      const IndexMask sliced_mask = mask_.slice(chunk_start, chunk_size);
+      const int64_t sliced_mask_size = sliced_mask.size();
+      (
+          [&]() {
+            using ParamTag = std::tuple_element_t<I, TagsTuple>;
+            using T = typename ParamTag::BaseType;
+            if constexpr (std::is_base_of_v<SingleInputTagBase, ParamTag>) {
+              MutableSpan in_chunk = std::get<I>(buffers).take_front(sliced_mask_size);
+              const VArray<T> *varray = std::get<I>(params_);
+              varray->materialize_compressed_to_uninitialized(sliced_mask, in_chunk);
+            }
+          }(),
+          ...);
+
+      fn_(IndexRange(sliced_mask_size), sliced_mask, [&]() {
+        using ParamTag = std::tuple_element_t<I, TagsTuple>;
+        using T = typename ParamTag::BaseType;
+        if constexpr (std::is_base_of_v<SingleInputTagBase, ParamTag>) {
+          MutableSpan<T> in_chunk = std::get<I>(buffers).take_front(sliced_mask_size);
+          return in_chunk;
+        }
+        else if constexpr (std::is_base_of_v<SingleOutputTagBase, ParamTag>) {
+          MutableSpan<T> out_span = *std::get<I>(params_);
+          return out_span.data();
+        }
+      }()...);
+
+      (
+          [&]() {
+            using ParamTag = std::tuple_element_t<I, TagsTuple>;
+            using T = typename ParamTag::BaseType;
+            if constexpr (std::is_base_of_v<SingleInputTagBase, ParamTag>) {
+              MutableSpan<T> in_chunk = std::get<I>(buffers);
+              destruct_n(in_chunk.data(), sliced_mask_size);
+            }
+          }(),
+          ...);
+    }
+  }
+
   template<typename... Mode> bool try_execute_devirtualized_impl()
   {
     if constexpr (sizeof...(Mode) == sizeof...(Args)) {
diff --git a/source/blender/blenlib/tests/BLI_virtual_array_test.cc b/source/blender/blenlib/tests/BLI_virtual_array_test.cc
index 95222e72bb0..a1d43c89cdf 100644
--- a/source/blender/blenlib/tests/BLI_virtual_array_test.cc
+++ b/source/blender/blenlib/tests/BLI_virtual_array_test.cc
@@ -256,7 +256,7 @@ TEST(virtual_array, Devirtualize)
       devirtualizer{fn, &mask, &in1, &in2, &out1};
 
   if (!devirtualizer.try_execute_devirtualized()) {
-    devirtualizer.execute_fallback();
+    devirtualizer.execute_materialized();
   }
 
   EXPECT_EQ(out1[0], 8);



More information about the Bf-blender-cvs mailing list