فهرست منبع

WIP: Linux port
- Fixing Mono initialization

Marko Pintera 8 سال پیش
والد
کامیت
0cd8d0e66c

+ 1 - 1
Source/BansheeCore/RenderAPI/BsGpuPipelineParamInfo.cpp

@@ -211,7 +211,7 @@ namespace bs
 			// Allow sampler states & textures/buffers to share the same slot, as some APIs combine them
 			if(type == ParamType::SamplerState)
 			{
-				if (mSetInfos[set].slotSamplers[slot] != -1)
+				if (mSetInfos[set].slotSamplers[slot] != (UINT32)-1)
 					return mSetInfos[set].slotSamplers[slot];
 			}
 

+ 1 - 1
Source/BansheeGLRenderAPI/GLSL/BsGLSLParamParser.cpp

@@ -609,7 +609,7 @@ namespace bs { namespace ct
 			assert(blockSize % 4 == 0);
 			blockSize = blockSize / 4;
 
-			if (iter->second.blockSize != blockSize)
+			if ((INT32)iter->second.blockSize != blockSize)
 				BS_EXCEPT(InternalErrorException, "OpenGL specified and manual uniform block buffer sizes don't match!");
 
 			blockIdx++;

+ 12 - 1
Source/BansheeMono/BsMonoAssembly.cpp

@@ -267,6 +267,10 @@ namespace bs
 		mCachedClassList.clear();
 		Stack<MonoClass*> todo;
 
+		MonoAssembly* corlib = MonoManager::instance().getAssembly("corlib");
+		MonoClass* compilerGeneratedAttrib = corlib->getClass("System.Runtime.CompilerServices",
+				"CompilerGeneratedAttribute");
+
 		int numRows = mono_image_get_table_rows (mMonoImage, MONO_TABLE_TYPEDEF);
 
 		for(int i = 1; i < numRows; i++) // Skip Module
@@ -278,9 +282,12 @@ namespace bs
 			MonoUtil::getClassName(monoClass, ns, type);
 
 			MonoClass* curClass = getClass(ns, type);
-
 			if (curClass != nullptr)
 			{
+				// Skip compiler generates classes
+				if(curClass->hasAttribute(compilerGeneratedAttrib))
+					continue;
+
 				// Get nested types if it has any
 				todo.push(curClass);
 				while (!todo.empty())
@@ -300,6 +307,10 @@ namespace bs
 						MonoClass* nestedClass = getClass(ns, nestedType, rawNestedClass);
 						if (nestedClass != nullptr)
 						{
+							// Skip compiler generated classes
+							if(nestedClass->hasAttribute(compilerGeneratedAttrib))
+								continue;
+
 							mCachedClassList.push_back(nestedClass);
 							todo.push(nestedClass);
 						}

+ 3 - 2
Source/BansheeMono/BsMonoClass.cpp

@@ -318,10 +318,11 @@ namespace bs
 		if(attrInfo == nullptr)
 			return nullptr;
 
-		MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
+		MonoObject* foundAttr = nullptr;
+		if(mono_custom_attrs_has_attr(attrInfo, monoClass->_getInternalClass()))
+			foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
 
 		mono_custom_attrs_free(attrInfo);
-
 		return foundAttr;
 	}
 

+ 3 - 2
Source/BansheeMono/BsMonoField.cpp

@@ -71,10 +71,11 @@ namespace bs
 		if(attrInfo == nullptr)
 			return nullptr;
 
-		MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
+		MonoObject* foundAttr = nullptr;
+		if(mono_custom_attrs_has_attr(attrInfo, monoClass->_getInternalClass()))
+			foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
 
 		mono_custom_attrs_free(attrInfo);
-
 		return foundAttr;
 	}
 

+ 17 - 11
Source/BansheeMono/BsMonoManager.cpp

@@ -102,11 +102,11 @@ namespace bs
 #if BS_DEBUG_MODE
 		mono_debug_init(MONO_DEBUG_FORMAT_MONO);
 
-		char* options[] = {
+		const char* options[] = {
 			"--soft-breakpoints",
 			"--debugger-agent=transport=dt_socket,address=127.0.0.1:17615,embedding=1,server=y,suspend=n"
 		};
-		mono_jit_parse_options(2, options);
+		mono_jit_parse_options(2, (char**)options);
 		mono_trace_set_level_string("warning"); // Note: Switch to "debug" for detailed output, disabled for now due to spam
 #else
 		mono_trace_set_level_string("warning");
@@ -185,12 +185,18 @@ namespace bs
 			assembly.load(mScriptDomain);
 
 			// Fully initialize all types that use this assembly
-			Vector<ScriptMeta*>& mTypeMetas = getScriptMetaData()[assembly.mName];
-			for (auto& meta : mTypeMetas)
+			Vector<ScriptMetaInfo>& typeMetas = getScriptMetaData()[assembly.mName];
+			for (auto& entry : typeMetas)
 			{
+				ScriptMeta* meta = entry.metaData;
+				*meta = entry.localMetaData;
+
 				meta->scriptClass = assembly.getClass(meta->ns, meta->name);
 				if (meta->scriptClass == nullptr)
-					BS_EXCEPT(InvalidParametersException, "Unable to find class of type: \"" + meta->ns + "::" + meta->name + "\"");
+				{
+					BS_EXCEPT(InvalidParametersException,
+							"Unable to find class of type: \"" + meta->ns + "::" + meta->name + "\"");
+				}
 
 				if (meta->scriptClass->hasField("mCachedPtr"))
 					meta->thisPtrField = meta->scriptClass->getField("mCachedPtr");
@@ -230,10 +236,10 @@ namespace bs
 		return nullptr;
 	}
 
-	void MonoManager::registerScriptType(ScriptMeta* metaData)
+	void MonoManager::registerScriptType(ScriptMeta* metaData, const ScriptMeta& localMetaData)
 	{
-		Vector<ScriptMeta*>& mMetas = getScriptMetaData()[metaData->assembly];
-		mMetas.push_back(metaData);
+		Vector<ScriptMetaInfo>& mMetas = getScriptMetaData()[localMetaData.assembly];
+		mMetas.push_back({ metaData, localMetaData });
 	}
 
 	MonoClass* MonoManager::findClass(const String& ns, const String& typeName)
@@ -287,11 +293,11 @@ namespace bs
 			assemblyEntry.second->unload();
 
 			// Metas hold references to various assembly objects that were just deleted, so clear them
-			Vector<ScriptMeta*>& typeMetas = getScriptMetaData()[assemblyEntry.first];
+			Vector<ScriptMetaInfo>& typeMetas = getScriptMetaData()[assemblyEntry.first];
 			for (auto& entry : typeMetas)
 			{
-				entry->scriptClass = nullptr;
-				entry->thisPtrField = nullptr;
+				entry.metaData->scriptClass = nullptr;
+				entry.metaData->thisPtrField = nullptr;
 			}
 		}
 

+ 9 - 3
Source/BansheeMono/BsMonoManager.h

@@ -72,18 +72,24 @@ namespace bs
 		 * Registers a new script type. This should be done before any assembly loading is done. Upon assembly load these
 		 * script types will be initialized with necessary information about their managed counterparts.
 		 */
-		static void registerScriptType(ScriptMeta* metaData);
+		static void registerScriptType(ScriptMeta* metaData, const ScriptMeta& localMetaData);
 
 		/** Triggered when the assembly domain and all relevant assemblies are about to be unloaded. */
 		Event<void()> onDomainUnload;
 	private:
+		struct ScriptMetaInfo
+		{
+			ScriptMeta* metaData;
+			ScriptMeta localMetaData;
+		};
+
 		/**	Initializes a previous loaded assembly. */
 		void initializeAssembly(MonoAssembly& assembly);
 
 		/**	Returns a list of all types that will be initializes with their assembly gets loaded. */
-		static UnorderedMap<String, Vector<ScriptMeta*>>& getScriptMetaData()
+		static UnorderedMap<String, Vector<ScriptMetaInfo>>& getScriptMetaData()
 		{
-			static UnorderedMap<String, Vector<ScriptMeta*>> mTypesToInitialize;
+			static UnorderedMap<String, Vector<ScriptMetaInfo>> mTypesToInitialize;
 			return mTypesToInitialize;
 		}
 

+ 3 - 2
Source/BansheeMono/BsMonoMethod.cpp

@@ -111,10 +111,11 @@ namespace bs
 		if (attrInfo == nullptr)
 			return nullptr;
 
-		MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
+		MonoObject* foundAttr = nullptr;
+		if(mono_custom_attrs_has_attr(attrInfo, monoClass->_getInternalClass()))
+			foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
 
 		mono_custom_attrs_free(attrInfo);
-
 		return foundAttr;
 	}
 

+ 3 - 2
Source/BansheeMono/BsMonoProperty.cpp

@@ -92,10 +92,11 @@ namespace bs
 		if (attrInfo == nullptr)
 			return nullptr;
 
-		MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
+		MonoObject* foundAttr = nullptr;
+		if(mono_custom_attrs_has_attr(attrInfo, monoClass->_getInternalClass()))
+			foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
 
 		mono_custom_attrs_free(attrInfo);
-
 		return foundAttr;
 	}
 

+ 1 - 1
Source/BansheeUtility/Allocators/BsFrameAlloc.cpp

@@ -92,7 +92,7 @@ namespace bs
 			// the requested alignment
 
 #if BS_DEBUG_MODE
-			alignOffset = alignment - sizeof(UINT32) & (alignment - 1);
+			alignOffset = alignment - (sizeof(UINT32) & (alignment - 1));
 #else
 			if (alignment > 16)
 				alignOffset = alignment - 16;

+ 2 - 2
Source/CMakeLists.txt

@@ -169,7 +169,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 	set(BS_COMPILER_FLAGS_COMMON "-Wall -fPIC -fno-exceptions -fno-strict-aliasing -fno-rtti -fno-ms-compatibility
 	-fms-extensions -Wl,-rpath=$ORIGIN")
 	
-	set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
+	set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0 -DDEBUG")
 	set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
 	set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
 
@@ -180,7 +180,7 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
 	# TODO: Use link-time optimization -flto. Might require non-default linker.
 	set(BS_COMPILER_FLAGS_COMMON "-Wall -fPIC -fno-exceptions -fno-strict-aliasing -fno-rtti -Wl,-rpath=$ORIGIN")
 	
-	set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0")
+	set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} -g -O0 -DDEBUG")
 	set(CMAKE_CXX_FLAGS_OPTIMIZEDDEBUG "${BS_COMPILER_FLAGS_COMMON} -gline-tables-only -O2")
 	set(CMAKE_CXX_FLAGS_RELEASE "${BS_COMPILER_FLAGS_COMMON} -g0 -O2")
 

+ 1 - 6
Source/MBansheeEditor/MBansheeEditor.csproj

@@ -31,14 +31,9 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-	<CSFile Include="*.cs"/>
+    <CSFile Include="*.cs" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Inspectors\AnimationClipInspector.cs" />

+ 0 - 1
Source/MBansheeEditor/Windows/Inspector/InspectorWindow.cs

@@ -2,7 +2,6 @@
 //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
 using System;
 using System.Collections.Generic;
-using System.Data.Common;
 using System.IO;
 using BansheeEngine;
 

+ 0 - 5
Source/MBansheeEngine/MBansheeEngine.csproj

@@ -37,11 +37,6 @@
     <CSFile Include="*.cs" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Animation\Animation.cs" />

+ 5 - 3
Source/SBansheeEngine/BsScriptObject.h

@@ -162,10 +162,12 @@ namespace bs
 		 */
 		static void _initMetaData()
 		{
-			assert(metaData.name.empty());
-			metaData = ScriptMeta(Type::getAssemblyName(), Type::getNamespace(), Type::getTypeName(), &Type::initRuntimeData);
+			// Need to delay init of actual metaData since it's also a static, and we can't guarantee the order
+			// (if it gets initialized after this, it will just overwrite the data)
+			ScriptMeta localMetaData = ScriptMeta(Type::getAssemblyName(), Type::getNamespace(), Type::getTypeName(),
+					&Type::initRuntimeData);
 
-			MonoManager::registerScriptType(&metaData);
+			MonoManager::registerScriptType(&metaData, localMetaData);
 		}
 
 	protected: