Browse Source

Throttle 1 reflection render per frame

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
7596e1eadb
2 changed files with 16 additions and 10 deletions
  1. 4 2
      include/anki/renderer/Ir.h
  2. 12 8
      src/renderer/Ir.cpp

+ 4 - 2
include/anki/renderer/Ir.h

@@ -69,7 +69,8 @@ private:
 		Timestamp m_timestamp = 0; ///< When last rendered.
 		Timestamp m_timestamp = 0; ///< When last rendered.
 	};
 	};
 
 
-	static const U IRRADIANCE_SIZE = 32;
+	static const U IRRADIANCE_TEX_SIZE = 32;
+	static const U MAX_PROBE_RENDERS_PER_FRAME = 1;
 
 
 	Renderer m_nestedR;
 	Renderer m_nestedR;
 	TexturePtr m_envCubemapArr;
 	TexturePtr m_envCubemapArr;
@@ -93,7 +94,8 @@ private:
 	/// Bin probes in clusters.
 	/// Bin probes in clusters.
 	void binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx);
 	void binProbes(U32 threadId, PtrSize threadsCount, IrRunContext& ctx);
 
 
-	ANKI_USE_RESULT Error tryRender(RenderingContext& ctx, SceneNode& node);
+	ANKI_USE_RESULT Error tryRender(
+		RenderingContext& ctx, SceneNode& node, U& probesRendered);
 
 
 	void binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const;
 	void binProbe(U probeIdx, IrRunContext& ctx, IrTaskContext& task) const;
 
 

+ 12 - 8
src/renderer/Ir.cpp

@@ -89,8 +89,8 @@ Error Ir::init(const ConfigSet& config)
 
 
 	m_envCubemapArr = getGrManager().newInstance<Texture>(texinit);
 	m_envCubemapArr = getGrManager().newInstance<Texture>(texinit);
 
 
-	texinit.m_width = IRRADIANCE_SIZE;
-	texinit.m_height = IRRADIANCE_SIZE;
+	texinit.m_width = IRRADIANCE_TEX_SIZE;
+	texinit.m_height = IRRADIANCE_TEX_SIZE;
 	m_irradianceCubemapArr = getGrManager().newInstance<Texture>(texinit);
 	m_irradianceCubemapArr = getGrManager().newInstance<Texture>(texinit);
 
 
 	m_cubemapArrMipCount = computeMaxMipmapCount(m_fbSize, m_fbSize);
 	m_cubemapArrMipCount = computeMaxMipmapCount(m_fbSize, m_fbSize);
@@ -101,7 +101,8 @@ Error Ir::init(const ConfigSet& config)
 	// Clear the textures
 	// Clear the textures
 	CommandBufferInitInfo cinf;
 	CommandBufferInitInfo cinf;
 	CommandBufferPtr cmdb = getGrManager().newInstance<CommandBuffer>(cinf);
 	CommandBufferPtr cmdb = getGrManager().newInstance<CommandBuffer>(cinf);
-	U irrMipCount = computeMaxMipmapCount(IRRADIANCE_SIZE, IRRADIANCE_SIZE);
+	U irrMipCount =
+		computeMaxMipmapCount(IRRADIANCE_TEX_SIZE, IRRADIANCE_TEX_SIZE);
 	ClearValue clear;
 	ClearValue clear;
 	for(U i = 0; i < m_cubemapArrSize; ++i)
 	for(U i = 0; i < m_cubemapArrSize; ++i)
 	{
 	{
@@ -143,7 +144,7 @@ Error Ir::initIrradiance()
 {
 {
 	// Create the shader
 	// Create the shader
 	StringAuto pps(getFrameAllocator());
 	StringAuto pps(getFrameAllocator());
-	pps.sprintf("#define CUBEMAP_SIZE %u\n", IRRADIANCE_SIZE);
+	pps.sprintf("#define CUBEMAP_SIZE %u\n", IRRADIANCE_TEX_SIZE);
 
 
 	ANKI_CHECK(getResourceManager().loadResourceToCache(m_computeIrradianceFrag,
 	ANKI_CHECK(getResourceManager().loadResourceToCache(m_computeIrradianceFrag,
 		"shaders/Irradiance.frag.glsl",
 		"shaders/Irradiance.frag.glsl",
@@ -189,11 +190,12 @@ Error Ir::run(RenderingContext& rctx)
 	const VisibleNode* end =
 	const VisibleNode* end =
 		visRez.getEnd(VisibilityGroupType::REFLECTION_PROBES);
 		visRez.getEnd(VisibilityGroupType::REFLECTION_PROBES);
 
 
+	U probesRendered = 0;
 	U probeIdx = 0;
 	U probeIdx = 0;
 	while(it != end)
 	while(it != end)
 	{
 	{
 		// Write and render probe
 		// Write and render probe
-		ANKI_CHECK(tryRender(rctx, *it->m_node));
+		ANKI_CHECK(tryRender(rctx, *it->m_node, probesRendered));
 
 
 		++it;
 		++it;
 		++probeIdx;
 		++probeIdx;
@@ -207,7 +209,7 @@ Error Ir::run(RenderingContext& rctx)
 }
 }
 
 
 //==============================================================================
 //==============================================================================
-Error Ir::tryRender(RenderingContext& ctx, SceneNode& node)
+Error Ir::tryRender(RenderingContext& ctx, SceneNode& node, U& probesRendered)
 {
 {
 	ReflectionProbeComponent& reflc =
 	ReflectionProbeComponent& reflc =
 		node.getComponent<ReflectionProbeComponent>();
 		node.getComponent<ReflectionProbeComponent>();
@@ -219,8 +221,10 @@ Error Ir::tryRender(RenderingContext& ctx, SceneNode& node)
 	// Write shader var
 	// Write shader var
 	reflc.setTextureArrayIndex(entry);
 	reflc.setTextureArrayIndex(entry);
 
 
-	if(reflc.getMarkedForRendering())
+	if(reflc.getMarkedForRendering()
+		&& probesRendered < MAX_PROBE_RENDERS_PER_FRAME)
 	{
 	{
+		++probesRendered;
 		reflc.setMarkedForRendering(false);
 		reflc.setMarkedForRendering(false);
 		ANKI_CHECK(renderReflection(ctx, node, reflc, entry));
 		ANKI_CHECK(renderReflection(ctx, node, reflc, entry));
 	}
 	}
@@ -275,7 +279,7 @@ Error Ir::renderReflection(RenderingContext& ctx,
 	}
 	}
 
 
 	// Compute irradiance
 	// Compute irradiance
-	cmdb->setViewport(0, 0, IRRADIANCE_SIZE, IRRADIANCE_SIZE);
+	cmdb->setViewport(0, 0, IRRADIANCE_TEX_SIZE, IRRADIANCE_TEX_SIZE);
 	for(U i = 0; i < 6; ++i)
 	for(U i = 0; i < 6; ++i)
 	{
 	{
 		DynamicBufferInfo dinf;
 		DynamicBufferInfo dinf;