Browse Source

New core object sync seems to work for the most part

BearishSun 10 years ago
parent
commit
157fe12618

+ 8 - 2
BansheeCore/Include/BsCoreObjectManager.h

@@ -23,14 +23,14 @@ namespace BansheeEngine
 		struct CoreStoredSyncObjData
 		{
 			CoreStoredSyncObjData()
-				:destinationObj(nullptr), internalId(0)
+				:internalId(0)
 			{ }
 
 			CoreStoredSyncObjData(const SPtr<CoreObjectCore> destObj, UINT64 internalId, const CoreSyncData& syncData)
 				:destinationObj(destObj), syncData(syncData), internalId(internalId)
 			{ }
 
-			SPtr<CoreObjectCore> destinationObj;
+			std::weak_ptr<CoreObjectCore> destinationObj;
 			CoreSyncData syncData;
 			UINT64 internalId;
 		};
@@ -101,6 +101,12 @@ namespace BansheeEngine
 		 */
 		void syncToCore(CoreObject* object, CoreAccessor& accessor);
 
+		/**
+		 * @brief	Clears any objects that are dirty and queued for sync on the core thread. Normally you
+		 * 			only want to call this during shutdown when you no longer care about any of that data.
+		 */
+		void clearDirty();
+
 	private:
 		/**
 		 * @brief	Stores all syncable data from dirty core objects into memory allocated

+ 10 - 0
BansheeCore/Include/BsMaterial.h

@@ -128,6 +128,11 @@ namespace BansheeEngine
 		 */
 		virtual void _markCoreDirty() { }
 
+		/**
+		 * @copydoc	CoreObject::markDependenciesDirty
+		 */
+		virtual void _markDependenciesDirty() { }
+
 		/**
 		 * @copydoc	IResourceListener::markResourcesDirty
 		 */
@@ -697,6 +702,11 @@ namespace BansheeEngine
 		 */
 		void _markCoreDirty() override;
 
+		/**
+		 * @copydoc	CoreObject::markDependenciesDirty
+		 */
+		void _markDependenciesDirty() override;
+
 		/**
 		 * @copydoc	IResourceListener::markResourcesDirty
 		 */

+ 1 - 0
BansheeCore/Source/BsCoreApplication.cpp

@@ -79,6 +79,7 @@ namespace BansheeEngine
 
 		// All CoreObject related modules should be shut down now. They have likely queued CoreObjects for destruction, so
 		// we need to wait for those objects to get destroyed before continuing.
+		CoreObjectManager::instance().clearDirty();
 		gCoreThread().update();
 		gCoreThread().submitAccessors(true);
 

+ 41 - 3
BansheeCore/Source/BsCoreObjectManager.cpp

@@ -38,6 +38,7 @@ namespace BansheeEngine
 		BS_LOCK_MUTEX(mObjectsMutex);
 
 		mObjects[mNextAvailableID] = object;
+		mDirtyObjects[mNextAvailableID] = { object, -1 };
 
 		return mNextAvailableID++;
 	}
@@ -64,6 +65,12 @@ namespace BansheeEngine
 				dirtyObjData.syncDataId = (INT32)mDestroyedSyncData.size() - 1;
 				dirtyObjData.object = nullptr;
 			}
+			else
+			{
+				DirtyObjectData& dirtyObjData = mDirtyObjects[internalId];
+				dirtyObjData.syncDataId = -1;
+				dirtyObjData.object = nullptr;
+			}
 		}
 
 		{
@@ -105,6 +112,9 @@ namespace BansheeEngine
 
 			// Add dependencies and clear old dependencies from dependants
 			{
+				if (dependencies != nullptr)
+					std::sort(dependencies->begin(), dependencies->end());
+
 				auto iterFind = mDependencies.find(id);
 				if (iterFind != mDependencies.end())
 				{
@@ -142,8 +152,11 @@ namespace BansheeEngine
 				}
 				else
 				{
-					for (auto& dependency : *dependencies)
-						toAdd.push_back(dependency);
+					if (dependencies != nullptr)
+					{
+						for (auto& dependency : *dependencies)
+							toAdd.push_back(dependency);
+					}
 				}
 
 				if (dependencies != nullptr)
@@ -343,7 +356,10 @@ namespace BansheeEngine
 		for (auto& iter = syncData.entries.begin(); iter != syncData.entries.end(); ++iter)
 		{
 			const CoreStoredSyncObjData& objSyncData = *iter;
-			objSyncData.destinationObj->syncToCore(objSyncData.syncData);
+
+			SPtr<CoreObjectCore> destinationObj = objSyncData.destinationObj.lock();
+			if (destinationObj != nullptr)
+				destinationObj->syncToCore(objSyncData.syncData);
 
 			UINT8* data = objSyncData.syncData.getBuffer();
 
@@ -354,4 +370,26 @@ namespace BansheeEngine
 		syncData.entries.clear();
 		mCoreSyncData.pop_front();
 	}
+
+	void CoreObjectManager::clearDirty()
+	{
+		BS_LOCK_MUTEX(mObjectsMutex);
+
+		FrameAlloc* allocator = gCoreThread().getFrameAlloc();
+		for (auto& objectData : mDirtyObjects)
+		{
+			if (objectData.second.syncDataId != -1)
+			{
+				CoreStoredSyncObjData& objSyncData = mDestroyedSyncData[objectData.second.syncDataId];
+
+				UINT8* data = objSyncData.syncData.getBuffer();
+
+				if (data != nullptr)
+					allocator->dealloc(data);
+			}
+		}
+
+		mDirtyObjects.clear();
+		mDestroyedSyncData.clear();
+	}
 }

+ 7 - 1
BansheeCore/Source/BsMaterial.cpp

@@ -753,6 +753,8 @@ namespace BansheeEngine
 			// Assign default parameters
 			initDefaultParameters();
 		}
+
+		_markDependenciesDirty();
 	}
 
 	template <bool Core>
@@ -1086,6 +1088,11 @@ namespace BansheeEngine
 		markCoreDirty();
 	}
 
+	void Material::_markDependenciesDirty()
+	{
+		markDependenciesDirty();
+	}
+
 	void Material::_markResourcesDirty()
 	{
 		markListenerResourcesDirty();
@@ -1228,7 +1235,6 @@ namespace BansheeEngine
 				mLoadFlags = Load_All;
 
 				initBestTechnique();
-				markDependenciesDirty();
 				markCoreDirty();
 			}
 		}

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

@@ -72,7 +72,7 @@ int CALLBACK WinMain(
 
 	__try
 	{
-		EditorApplication::startUp(RenderAPIPlugin::OpenGL);
+		EditorApplication::startUp(RenderAPIPlugin::DX11);
 		EditorApplication::instance().runMainLoop();
 		EditorApplication::shutDown();
 	}

+ 2 - 0
BansheeEngine/Source/BsApplication.cpp

@@ -15,6 +15,7 @@
 #include "BsPlainTextImporter.h"
 #include "BsImporter.h"
 #include "BsShortcutManager.h"
+#include "BsCoreObjectManager.h"
 #include "BsRendererMaterialManager.h"
 
 namespace BansheeEngine
@@ -45,6 +46,7 @@ namespace BansheeEngine
 	Application::~Application()
 	{
 		// Cleanup any new objects queued for destruction by unloaded scripts
+		CoreObjectManager::instance().clearDirty();
 		gCoreThread().update();
 		gCoreThread().submitAccessors(true);