浏览代码

Rendergraph fixes

Panagiotis Christopoulos Charitos 8 年之前
父节点
当前提交
49aec73b84
共有 3 个文件被更改,包括 29 次插入35 次删除
  1. 23 26
      src/anki/renderer/ForwardShading.cpp
  2. 2 2
      src/anki/renderer/Renderer.cpp
  3. 4 7
      src/anki/renderer/ShadowMapping.cpp

+ 23 - 26
src/anki/renderer/ForwardShading.cpp

@@ -154,35 +154,32 @@ void ForwardShading::run(
 	PtrSize start, end;
 	ThreadPoolTask::choseStartEnd(threadId, threadCount, problemSize, start, end);
 
-	if(start == end)
+	if(start != end)
 	{
-		// Early exit
-		return;
+		const LightShadingResources& rsrc = m_r->getLightShading().getResources();
+		cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
+		cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getShadowMapping().getShadowmapRt()));
+		bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
+		bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
+		bindUniforms(cmdb, 0, 2, rsrc.m_spotLightsToken);
+		bindStorage(cmdb, 0, 0, rsrc.m_clustersToken);
+		bindStorage(cmdb, 0, 1, rsrc.m_lightIndicesToken);
+
+		cmdb->setViewport(0, 0, m_width, m_height);
+		cmdb->setBlendFactors(
+			0, BlendFactor::ONE_MINUS_SRC_ALPHA, BlendFactor::SRC_ALPHA, BlendFactor::DST_ALPHA, BlendFactor::ZERO);
+		cmdb->setBlendOperation(0, BlendOperation::ADD);
+		cmdb->setDepthWrite(false);
+
+		// Start drawing
+		m_r->getSceneDrawer().drawRange(Pass::GB_FS,
+			ctx.m_renderQueue->m_viewMatrix,
+			ctx.m_viewProjMatJitter,
+			cmdb,
+			ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + start,
+			ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + end);
 	}
 
-	const LightShadingResources& rsrc = m_r->getLightShading().getResources();
-	cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
-	cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getShadowMapping().getShadowmapRt()));
-	bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
-	bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
-	bindUniforms(cmdb, 0, 2, rsrc.m_spotLightsToken);
-	bindStorage(cmdb, 0, 0, rsrc.m_clustersToken);
-	bindStorage(cmdb, 0, 1, rsrc.m_lightIndicesToken);
-
-	cmdb->setViewport(0, 0, m_width, m_height);
-	cmdb->setBlendFactors(
-		0, BlendFactor::ONE_MINUS_SRC_ALPHA, BlendFactor::SRC_ALPHA, BlendFactor::DST_ALPHA, BlendFactor::ZERO);
-	cmdb->setBlendOperation(0, BlendOperation::ADD);
-	cmdb->setDepthWrite(false);
-
-	// Start drawing
-	m_r->getSceneDrawer().drawRange(Pass::GB_FS,
-		ctx.m_renderQueue->m_viewMatrix,
-		ctx.m_viewProjMatJitter,
-		cmdb,
-		ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + start,
-		ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + end);
-
 	if(threadId == threadCount - 1)
 	{
 		drawVolumetric(ctx, cmdb, rgraph);

+ 2 - 2
src/anki/renderer/Renderer.cpp

@@ -239,8 +239,6 @@ Error Renderer::populateRenderGraph(RenderingContext& ctx)
 	}
 
 	// Populate render graph. WARNING Watch the order
-	ANKI_CHECK(m_lightShading->binLights(ctx));
-
 	m_shadowMapping->populateRenderGraph(ctx);
 	m_indirect->populateRenderGraph(ctx);
 	m_gbuffer->populateRenderGraph(ctx);
@@ -262,6 +260,8 @@ Error Renderer::populateRenderGraph(RenderingContext& ctx)
 
 	m_finalComposite->populateRenderGraph(ctx);
 
+	ANKI_CHECK(m_lightShading->binLights(ctx));
+
 	return Error::NONE;
 }
 

+ 4 - 7
src/anki/renderer/ShadowMapping.cpp

@@ -400,7 +400,8 @@ void ShadowMapping::processLights(RenderingContext& ctx, U32& threadCountForScra
 		U lightToRenderDrawcallCount = lightToRender->m_drawcallCount;
 		const LightToRenderToScratchInfo* lightToRenderEnd = lightsToRender.getEnd();
 
-		const U threadCount = m_r->getThreadPool().getThreadsCount();
+		const U threadCount = computeNumberOfSecondLevelCommandBuffers(drawcallCount);
+		threadCountForScratchPass = threadCount;
 		for(U taskId = 0; taskId < threadCount; ++taskId)
 		{
 			PtrSize start, end;
@@ -408,11 +409,7 @@ void ShadowMapping::processLights(RenderingContext& ctx, U32& threadCountForScra
 
 			// While there are drawcalls in this task emit new work items
 			U taskDrawcallCount = end - start;
-
-			if(taskDrawcallCount)
-			{
-				threadCountForScratchPass = taskId + 1;
-			}
+			ANKI_ASSERT(taskDrawcallCount > 0 && "Because we used computeNumberOfSecondLevelCommandBuffers()");
 
 			while(taskDrawcallCount)
 			{
@@ -481,7 +478,7 @@ void ShadowMapping::newScratchAndEsmResloveRenderWorkItems(U32 tileIdx,
 		Array<U32, 4> viewport;
 		viewport[0] = scratchTileIdx * m_scratchTileResolution;
 		viewport[1] = 0;
-		viewport[2] = viewport[0] + m_scratchTileResolution;
+		viewport[2] = m_scratchTileResolution;
 		viewport[3] = m_scratchTileResolution;
 
 		LightToRenderToScratchInfo toRender = {