[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