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 VArray<T> &operator*() const
const VArray<T> &operator*() const &
{
return this->varray;
}
VArray<T> &operator*()
VArray<T> &operator*() &
{
return this->varray;
}
VArray<T> operator*() &&
{
return std::move(this->varray);
}
operator bool() const
{
return this->varray;
@ -329,15 +335,21 @@ struct GAttributeReader {
return this->varray;
}
const GVArray &operator*() const
const GVArray &operator*() const &
{
return this->varray;
}
GVArray &operator*()
GVArray &operator*() &
{
return this->varray;
}
GVArray operator*() &&
{
return std::move(this->varray);
}
template<typename T> AttributeReader<T> typed() const
{
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();
const VArray<bool> cyclic = curves.cyclic();
VArray<bool> cyclic = curves.cyclic();
VArray<float> lengths = VArray<float>::ForFunc(
curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t 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);
template<typename T> GVArray(const VArray<T> &varray);
template<typename T> GVArray(VArray<T> &&varray);
template<typename T> VArray<T> typed() const;
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;
}
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) {
return;
@ -889,7 +894,7 @@ template<typename T> inline GVArray::GVArray(const VArray<T> &varray)
if (varray.try_assign_GVArray(*this)) {
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

View File

@ -1035,7 +1035,9 @@ template<typename T> class VArraySpan final : public Span<T> {
public:
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_) {
return;

View File

@ -263,7 +263,7 @@ static void pointcloud_extract_position_and_radius(const PointCloud &pointcloud,
MutableSpan<float4> vbo_data{
static_cast<float4 *>(GPU_vertbuf_get_data(cache.eval_cache.pos_rad)), pointcloud.totpoint};
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) {
for (const int i : range) {
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 Span<bke::GeometryComponent::Type> component_types,
const bke::GeometryComponent::Type dst_component_type,
const VArray<int> instance_depth,
const VArray<int> &instance_depth,
const IndexMask selection,
const bke::AnonymousAttributePropagationInfo &propagation_info,
Map<AttributeIDRef, AttributeKind> &r_attributes)