Browse Source

Remove the allocator from the physics

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
168a177fbd

+ 3 - 3
AnKi/Physics/PhysicsObject.cpp

@@ -21,14 +21,14 @@ PhysicsFilteredObject::~PhysicsFilteredObject()
 
 
 		if(pair->shouldDelete())
 		if(pair->shouldDelete())
 		{
 		{
-			getAllocator().deleteInstance(pair);
+			deleteInstance(getMemoryPool(), pair);
 		}
 		}
 	}
 	}
 }
 }
 
 
-HeapAllocator<U8> PhysicsObject::getAllocator() const
+HeapMemoryPool& PhysicsObject::getMemoryPool()
 {
 {
-	return m_world->getAllocator();
+	return m_world->getMemoryPool();
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 1 - 1
AnKi/Physics/PhysicsObject.h

@@ -99,7 +99,7 @@ protected:
 		return m_refcount.fetchSub(1);
 		return m_refcount.fetchSub(1);
 	}
 	}
 
 
-	HeapAllocator<U8> getAllocator() const;
+	HeapMemoryPool& getMemoryPool();
 
 
 private:
 private:
 	Bool m_registered = false;
 	Bool m_registered = false;

+ 6 - 6
AnKi/Physics/PhysicsTrigger.cpp

@@ -38,11 +38,11 @@ PhysicsTrigger::~PhysicsTrigger()
 
 
 		if(pair->shouldDelete())
 		if(pair->shouldDelete())
 		{
 		{
-			getAllocator().deleteInstance(pair);
+			deleteInstance(getMemoryPool(), pair);
 		}
 		}
 	}
 	}
 
 
-	m_pairs.destroy(getAllocator());
+	m_pairs.destroy(getMemoryPool());
 
 
 	m_ghostShape.destroy();
 	m_ghostShape.destroy();
 }
 }
@@ -63,12 +63,12 @@ void PhysicsTrigger::processContacts()
 
 
 	if(m_contactCallback == nullptr)
 	if(m_contactCallback == nullptr)
 	{
 	{
-		m_pairs.destroy(getAllocator());
+		m_pairs.destroy(getMemoryPool());
 		return;
 		return;
 	}
 	}
 
 
 	// Gather the new pairs
 	// Gather the new pairs
-	DynamicArrayRaii<PhysicsTriggerFilteredPair*> newPairs(getWorld().getTempAllocator());
+	DynamicArrayRaii<PhysicsTriggerFilteredPair*> newPairs(&getWorld().getTempMemoryPool());
 	newPairs.resizeStorage(m_ghostShape->getOverlappingPairs().size());
 	newPairs.resizeStorage(m_ghostShape->getOverlappingPairs().size());
 	for(U32 i = 0; i < U32(m_ghostShape->getOverlappingPairs().size()); ++i)
 	for(U32 i = 0; i < U32(m_ghostShape->getOverlappingPairs().size()); ++i)
 	{
 	{
@@ -107,7 +107,7 @@ void PhysicsTrigger::processContacts()
 		if(pair->m_filteredObject == nullptr)
 		if(pair->m_filteredObject == nullptr)
 		{
 		{
 			// Filtered object died while inside the tigger, destroy the pair
 			// Filtered object died while inside the tigger, destroy the pair
-			getAllocator().deleteInstance(pair);
+			deleteInstance(getMemoryPool(), pair);
 		}
 		}
 		else if(pair->m_frame == m_processContactsFrame)
 		else if(pair->m_frame == m_processContactsFrame)
 		{
 		{
@@ -124,7 +124,7 @@ void PhysicsTrigger::processContacts()
 	}
 	}
 
 
 	// Store the new contacts
 	// Store the new contacts
-	m_pairs.resize(getAllocator(), newPairs.getSize());
+	m_pairs.resize(getMemoryPool(), newPairs.getSize());
 	if(m_pairs.getSize())
 	if(m_pairs.getSize())
 	{
 	{
 		memcpy(&m_pairs[0], &newPairs[0], m_pairs.getSizeInBytes());
 		memcpy(&m_pairs[0], &newPairs[0], m_pairs.getSizeInBytes());

+ 14 - 14
AnKi/Physics/PhysicsWorld.cpp

@@ -14,18 +14,18 @@
 namespace anki {
 namespace anki {
 
 
 // Ugly but there is no other way
 // Ugly but there is no other way
-static HeapAllocator<U8>* g_alloc = nullptr;
+static HeapMemoryPool* g_pool = nullptr;
 
 
 static void* btAlloc(size_t size)
 static void* btAlloc(size_t size)
 {
 {
-	ANKI_ASSERT(g_alloc);
-	return g_alloc->getMemoryPool().allocate(size, 16);
+	ANKI_ASSERT(g_pool);
+	return g_pool->allocate(size, 16);
 }
 }
 
 
 static void btFree(void* ptr)
 static void btFree(void* ptr)
 {
 {
-	ANKI_ASSERT(g_alloc);
-	g_alloc->getMemoryPool().free(ptr);
+	ANKI_ASSERT(g_pool);
+	g_pool->free(ptr);
 }
 }
 
 
 /// Broad phase collision callback.
 /// Broad phase collision callback.
@@ -155,25 +155,25 @@ PhysicsWorld::~PhysicsWorld()
 	m_collisionConfig.destroy();
 	m_collisionConfig.destroy();
 	m_broadphase.destroy();
 	m_broadphase.destroy();
 	m_gpc.destroy();
 	m_gpc.destroy();
-	m_alloc.deleteInstance(m_filterCallback);
+	deleteInstance(m_pool, m_filterCallback);
 
 
-	g_alloc = nullptr;
+	g_pool = nullptr;
 }
 }
 
 
 Error PhysicsWorld::init(AllocAlignedCallback allocCb, void* allocCbData)
 Error PhysicsWorld::init(AllocAlignedCallback allocCb, void* allocCbData)
 {
 {
-	m_alloc = HeapAllocator<U8>(allocCb, allocCbData);
-	m_tmpAlloc = StackAllocator<U8>(allocCb, allocCbData, 1_KB, 2.0f);
+	m_pool.init(allocCb, allocCbData);
+	m_tmpPool.init(allocCb, allocCbData, 1_KB, 2.0f);
 
 
 	// Set allocators
 	// Set allocators
-	g_alloc = &m_alloc;
+	g_pool = &m_pool;
 	btAlignedAllocSetCustom(btAlloc, btFree);
 	btAlignedAllocSetCustom(btAlloc, btFree);
 
 
 	// Create objects
 	// Create objects
 	m_broadphase.init();
 	m_broadphase.init();
 	m_gpc.init();
 	m_gpc.init();
 	m_broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(m_gpc.get());
 	m_broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(m_gpc.get());
-	m_filterCallback = m_alloc.newInstance<MyOverlapFilterCallback>();
+	m_filterCallback = anki::newInstance<MyOverlapFilterCallback>(m_pool);
 	m_broadphase->getOverlappingPairCache()->setOverlapFilterCallback(m_filterCallback);
 	m_broadphase->getOverlappingPairCache()->setOverlapFilterCallback(m_filterCallback);
 
 
 	m_collisionConfig.init();
 	m_collisionConfig.init();
@@ -214,7 +214,7 @@ void PhysicsWorld::destroyMarkedForDeletion()
 			break;
 			break;
 		}
 		}
 
 
-		m_alloc.deleteInstance(obj);
+		deleteInstance(m_pool, obj);
 #if ANKI_ENABLE_ASSERTIONS
 #if ANKI_ENABLE_ASSERTIONS
 		const I32 count = m_objectsCreatedCount.fetchSub(1) - 1;
 		const I32 count = m_objectsCreatedCount.fetchSub(1) - 1;
 		ANKI_ASSERT(count >= 0);
 		ANKI_ASSERT(count >= 0);
@@ -259,7 +259,7 @@ void PhysicsWorld::update(Second dt)
 	}
 	}
 
 
 	// Reset the pool
 	// Reset the pool
-	m_tmpAlloc.getMemoryPool().reset();
+	m_tmpPool.reset();
 }
 }
 
 
 void PhysicsWorld::destroyObject(PhysicsObject* obj)
 void PhysicsWorld::destroyObject(PhysicsObject* obj)
@@ -330,7 +330,7 @@ PhysicsTriggerFilteredPair* PhysicsWorld::getOrCreatePhysicsTriggerFilteredPair(
 	PhysicsTriggerFilteredPair* newPair;
 	PhysicsTriggerFilteredPair* newPair;
 	if(filtered->m_triggerFilteredPairs[emptySlot] == nullptr)
 	if(filtered->m_triggerFilteredPairs[emptySlot] == nullptr)
 	{
 	{
-		filtered->m_triggerFilteredPairs[emptySlot] = m_alloc.newInstance<PhysicsTriggerFilteredPair>();
+		filtered->m_triggerFilteredPairs[emptySlot] = anki::newInstance<PhysicsTriggerFilteredPair>(m_pool);
 	}
 	}
 	newPair = filtered->m_triggerFilteredPairs[emptySlot];
 	newPair = filtered->m_triggerFilteredPairs[emptySlot];
 
 

+ 8 - 18
AnKi/Physics/PhysicsWorld.h

@@ -48,8 +48,8 @@ public:
 	template<typename T, typename... TArgs>
 	template<typename T, typename... TArgs>
 	PhysicsPtr<T> newInstance(TArgs&&... args)
 	PhysicsPtr<T> newInstance(TArgs&&... args)
 	{
 	{
-		T* obj = static_cast<T*>(m_alloc.getMemoryPool().allocate(sizeof(T), alignof(T)));
-		::new(obj) T(this, std::forward<TArgs>(args)...);
+		T* obj = static_cast<T*>(m_pool.allocate(sizeof(T), alignof(T)));
+		callConstructor(&obj, this, std::forward<TArgs>(args)...);
 		{
 		{
 			LockGuard<Mutex> lock(m_markedMtx);
 			LockGuard<Mutex> lock(m_markedMtx);
 			m_markedForCreation.pushBack(obj);
 			m_markedForCreation.pushBack(obj);
@@ -64,24 +64,14 @@ public:
 	/// Do the update.
 	/// Do the update.
 	void update(Second dt);
 	void update(Second dt);
 
 
-	HeapAllocator<U8> getAllocator() const
+	HeapMemoryPool& getMemoryPool()
 	{
 	{
-		return m_alloc;
+		return m_pool;
 	}
 	}
 
 
-	HeapAllocator<U8>& getAllocator()
+	StackMemoryPool& getTempMemoryPool()
 	{
 	{
-		return m_alloc;
-	}
-
-	StackAllocator<U8> getTempAllocator() const
-	{
-		return m_tmpAlloc;
-	}
-
-	StackAllocator<U8>& getTempAllocator()
-	{
-		return m_tmpAlloc;
+		return m_tmpPool;
 	}
 	}
 
 
 	void rayCast(WeakArray<PhysicsWorldRayCastCallback*> rayCasts) const;
 	void rayCast(WeakArray<PhysicsWorldRayCastCallback*> rayCasts) const;
@@ -117,8 +107,8 @@ private:
 	class MyOverlapFilterCallback;
 	class MyOverlapFilterCallback;
 	class MyRaycastCallback;
 	class MyRaycastCallback;
 
 
-	HeapAllocator<U8> m_alloc;
-	StackAllocator<U8> m_tmpAlloc;
+	HeapMemoryPool m_pool;
+	StackMemoryPool m_tmpPool;
 
 
 	ClassWrapper<btDbvtBroadphase> m_broadphase;
 	ClassWrapper<btDbvtBroadphase> m_broadphase;
 	ClassWrapper<btGhostPairCallback> m_gpc;
 	ClassWrapper<btGhostPairCallback> m_gpc;