BLI: refactor IndexMask for better performance and memory usage #104629
|
@ -865,6 +865,7 @@ inline Vector<std::variant<IndexRange, IndexMaskSegment>, N> IndexMask::to_spans
|
|||
|
||||
namespace blender {
|
||||
using index_mask::IndexMask;
|
||||
using index_mask::IndexMaskFromSegment;
|
||||
using index_mask::IndexMaskMemory;
|
||||
using index_mask::IndexMaskSegment;
|
||||
} // namespace blender
|
||||
|
|
|
@ -497,9 +497,10 @@ class GVArrayImpl_For_SlicedGVArray : public GVArrayImpl {
|
|||
|
||||
void materialize_compressed_to_uninitialized(const IndexMask &mask, void *dst) const override
|
||||
{
|
||||
mask.foreach_range([&](const IndexRange range, const int64_t start) {
|
||||
const IndexRange offset_mask_range = range.shift(offset_);
|
||||
varray_.materialize_compressed_to_uninitialized(offset_mask_range,
|
||||
IndexMaskFromSegment mask_from_segment;
|
||||
mask.foreach_segment([&](const IndexMaskSegment segment, const int64_t start) {
|
||||
mask_from_segment.update({segment.offset() + offset_, segment.base_span()});
|
||||
varray_.materialize_compressed_to_uninitialized(mask_from_segment.mask,
|
||||
POINTER_OFFSET(dst, type_->size() * start));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -239,7 +239,7 @@ inline void execute_materialized(TypeSequence<ParamTags...> /* param_tags */,
|
|||
}(),
|
||||
...);
|
||||
|
||||
index_mask::IndexMaskFromSegment index_mask_from_segment;
|
||||
IndexMaskFromSegment index_mask_from_segment;
|
||||
const int64_t segment_offset = mask.offset();
|
||||
|
||||
/* Outer loop over all chunks. */
|
||||
|
|
Loading…
Reference in New Issue