Browse Source

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

Marko Pintera 11 years ago
parent
commit
7ec17510f4

+ 9 - 6
BansheeCore/Include/BsRenderSystem.h

@@ -335,10 +335,16 @@ namespace BansheeEngine
 		RenderWindowPtr initialize(const RENDER_WINDOW_DESC& primaryWindowDesc);
 		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.
 		 * @brief	Shuts down the render system and cleans up all resources.
@@ -381,8 +387,5 @@ namespace BansheeEngine
 
 
 		RenderSystemCapabilities* mCurrentCapabilities;
 		RenderSystemCapabilities* mCurrentCapabilities;
 		VideoModeInfoPtr mVideoModeInfo;
 		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)
 	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;
 		THROW_IF_NOT_CORE_THREAD;
 
 

+ 7 - 2
BansheeD3D11RenderSystem/Include/BsD3D11RenderSystem.h

@@ -208,9 +208,14 @@ namespace BansheeEngine
 		friend class D3D11RenderSystemFactory;
 		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
 		 * @copydoc	RenderSystem::destroy_internal

+ 6 - 6
BansheeD3D11RenderSystem/Source/BsD3D11RenderSystem.cpp

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

+ 7 - 2
BansheeD3D9RenderSystem/Include/BsD3D9RenderSystem.h

@@ -241,9 +241,14 @@ namespace BansheeEngine
 		friend class D3D9RenderWindowCoreManager;
 		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
 		 * @copydoc	RenderSystem::destroy_internal

+ 11 - 13
BansheeD3D9RenderSystem/Source/BsD3D9RenderSystem.cpp

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

+ 1 - 1
BansheeEditorExec/BsEditorExec.cpp

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

+ 7 - 2
BansheeGLRenderSystem/Include/BsGLRenderSystem.h

@@ -190,9 +190,14 @@ namespace BansheeEngine
 
 
 	protected:
 	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().
 		 * @copydoc	RenderSystem::destroy_internal().

+ 10 - 10
BansheeGLRenderSystem/Source/BsGLRenderSystem.cpp

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