Variant large bucket memory pool - for Projection
Add a larger bucket size pool for the new Projection Matrix.
This commit is contained in:
parent
0f9e84feab
commit
bb273bc972
@ -40,6 +40,7 @@
|
|||||||
#include "core/variant/variant_parser.h"
|
#include "core/variant/variant_parser.h"
|
||||||
|
|
||||||
PagedAllocator<Variant::Pools::BucketSmall, true> Variant::Pools::_bucket_small;
|
PagedAllocator<Variant::Pools::BucketSmall, true> Variant::Pools::_bucket_small;
|
||||||
|
PagedAllocator<Variant::Pools::BucketMedium, true> Variant::Pools::_bucket_medium;
|
||||||
PagedAllocator<Variant::Pools::BucketLarge, true> Variant::Pools::_bucket_large;
|
PagedAllocator<Variant::Pools::BucketLarge, true> Variant::Pools::_bucket_large;
|
||||||
|
|
||||||
String Variant::get_type_name(Variant::Type p_type) {
|
String Variant::get_type_name(Variant::Type p_type) {
|
||||||
@ -1191,15 +1192,16 @@ void Variant::reference(const Variant &p_variant) {
|
|||||||
memnew_placement(_data._mem, Quaternion(*reinterpret_cast<const Quaternion *>(p_variant._data._mem)));
|
memnew_placement(_data._mem, Quaternion(*reinterpret_cast<const Quaternion *>(p_variant._data._mem)));
|
||||||
} break;
|
} break;
|
||||||
case BASIS: {
|
case BASIS: {
|
||||||
_data._basis = (Basis *)Pools::_bucket_large.alloc();
|
_data._basis = (Basis *)Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(_data._basis, Basis(*p_variant._data._basis));
|
memnew_placement(_data._basis, Basis(*p_variant._data._basis));
|
||||||
} break;
|
} break;
|
||||||
case TRANSFORM3D: {
|
case TRANSFORM3D: {
|
||||||
_data._transform3d = (Transform3D *)Pools::_bucket_large.alloc();
|
_data._transform3d = (Transform3D *)Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(_data._transform3d, Transform3D(*p_variant._data._transform3d));
|
memnew_placement(_data._transform3d, Transform3D(*p_variant._data._transform3d));
|
||||||
} break;
|
} break;
|
||||||
case PROJECTION: {
|
case PROJECTION: {
|
||||||
_data._projection = memnew(Projection(*p_variant._data._projection));
|
_data._projection = (Projection *)Pools::_bucket_large.alloc();
|
||||||
|
memnew_placement(_data._projection, Projection(*p_variant._data._projection));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
// misc types
|
// misc types
|
||||||
@ -1401,19 +1403,23 @@ void Variant::_clear_internal() {
|
|||||||
case BASIS: {
|
case BASIS: {
|
||||||
if (_data._basis) {
|
if (_data._basis) {
|
||||||
_data._basis->~Basis();
|
_data._basis->~Basis();
|
||||||
Pools::_bucket_large.free((Pools::BucketLarge *)_data._basis);
|
Pools::_bucket_medium.free((Pools::BucketMedium *)_data._basis);
|
||||||
_data._basis = nullptr;
|
_data._basis = nullptr;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case TRANSFORM3D: {
|
case TRANSFORM3D: {
|
||||||
if (_data._transform3d) {
|
if (_data._transform3d) {
|
||||||
_data._transform3d->~Transform3D();
|
_data._transform3d->~Transform3D();
|
||||||
Pools::_bucket_large.free((Pools::BucketLarge *)_data._transform3d);
|
Pools::_bucket_medium.free((Pools::BucketMedium *)_data._transform3d);
|
||||||
_data._transform3d = nullptr;
|
_data._transform3d = nullptr;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case PROJECTION: {
|
case PROJECTION: {
|
||||||
memdelete(_data._projection);
|
if (_data._projection) {
|
||||||
|
_data._projection->~Projection();
|
||||||
|
Pools::_bucket_large.free((Pools::BucketLarge *)_data._projection);
|
||||||
|
_data._projection = nullptr;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// misc types
|
// misc types
|
||||||
case STRING_NAME: {
|
case STRING_NAME: {
|
||||||
@ -2635,7 +2641,7 @@ Variant::Variant(const ::AABB &p_aabb) {
|
|||||||
|
|
||||||
Variant::Variant(const Basis &p_matrix) {
|
Variant::Variant(const Basis &p_matrix) {
|
||||||
type = BASIS;
|
type = BASIS;
|
||||||
_data._basis = (Basis *)Pools::_bucket_large.alloc();
|
_data._basis = (Basis *)Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(_data._basis, Basis(p_matrix));
|
memnew_placement(_data._basis, Basis(p_matrix));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2646,13 +2652,14 @@ Variant::Variant(const Quaternion &p_quaternion) {
|
|||||||
|
|
||||||
Variant::Variant(const Transform3D &p_transform) {
|
Variant::Variant(const Transform3D &p_transform) {
|
||||||
type = TRANSFORM3D;
|
type = TRANSFORM3D;
|
||||||
_data._transform3d = (Transform3D *)Pools::_bucket_large.alloc();
|
_data._transform3d = (Transform3D *)Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(_data._transform3d, Transform3D(p_transform));
|
memnew_placement(_data._transform3d, Transform3D(p_transform));
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant::Variant(const Projection &pp_projection) {
|
Variant::Variant(const Projection &pp_projection) {
|
||||||
type = PROJECTION;
|
type = PROJECTION;
|
||||||
_data._projection = memnew(Projection(pp_projection));
|
_data._projection = (Projection *)Pools::_bucket_large.alloc();
|
||||||
|
memnew_placement(_data._projection, Projection(pp_projection));
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant::Variant(const Transform2D &p_transform) {
|
Variant::Variant(const Transform2D &p_transform) {
|
||||||
|
@ -142,14 +142,20 @@ private:
|
|||||||
Transform2D _transform2d;
|
Transform2D _transform2d;
|
||||||
::AABB _aabb;
|
::AABB _aabb;
|
||||||
};
|
};
|
||||||
union BucketLarge {
|
union BucketMedium {
|
||||||
BucketLarge() {}
|
BucketMedium() {}
|
||||||
~BucketLarge() {}
|
~BucketMedium() {}
|
||||||
Basis _basis;
|
Basis _basis;
|
||||||
Transform3D _transform3d;
|
Transform3D _transform3d;
|
||||||
};
|
};
|
||||||
|
union BucketLarge {
|
||||||
|
BucketLarge() {}
|
||||||
|
~BucketLarge() {}
|
||||||
|
Projection _projection;
|
||||||
|
};
|
||||||
|
|
||||||
static PagedAllocator<BucketSmall, true> _bucket_small;
|
static PagedAllocator<BucketSmall, true> _bucket_small;
|
||||||
|
static PagedAllocator<BucketMedium, true> _bucket_medium;
|
||||||
static PagedAllocator<BucketLarge, true> _bucket_large;
|
static PagedAllocator<BucketLarge, true> _bucket_large;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -227,17 +227,18 @@ public:
|
|||||||
v->type = Variant::AABB;
|
v->type = Variant::AABB;
|
||||||
}
|
}
|
||||||
_FORCE_INLINE_ static void init_basis(Variant *v) {
|
_FORCE_INLINE_ static void init_basis(Variant *v) {
|
||||||
v->_data._basis = (Basis *)Variant::Pools::_bucket_large.alloc();
|
v->_data._basis = (Basis *)Variant::Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(v->_data._basis, Basis);
|
memnew_placement(v->_data._basis, Basis);
|
||||||
v->type = Variant::BASIS;
|
v->type = Variant::BASIS;
|
||||||
}
|
}
|
||||||
_FORCE_INLINE_ static void init_transform(Variant *v) {
|
_FORCE_INLINE_ static void init_transform(Variant *v) {
|
||||||
v->_data._transform3d = (Transform3D *)Variant::Pools::_bucket_large.alloc();
|
v->_data._transform3d = (Transform3D *)Variant::Pools::_bucket_medium.alloc();
|
||||||
memnew_placement(v->_data._transform3d, Transform3D);
|
memnew_placement(v->_data._transform3d, Transform3D);
|
||||||
v->type = Variant::TRANSFORM3D;
|
v->type = Variant::TRANSFORM3D;
|
||||||
}
|
}
|
||||||
_FORCE_INLINE_ static void init_projection(Variant *v) {
|
_FORCE_INLINE_ static void init_projection(Variant *v) {
|
||||||
v->_data._projection = memnew(Projection);
|
v->_data._projection = (Projection *)Variant::Pools::_bucket_large.alloc();
|
||||||
|
memnew_placement(v->_data._projection, Projection);
|
||||||
v->type = Variant::PROJECTION;
|
v->type = Variant::PROJECTION;
|
||||||
}
|
}
|
||||||
_FORCE_INLINE_ static void init_string_name(Variant *v) {
|
_FORCE_INLINE_ static void init_string_name(Variant *v) {
|
||||||
|
Loading…
Reference in New Issue
Block a user