Преглед изворни кода

Refactored render system initialization so that render window gets created from sim thread instead of core

Marko Pintera пре 11 година
родитељ
комит
7ec17510f4

+ 9 - 6
BansheeCore/Include/BsRenderSystem.h

@@ -335,10 +335,16 @@ namespace BansheeEngine
 		RenderWindowPtr initialize(const RENDER_WINDOW_DESC& primaryWindowDesc);
 
 		/**
-		 * @brief	Performs second part of the initialization (on Core thread), first part
-		 *			being in initialize().
+		 * @brief	Prepares the initialization of the render system on the core thread. After
+		 *			the system is prepared a render window can be created and initialization finalized.
 		 */
-		virtual void initialize_internal(AsyncOp& asyncOp);
+		virtual void initializePrepare();
+
+		/**
+		 * @brief	Finalized the initialization of the render system on the core thread. 
+		 *			Should be called after the primary render window is created.
+		 */
+		virtual void initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow);
 
 		/**
 		 * @brief	Shuts down the render system and cleans up all resources.
@@ -381,8 +387,5 @@ namespace BansheeEngine
 
 		RenderSystemCapabilities* mCurrentCapabilities;
 		VideoModeInfoPtr mVideoModeInfo;
-
-		// TODO - Only used between initialize and initialize_internal. Handle it better?
-		RENDER_WINDOW_DESC mPrimaryWindowDesc;
 	};
 }

+ 12 - 4
BansheeCore/Source/BsRenderSystem.cpp

@@ -43,14 +43,22 @@ namespace BansheeEngine
 
 	RenderWindowPtr RenderSystem::initialize(const RENDER_WINDOW_DESC& primaryWindowDesc)
 	{
-		mPrimaryWindowDesc = primaryWindowDesc;
+		gCoreThread().queueCommand(std::bind(&RenderSystem::initializePrepare, this), true);
 
-		AsyncOp op = gCoreThread().queueReturnCommand(std::bind(&RenderSystem::initialize_internal, this, _1), true);
+		RENDER_WINDOW_DESC windowDesc = primaryWindowDesc;
+		RenderWindowPtr renderWindow = RenderWindow::create(windowDesc, nullptr);
 
-		return op.getReturnValue<RenderWindowPtr>();
+		gCoreThread().queueCommand(std::bind(&RenderSystem::initializeFinalize, this, renderWindow->getCore()), true);
+
+		return renderWindow;
+	}
+
+	void RenderSystem::initializePrepare()
+	{
+		// Do nothing
 	}
 
-	void RenderSystem::initialize_internal(AsyncOp& asyncOp)
+	void RenderSystem::initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 

+ 7 - 2
BansheeD3D11RenderSystem/Include/BsD3D11RenderSystem.h

@@ -208,9 +208,14 @@ namespace BansheeEngine
 		friend class D3D11RenderSystemFactory;
 
 		/**
-		 * @copydoc	RenderSystem::initialize_internal
+		 * @copydoc	RenderSystem::initializePrepare
 		 */
-		void initialize_internal(AsyncOp& asyncOp);
+		void initializePrepare();
+
+		/**
+		 * @copydoc	RenderSystem::initializeFinalize
+		 */
+		void initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow);
 
 		/**
 		 * @copydoc	RenderSystem::destroy_internal

+ 6 - 6
BansheeD3D11RenderSystem/Source/BsD3D11RenderSystem.cpp

@@ -56,7 +56,7 @@ namespace BansheeEngine
 		return strName;
 	}
 
-	void D3D11RenderSystem::initialize_internal(AsyncOp& asyncOp)
+	void D3D11RenderSystem::initializePrepare()
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
@@ -130,16 +130,16 @@ namespace BansheeEngine
 		GpuProgramManager::instance().addFactory(mHLSLFactory);
 
 		mIAManager = bs_new<D3D11InputLayoutManager>();
+		RenderSystem::initializePrepare();
+	}
 
-		RenderWindowPtr primaryWindow = RenderWindow::create(mPrimaryWindowDesc);
-
+	void D3D11RenderSystem::initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow)
+	{
 		D3D11RenderUtility::startUp(mDevice);
 
 		QueryManager::startUp<D3D11QueryManager>();
 
-		RenderSystem::initialize_internal(asyncOp);
-
-		asyncOp._completeOperation(primaryWindow);
+		RenderSystem::initializeFinalize(primaryWindow);
 	}
 
     void D3D11RenderSystem::destroy_internal()

+ 7 - 2
BansheeD3D9RenderSystem/Include/BsD3D9RenderSystem.h

@@ -241,9 +241,14 @@ namespace BansheeEngine
 		friend class D3D9RenderWindowCoreManager;
 
 		/**
-		 * @copydoc	RenderSystem::initialize_internal
+		 * @copydoc	RenderSystem::initializePrepare
 		 */
-		void initialize_internal(AsyncOp& asyncOp);
+		void initializePrepare();
+
+		/**
+		 * @copydoc	RenderSystem::initializeFinalize
+		 */
+		void initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow);
 
 		/**
 		 * @copydoc	RenderSystem::destroy_internal

+ 11 - 13
BansheeD3D9RenderSystem/Source/BsD3D9RenderSystem.cpp

@@ -66,7 +66,7 @@ namespace BansheeEngine
 		return strName;
 	}
 
-	void D3D9RenderSystem::initialize_internal(AsyncOp& asyncOp)
+	void D3D9RenderSystem::initializePrepare()
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
@@ -74,15 +74,13 @@ namespace BansheeEngine
 		mResourceManager = bs_new<D3D9ResourceManager>();
 
 		// Create our Direct3D object
-		if( NULL == (mpD3D = Direct3DCreate9(D3D_SDK_VERSION)) )
+		if((mpD3D = Direct3DCreate9(D3D_SDK_VERSION)) == nullptr)
 			BS_EXCEPT(InternalErrorException, "Failed to create Direct3D9 object");
 
-		RenderWindow* autoWindow = NULL;
-
 		// Init using current settings
 		mActiveD3DDriver = getDirect3DDrivers()->item(0); // TODO - We always use the first driver
 
-		if( !mActiveD3DDriver )
+		if(mActiveD3DDriver == nullptr)
 			BS_EXCEPT(InvalidParametersException, "Problems finding requested Direct3D driver!" );
 
 		// get driver version
@@ -110,10 +108,13 @@ namespace BansheeEngine
 		// Create render state manager
 		RenderStateManager::startUp();
 
-		// Create primary window and finalize initialization
-		RenderWindowPtr primaryWindow = RenderWindow::create(mPrimaryWindowDesc);
-		D3D9RenderWindowCore* d3d9renderWindow = static_cast<D3D9RenderWindowCore*>(primaryWindow->getCore().get());
-		updateRenderSystemCapabilities(d3d9renderWindow);
+		RenderSystem::initializePrepare();
+	}
+
+	void D3D9RenderSystem::initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow)
+	{
+		D3D9RenderWindowCore* d3d9window = static_cast<D3D9RenderWindowCore*>(primaryWindow.get());
+		updateRenderSystemCapabilities(d3d9window);
 
 		// Create the texture manager for use by others		
 		TextureManager::startUp<D3D9TextureManager>();
@@ -121,10 +122,7 @@ namespace BansheeEngine
 
 		QueryManager::startUp<D3D9QueryManager>();
 
-		// call superclass method
-		RenderSystem::initialize_internal(asyncOp);
-
-		asyncOp._completeOperation(primaryWindow);
+		RenderSystem::initializeFinalize(primaryWindow);
 	}
 
 	void D3D9RenderSystem::destroy_internal()

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

@@ -11,7 +11,7 @@ int CALLBACK WinMain(
 	_In_  int nCmdShow
 	)
 {
-	EditorApplication::startUp(RenderSystemPlugin::OpenGL);
+	EditorApplication::startUp(RenderSystemPlugin::DX9);
 	EditorApplication::instance().runMainLoop();
 	EditorApplication::shutDown();
 

+ 7 - 2
BansheeGLRenderSystem/Include/BsGLRenderSystem.h

@@ -190,9 +190,14 @@ namespace BansheeEngine
 
 	protected:
 		/**
-		 * @copydoc	RenderSystem::initialize_internal().
+		 * @copydoc	RenderSystem::initializePrepare
 		 */
-		void initialize_internal(AsyncOp& asyncOp);
+		void initializePrepare();
+
+		/**
+		 * @copydoc	RenderSystem::initializeFinalize
+		 */
+		void initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow);
 
 		/**
 		 * @copydoc	RenderSystem::destroy_internal().

+ 10 - 10
BansheeGLRenderSystem/Source/BsGLRenderSystem.cpp

@@ -99,7 +99,7 @@ namespace BansheeEngine
 		return strName;
 	}
 
-	void GLRenderSystem::initialize_internal(AsyncOp& asyncOp)
+	void GLRenderSystem::initializePrepare()
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
@@ -113,12 +113,14 @@ namespace BansheeEngine
 
 		QueryManager::startUp<GLQueryManager>();
 
-		// Initialize a window so we have something to create a GL context with
-		RenderWindowPtr primaryWindow = RenderWindow::create(mPrimaryWindowDesc);
-		      
+		RenderSystem::initializePrepare();
+	}
+
+	void GLRenderSystem::initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow)
+	{
 		// Get the context from the window and finish initialization
 		GLContext *context = nullptr;
-		primaryWindow->getCore()->getCustomAttribute("GLCONTEXT", &context);
+		primaryWindow->getCustomAttribute("GLCONTEXT", &context);
 
 		// Set main and current context
 		mMainContext = context;
@@ -142,19 +144,17 @@ namespace BansheeEngine
 			if (tokens.size() > 1)
 				mDriverVersion.minor = parseInt(tokens[1]);
 			if (tokens.size() > 2)
-				mDriverVersion.release = parseInt(tokens[2]); 
+				mDriverVersion.release = parseInt(tokens[2]);
 		}
 		mDriverVersion.build = 0;
 
 		mCurrentCapabilities = createRenderSystemCapabilities();
 		initFromCaps(mCurrentCapabilities);
 		GLVertexArrayObjectManager::startUp();
-		
+
 		mGLInitialised = true;
-		
-		RenderSystem::initialize_internal(asyncOp);
 
-		asyncOp._completeOperation(primaryWindow);
+		RenderSystem::initializeFinalize(primaryWindow);
 	}
 
 	void GLRenderSystem::destroy_internal()

+ 0 - 6
TODO.txt

@@ -31,12 +31,6 @@ Need RenderWindow::create that works from core thread used for creating the prim
 
 Move CoreAccessor methods relating to render target, to the render targets themselves
 
-Find remaining uses of getCore and try to replace them:
- - Check Win32GLSupport
- - When creating a window, parent window gets sent as a RenderWindow
- - PlatfromWndProc accesses a list of non-core windows
- - Various callbacks in PlatformImpl as well
-
 -----------------