Browse Source

Removed render window pointer array from D3D9RenderSystem

Marko Pintera 13 years ago
parent
commit
0105df516c

+ 48 - 48
CamelotClient/CamelotClient.cpp

@@ -32,8 +32,8 @@ int CALLBACK WinMain(
 	_In_  int nCmdShow
 	_In_  int nCmdShow
 	)
 	)
 {
 {
-	gApplication().startUp("CamelotGLRenderSystem", "CamelotForwardRenderer");
-	//gApplication().startUp("CamelotD3D9RenderSystem", "CamelotForwardRenderer");
+	//gApplication().startUp("CamelotGLRenderSystem", "CamelotForwardRenderer");
+	gApplication().startUp("CamelotD3D9RenderSystem", "CamelotForwardRenderer");
 	//gApplication().startUp("CamelotD3D11RenderSystem", "CamelotForwardRenderer");
 	//gApplication().startUp("CamelotD3D11RenderSystem", "CamelotForwardRenderer");
 
 
 	RenderSystem* renderSystem = RenderSystem::instancePtr();
 	RenderSystem* renderSystem = RenderSystem::instancePtr();
@@ -54,27 +54,27 @@ int CALLBACK WinMain(
 	RenderablePtr testRenderable = testModelGO->addComponent<Renderable>();
 	RenderablePtr testRenderable = testModelGO->addComponent<Renderable>();
 
 
 	/////////////////// HLSL 9 SHADERS //////////////////////////
 	/////////////////// HLSL 9 SHADERS //////////////////////////
-	//String fragShaderCode = "sampler2D tex;			\
-	//						float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
-	//						{														\
-	//						float4 color = tex2D(tex, uv);				\
-	//						return color;										\
-	//						}";
-
-	//HighLevelGpuProgramHandle fragProgRef =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
-
-	//String vertShaderCode = "float4x4 matViewProjection;	\
-	//						void vs_main(										\
-	//						float4 inPos : POSITION,							\
-	//						float2 uv : TEXCOORD0,								\
-	//						out float4 oPosition : POSITION,					\
-	//						out float2 oUv : TEXCOORD0)							\
-	//						{														\
-	//						oPosition = mul(matViewProjection, inPos);			\
-	//						oUv = uv;											\
-	//						}";
-
-	//HighLevelGpuProgramHandle vertProgRef =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+	String fragShaderCode = "sampler2D tex;			\
+							float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
+							{														\
+							float4 color = tex2D(tex, uv);				\
+							return color;										\
+							}";
+
+	HighLevelGpuProgramHandle fragProgRef =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+
+	String vertShaderCode = "float4x4 matViewProjection;	\
+							void vs_main(										\
+							float4 inPos : POSITION,							\
+							float2 uv : TEXCOORD0,								\
+							out float4 oPosition : POSITION,					\
+							out float2 oUv : TEXCOORD0)							\
+							{														\
+							oPosition = mul(matViewProjection, inPos);			\
+							oUv = uv;											\
+							}";
+
+	HighLevelGpuProgramHandle vertProgRef =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 
 
 	/////////////////// HLSL 11 SHADERS //////////////////////////
 	/////////////////// HLSL 11 SHADERS //////////////////////////
 	//String fragShaderCode = "SamplerState samp : register(s0);			\
 	//String fragShaderCode = "SamplerState samp : register(s0);			\
@@ -124,31 +124,31 @@ int CALLBACK WinMain(
 	//HighLevelGpuProgramHandle vertProgRef =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "cg", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 	//HighLevelGpuProgramHandle vertProgRef =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "cg", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 
 
 	///////////////// GLSL SHADERS ////////////////////////////
 	///////////////// GLSL SHADERS ////////////////////////////
-	String fragShaderCode = " #version 400 \n \
-							  uniform sampler2D tex; \
-							  in vec2 texcoord0; \
-							  out vec4 fragColor; \
-							  void main() \
-							  {\
-								  vec4 texColor = texture2D(tex, texcoord0.st);\
-								  fragColor = texColor; \
-							  }";
-
-	HighLevelGpuProgramHandle fragProgRef = HighLevelGpuProgram::create(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
-
-	// TODO - Make sure to document the strict input parameter naming. (Exact supported names are in GLSLParamParser)
-	String vertShaderCode = "#version 400 \n \
-							 uniform mainFragBlock { mat4 matViewProjection; }; \
-							 in vec4 cm_position; \
-							 in vec2 cm_texcoord0; \
-							 out vec2 texcoord0; \
-							 void main() \
-							 { \
-								texcoord0 = cm_texcoord0; \
-								gl_Position = cm_position * matViewProjection; \
-							 }";
-
-	HighLevelGpuProgramHandle vertProgRef= HighLevelGpuProgram::create(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+	//String fragShaderCode = " #version 400 \n \
+	//						  uniform sampler2D tex; \
+	//						  in vec2 texcoord0; \
+	//						  out vec4 fragColor; \
+	//						  void main() \
+	//						  {\
+	//							  vec4 texColor = texture2D(tex, texcoord0.st);\
+	//							  fragColor = texColor; \
+	//						  }";
+
+	//HighLevelGpuProgramHandle fragProgRef = HighLevelGpuProgram::create(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+
+	//// TODO - Make sure to document the strict input parameter naming. (Exact supported names are in GLSLParamParser)
+	//String vertShaderCode = "#version 400 \n \
+	//						 uniform mainFragBlock { mat4 matViewProjection; }; \
+	//						 in vec4 cm_position; \
+	//						 in vec2 cm_texcoord0; \
+	//						 out vec2 texcoord0; \
+	//						 void main() \
+	//						 { \
+	//							texcoord0 = cm_texcoord0; \
+	//							gl_Position = cm_position * matViewProjection; \
+	//						 }";
+
+	//HighLevelGpuProgramHandle vertProgRef= HighLevelGpuProgram::create(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 
 
 	gResources().create(vertProgRef, "C:\\vertProgCg.vprog", true);
 	gResources().create(vertProgRef, "C:\\vertProgCg.vprog", true);
 	gResources().unload(vertProgRef);
 	gResources().unload(vertProgRef);

+ 1 - 1
CamelotD3D11RenderSystem/Include/CmD3D11RenderSystem.h

@@ -32,7 +32,7 @@ namespace CamelotEngine
 		void endFrame();
 		void endFrame();
 		void clear(RenderTargetPtr target, unsigned int buffers, const Color& color = Color::Black, float depth = 1.0f, unsigned short stencil = 0);
 		void clear(RenderTargetPtr target, unsigned int buffers, const Color& color = Color::Black, float depth = 1.0f, unsigned short stencil = 0);
 
 
-		void setRenderTarget(RenderTarget* target);
+		void setRenderTarget(RenderTargetPtr target);
 		void setViewport(ViewportPtr& vp);
 		void setViewport(ViewportPtr& vp);
 		void setScissorRect(UINT32 left = 0, UINT32 top = 0, UINT32 right = 800, UINT32 bottom = 600);
 		void setScissorRect(UINT32 left = 0, UINT32 top = 0, UINT32 right = 800, UINT32 bottom = 600);
 
 

+ 2 - 2
CamelotD3D11RenderSystem/Source/CmD3D11RenderSystem.cpp

@@ -283,7 +283,7 @@ namespace CamelotEngine
 
 
 		// Set render target
 		// Set render target
 		RenderTargetPtr target = vp->getTarget();
 		RenderTargetPtr target = vp->getTarget();
-		setRenderTarget(target.get());
+		setRenderTarget(target);
 
 
 		// set viewport dimensions
 		// set viewport dimensions
 		mViewport.TopLeftX = (FLOAT)vp->getActualLeft();
 		mViewport.TopLeftX = (FLOAT)vp->getActualLeft();
@@ -585,7 +585,7 @@ namespace CamelotEngine
 		}
 		}
 	}
 	}
 
 
-	void D3D11RenderSystem::setRenderTarget(RenderTarget* target)
+	void D3D11RenderSystem::setRenderTarget(RenderTargetPtr target)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 

+ 1 - 5
CamelotD3D9Renderer/Include/CmD3D9RenderSystem.h

@@ -67,7 +67,7 @@ namespace CamelotEngine
 		/**
 		/**
 		 * @copydoc RenderSystem::setRenderTarget()
 		 * @copydoc RenderSystem::setRenderTarget()
 		 */
 		 */
-		void setRenderTarget(RenderTarget* target);
+		void setRenderTarget(RenderTargetPtr target);
 
 
 		/**
 		/**
 		 * @copydoc RenderSystem::bindGpuProgram()
 		 * @copydoc RenderSystem::bindGpuProgram()
@@ -249,10 +249,6 @@ namespace CamelotEngine
         void convertVertexShaderCaps(RenderSystemCapabilities* rsc) const;
         void convertVertexShaderCaps(RenderSystemCapabilities* rsc) const;
         void convertPixelShaderCaps(RenderSystemCapabilities* rsc) const;
         void convertPixelShaderCaps(RenderSystemCapabilities* rsc) const;
 		bool checkVertexTextureFormats(D3D9RenderWindow* renderWindow) const;
 		bool checkVertexTextureFormats(D3D9RenderWindow* renderWindow) const;
-	
-		typedef vector<D3D9RenderWindow*>::type D3D9RenderWindowList;
-		// List of additional windows after the first (swap chains)
-		D3D9RenderWindowList mRenderWindows;
 
 
 	protected:
 	protected:
 		// I know that's a lot of friends, but I'd rather have friend classes than exposing the needed methods
 		// I know that's a lot of friends, but I'd rather have friend classes than exposing the needed methods

+ 0 - 165
CamelotD3D9Renderer/Source/CmD3D9DeviceManager.cpp

@@ -184,171 +184,6 @@ namespace CamelotEngine
 			}		
 			}		
 		}
 		}
 
 
-		// No special adapter should be used.
-		if (nvAdapterFound == false)
-		{
-			renderSystem->mActiveD3DDriver = findDriver(renderWindow);
-			nAdapterOrdinal = renderSystem->mActiveD3DDriver->getAdapterNumber();
-
-			BOOL bTryUsingMultiheadDevice = FALSE;
-
-			if (renderWindow->isFullScreen())
-			{
-				bTryUsingMultiheadDevice = TRUE;
-
-				OSVERSIONINFO osVersionInfo;
-				
-				osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-				
-				// Case version info failed -> assume we run on XP.
-				if (FALSE == GetVersionEx(&osVersionInfo))
-				{
-					osVersionInfo.dwMajorVersion = 5;
-				}
-
-				// XP and below - multi-head will cause artifacts when vsync is on.
-				if (osVersionInfo.dwMajorVersion <= 5 && renderWindow->isVSync())
-				{
-					bTryUsingMultiheadDevice = FALSE;
-					// TODO LOG PORT - Log this somewhere
-					//LogManager::getSingleton().logMessage("D3D9 : Multi head disabled. It causes horizontal line when used in XP + VSync combination");
-				}		
-
-				// Vista and SP1 or SP2 - multi-head device can not be reset - it causes memory corruption.
-				if (osVersionInfo.dwMajorVersion == 6 &&
-					(_stricmp(osVersionInfo.szCSDVersion, "Service Pack 1") == 0 ||
-					 _stricmp(osVersionInfo.szCSDVersion, "Service Pack 2") == 0))
-
-				{
-					bTryUsingMultiheadDevice = FALSE;
-					// TODO LOG PORT - Log this somewhere
-					//LogManager::getSingleton().logMessage("D3D9 : Multi head disabled. It causes application run time crashes when used in Vista + SP 1 or 2 combination");
-				}				
-			}
-			
-			
-			// Check if we can create a group of render windows 
-			// on the same device using the multi-head feature.
-			if (bTryUsingMultiheadDevice)
-			{
-				const D3DCAPS9& targetAdapterCaps = renderSystem->mActiveD3DDriver->getD3D9DeviceCaps();
-				D3DCAPS9        masterAdapterCaps;
-
-				// Find the master device caps.
-				if (targetAdapterCaps.MasterAdapterOrdinal == targetAdapterCaps.AdapterOrdinal)
-				{
-					masterAdapterCaps = targetAdapterCaps;
-				}
-				else
-				{
-					for (UINT32 i = 0; i < driverList->count(); ++i)
-					{
-						D3D9Driver* currDriver = driverList->item(i);
-						const D3DCAPS9& currDeviceCaps = currDriver->getD3D9DeviceCaps();
-
-						if (currDeviceCaps.AdapterOrdinal == targetAdapterCaps.MasterAdapterOrdinal)
-						{
-							masterAdapterCaps = currDeviceCaps;
-							break;
-						}					
-					}
-				}
-
-				// Case the master adapter can handle multiple adapters.
-				if (masterAdapterCaps.NumberOfAdaptersInGroup > 1)
-				{				
-					// Create empty list of render windows composing this group.
-					renderWindowsGroup.resize(masterAdapterCaps.NumberOfAdaptersInGroup);
-					for (UINT32 i = 0; i < renderWindowsGroup.size(); ++i)
-						renderWindowsGroup[i] = NULL;
-
-
-					// Assign the current render window to it's place in the group.
-					renderWindowsGroup[targetAdapterCaps.AdapterOrdinalInGroup] = renderWindow;
-
-
-					// For each existing window - check if it belongs to the group.
-					for (UINT32 i = 0; i < renderSystem->mRenderWindows.size(); ++i)
-					{
-						D3D9RenderWindow* currRenderWindow = renderSystem->mRenderWindows[i];
-
-						if (currRenderWindow->isFullScreen())
-						{
-							D3D9Driver* currDriver = findDriver(currRenderWindow);
-							const D3DCAPS9& currDeviceCaps = currDriver->getD3D9DeviceCaps();
-
-							if (currDeviceCaps.MasterAdapterOrdinal == masterAdapterCaps.AdapterOrdinal)
-							{
-								renderWindowsGroup[currDeviceCaps.AdapterOrdinalInGroup] = currRenderWindow;
-								break;
-							}
-						}									
-					}
-
-					bool bDeviceGroupFull = true;
-
-
-					// Check if render windows group is full and ready to be driven by
-					// the master device.
-					for (UINT32 i = 0; i < renderWindowsGroup.size(); ++i)
-					{
-						// This group misses required window -> go back to default.
-						if (renderWindowsGroup[i] == NULL)
-						{
-							bDeviceGroupFull = false;
-							renderWindowsGroup.clear();
-							renderWindowsGroup.push_back(renderWindow);
-							break;
-						}					
-					}
-
-					// Case device group is full -> we can use multi head device.
-					if (bDeviceGroupFull)
-					{
-						bool validateAllDevices = false;
-
-						for (UINT32 i = 0; i < renderWindowsGroup.size(); ++i)
-						{
-							D3D9RenderWindow* currRenderWindow = renderWindowsGroup[i];
-							D3D9Device* currDevice = currRenderWindow->getDevice();
-
-							// This is the master window
-							if (i == 0)
-							{
-								// If master device exists - just release it.
-								if (currDevice != NULL)
-								{
-									renderDevice = currDevice;
-									renderDevice->release();
-								}							
-							}
-
-							// This is subordinate window.
-							else
-							{						
-								// If subordinate device exists - destroy it.
-								if (currDevice != NULL)
-								{
-									currDevice->destroy();
-									validateAllDevices = true;
-								}							
-							}						
-						}
-
-						// In case some device was destroyed - make sure all other devices are valid.
-						// A possible scenario is that full screen window has been destroyed and it's handle
-						// was used and the shared focus handle. All other devices used this handle and must be
-						// recreated using other handles otherwise create device will fail. 
-						if (validateAllDevices)
-						{
-							for (UINT32 i = 0; i < mRenderDevices.size(); ++i)
-								mRenderDevices[i]->validateFocusWindow();
-						}	
-					}				
-				}
-			}		
-		}
-
 		// Try to find a matching device from current device list.
 		// Try to find a matching device from current device list.
 		if (renderDevice == NULL)
 		if (renderDevice == NULL)
 		{
 		{

+ 9 - 16
CamelotD3D9Renderer/Source/CmD3D9RenderSystem.cpp

@@ -253,9 +253,6 @@ namespace CamelotEngine
 
 
 		mResourceManager->unlockDeviceAccess();
 		mResourceManager->unlockDeviceAccess();
 
 
-		// TODO - Storing raw pointer here might not be a good idea?
-		mRenderWindows.push_back(d3d9renderWindow);		
-
 		updateRenderSystemCapabilities(d3d9renderWindow);
 		updateRenderSystemCapabilities(d3d9renderWindow);
 	}	
 	}	
 
 
@@ -1047,7 +1044,7 @@ namespace CamelotEngine
 			__SetSamplerState( static_cast<DWORD>(unit), D3DSAMP_MAXANISOTROPY, maxAnisotropy );
 			__SetSamplerState( static_cast<DWORD>(unit), D3DSAMP_MAXANISOTROPY, maxAnisotropy );
 	}
 	}
 	//---------------------------------------------------------------------
 	//---------------------------------------------------------------------
-	void D3D9RenderSystem::setRenderTarget(RenderTarget* target)
+	void D3D9RenderSystem::setRenderTarget(RenderTargetPtr target)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
@@ -1055,15 +1052,11 @@ namespace CamelotEngine
 
 
 		HRESULT hr;
 		HRESULT hr;
 
 
-		// If this is called without going through RenderWindow::update, then 
-		// the device will not have been set. Calling it twice is safe, the 
-		// implementation ensures nothing happens if the same device is set twice
-		if (std::find(mRenderWindows.begin(), mRenderWindows.end(), target) != mRenderWindows.end())
+		// Possibly change device if the target is a window
+		if (target->isWindow())
 		{
 		{
-			D3D9RenderWindow* window = static_cast<D3D9RenderWindow*>(target);
+			D3D9RenderWindow* window = static_cast<D3D9RenderWindow*>(target.get());
 			mDeviceManager->setActiveRenderTargetDevice(window->getDevice());
 			mDeviceManager->setActiveRenderTargetDevice(window->getDevice());
-			// also make sure we validate the device; if this never went 
-			// through update() it won't be set
 			window->_validateDevice();
 			window->_validateDevice();
 		}
 		}
 
 
@@ -1116,7 +1109,7 @@ namespace CamelotEngine
 
 
 		// Set render target
 		// Set render target
 		RenderTargetPtr target = vp->getTarget();
 		RenderTargetPtr target = vp->getTarget();
-		setRenderTarget(target.get());
+		setRenderTarget(target);
 
 
 		setCullingMode( mCullingMode );
 		setCullingMode( mCullingMode );
 
 
@@ -1344,11 +1337,11 @@ namespace CamelotEngine
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
-		RenderTarget* previousRenderTarget = mActiveRenderTarget;
-		if(target.get() != mActiveRenderTarget)
+		RenderTargetPtr previousRenderTarget = mActiveRenderTarget;
+		if(target != mActiveRenderTarget)
 		{
 		{
 			previousRenderTarget = mActiveRenderTarget;
 			previousRenderTarget = mActiveRenderTarget;
-			setRenderTarget(target.get());
+			setRenderTarget(target);
 		}
 		}
 
 
 		DWORD flags = 0;
 		DWORD flags = 0;
@@ -1380,7 +1373,7 @@ namespace CamelotEngine
 			CM_EXCEPT(RenderingAPIException, "Error clearing frame buffer : " + msg);
 			CM_EXCEPT(RenderingAPIException, "Error clearing frame buffer : " + msg);
 		}
 		}
 
 
-		if(target.get() != previousRenderTarget)
+		if(target != previousRenderTarget)
 		{
 		{
 			setRenderTarget(previousRenderTarget);
 			setRenderTarget(previousRenderTarget);
 		}
 		}

+ 1 - 1
CamelotGLRenderer/Include/CmGLRenderSystem.h

@@ -60,7 +60,7 @@ namespace CamelotEngine {
 		/**
 		/**
 		 * @copydoc RenderSystem::setRenderTarget()
 		 * @copydoc RenderSystem::setRenderTarget()
 		 */
 		 */
-        void setRenderTarget(RenderTarget *target);
+        void setRenderTarget(RenderTargetPtr target);
 
 
         /**
         /**
 		 * @copydoc RenderSystem::setVertexBuffer()
 		 * @copydoc RenderSystem::setVertexBuffer()

+ 6 - 7
CamelotGLRenderer/Source/CmGLRenderSystem.cpp

@@ -106,7 +106,6 @@ namespace CamelotEngine
 
 
 		mColourWrite[0] = mColourWrite[1] = mColourWrite[2] = mColourWrite[3] = true;
 		mColourWrite[0] = mColourWrite[1] = mColourWrite[2] = mColourWrite[3] = true;
 
 
-		mActiveRenderTarget = 0;
 		mCurrentContext = 0;
 		mCurrentContext = 0;
 		mMainContext = 0;
 		mMainContext = 0;
 
 
@@ -536,7 +535,7 @@ namespace CamelotEngine
 
 
 		RenderTargetPtr target;
 		RenderTargetPtr target;
 		target = vp->getTarget();
 		target = vp->getTarget();
-		setRenderTarget(target.get());
+		setRenderTarget(target);
 
 
 		// Calculate the "lower-left" corner of the viewport
 		// Calculate the "lower-left" corner of the viewport
 		mViewportWidth = vp->getActualWidth();
 		mViewportWidth = vp->getActualWidth();
@@ -555,7 +554,7 @@ namespace CamelotEngine
 		glScissor(mViewportLeft, mViewportTop, mViewportWidth, mViewportHeight);
 		glScissor(mViewportLeft, mViewportTop, mViewportWidth, mViewportHeight);
 	}
 	}
 	//---------------------------------------------------------------------
 	//---------------------------------------------------------------------
-	void GLRenderSystem::setRenderTarget(RenderTarget *target)
+	void GLRenderSystem::setRenderTarget(RenderTargetPtr target)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
@@ -695,11 +694,11 @@ namespace CamelotEngine
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
-		RenderTarget* previousRenderTarget = mActiveRenderTarget;
-		if(target.get() != mActiveRenderTarget)
+		RenderTargetPtr previousRenderTarget = mActiveRenderTarget;
+		if(target != mActiveRenderTarget)
 		{
 		{
 			previousRenderTarget = mActiveRenderTarget;
 			previousRenderTarget = mActiveRenderTarget;
-			setRenderTarget(target.get());
+			setRenderTarget(target);
 		}
 		}
 
 
 		bool colourMask = !mColourWrite[0] || !mColourWrite[1] 
 		bool colourMask = !mColourWrite[0] || !mColourWrite[1] 
@@ -765,7 +764,7 @@ namespace CamelotEngine
 			glStencilMask(mStencilWriteMask);
 			glStencilMask(mStencilWriteMask);
 		}
 		}
 
 
-		if(target.get() != previousRenderTarget)
+		if(target != previousRenderTarget)
 		{
 		{
 			setRenderTarget(previousRenderTarget);
 			setRenderTarget(previousRenderTarget);
 		}
 		}

+ 1 - 1
CamelotRenderer/Include/CmDeferredRenderContext.h

@@ -69,7 +69,7 @@ namespace CamelotEngine
 		void setScissorTest(UINT32 left = 0, UINT32 top = 0, UINT32 right = 800, UINT32 bottom = 600);
 		void setScissorTest(UINT32 left = 0, UINT32 top = 0, UINT32 right = 800, UINT32 bottom = 600);
 
 
 		/** @copydoc RenderSystem::setRenderTarget() */
 		/** @copydoc RenderSystem::setRenderTarget() */
-		void setRenderTarget(RenderTarget *target);
+		void setRenderTarget(RenderTargetPtr target);
 
 
 		/** @copydoc RenderSystem::bindGpuProgram() */
 		/** @copydoc RenderSystem::bindGpuProgram() */
 		void bindGpuProgram(GpuProgramHandle prg);
 		void bindGpuProgram(GpuProgramHandle prg);

+ 5 - 0
CamelotRenderer/Include/CmMultiRenderTexture.h

@@ -18,6 +18,11 @@ namespace CamelotEngine
 
 
 		void initialize(const MULTI_RENDER_TEXTURE_DESC& desc);
 		void initialize(const MULTI_RENDER_TEXTURE_DESC& desc);
 
 
+		/**
+		 * @copydoc RenderTarget::isWindow.
+		 */
+		bool isWindow() const { return true; }
+
 		bool requiresTextureFlipping() const { return false; }
 		bool requiresTextureFlipping() const { return false; }
 
 
 	protected:
 	protected:

+ 2 - 2
CamelotRenderer/Include/CmRenderSystem.h

@@ -275,7 +275,7 @@ namespace CamelotEngine
 		/**
 		/**
          * Set current render target to target, enabling its device context if needed
          * Set current render target to target, enabling its device context if needed
          */
          */
-        virtual void setRenderTarget(RenderTarget* target) = 0;
+        virtual void setRenderTarget(RenderTargetPtr target) = 0;
 
 
 		/************************************************************************/
 		/************************************************************************/
 		/* 								UTILITY METHODS                    		*/
 		/* 								UTILITY METHODS                    		*/
@@ -344,7 +344,7 @@ namespace CamelotEngine
 		friend class RenderSystemManager;
 		friend class RenderSystemManager;
 
 
 		/** The Active render target. */
 		/** The Active render target. */
-		RenderTarget* mActiveRenderTarget;
+		RenderTargetPtr mActiveRenderTarget;
 
 
 		CullingMode mCullingMode;
 		CullingMode mCullingMode;
 
 

+ 5 - 0
CamelotRenderer/Include/CmRenderTarget.h

@@ -101,6 +101,11 @@ namespace CamelotEngine
         */
         */
         void swapBuffers();
         void swapBuffers();
 
 
+		/**
+		 * @brief	Returns true if the render target is a render window.
+		 */
+		virtual bool isWindow() const = 0;
+
         /** Gets a custom (maybe platform-specific) attribute.
         /** Gets a custom (maybe platform-specific) attribute.
             @remarks
             @remarks
                 This is a nasty way of satisfying any API's need to see platform-specific details.
                 This is a nasty way of satisfying any API's need to see platform-specific details.

+ 5 - 0
CamelotRenderer/Include/CmRenderTexture.h

@@ -58,6 +58,11 @@ namespace CamelotEngine
 
 
 		bool requiresTextureFlipping() const { return false; }
 		bool requiresTextureFlipping() const { return false; }
 
 
+		/**
+		 * @copydoc RenderTarget::isWindow.
+		 */
+		bool isWindow() const { return false; }
+
 		void initialize(const RENDER_TEXTURE_DESC& desc);
 		void initialize(const RENDER_TEXTURE_DESC& desc);
 
 
 	protected:
 	protected:

+ 5 - 0
CamelotRenderer/Include/CmRenderWindow.h

@@ -98,6 +98,11 @@ namespace CamelotEngine
     public:
     public:
 		virtual ~RenderWindow();
 		virtual ~RenderWindow();
 
 
+		/**
+		 * @copydoc RenderTarget::isWindow.
+		 */
+		bool isWindow() const { return true; }
+
 		/** Alter fullscreen mode options. 
 		/** Alter fullscreen mode options. 
 		@note Nothing will happen unless the settings here are different from the
 		@note Nothing will happen unless the settings here are different from the
 			current settings.
 			current settings.

+ 1 - 1
CamelotRenderer/Source/CmDeferredRenderContext.cpp

@@ -115,7 +115,7 @@ namespace CamelotEngine
 		mCommandQueue->queue(boost::bind(&RenderSystem::bindGpuParams, mRenderSystem, gptype, params));
 		mCommandQueue->queue(boost::bind(&RenderSystem::bindGpuParams, mRenderSystem, gptype, params));
 	}
 	}
 
 
-	void DeferredRenderContext::setRenderTarget(RenderTarget* target)
+	void DeferredRenderContext::setRenderTarget(RenderTargetPtr target)
 	{
 	{
 		mCommandQueue->queue(boost::bind(&RenderSystem::setRenderTarget, mRenderSystem, target));
 		mCommandQueue->queue(boost::bind(&RenderSystem::setRenderTarget, mRenderSystem, target));
 	}
 	}

+ 2 - 2
CamelotRenderer/Source/CmRenderSystem.cpp

@@ -55,8 +55,7 @@ namespace CamelotEngine {
 
 
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
     RenderSystem::RenderSystem()
     RenderSystem::RenderSystem()
-        : mActiveRenderTarget(nullptr)
-        , mCullingMode(CULL_CLOCKWISE)
+        : mCullingMode(CULL_CLOCKWISE)
         , mInvertVertexWinding(false)
         , mInvertVertexWinding(false)
         , mDisabledTexUnitsFrom(0)
         , mDisabledTexUnitsFrom(0)
         , mVertexProgramBound(false)
         , mVertexProgramBound(false)
@@ -110,6 +109,7 @@ namespace CamelotEngine {
 	//-----------------------------------------------------------------------
 	//-----------------------------------------------------------------------
 	void RenderSystem::destroy_internal()
 	void RenderSystem::destroy_internal()
 	{
 	{
+		mActiveRenderTarget = nullptr;
 	}
 	}
     //---------------------------------------------------------------------------------------------
     //---------------------------------------------------------------------------------------------
     void RenderSystem::_notifyWindowCreated(RenderWindow& window)
     void RenderSystem::_notifyWindowCreated(RenderWindow& window)

+ 0 - 6
CamelotRenderer/TODO.txt

@@ -22,15 +22,9 @@ Make sure we can add an include file to a HighLevelGpuProgram, and make sure it
  - Also a way to list all referenced includes, and a way to remove them
  - Also a way to list all referenced includes, and a way to remove them
 
 
 Go through RenderSystem classes and make sure we don't hold any raw pointer references:
 Go through RenderSystem classes and make sure we don't hold any raw pointer references:
-mActiveRenderTarget
- - when is this set to null?
- - I don't want it to be set in the background somewhere and then have the user wonder why aren't his references being released, or worse yet (since it isn't a shared_ptr) why the game crashes
-
 D3D9 keeps a list of render windows
 D3D9 keeps a list of render windows
  - it keeps a list of RAW pointers to those windows. That NEEDS to change
  - it keeps a list of RAW pointers to those windows. That NEEDS to change
 
 
-mActiveViewport - keeps an active viewport using a RAW pointer
-
 D3D11 keeps an active vertex shader & active vertex delecaration
 D3D11 keeps an active vertex shader & active vertex delecaration
  - should be okay if they are both shared_ptr (they're not atm), and user knows how to reset them
  - should be okay if they are both shared_ptr (they're not atm), and user knows how to reset them