Browse Source

Rendergraph fixes and refactoring

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
628cc84ed9

+ 2 - 0
src/anki/gr/RenderGraph.cpp

@@ -754,6 +754,8 @@ void RenderGraph::runSecondLevel(U32 threadIdx) const
 			// TODO Inform about texture usage
 			ANKI_ASSERT(p.m_secondLevelCmdbs[threadIdx].isCreated());
 			p.m_callback(p.m_userData, p.m_secondLevelCmdbs[threadIdx], threadIdx, size, *this);
+
+			p.m_secondLevelCmdbs[threadIdx]->flush();
 		}
 	}
 }

+ 3 - 3
src/anki/renderer/Bloom.cpp

@@ -152,7 +152,7 @@ void Bloom::runExposure(const RenderGraph& rgraph, CommandBufferPtr& cmdb)
 
 	cmdb->bindStorageBuffer(0, 0, rgraph.getBuffer(m_r->getTonemapping().getAverageLuminanceBuffer()), 0, MAX_PTR_SIZE);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Bloom::runUpscaleAndSslf(const RenderGraph& rgraph, CommandBufferPtr& cmdb)
@@ -161,13 +161,13 @@ void Bloom::runUpscaleAndSslf(const RenderGraph& rgraph, CommandBufferPtr& cmdb)
 	cmdb->setViewport(0, 0, m_upscale.m_width, m_upscale.m_height);
 	cmdb->bindShaderProgram(m_upscale.m_grProg);
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_exposureRt));
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 
 	// SSLF
 	cmdb->bindShaderProgram(m_sslf.m_grProg);
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ONE);
 	cmdb->bindTexture(0, 1, m_sslf.m_lensDirtTex->getGrTexture());
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 
 	// Retore state
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);

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

@@ -116,7 +116,7 @@ void DepthDownscale::runHalf(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
 	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 
 	// Restore state
 	cmdb->setDepthCompareOperation(CompareOperation::LESS);
@@ -128,7 +128,7 @@ void DepthDownscale::runQuarter(CommandBufferPtr& cmdb, const RenderGraph& rgrap
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_halfColorRt));
 	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void DepthDownscale::populateRenderGraph(RenderingContext& ctx)

+ 1 - 1
src/anki/renderer/DownscaleBlur.cpp

@@ -97,7 +97,7 @@ void DownscaleBlur::run(const RenderGraph& rgraph, CommandBufferPtr& cmdb)
 	const Subpass& pass = m_passes[passIdx];
 	cmdb->setViewport(0, 0, pass.m_width, pass.m_height);
 	cmdb->bindShaderProgram(m_grProg);
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void DownscaleBlur::populateRenderGraph(RenderingContext& ctx)

+ 1 - 1
src/anki/renderer/FinalComposite.cpp

@@ -141,7 +141,7 @@ void FinalComposite::run(const RenderingContext& ctx, const RenderGraph& rgraph,
 	cmdb->setViewport(0, 0, width, height);
 
 	cmdb->bindShaderProgram(m_grProgs[dbgEnabled]);
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void FinalComposite::populateRenderGraph(RenderingContext& ctx)

+ 3 - 3
src/anki/renderer/ForwardShading.cpp

@@ -115,7 +115,7 @@ void ForwardShading::drawVolumetric(RenderingContext& ctx, CommandBufferPtr& cmd
 	cmdb->bindTexture(0, 2, rgraph.getTexture(m_r->getVolumetric().getRt()));
 	cmdb->bindTexture(0, 3, m_vol.m_noiseTex->getGrTexture());
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 
 	// Restore state
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
@@ -141,7 +141,7 @@ void ForwardShading::drawUpscale(const RenderingContext& ctx, const RenderGraph&
 	cmdb->bindShaderProgram(m_upscale.m_grProg);
 	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 
 	// Restore state
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
@@ -163,7 +163,7 @@ void ForwardShading::run(
 	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_commonToken);
+	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);

+ 1 - 1
src/anki/renderer/Indirect.cpp

@@ -584,7 +584,7 @@ void Indirect::runIrradiance(CommandBufferPtr& cmdb, const RenderGraph& rgraph,
 	faceIdxArrayIdx->y() = cacheEntryIdx;
 
 	// Draw
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Indirect::populateRenderGraph(RenderingContext& rctx)

+ 0 - 1
src/anki/renderer/LightBin.h

@@ -20,7 +20,6 @@ class LightBinContext;
 class LightBinOut
 {
 public:
-	StagingGpuMemoryToken m_commonToken;
 	StagingGpuMemoryToken m_pointLightsToken;
 	StagingGpuMemoryToken m_spotLightsToken;
 	StagingGpuMemoryToken m_probesToken;

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

@@ -115,7 +115,7 @@ Error LightShading::binLights(RenderingContext& ctx)
 		ctx.m_renderQueue->m_viewProjectionMatrix,
 		ctx.m_renderQueue->m_cameraTransform,
 		*ctx.m_renderQueue,
-		getFrameAllocator(),
+		ctx.m_tempAllocator,
 		m_maxLightIds,
 		true,
 		m_runCtx.m_resources));
@@ -144,7 +144,7 @@ void LightShading::run(const RenderingContext& ctx, const RenderGraph& rgraph, C
 	cmdb->bindTexture(0, 4, (rsrc.m_diffDecalTex) ? rsrc.m_diffDecalTex : m_r->getDummyTexture());
 	cmdb->bindTexture(0, 5, (rsrc.m_normRoughnessDecalTex) ? rsrc.m_normRoughnessDecalTex : m_r->getDummyTexture());
 
-	bindUniforms(cmdb, 0, 0, rsrc.m_commonToken);
+	bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
 	bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
 	bindUniforms(cmdb, 0, 2, rsrc.m_spotLightsToken);
 	bindUniforms(cmdb, 0, 3, rsrc.m_probesToken);

+ 1 - 1
src/anki/renderer/MainRenderer.cpp

@@ -157,7 +157,7 @@ void MainRenderer::runBlit(const RenderGraph& rgraph, CommandBufferPtr& cmdb)
 	cmdb->bindShaderProgram(m_blitGrProg);
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getFinalComposite().getRt()));
 
-	m_r->drawQuad(cmdb);
+	cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 3, 1);
 }
 
 Dbg& MainRenderer::getDbg()

+ 0 - 11
src/anki/renderer/Renderer.h

@@ -205,17 +205,6 @@ anki_internal:
 	static Vec3 unproject(
 		const Vec3& windowCoords, const Mat4& modelViewMat, const Mat4& projectionMat, const int view[4]);
 
-	/// Draws a quad. Actually it draws 2 triangles because OpenGL will no longer support quads
-	static void drawQuad(CommandBufferPtr& cmdb)
-	{
-		drawQuadInstanced(cmdb, 1);
-	}
-
-	static void drawQuadInstanced(CommandBufferPtr& cmdb, U32 primitiveCount)
-	{
-		cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 3, primitiveCount);
-	}
-
 	/// Get the LOD given the distance of an object from the camera
 	U calculateLod(F32 distance) const
 	{

+ 0 - 5
src/anki/renderer/RendererObject.cpp

@@ -25,11 +25,6 @@ HeapAllocator<U8> RendererObject::getAllocator() const
 	return m_r->getAllocator();
 }
 
-StackAllocator<U8> RendererObject::getFrameAllocator() const
-{
-	return m_r->getFrameAllocator();
-}
-
 ResourceManager& RendererObject::getResourceManager()
 {
 	return m_r->getResourceManager();

+ 17 - 13
src/anki/renderer/RendererObject.h

@@ -38,7 +38,23 @@ anki_internal:
 
 	HeapAllocator<U8> getAllocator() const;
 
-	StackAllocator<U8> getFrameAllocator() const;
+protected:
+	Renderer* m_r; ///< Know your father
+
+	GrManager& getGrManager();
+	const GrManager& getGrManager() const;
+
+	ResourceManager& getResourceManager();
+
+	void* allocateFrameStagingMemory(PtrSize size, StagingGpuMemoryType usage, StagingGpuMemoryToken& token);
+
+	U32 computeNumberOfSecondLevelCommandBuffers(U32 drawcallCount) const;
+
+	/// Used in fullscreen quad draws.
+	static void drawQuad(CommandBufferPtr& cmdb)
+	{
+		cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 3, 1);
+	}
 
 	template<typename TPtr>
 	TPtr allocateUniforms(PtrSize size, StagingGpuMemoryToken& token)
@@ -64,18 +80,6 @@ anki_internal:
 	}
 
 	void bindStorage(CommandBufferPtr& cmdb, U set, U binding, const StagingGpuMemoryToken& token) const;
-
-protected:
-	Renderer* m_r; ///< Know your father
-
-	GrManager& getGrManager();
-	const GrManager& getGrManager() const;
-
-	ResourceManager& getResourceManager();
-
-	void* allocateFrameStagingMemory(PtrSize size, StagingGpuMemoryType usage, StagingGpuMemoryToken& token);
-
-	U32 computeNumberOfSecondLevelCommandBuffers(U32 drawcallCount) const;
 };
 /// @}
 

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

@@ -164,7 +164,7 @@ void ShadowMapping::runEsm(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 		unis[0] = Vec4(workItem.m_cameraNear, workItem.m_cameraFar, 0.0f, 0.0f);
 		unis[1] = workItem.m_uvIn;
 
-		m_r->drawQuad(cmdb);
+		drawQuad(cmdb);
 	}
 
 	// Restore GR state
@@ -202,7 +202,8 @@ void ShadowMapping::populateRenderGraph(RenderingContext& ctx)
 	ANKI_TRACE_SCOPED_EVENT(RENDER_SM);
 
 	// First process the lights
-	processLights(ctx);
+	U32 threadCountForScratchPass = 0;
+	processLights(ctx, threadCountForScratchPass);
 
 	// Build the render graph
 	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
@@ -220,7 +221,9 @@ void ShadowMapping::populateRenderGraph(RenderingContext& ctx)
 
 			m_scratchRt = rgraph.newRenderTarget(m_scratchRtDescr);
 			pass.setFramebufferInfo(m_scratchFbDescr, {}, m_scratchRt, minx, miny, width, height);
-			pass.setWork(runShadowmappingCallback, this, m_r->getThreadPool().getThreadsCount());
+			ANKI_ASSERT(
+				threadCountForScratchPass && threadCountForScratchPass <= m_r->getThreadPool().getThreadsCount());
+			pass.setWork(runShadowmappingCallback, this, threadCountForScratchPass);
 
 			pass.newConsumer({m_scratchRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
 			pass.newProducer({m_scratchRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
@@ -266,7 +269,7 @@ Mat4 ShadowMapping::createSpotLightTextureMatrix(const Tile& tile)
 		1.0);
 }
 
-void ShadowMapping::processLights(RenderingContext& ctx)
+void ShadowMapping::processLights(RenderingContext& ctx, U32& threadCountForScratchPass)
 {
 	// Reset stuff
 	m_freeScratchTiles = m_scratchTileCount;
@@ -405,6 +408,12 @@ void ShadowMapping::processLights(RenderingContext& ctx)
 
 			// While there are drawcalls in this task emit new work items
 			U taskDrawcallCount = end - start;
+
+			if(taskDrawcallCount)
+			{
+				threadCountForScratchPass = taskId + 1;
+			}
+
 			while(taskDrawcallCount)
 			{
 				ANKI_ASSERT(lightToRender != lightToRenderEnd);

+ 1 - 1
src/anki/renderer/ShadowMapping.h

@@ -171,7 +171,7 @@ private:
 		U32& drawcallCount) const;
 
 	/// Iterate lights and create work items.
-	void processLights(RenderingContext& ctx);
+	void processLights(RenderingContext& ctx, U32& threadCountForScratchPass);
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
 	/// @}

+ 3 - 3
src/anki/renderer/Ssao.cpp

@@ -147,7 +147,7 @@ void Ssao::runMain(CommandBufferPtr& cmdb, const RenderingContext& ctx, const Re
 	unis->m_prevViewProjMatMulInvViewProjMat =
 		ctx.m_prevViewProjMat * ctx.m_renderQueue->m_viewProjectionMatrix.getInverse();
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Ssao::runHBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
@@ -156,7 +156,7 @@ void Ssao::runHBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->bindShaderProgram(m_hblur.m_grProg);
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_rts[m_r->getFrameCount() & 1]));
 	cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Ssao::runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
@@ -165,7 +165,7 @@ void Ssao::runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->bindShaderProgram(m_vblur.m_grProg);
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_rts[(m_r->getFrameCount() + 1) & 1]));
 	cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Ssao::populateRenderGraph(RenderingContext& ctx)

+ 1 - 1
src/anki/renderer/TemporalAA.cpp

@@ -71,7 +71,7 @@ void TemporalAA::run(const RenderingContext& ctx, const RenderGraph& rgraph, Com
 	Mat4* unis = allocateAndBindUniforms<Mat4*>(sizeof(Mat4), cmdb, 0, 0);
 	*unis = ctx.m_jitterMat * ctx.m_prevViewProjMat * ctx.m_viewProjMatJitter.getInverse();
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void TemporalAA::populateRenderGraph(RenderingContext& ctx)

+ 4 - 4
src/anki/renderer/Volumetric.cpp

@@ -129,7 +129,7 @@ void Volumetric::runMain(CommandBufferPtr& cmdb, const RenderingContext& ctx, co
 	cmdb->bindTexture(0, 3, rgraph.getTexture(m_r->getShadowMapping().getShadowmapRt()));
 
 	const LightShadingResources& rsrc = m_r->getLightShading().getResources();
-	bindUniforms(cmdb, 0, 0, rsrc.m_commonToken);
+	bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
 	bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
 	bindUniforms(cmdb, 0, 2, rsrc.m_spotLightsToken);
 
@@ -157,7 +157,7 @@ void Volumetric::runMain(CommandBufferPtr& cmdb, const RenderingContext& ctx, co
 
 	cmdb->bindShaderProgram(m_main.m_grProg);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Volumetric::runHBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
@@ -166,7 +166,7 @@ void Volumetric::runHBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->bindShaderProgram(m_hblur.m_grProg);
 	cmdb->setViewport(0, 0, m_width, m_height);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Volumetric::runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
@@ -175,7 +175,7 @@ void Volumetric::runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->bindShaderProgram(m_vblur.m_grProg);
 	cmdb->setViewport(0, 0, m_width, m_height);
 
-	m_r->drawQuad(cmdb);
+	drawQuad(cmdb);
 }
 
 void Volumetric::populateRenderGraph(RenderingContext& ctx)

+ 6 - 6
tests/gr/Gr.cpp

@@ -588,9 +588,9 @@ ANKI_TEST(Gr, ViewportAndScissorOffscreen)
 	FramebufferPtr defaultFb = createDefaultFb(*gr);
 
 	static const Array2d<U, 4, 4> VIEWPORTS = {{{{0, 0, RT_WIDTH / 2, RT_HEIGHT / 2}},
-		{{RT_WIDTH / 2, 0, RT_WIDTH, RT_HEIGHT / 2}},
-		{{RT_WIDTH / 2, RT_HEIGHT / 2, RT_WIDTH, RT_HEIGHT}},
-		{{0, RT_HEIGHT / 2, RT_WIDTH / 2, RT_HEIGHT}}}};
+		{{RT_WIDTH / 2, 0, RT_WIDTH / 2, RT_HEIGHT / 2}},
+		{{RT_WIDTH / 2, RT_HEIGHT / 2, RT_WIDTH / 2, RT_HEIGHT / 2}},
+		{{0, RT_HEIGHT / 2, RT_WIDTH / 2, RT_HEIGHT / 2}}}};
 
 	const U ITERATIONS = 400;
 	const U SCISSOR_MARGIN = 2;
@@ -634,13 +634,13 @@ ANKI_TEST(Gr, ViewportAndScissorOffscreen)
 		auto vp = VIEWPORTS[(i / 30) % 4];
 		cmdb->setViewport(vp[0], vp[1], vp[2], vp[3]);
 		cmdb->setScissor(
-			vp[0] + SCISSOR_MARGIN, vp[1] + SCISSOR_MARGIN, vp[2] - SCISSOR_MARGIN, vp[3] - SCISSOR_MARGIN);
+			vp[0] + SCISSOR_MARGIN, vp[1] + SCISSOR_MARGIN, vp[2] - SCISSOR_MARGIN * 2, vp[3] - SCISSOR_MARGIN * 2);
 		cmdb->bindShaderProgram(prog);
 		cmdb->beginRenderPass(fb[i % 4],
 			vp[0] + RENDER_AREA_MARGIN,
 			vp[1] + RENDER_AREA_MARGIN,
-			vp[2] - RENDER_AREA_MARGIN,
-			vp[3] - RENDER_AREA_MARGIN);
+			vp[2] - RENDER_AREA_MARGIN * 2,
+			vp[3] - RENDER_AREA_MARGIN * 2);
 		cmdb->drawArrays(PrimitiveTopology::TRIANGLE_STRIP, 4);
 		cmdb->endRenderPass();