瀏覽代碼

Removed mActiveViewport from render system

Marko Pintera 13 年之前
父節點
當前提交
5700fec8d0

+ 1 - 1
CamelotD3D11RenderSystem/Include/CmD3D11RenderSystem.h

@@ -33,7 +33,7 @@ namespace CamelotEngine
 		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(RenderTarget* target);
-		void setViewport(const Viewport* 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);
 
 
 		void setVertexBuffer(UINT32 index, const VertexBufferPtr& buffer);
 		void setVertexBuffer(UINT32 index, const VertexBufferPtr& buffer);

+ 1 - 3
CamelotD3D11RenderSystem/Source/CmD3D11RenderSystem.cpp

@@ -275,14 +275,12 @@ namespace CamelotEngine
 		// Not used
 		// Not used
 	}
 	}
 
 
-	void D3D11RenderSystem::setViewport(const Viewport* vp)
+	void D3D11RenderSystem::setViewport(ViewportPtr& vp)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
 		assert(vp != nullptr);
 		assert(vp != nullptr);
 
 
-		mActiveViewport = vp;
-
 		// Set render target
 		// Set render target
 		RenderTargetPtr target = vp->getTarget();
 		RenderTargetPtr target = vp->getTarget();
 		setRenderTarget(target.get());
 		setRenderTarget(target.get());

+ 1 - 1
CamelotD3D9Renderer/Include/CmD3D9RenderSystem.h

@@ -132,7 +132,7 @@ namespace CamelotEngine
 		/**
 		/**
 		 * @copydoc RenderSystem::setViewport()
 		 * @copydoc RenderSystem::setViewport()
 		 */
 		 */
-		void setViewport(const Viewport* vp);	
+		void setViewport(ViewportPtr& vp);	
 
 
 		/**
 		/**
 		 * @copydoc RenderSystem::beginFrame()
 		 * @copydoc RenderSystem::beginFrame()

+ 0 - 3
CamelotD3D9Renderer/Source/CmD3D9DeviceManager.cpp

@@ -75,9 +75,6 @@ namespace CamelotEngine
 					break;
 					break;
 				}				
 				}				
 			}	
 			}	
-
-			// Invalidate active view port.
-			renderSystem->mActiveViewport = nullptr;
 		}						
 		}						
 	}
 	}
 
 

+ 1 - 8
CamelotD3D9Renderer/Source/CmD3D9RenderSystem.cpp

@@ -1104,14 +1104,12 @@ namespace CamelotEngine
 		}
 		}
 	}
 	}
 	//---------------------------------------------------------------------
 	//---------------------------------------------------------------------
-	void D3D9RenderSystem::setViewport(const Viewport* vp)
+	void D3D9RenderSystem::setViewport(ViewportPtr& vp)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
 		assert(vp != nullptr);
 		assert(vp != nullptr);
 
 
-		mActiveViewport = vp;
-
 		// ok, it's different, time to set render target and viewport params
 		// ok, it's different, time to set render target and viewport params
 		D3DVIEWPORT9 d3dvp;
 		D3DVIEWPORT9 d3dvp;
 		HRESULT hr;
 		HRESULT hr;
@@ -2342,11 +2340,6 @@ namespace CamelotEngine
 		// Reset state attributes.	
 		// Reset state attributes.	
 		mVertexProgramBound = false;
 		mVertexProgramBound = false;
 		mFragmentProgramBound = false;
 		mFragmentProgramBound = false;
-
-		// Restore previous active device.
-
-		// Invalidate active view port.
-		mActiveViewport = nullptr;
 	}
 	}
 	//---------------------------------------------------------------------
 	//---------------------------------------------------------------------
 	void D3D9RenderSystem::determineFSAASettings(IDirect3DDevice9* d3d9Device,
 	void D3D9RenderSystem::determineFSAASettings(IDirect3DDevice9* d3d9Device,

+ 1 - 1
CamelotForwardRenderer/Source/CmForwardRenderer.cpp

@@ -37,7 +37,7 @@ namespace CamelotEngine
 		{
 		{
 			render(*iter);
 			render(*iter);
 
 
-			Viewport* vp = (*iter)->getViewport();
+			ViewportPtr vp = (*iter)->getViewport();
 			if(vp != nullptr)
 			if(vp != nullptr)
 			{
 			{
 				RenderTargetPtr rt = vp->getTarget();
 				RenderTargetPtr rt = vp->getTarget();

+ 2 - 1
CamelotGLRenderer/Include/CmGLRenderSystem.h

@@ -115,7 +115,7 @@ namespace CamelotEngine {
 		/**
 		/**
 		 * @copydoc RenderSystem::setViewport()
 		 * @copydoc RenderSystem::setViewport()
 		 */
 		 */
-        void setViewport(const Viewport* vp);
+        void setViewport(ViewportPtr& vp);
 
 
 		/**
 		/**
 		 * @copydoc RenderSystem::bindGpuProgram()
 		 * @copydoc RenderSystem::bindGpuProgram()
@@ -202,6 +202,7 @@ namespace CamelotEngine {
     private:
     private:
 		// Scissor test
 		// Scissor test
 		UINT32 mScissorTop, mScissorBottom, mScissorLeft, mScissorRight;
 		UINT32 mScissorTop, mScissorBottom, mScissorLeft, mScissorRight;
+		UINT32 mViewportLeft, mViewportTop, mViewportWidth, mViewportHeight;
 
 
 		UINT32 mStencilReadMask;
 		UINT32 mStencilReadMask;
 		UINT32 mStencilWriteMask;
 		UINT32 mStencilWriteMask;

+ 16 - 16
CamelotGLRenderer/Source/CmGLRenderSystem.cpp

@@ -80,6 +80,7 @@ namespace CamelotEngine
 		mActivePipeline(nullptr),
 		mActivePipeline(nullptr),
 		mActiveTextureUnit(0),
 		mActiveTextureUnit(0),
 		mScissorTop(0), mScissorBottom(720), mScissorLeft(0), mScissorRight(1280),
 		mScissorTop(0), mScissorBottom(720), mScissorLeft(0), mScissorRight(1280),
+		mViewportLeft(0), mViewportTop(0), mViewportWidth(0), mViewportHeight(0),
 		mStencilReadMask(0xFFFFFFFF),
 		mStencilReadMask(0xFFFFFFFF),
 		mStencilWriteMask(0xFFFFFFFF),
 		mStencilWriteMask(0xFFFFFFFF),
 		mStencilCompareFront(CMPF_ALWAYS_PASS),
 		mStencilCompareFront(CMPF_ALWAYS_PASS),
@@ -527,7 +528,7 @@ namespace CamelotEngine
 		setStencilRefValue(stencilRefValue);
 		setStencilRefValue(stencilRefValue);
 	}
 	}
 	//-----------------------------------------------------------------------------
 	//-----------------------------------------------------------------------------
-	void GLRenderSystem::setViewport(const Viewport* vp)
+	void GLRenderSystem::setViewport(ViewportPtr& vp)
 	{
 	{
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;
 
 
@@ -536,24 +537,22 @@ namespace CamelotEngine
 		RenderTargetPtr target;
 		RenderTargetPtr target;
 		target = vp->getTarget();
 		target = vp->getTarget();
 		setRenderTarget(target.get());
 		setRenderTarget(target.get());
-		mActiveViewport = vp;
-		
-		GLsizei x, y, w, h;
 
 
 		// Calculate the "lower-left" corner of the viewport
 		// Calculate the "lower-left" corner of the viewport
-		w = vp->getActualWidth();
-		h = vp->getActualHeight();
-		x = vp->getActualLeft();
-		y = vp->getActualTop();
+		mViewportWidth = vp->getActualWidth();
+		mViewportHeight = vp->getActualHeight();
+		mViewportLeft = vp->getActualLeft();
+		mViewportTop = vp->getActualTop();
+
 		if (!target->requiresTextureFlipping())
 		if (!target->requiresTextureFlipping())
 		{
 		{
 			// Convert "upper-left" corner to "lower-left"
 			// Convert "upper-left" corner to "lower-left"
-			y = target->getHeight() - h - y;
+			mViewportTop = target->getHeight() - mViewportHeight - mViewportTop;
 		}
 		}
-		glViewport(x, y, w, h);
+		glViewport(mViewportLeft, mViewportTop, mViewportWidth, mViewportHeight);
 
 
 		// Configure the viewport clipping
 		// Configure the viewport clipping
-		glScissor(x, y, w, h);
+		glScissor(mViewportLeft, mViewportTop, mViewportWidth, mViewportHeight);
 	}
 	}
 	//---------------------------------------------------------------------
 	//---------------------------------------------------------------------
 	void GLRenderSystem::setRenderTarget(RenderTarget *target)
 	void GLRenderSystem::setRenderTarget(RenderTarget *target)
@@ -990,13 +989,14 @@ namespace CamelotEngine
 		{
 		{
 			glDisable(GL_SCISSOR_TEST);
 			glDisable(GL_SCISSOR_TEST);
 			// GL requires you to reset the scissor when disabling
 			// GL requires you to reset the scissor when disabling
-			w = mActiveViewport->getActualWidth();
-			h = mActiveViewport->getActualHeight();
-			x = mActiveViewport->getActualLeft();
+			w = mViewportWidth;
+			h = mViewportHeight;
+			x = mViewportLeft;
 			if (flipping)
 			if (flipping)
-				y = mActiveViewport->getActualTop();
+				y = mViewportTop;
 			else
 			else
-				y = targetHeight - mActiveViewport->getActualTop() - h;
+				y = targetHeight - mViewportTop - h;
+
 			glScissor(x, y, w, h);
 			glScissor(x, y, w, h);
 		}
 		}
 	}
 	}

+ 2 - 2
CamelotRenderer/Include/CmCamera.h

@@ -505,7 +505,7 @@ namespace CamelotEngine {
         /// Small constant used to reduce far plane projection to avoid inaccuracies
         /// Small constant used to reduce far plane projection to avoid inaccuracies
         static const float INFINITE_FAR_PLANE_ADJUST;
         static const float INFINITE_FAR_PLANE_ADJUST;
     protected:
     protected:
-		Viewport* mViewport;
+		ViewportPtr mViewport;
 
 
     public:
     public:
         /** Standard destructor.
         /** Standard destructor.
@@ -517,7 +517,7 @@ namespace CamelotEngine {
 			float width = 1.0f, float height = 1.0f,
 			float width = 1.0f, float height = 1.0f,
 			int ZOrder = 0);
 			int ZOrder = 0);
 
 
-		Viewport* getViewport() { return mViewport; }
+		ViewportPtr getViewport() { return mViewport; }
 
 
 		/************************************************************************/
 		/************************************************************************/
 		/* 						COMPONENT OVERRIDES                      		*/
 		/* 						COMPONENT OVERRIDES                      		*/

+ 1 - 1
CamelotRenderer/Include/CmDeferredRenderContext.h

@@ -42,7 +42,7 @@ namespace CamelotEngine
 		void setDepthStencilState(const DepthStencilStatePtr& depthStencilState, UINT32 stencilRefValue);
 		void setDepthStencilState(const DepthStencilStatePtr& depthStencilState, UINT32 stencilRefValue);
 
 
 		/** @copydoc RenderSystem::setViewport() */
 		/** @copydoc RenderSystem::setViewport() */
-		void setViewport(const Viewport* vp);
+		void setViewport(ViewportPtr& vp);
 
 
 		/** @copydoc RenderSystem::setVertexBuffer() */
 		/** @copydoc RenderSystem::setVertexBuffer() */
 		void setVertexBuffer(UINT32 index, const VertexBufferPtr& buffer);
 		void setVertexBuffer(UINT32 index, const VertexBufferPtr& buffer);

+ 1 - 0
CamelotRenderer/Include/CmPrerequisites.h

@@ -203,6 +203,7 @@ namespace CamelotEngine
 	typedef std::shared_ptr<GpuParamBlock> GpuParamBlockPtr;
 	typedef std::shared_ptr<GpuParamBlock> GpuParamBlockPtr;
 	typedef std::shared_ptr<GpuParams> GpuParamsPtr;
 	typedef std::shared_ptr<GpuParams> GpuParamsPtr;
 	typedef std::shared_ptr<TextureView> TextureViewPtr;
 	typedef std::shared_ptr<TextureView> TextureViewPtr;
+	typedef std::shared_ptr<Viewport> ViewportPtr;
 }
 }
 
 
 // All type IDs used for RTTI
 // All type IDs used for RTTI

+ 1 - 6
CamelotRenderer/Include/CmRenderSystem.h

@@ -158,9 +158,7 @@ namespace CamelotEngine
 
 
 		@param target Viewport to render to.
 		@param target Viewport to render to.
 		*/
 		*/
-		virtual void setViewport(const Viewport* vp) = 0;
-		/** Get the current active viewport for rendering. */
-		virtual const Viewport* getViewport(void);
+		virtual void setViewport(ViewportPtr& vp) = 0;
 
 
 		/** Sets the current vertex buffer for the specified source index.   
 		/** Sets the current vertex buffer for the specified source index.   
 		/** @note Set buffer to nullptr to clear the buffer at the specified index.*/
 		/** @note Set buffer to nullptr to clear the buffer at the specified index.*/
@@ -348,9 +346,6 @@ namespace CamelotEngine
 		/** The Active render target. */
 		/** The Active render target. */
 		RenderTarget* mActiveRenderTarget;
 		RenderTarget* mActiveRenderTarget;
 
 
-		// Active viewport (dest for future rendering operations)
-		const Viewport* mActiveViewport;
-
 		CullingMode mCullingMode;
 		CullingMode mCullingMode;
 
 
 		bool mInvertVertexWinding;
 		bool mInvertVertexWinding;

+ 2 - 5
CamelotRenderer/Source/CmCamera.cpp

@@ -62,8 +62,7 @@ namespace CamelotEngine {
 		mRecalcVertexData(true),
 		mRecalcVertexData(true),
 		mCustomViewMatrix(false),
 		mCustomViewMatrix(false),
 		mCustomProjMatrix(false),
 		mCustomProjMatrix(false),
-		mFrustumExtentsManuallySet(false),
-		mViewport(nullptr)
+		mFrustumExtentsManuallySet(false)
     {
     {
 		updateView();
 		updateView();
 		updateFrustum();
 		updateFrustum();
@@ -85,12 +84,10 @@ namespace CamelotEngine {
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
     Camera::~Camera()
     Camera::~Camera()
     {
     {
-		if(mViewport != nullptr)
-			delete mViewport;
     }
     }
 	void Camera::init(RenderTargetPtr target, float left, float top, float width, float height, int ZOrder)
 	void Camera::init(RenderTargetPtr target, float left, float top, float width, float height, int ZOrder)
 	{
 	{
-		mViewport = new Viewport(target, left, top, width, height, ZOrder);
+		mViewport = ViewportPtr(new Viewport(target, left, top, width, height, ZOrder));
 	}
 	}
 	//-----------------------------------------------------------------------
 	//-----------------------------------------------------------------------
 	void Camera::setFOVy(const Radian& fov)
 	void Camera::setFOVy(const Radian& fov)

+ 1 - 1
CamelotRenderer/Source/CmDeferredRenderContext.cpp

@@ -20,7 +20,7 @@ namespace CamelotEngine
 		delete mCommandQueue;
 		delete mCommandQueue;
 	}
 	}
 
 
-	void DeferredRenderContext::setViewport(const Viewport* vp)
+	void DeferredRenderContext::setViewport(ViewportPtr& vp)
 	{
 	{
 		mCommandQueue->queue(boost::bind(&RenderSystem::setViewport, mRenderSystem, vp));
 		mCommandQueue->queue(boost::bind(&RenderSystem::setViewport, mRenderSystem, vp));
 	}
 	}

+ 0 - 8
CamelotRenderer/Source/CmRenderSystem.cpp

@@ -68,7 +68,6 @@ namespace CamelotEngine {
 		, mRenderThreadShutdown(false)
 		, mRenderThreadShutdown(false)
 		, mCommandQueue(nullptr)
 		, mCommandQueue(nullptr)
 		, mMaxCommandNotifyId(0)
 		, mMaxCommandNotifyId(0)
-		, mActiveViewport(nullptr)
     {
     {
     }
     }
 
 
@@ -133,13 +132,6 @@ namespace CamelotEngine {
 		return mDriverVersion; 
 		return mDriverVersion; 
 	}
 	}
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
-    const Viewport* RenderSystem::getViewport(void)
-    {
-		THROW_IF_NOT_RENDER_THREAD;
-
-        return mActiveViewport;
-    }
-    //-----------------------------------------------------------------------
     void RenderSystem::disableTextureUnit(GpuProgramType gptype, UINT16 texUnit)
     void RenderSystem::disableTextureUnit(GpuProgramType gptype, UINT16 texUnit)
     {
     {
 		THROW_IF_NOT_RENDER_THREAD;
 		THROW_IF_NOT_RENDER_THREAD;

+ 17 - 1
CamelotRenderer/TODO.txt

@@ -21,7 +21,23 @@ Add support for include file resource
 Make sure we can add an include file to a HighLevelGpuProgram, and make sure it uses it
 Make sure we can add an include file to a HighLevelGpuProgram, and make sure it uses 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
+ - 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
+ - should be okay if they are both shared_ptr (they're not atm), and user knows how to reset them
+
+GL keeps a list of RAW pointers for every Gpuprogram!
+ - also a bound vertex/index buffer & vertex declaration
+
+
 Seems there is a possible deadlock when starting the render thread, while waiting for the thread to be started
 Seems there is a possible deadlock when starting the render thread, while waiting for the thread to be started
 Get rid of resource handlers in Resources?
 Get rid of resource handlers in Resources?