Cleanup: Unnecessary copies of VArray #118437

Merged
Hans Goudey merged 4 commits from mod_moder/blender:tmp_cleanup_varray_copys into main 2024-05-07 04:02:28 +02:00
6 changed files with 29 additions and 10 deletions

View File

@ -194,15 +194,21 @@ template<typename T> struct AttributeReader {
*/ */
const ImplicitSharingInfo *sharing_info; const ImplicitSharingInfo *sharing_info;
const VArray<T> &operator*() const const VArray<T> &operator*() const &
{ {
return this->varray; return this->varray;
} }
VArray<T> &operator*()
VArray<T> &operator*() &
{ {
return this->varray; return this->varray;
} }
VArray<T> operator*() &&
{
return std::move(this->varray);
}
operator bool() const operator bool() const
{ {
return this->varray; return this->varray;
@ -329,15 +335,21 @@ struct GAttributeReader {
return this->varray; return this->varray;
} }
const GVArray &operator*() const const GVArray &operator*() const &
{ {
return this->varray; return this->varray;
} }
GVArray &operator*()
GVArray &operator*() &
{ {
return this->varray; return this->varray;
} }
GVArray operator*() &&
{
return std::move(this->varray);
}
template<typename T> AttributeReader<T> typed() const template<typename T> AttributeReader<T> typed() const
{ {
return {varray.typed<T>(), domain, sharing_info}; return {varray.typed<T>(), domain, sharing_info};

View File

@ -254,7 +254,7 @@ static VArray<float> construct_curve_length_gvarray(const CurvesGeometry &curves
{ {
curves.ensure_evaluated_lengths(); curves.ensure_evaluated_lengths();
const VArray<bool> cyclic = curves.cyclic(); VArray<bool> cyclic = curves.cyclic();
VArray<float> lengths = VArray<float>::ForFunc( VArray<float> lengths = VArray<float>::ForFunc(
curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t index) { curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t index) {
return curves.evaluated_length_total_for_curve(index, cyclic[index]); return curves.evaluated_length_total_for_curve(index, cyclic[index]);

View File

@ -190,6 +190,7 @@ class GVArray : public GVArrayCommon {
GVArray(varray_tag::single /*tag*/, const CPPType &type, int64_t size, const void *value); GVArray(varray_tag::single /*tag*/, const CPPType &type, int64_t size, const void *value);
template<typename T> GVArray(const VArray<T> &varray); template<typename T> GVArray(const VArray<T> &varray);
template<typename T> GVArray(VArray<T> &&varray);
template<typename T> VArray<T> typed() const; template<typename T> VArray<T> typed() const;
template<typename ImplT, typename... Args> static GVArray For(Args &&...args); template<typename ImplT, typename... Args> static GVArray For(Args &&...args);
@ -870,7 +871,11 @@ template<typename ImplT, typename... Args> inline GVArray GVArray::For(Args &&..
return varray; return varray;
} }
template<typename T> inline GVArray::GVArray(const VArray<T> &varray) template<typename T> inline GVArray::GVArray(const VArray<T> &varray) : GVArray(VArray<T>(varray))
{
}
template<typename T> inline GVArray::GVArray(VArray<T> &&varray)
{ {
if (!varray) { if (!varray) {
return; return;
@ -889,7 +894,7 @@ template<typename T> inline GVArray::GVArray(const VArray<T> &varray)
if (varray.try_assign_GVArray(*this)) { if (varray.try_assign_GVArray(*this)) {
return; return;
} }
*this = GVArray::For<GVArrayImpl_For_VArray<T>>(varray); *this = GVArray::For<GVArrayImpl_For_VArray<T>>(std::move(varray));
} }
template<typename T> inline VArray<T> GVArray::typed() const template<typename T> inline VArray<T> GVArray::typed() const

View File

@ -1035,7 +1035,9 @@ template<typename T> class VArraySpan final : public Span<T> {
public: public:
VArraySpan() = default; VArraySpan() = default;
VArraySpan(VArray<T> varray) : Span<T>(), varray_(std::move(varray)) VArraySpan(const VArray<T> &varray) : VArraySpan(VArray<T>(varray)) {}
VArraySpan(VArray<T> &&varray) : Span<T>(), varray_(std::move(varray))
{ {
if (!varray_) { if (!varray_) {
return; return;

View File

@ -263,7 +263,7 @@ static void pointcloud_extract_position_and_radius(const PointCloud &pointcloud,
MutableSpan<float4> vbo_data{ MutableSpan<float4> vbo_data{
static_cast<float4 *>(GPU_vertbuf_get_data(cache.eval_cache.pos_rad)), pointcloud.totpoint}; static_cast<float4 *>(GPU_vertbuf_get_data(cache.eval_cache.pos_rad)), pointcloud.totpoint};
if (radii) { if (radii) {
const VArraySpan<float> radii_span(radii); const VArraySpan<float> radii_span(std::move(radii));
threading::parallel_for(vbo_data.index_range(), 4096, [&](IndexRange range) { threading::parallel_for(vbo_data.index_range(), 4096, [&](IndexRange range) {
for (const int i : range) { for (const int i : range) {
vbo_data[i].x = positions[i].x; vbo_data[i].x = positions[i].x;

View File

@ -824,7 +824,7 @@ static void gather_attributes_for_propagation(
const bke::GeometrySet &geometry_set, const bke::GeometrySet &geometry_set,
const Span<bke::GeometryComponent::Type> component_types, const Span<bke::GeometryComponent::Type> component_types,
const bke::GeometryComponent::Type dst_component_type, const bke::GeometryComponent::Type dst_component_type,
const VArray<int> instance_depth, const VArray<int> &instance_depth,
const IndexMask selection, const IndexMask selection,
const bke::AnonymousAttributePropagationInfo &propagation_info, const bke::AnonymousAttributePropagationInfo &propagation_info,
Map<AttributeIDRef, AttributeKind> &r_attributes) Map<AttributeIDRef, AttributeKind> &r_attributes)