Explorar o código

Some more parallelization of the renderer

Panagiotis Christopoulos Charitos %!s(int64=10) %!d(string=hai) anos
pai
achega
48df46dd35

+ 1 - 0
include/anki/core/Trace.h

@@ -36,6 +36,7 @@ enum class TraceEventType
 	RENDER_SM,
 	RENDER_IR,
 	RENDER_DRAWER,
+	RENDERER_COMMAND_BUFFER_BUILDING,
 	GL_THREAD,
 	SWAP_BUFFERS,
 

+ 4 - 4
include/anki/renderer/Is.h

@@ -48,7 +48,10 @@ anki_internal:
 
 	ANKI_USE_RESULT Error init(const ConfigSet& initializer);
 
-	ANKI_USE_RESULT Error run(RenderingContext& ctx);
+	/// Populate light buffers.
+	ANKI_USE_RESULT Error populateBuffers(RenderingContext& ctx);
+
+	void run(RenderingContext& ctx);
 
 	TexturePtr getRt() const
 	{
@@ -124,9 +127,6 @@ private:
 	/// Called by init
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 
-	/// Do the actual pass
-	ANKI_USE_RESULT Error lightPass(RenderingContext& ctx);
-
 	/// Prepare GL for rendering
 	void setState(CommandBufferPtr& cmdBuff);
 

+ 1 - 2
include/anki/renderer/Renderer.h

@@ -428,8 +428,7 @@ private:
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 
-	ANKI_USE_RESULT Error buildCommandBuffersSmMs(RenderingContext& ctx);
-	ANKI_USE_RESULT Error buildCommandBuffersFs(RenderingContext& ctx);
+	ANKI_USE_RESULT Error buildCommandBuffers(RenderingContext& ctx);
 };
 /// @}
 

+ 1 - 0
src/core/Trace.cpp

@@ -28,6 +28,7 @@ static Array<const char*, U(TraceEventType::COUNT)> eventNames = {
 		"RENDER_SM",
 		"RENDER_IR",
 		"RENDER_DRAWER",
+		"RENDERER_COMMAND_BUFFER_BUILDING",
 		"GL_THREAD",
 		"SWAP_BUFFERS"}};
 

+ 6 - 13
src/renderer/Is.cpp

@@ -476,7 +476,7 @@ Error Is::initInternal(const ConfigSet& config)
 }
 
 //==============================================================================
-Error Is::lightPass(RenderingContext& ctx)
+Error Is::populateBuffers(RenderingContext& ctx)
 {
 	ANKI_TRACE_START_EVENT(RENDER_IS);
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
@@ -592,18 +592,9 @@ Error Is::lightPass(RenderingContext& ctx)
 	// Update uniforms
 	updateCommonBlock(*m_frc);
 
-	// In the meantime set the state
-	setState(cmdb);
-
 	// Sync
 	ANKI_CHECK(threadPool.waitForAllThreadsToFinish());
 
-	//
-	// Draw
-	//
-	cmdb->drawArrays(4, m_r->getTileCount());
-	cmdb->endRenderPass();
-
 	ANKI_TRACE_STOP_EVENT(RENDER_IS);
 	return ErrorCode::NONE;
 }
@@ -983,10 +974,12 @@ void Is::setState(CommandBufferPtr& cmdb)
 }
 
 //==============================================================================
-Error Is::run(RenderingContext& ctx)
+void Is::run(RenderingContext& ctx)
 {
-	// Do the light pass including the shadow passes
-	return lightPass(ctx);
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+	setState(cmdb);
+	cmdb->drawArrays(4, m_r->getTileCount());
+	cmdb->endRenderPass();
 }
 
 //==============================================================================

+ 14 - 35
src/renderer/Renderer.cpp

@@ -167,7 +167,7 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_lf.reset(m_alloc.newInstance<Lf>(this));
 	ANKI_CHECK(m_lf->init(config));
 
-	if(config.getNumber("ssao.enabled"))
+	if(config.getNumber("ssao.enabled") && config.getNumber("pps.enabled"))
 	{
 		m_ssao.reset(m_alloc.newInstance<Ssao>(this));
 		ANKI_CHECK(m_ssao->init(config));
@@ -247,7 +247,9 @@ Error Renderer::render(RenderingContext& ctx)
 		ANKI_CHECK(m_ir->run(ctx));
 	}
 
-	ANKI_CHECK(buildCommandBuffersSmMs(ctx));
+	ANKI_CHECK(m_is->populateBuffers(ctx));
+
+	ANKI_CHECK(buildCommandBuffers(ctx));
 
 	if(m_sm)
 	{
@@ -258,12 +260,12 @@ Error Renderer::render(RenderingContext& ctx)
 	m_lf->runOcclusionTests(ctx);
 	cmdb->endRenderPass();
 
-	ANKI_CHECK(m_is->run(ctx));
+	m_is->run(ctx);
 
 	cmdb->generateMipmaps(m_ms->getDepthRt());
 	cmdb->generateMipmaps(m_ms->getRt2());
 
-	ANKI_CHECK(buildCommandBuffersFs(ctx));
+	//ANKI_CHECK(buildCommandBuffersFs(ctx));
 	m_fs->run(ctx);
 	m_lf->run(ctx);
 	m_vol->run(ctx);
@@ -405,14 +407,17 @@ Bool Renderer::doGpuVisibilityTest(
 }
 
 //==============================================================================
-Error Renderer::buildCommandBuffersSmMs(RenderingContext& ctx)
+Error Renderer::buildCommandBuffers(RenderingContext& ctx)
 {
+	ANKI_TRACE_START_EVENT(RENDERER_COMMAND_BUFFER_BUILDING);
+
 	// Prepare
 	m_ms->prepareBuildCommandBuffers(ctx);
 	if(m_sm)
 	{
 		m_sm->prepareBuildCommandBuffers(ctx);
 	}
+	m_fs->prepareBuildCommandBuffers(ctx);
 
 	// Build
 	class Task : public ThreadPool::Task
@@ -432,35 +437,6 @@ Error Renderer::buildCommandBuffersSmMs(RenderingContext& ctx)
 					*m_ctx, threadId, threadsCount));
 			}
 
-			return ErrorCode::NONE;
-		}
-	};
-
-	ThreadPool& threadPool = getThreadPool();
-	Task task;
-	task.m_r = this;
-	task.m_ctx = &ctx;
-	for(U i = 0; i < threadPool.getThreadsCount(); i++)
-	{
-		threadPool.assignNewTask(i, &task);
-	}
-
-	return threadPool.waitForAllThreadsToFinish();
-}
-
-//==============================================================================
-Error Renderer::buildCommandBuffersFs(RenderingContext& ctx)
-{
-	m_fs->prepareBuildCommandBuffers(ctx);
-
-	class Task : public ThreadPool::Task
-	{
-	public:
-		Renderer* m_r ANKI_DBG_NULLIFY_PTR;
-		RenderingContext* m_ctx ANKI_DBG_NULLIFY_PTR;
-
-		Error operator()(U32 threadId, PtrSize threadsCount)
-		{
 			ANKI_CHECK(m_r->getFs().buildCommandBuffers(
 				*m_ctx, threadId, threadsCount));
 
@@ -477,7 +453,10 @@ Error Renderer::buildCommandBuffersFs(RenderingContext& ctx)
 		threadPool.assignNewTask(i, &task);
 	}
 
-	return threadPool.waitForAllThreadsToFinish();
+	Error err = threadPool.waitForAllThreadsToFinish();
+	ANKI_TRACE_STOP_EVENT(RENDERER_COMMAND_BUFFER_BUILDING);
+
+	return err;
 }
 
 } // end namespace anki

+ 1 - 1
testapp/Main.cpp

@@ -10,7 +10,7 @@
 
 using namespace anki;
 
-#define PLAYER 1
+#define PLAYER 0
 #define MOUSE 1
 
 class MyApp : public App