Browse Source

Better renderer param buffer binding
Renamed renderable controller

BearishSun 10 years ago
parent
commit
fc73944aef

+ 17 - 6
BansheeCore/Include/BsMaterial.h

@@ -52,12 +52,8 @@ namespace BansheeEngine
 		GpuParamsType mHullParams;
 		GpuParamsType mDomainParams;
 		GpuParamsType mComputeParams;
-
-		static const UINT32 NUM_PARAMS;
 	};
 
-	template<bool Core> const UINT32 TPassParameters<Core>::NUM_PARAMS = 6;
-
 	template<bool Core> struct TGpuParamBlockBufferPtrType { };
 	template<> struct TGpuParamBlockBufferPtrType<false> { typedef SPtr<GpuParamBlockBuffer> Type; };
 	template<> struct TGpuParamBlockBufferPtrType<true> { typedef SPtr<GpuParamBlockBufferCore> Type; };
@@ -66,8 +62,23 @@ namespace BansheeEngine
 	template<> struct TGpuProgramType<false> { typedef GpuProgramPtr Type; };
 	template<> struct TGpuProgramType<true> { typedef SPtr<GpuProgramCore> Type; };
 
-	class BS_CORE_EXPORT PassParameters : public TPassParameters<false> {};
-	class BS_CORE_EXPORT PassParametersCore : public TPassParameters<true> {};
+	/**
+	 * @brief	Contains sim thread pass parameters for each shader stage.
+	 */
+	class BS_CORE_EXPORT PassParameters : public TPassParameters<false>
+	{
+	public:
+		static const UINT32 NUM_PARAMS;
+	};
+
+	/**
+	 * @brief	Contains core thread pass parameters for each shader stage.
+	 */
+	class BS_CORE_EXPORT PassParametersCore : public TPassParameters<true>
+	{
+	public:
+		static const UINT32 NUM_PARAMS;
+	};
 
 	/**
 	 * @brief	Material that controls how objects are rendered. It is represented by a shader and 

+ 3 - 0
BansheeCore/Source/BsMaterial.cpp

@@ -34,6 +34,9 @@ namespace BansheeEngine
 		Load_All	= 2
 	};
 
+	const UINT32 PassParameters::NUM_PARAMS = 6;
+	const UINT32 PassParametersCore::NUM_PARAMS = 6;
+	
 	SPtr<PassParametersCore> convertParamsToCore(const SPtr<PassParameters>& passParams)
 	{
 		SPtr<PassParametersCore> passParameters = bs_shared_ptr_new<PassParametersCore>();

+ 2 - 2
BansheeEngine/BansheeEngine.vcxproj

@@ -249,7 +249,7 @@
     <ClCompile Include="Source\BsCLight.cpp" />
     <ClCompile Include="Source\BsPlainText.cpp" />
     <ClCompile Include="Source\BsPlainTextImporter.cpp" />
-    <ClCompile Include="Source\BsRenderableController.cpp" />
+    <ClCompile Include="Source\BsRenderableHandler.cpp" />
     <ClCompile Include="Source\BsRenderable.cpp" />
     <ClCompile Include="Source\BsRenderer.cpp" />
     <ClCompile Include="Source\BsRenderQueue.cpp" />
@@ -345,7 +345,7 @@
     <ClInclude Include="Include\BsImageSprite.h" />
     <ClInclude Include="Include\BsProfilerOverlay.h" />
     <ClInclude Include="Include\BsRectOffset.h" />
-    <ClInclude Include="Include\BsRenderableController.h" />
+    <ClInclude Include="Include\BsRenderableHandler.h" />
     <ClInclude Include="Include\BsRenderQueue.h" />
     <ClInclude Include="Include\BsSceneManager.h" />
     <ClInclude Include="Include\BsGUIScrollArea.h" />

+ 6 - 6
BansheeEngine/BansheeEngine.vcxproj.filters

@@ -227,9 +227,6 @@
     <ClInclude Include="Include\BsDrawHelper.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="Include\BsRenderableController.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="Include\BsRenderableElement.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -347,6 +344,9 @@
     <ClInclude Include="Include\BsCGUIWidgetRTTI.h">
       <Filter>Header Files\RTTI</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsRenderableHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsGUIElement.cpp">
@@ -508,9 +508,6 @@
     <ClCompile Include="Source\BsDrawHelper.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="Source\BsRenderableController.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="Source\BsRenderer.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -592,5 +589,8 @@
     <ClCompile Include="Source\BsCGUIWidget.cpp">
       <Filter>Source Files\GUI</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsRenderableHandler.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 1 - 1
BansheeEngine/Include/BsPrerequisites.h

@@ -83,7 +83,7 @@ namespace BansheeEngine
 	class GUISliderHorz;
 	class GUIProgressBar;
 
-	class RenderableController;
+	class RenderableHandler;
 	class ProfilerOverlay;
 	class ProfilerOverlayInternal;
 	class DrawHelper;

+ 4 - 9
BansheeEngine/Include/BsRenderableController.h → BansheeEngine/Include/BsRenderableHandler.h

@@ -5,21 +5,16 @@
 namespace BansheeEngine
 {
 	/**
-	 * Abstract class that provides an interface for initializing
-	 * renderable elements of a certain type, along with their GPU
-	 * parameter buffers.
+	 * Abstract class that provides an interface for initializing renderable elements of a 
+	 * certain type, along with their GPU parameter buffers.
 	 *
 	 * Essentially this class holds all the information that is needed for rendering
 	 * an element of a certain renderable type.
-	 *
-	 * @note	e.g. elements that have shadows would have a RenderableLitShadowHandler
-	 *			and elements that can be animated would have RenderableAnimatedHandler,
-	 *			or a combination of the two.	
 	 */
-	class BS_EXPORT RenderableController
+	class BS_EXPORT RenderableHandler
 	{
 	public:
-		virtual ~RenderableController() {}
+		virtual ~RenderableHandler() {}
 
 		/**
 		 * @brief	Initializes the specified renderable element, making it ready

+ 2 - 2
BansheeEngine/Source/BsRenderableController.cpp → BansheeEngine/Source/BsRenderableHandler.cpp

@@ -1,11 +1,11 @@
-#include "BsRenderableController.h"
+#include "BsRenderableHandler.h"
 #include "BsGpuParams.h"
 #include "BsMaterial.h"
 #include "BsRenderableElement.h"
 
 namespace BansheeEngine
 {
-	void RenderableController::bindGlobalBuffers(const RenderableElement& element)
+	void RenderableHandler::bindGlobalBuffers(const RenderableElement& element)
 	{
 		for (auto& rendererBuffer : element.rendererBuffers)
 		{

+ 2 - 2
RenderBeast/Include/BsRenderBeast.h

@@ -25,7 +25,7 @@ namespace BansheeEngine
 	{
 		RenderableCore* renderable;
 		Vector<BeastRenderableElement> elements;
-		RenderableController* controller;
+		RenderableHandler* controller;
 	};
 
 	/**
@@ -248,7 +248,7 @@ namespace BansheeEngine
 
 		SPtr<RenderBeastOptions> mCoreOptions; // Core thread
 
-		LitTexRenderableController* mLitTexHandler;
+		StaticRenderableHandler* mStaticHandler;
 		SPtr<RenderBeastOptions> mOptions;
 		bool mOptionsDirty;
 	};

+ 1 - 1
RenderBeast/Include/BsRenderBeastPrerequisites.h

@@ -20,7 +20,7 @@
 
 namespace BansheeEngine
 {
-	class LitTexRenderableController;
+	class StaticRenderableHandler;
 	struct RenderBeastOptions;
 	struct PooledRenderTexture;
 	class RenderTargets;

+ 5 - 8
RenderBeast/Include/BsLitTexRenderableController.h → RenderBeast/Include/BsStaticRenderableHandler.h

@@ -1,7 +1,7 @@
 #pragma once
 
 #include "BsRenderBeastPrerequisites.h"
-#include "BsRenderableController.h"
+#include "BsRenderableHandler.h"
 #include "BsGpuParamDesc.h"
 #include "BsGpuParam.h"
 #include "BsRenderableElement.h"
@@ -9,13 +9,10 @@
 namespace BansheeEngine
 {
 	/**
-	 * @brief	Renderer handler that manages initializing, updating
-	 *			and rendering of renderable objects with a single texture
-	 *			and a single light.
-	 *
-	 * @note	This class is DEBUG ONLY. Until a better renderer is complete.
+	 * @brief	Renderable handler that manages initializing, updating and 
+	 * 			rendering of static renderable objects.
 	 */
-	class BS_BSRND_EXPORT LitTexRenderableController : public RenderableController
+	class BS_BSRND_EXPORT StaticRenderableHandler : public RenderableHandler
 	{
 	public:
 		/**
@@ -28,7 +25,7 @@ namespace BansheeEngine
 			Vector<RenderableElement::BufferBindInfo> perObjectBuffers;
 		};
 
-		LitTexRenderableController();
+		StaticRenderableHandler();
 
 		/**
 		 * @copydoc	RenderableController::initializeRenderElem

+ 2 - 2
RenderBeast/RenderBeast.vcxproj

@@ -239,7 +239,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClInclude Include="Include\BsLitTexRenderableController.h" />
+    <ClInclude Include="Include\BsStaticRenderableHandler.h" />
     <ClInclude Include="Include\BsRenderBeast.h" />
     <ClInclude Include="Include\BsRenderBeastFactory.h" />
     <ClInclude Include="Include\BsRenderBeastPrerequisites.h" />
@@ -249,7 +249,7 @@
     <ClInclude Include="Include\BsSamplerOverrides.h" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="Source\BsLitTexRenderableController.cpp" />
+    <ClCompile Include="Source\BsStaticRenderableHandler.cpp" />
     <ClCompile Include="Source\BsRenderBeast.cpp" />
     <ClCompile Include="Source\BsRenderBeastFactory.cpp" />
     <ClCompile Include="Source\BsRenderBeastPlugin.cpp" />

+ 6 - 6
RenderBeast/RenderBeast.vcxproj.filters

@@ -15,9 +15,6 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="Include\BsLitTexRenderableController.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="Include\BsRenderTexturePool.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -39,11 +36,11 @@
     <ClInclude Include="Include\BsRenderTargets.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsStaticRenderableHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="Source\BsLitTexRenderableController.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="Source\BsRenderTexturePool.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -62,5 +59,8 @@
     <ClCompile Include="Source\BsRenderTargets.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsStaticRenderableHandler.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 15 - 41
RenderBeast/Source/BsRenderBeast.cpp

@@ -23,7 +23,7 @@
 #include "BsHardwareBufferManager.h"
 #include "BsGpuParamBlockBuffer.h"
 #include "BsShader.h"
-#include "BsLitTexRenderableController.h"
+#include "BsStaticRenderableHandler.h"
 #include "BsTime.h"
 #include "BsRenderableElement.h"
 #include "BsFrameAlloc.h"
@@ -38,7 +38,7 @@ using namespace std::placeholders;
 namespace BansheeEngine
 {
 	RenderBeast::RenderBeast()
-		:mOptions(bs_shared_ptr_new<RenderBeastOptions>()), mOptionsDirty(true)
+		:mOptions(bs_shared_ptr_new<RenderBeastOptions>()), mOptionsDirty(true), mStaticHandler(nullptr)
 	{
 
 	}
@@ -67,7 +67,7 @@ namespace BansheeEngine
 	void RenderBeast::initializeCore()
 	{
 		mCoreOptions = bs_shared_ptr_new<RenderBeastOptions>();
-		mLitTexHandler = bs_new<LitTexRenderableController>();
+		mStaticHandler = bs_new<StaticRenderableHandler>();
 
 		RenderTexturePool::startUp();
 
@@ -77,8 +77,8 @@ namespace BansheeEngine
 
 	void RenderBeast::destroyCore()
 	{
-		if (mLitTexHandler != nullptr)
-			bs_delete(mLitTexHandler);
+		if (mStaticHandler != nullptr)
+			bs_delete(mStaticHandler);
 
 		mRenderTargets.clear();
 		mCameraData.clear();
@@ -105,7 +105,7 @@ namespace BansheeEngine
 		renderableData.renderable = renderable;
 
 		if (renderable->getRenderableType() == RenType_LitTextured)
-			renderableData.controller = mLitTexHandler;
+			renderableData.controller = mStaticHandler;
 		else
 			renderableData.controller = nullptr;
 
@@ -316,7 +316,7 @@ namespace BansheeEngine
 		refreshSamplerOverrides();
 
 		// Update global per-frame hardware buffers
-		mLitTexHandler->updatePerFrameBuffers(time);
+		mStaticHandler->updatePerFrameBuffers(time);
 
 		// Sort cameras by render target
 		for (auto& cameraData : mCameraData)
@@ -410,7 +410,7 @@ namespace BansheeEngine
 		for (auto& renderableData : mRenderables)
 		{
 			RenderableCore* renderable = renderableData.renderable;
-			RenderableController* controller = renderableData.controller;
+			RenderableHandler* controller = renderableData.controller;
 			UINT32 renderableType = renderable->getRenderableType();
 			UINT32 rendererId = renderable->getRendererId();
 
@@ -476,7 +476,7 @@ namespace BansheeEngine
 		// Render opaque
 
 		//// Update global per-frame hardware buffers
-		mLitTexHandler->updatePerCameraBuffers(camera.getForward());
+		mStaticHandler->updatePerCameraBuffers(camera.getForward());
 
 		const Vector<RenderQueueElement>& opaqueElements = cameraData.opaqueQueue->getSortedElements();
 		for(auto iter = opaqueElements.begin(); iter != opaqueElements.end(); ++iter)
@@ -487,22 +487,9 @@ namespace BansheeEngine
 			UINT32 rendererId = renderElem->renderableId;
 			Matrix4 worldViewProjMatrix = viewProjMatrix * mWorldTransforms[rendererId];
 
-			mLitTexHandler->bindPerObjectBuffers(*renderElem);
-			mLitTexHandler->updatePerObjectBuffers(*renderElem, worldViewProjMatrix);
-
-			// TODO - Updating material buffers here is wrong - especially once per pass since elements are interated per-pass already
-			UINT32 numPasses = renderElem->material->getNumPasses();
-			for (UINT32 i = 0; i < numPasses; i++)
-			{
-				SPtr<PassParametersCore> passParams = renderElem->material->getPassParameters(i);
-
-				for (UINT32 j = 0; j < PassParametersCore::NUM_PARAMS; j++)
-				{
-					SPtr<GpuParamsCore> params = passParams->getParamByIdx(j);
-					if (params != nullptr)
-						params->updateHardwareBuffers();
-				}
-			}
+			mStaticHandler->updatePerObjectBuffers(*renderElem, worldViewProjMatrix);
+			mStaticHandler->bindGlobalBuffers(*renderElem); // Note: If I can keep global buffer slot indexes the same between shaders I could only bind these once
+			mStaticHandler->bindPerObjectBuffers(*renderElem);
 
 			if (iter->applyPass)
 			{
@@ -532,22 +519,9 @@ namespace BansheeEngine
 			UINT32 rendererId = renderElem->renderableId;
 			Matrix4 worldViewProjMatrix = viewProjMatrix * mWorldTransforms[rendererId];
 
-			mLitTexHandler->bindPerObjectBuffers(*renderElem);
-			mLitTexHandler->updatePerObjectBuffers(*renderElem, worldViewProjMatrix);
-
-			// TODO - Updating material buffers here is wrong - especially once per pass since elements are interated per-pass already
-			UINT32 numPasses = renderElem->material->getNumPasses();
-			for (UINT32 i = 0; i < numPasses; i++)
-			{
-				SPtr<PassParametersCore> passParams = material->getPassParameters(i);
-
-				for (UINT32 j = 0; j < PassParametersCore::NUM_PARAMS; j++)
-				{
-					SPtr<GpuParamsCore> params = passParams->getParamByIdx(j);
-					if (params != nullptr)
-						params->updateHardwareBuffers();
-				}
-			}
+			mStaticHandler->updatePerObjectBuffers(*renderElem, worldViewProjMatrix);
+			mStaticHandler->bindGlobalBuffers(*renderElem); // Note: If I can keep global buffer slot indexes the same between shaders I could only bind these once
+			mStaticHandler->bindPerObjectBuffers(*renderElem);
 
 			if (iter->applyPass)
 			{

+ 8 - 10
RenderBeast/Source/BsLitTexRenderableController.cpp → RenderBeast/Source/BsStaticRenderableHandler.cpp

@@ -1,4 +1,4 @@
-#include "BsLitTexRenderableController.h"
+#include "BsStaticRenderableHandler.h"
 #include "BsShader.h"
 #include "BsGpuParams.h"
 #include "BsRenderBeast.h"
@@ -11,7 +11,7 @@
 
 namespace BansheeEngine
 {
-	LitTexRenderableController::LitTexRenderableController()
+	StaticRenderableHandler::StaticRenderableHandler()
 	{
 		defaultShader = createDefaultShader();
 
@@ -150,7 +150,7 @@ namespace BansheeEngine
 		staticParams->updateHardwareBuffers();
 	}
 
-	void LitTexRenderableController::initializeRenderElem(RenderableElement& element)
+	void StaticRenderableHandler::initializeRenderElem(RenderableElement& element)
 	{
 		static auto paramsMatch = [](const GpuParamDataDesc& a, const GpuParamDataDesc& b)
 		{
@@ -272,11 +272,9 @@ namespace BansheeEngine
 				}
 			}
 		}
-
-		bindGlobalBuffers(element);
 	}
 
-	void LitTexRenderableController::bindPerObjectBuffers(const RenderableElement& element)
+	void StaticRenderableHandler::bindPerObjectBuffers(const RenderableElement& element)
 	{
 		const PerObjectData* rendererData = any_cast_unsafe<PerObjectData>(&element.rendererData);
 		for (auto& perObjectBuffer : rendererData->perObjectBuffers)
@@ -287,28 +285,28 @@ namespace BansheeEngine
 		}
 	}
 
-	void LitTexRenderableController::updatePerFrameBuffers(float time)
+	void StaticRenderableHandler::updatePerFrameBuffers(float time)
 	{
 		timeParam.set(time);
 
 		perFrameParams->updateHardwareBuffers();
 	}
 
-	void LitTexRenderableController::updatePerCameraBuffers(const Vector3& viewDir)
+	void StaticRenderableHandler::updatePerCameraBuffers(const Vector3& viewDir)
 	{
 		viewDirParam.set(viewDir);
 
 		perCameraParams->updateHardwareBuffers();
 	}
 
-	void LitTexRenderableController::updatePerObjectBuffers(RenderableElement& element, const Matrix4& wvpMatrix)
+	void StaticRenderableHandler::updatePerObjectBuffers(RenderableElement& element, const Matrix4& wvpMatrix)
 	{
 		PerObjectData* rendererData = any_cast_unsafe<PerObjectData>(&element.rendererData);
 
 		rendererData->wvpParam.set(wvpMatrix);
 	}
 
-	SPtr<ShaderCore> LitTexRenderableController::createDefaultShader()
+	SPtr<ShaderCore> StaticRenderableHandler::createDefaultShader()
 	{
 		StringID rsName = RenderAPICore::instance().getName();
 

+ 0 - 7
TODOExperimentation.txt

@@ -25,13 +25,6 @@ Rendering procedure should be:
  - Resolve scene color to frame buffer (they could be the same target if no MSAA is used, and gamma correction is properly set)
  - After rendering is done make sure to clear the queues so I don't hold invalid references
 
-Reduce state switching:
- - Extend render queues so they compare material hash values and sort accordingly
- - Add a flag that allows me to control whether the queue should prefer distance sort or material sort
- - Extend entries output from render queue with a flag that signals that a material should be re-applied
- - When rendering only apply new shaders & states when that flag is encountered
- - Switch buffers, textures and sampler for each renderable (possibly ignoring static/per-frame/per-camera ones)
-
 Store RenderTargets per camera
  - Only create it if camera is rendering some renderables
  - If none are rendered clear the reference to free the targets