[Bf-blender-cvs] [5e4d36dbbe8] devirtualizer: avoid materializing single array many times

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


Commit: 5e4d36dbbe85b73cbcc94572407939d3d8914975
Author: Jacques Lucke
Date:   Sun Apr 10 15:25:55 2022 +0200
Branches: devirtualizer
https://developer.blender.org/rB5e4d36dbbe85b73cbcc94572407939d3d8914975

avoid materializing single array many times

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

M	source/blender/blenlib/BLI_virtual_array_devirtualize.hh

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

diff --git a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
index 2293b55b663..e883c0802aa 100644
--- a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
+++ b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
@@ -87,6 +87,21 @@ template<typename Fn, typename... Args> class ArrayDevirtualizer {
     std::tuple<MutableSpan<BaseType<TagsTuple, I>>...> buffers = {
         MutableSpan{std::get<I>(buffers_owner).ptr(), std::min(mask_size, MaxChunkSize)}...};
 
+    (
+        [&]() {
+          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);
+            if (varray_is_single_[I]) {
+              const VArray<T> *varray = std::get<I>(params_);
+              const T in_single = varray->get_internal_single();
+              in_chunk.fill(in_single);
+            }
+          }
+        }(),
+        ...);
+
     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);
@@ -96,9 +111,11 @@ template<typename Fn, typename... Args> class ArrayDevirtualizer {
             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);
+              if (!varray_is_single_[I]) {
+                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);
+              }
             }
           }(),
           ...);



More information about the Bf-blender-cvs mailing list