Просмотр исходного кода

Move DepthDownscale to the render graph

Panagiotis Christopoulos Charitos 8 лет назад
Родитель
Сommit
b89cbbd613

+ 88 - 113
src/anki/renderer/DepthDownscale.cpp

@@ -10,186 +10,161 @@
 namespace anki
 {
 
-HalfDepth::~HalfDepth()
+DepthDownscale::~DepthDownscale()
 {
 }
 
-Error HalfDepth::init(const ConfigSet&)
+Error DepthDownscale::initHalf(const ConfigSet&)
 {
-	GrManager& gr = getGrManager();
 	U width = m_r->getWidth() / 2;
 	U height = m_r->getHeight() / 2;
 
-	// Create RTs
-	m_depthRt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(width,
+	// Create RT descrs
+	m_half.m_depthRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		SamplingFilter::LINEAR,
-		1,
-		"halfdepth"));
+		"Half depth");
+	m_half.m_depthRtDescr.bake();
 
-	m_colorRt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(width,
+	m_half.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
 		SamplingFilter::LINEAR,
-		1,
-		"halfdepthcol"));
-
-	// Create FB
-	FramebufferInitInfo fbInit("halfdepth");
-	fbInit.m_colorAttachments[0].m_texture = m_colorRt;
-	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_colorAttachmentCount = 1;
-	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
-	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
-	m_fb = gr.newInstance<Framebuffer>(fbInit);
+		"Half depth col");
+	m_half.m_colorRtDescr.bake();
+
+	// Create FB descr
+	m_half.m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	m_half.m_fbDescr.m_colorAttachmentCount = 1;
+	m_half.m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	m_half.m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
+	m_half.m_fbDescr.bake();
 
 	// Prog
-	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_prog));
+	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_half.m_prog));
 
-	ShaderProgramResourceMutationInitList<2> mutations(m_prog);
+	ShaderProgramResourceMutationInitList<2> mutations(m_half.m_prog);
 	mutations.add("TYPE", 0).add("SAMPLE_RESOLVE_TYPE", 0);
 
 	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(mutations.get(), variant);
-	m_grProg = variant->getProgram();
+	m_half.m_prog->getOrCreateVariant(mutations.get(), variant);
+	m_half.m_grProg = variant->getProgram();
 
 	return Error::NONE;
 }
 
-void HalfDepth::setPreRunBarriers(RenderingContext& ctx)
-{
-	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
-		TextureUsageBit::NONE,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		TextureSurfaceInfo(0, 0, 0, 0));
-
-	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_colorRt,
-		TextureUsageBit::NONE,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureSurfaceInfo(0, 0, 0, 0));
-}
-
-void HalfDepth::setPostRunBarriers(RenderingContext& ctx)
-{
-	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_colorRt,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT,
-		TextureSurfaceInfo(0, 0, 0, 0));
-}
-
-void HalfDepth::run(RenderingContext& ctx)
-{
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-
-	cmdb->beginRenderPass(m_fb);
-	cmdb->bindShaderProgram(m_grProg);
-	// TODO cmdb->bindTexture(0, 0, m_r->getGBuffer().m_depthRt);
-
-	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
-	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
-
-	m_r->drawQuad(cmdb);
-
-	cmdb->endRenderPass();
-
-	// Restore state
-	cmdb->setDepthCompareOperation(CompareOperation::LESS);
-}
-
-QuarterDepth::~QuarterDepth()
-{
-}
-
-Error QuarterDepth::init(const ConfigSet&)
+Error DepthDownscale::initQuarter(const ConfigSet&)
 {
-	GrManager& gr = getGrManager();
 	U width = m_r->getWidth() / 4;
 	U height = m_r->getHeight() / 4;
 
-	m_colorRt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(width,
+	// RT descr
+	m_quarter.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
 		SamplingFilter::LINEAR,
-		1,
-		"quarterdepth"));
+		"quarterdepth");
+	m_quarter.m_colorRtDescr.bake();
 
-	FramebufferInitInfo fbInit("quarterdepth");
-	fbInit.m_colorAttachments[0].m_texture = m_colorRt;
-	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_colorAttachmentCount = 1;
-	m_fb = gr.newInstance<Framebuffer>(fbInit);
+	// FB descr
+	m_quarter.m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	m_quarter.m_fbDescr.m_colorAttachmentCount = 1;
+	m_quarter.m_fbDescr.bake();
 
 	// Prog
-	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_prog));
+	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_quarter.m_prog));
 
-	ShaderProgramResourceMutationInitList<2> mutations(m_prog);
+	ShaderProgramResourceMutationInitList<2> mutations(m_quarter.m_prog);
 	mutations.add("TYPE", 1).add("SAMPLE_RESOLVE_TYPE", 0);
 
 	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(mutations.get(), variant);
-	m_grProg = variant->getProgram();
+	m_quarter.m_prog->getOrCreateVariant(mutations.get(), variant);
+	m_quarter.m_grProg = variant->getProgram();
 
 	return Error::NONE;
 }
 
-void QuarterDepth::setPreRunBarriers(RenderingContext& ctx)
+Error DepthDownscale::initInternal(const ConfigSet& cfg)
 {
-	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_colorRt,
-		TextureUsageBit::NONE,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureSurfaceInfo(0, 0, 0, 0));
+	ANKI_CHECK(initHalf(cfg));
+	ANKI_CHECK(initQuarter(cfg));
+	return Error::NONE;
 }
 
-void QuarterDepth::setPostRunBarriers(RenderingContext& ctx)
+Error DepthDownscale::init(const ConfigSet& cfg)
 {
-	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_colorRt,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT,
-		TextureSurfaceInfo(0, 0, 0, 0));
+	ANKI_R_LOGI("Initializing depth downscale passes");
+
+	Error err = initInternal(cfg);
+	if(err)
+	{
+		ANKI_R_LOGE("Failed to initialize depth downscale passes");
+	}
+
+	return err;
 }
 
-void QuarterDepth::run(RenderingContext& ctx)
+void DepthDownscale::runHalf(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 {
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+	cmdb->bindShaderProgram(m_half.m_grProg);
+	cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getGBuffer().getDepthRt()));
 
-	cmdb->beginRenderPass(m_fb);
-	cmdb->bindShaderProgram(m_grProg);
-	cmdb->bindTexture(0, 0, m_parent->m_hd.m_colorRt);
-
-	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
+	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
+	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
 
 	m_r->drawQuad(cmdb);
 
-	cmdb->endRenderPass();
+	// Restore state
+	cmdb->setDepthCompareOperation(CompareOperation::LESS);
 }
 
-DepthDownscale::~DepthDownscale()
+void DepthDownscale::runQuarter(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 {
-}
+	cmdb->bindShaderProgram(m_quarter.m_grProg);
+	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_halfColorRt));
+	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
 
-Error DepthDownscale::initInternal(const ConfigSet& cfg)
-{
-	ANKI_CHECK(m_hd.init(cfg));
-	ANKI_CHECK(m_qd.init(cfg));
-	return Error::NONE;
+	m_r->drawQuad(cmdb);
 }
 
-Error DepthDownscale::init(const ConfigSet& cfg)
+void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 {
-	ANKI_R_LOGI("Initializing depth downscale passes");
+	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
 
-	Error err = initInternal(cfg);
-	if(err)
+	// Create render targets
+	m_runCtx.m_halfDepthRt = rgraph.newRenderTarget(m_half.m_depthRtDescr);
+	m_runCtx.m_halfColorRt = rgraph.newRenderTarget(m_half.m_colorRtDescr);
+	m_runCtx.m_quarterRt = rgraph.newRenderTarget(m_quarter.m_colorRtDescr);
+
+	// Create half depth render pass
 	{
-		ANKI_R_LOGE("Failed to initialize depth downscale passes");
+		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Half depth");
+
+		pass.setFramebufferInfo(m_half.m_fbDescr, {{m_runCtx.m_halfColorRt}}, m_runCtx.m_halfDepthRt);
+		pass.setWork(runHalfCallback, this, 0);
+
+		pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_runCtx.m_halfColorRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+		pass.newConsumer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
+		pass.newProducer({m_runCtx.m_halfColorRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+		pass.newProducer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
 	}
 
-	return err;
+	// Create quarter depth render pass
+	{
+		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Quarter depth");
+
+		pass.setFramebufferInfo(m_quarter.m_fbDescr, {{m_runCtx.m_quarterRt}}, {});
+		pass.setWork(runQuarterCallback, this, 0);
+
+		pass.newConsumer({m_runCtx.m_halfColorRt, TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_runCtx.m_quarterRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+		pass.newProducer({m_runCtx.m_quarterRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+	}
 }
 
 } // end namespace anki

+ 69 - 54
src/anki/renderer/DepthDownscale.h

@@ -18,85 +18,100 @@ class DepthDownscale;
 /// @addtogroup renderer
 /// @{
 
-/// Quick pass to downscale the depth buffer.
-class HalfDepth : public RendererObject
+/// Downscales the depth buffer a few times.
+class DepthDownscale : public RendererObject
 {
 anki_internal:
-	TexturePtr m_depthRt;
-	TexturePtr m_colorRt;
-
-	HalfDepth(Renderer* r, DepthDownscale* depthDownscale)
+	DepthDownscale(Renderer* r)
 		: RendererObject(r)
-		, m_parent(depthDownscale)
 	{
 	}
 
-	~HalfDepth();
+	~DepthDownscale();
 
 	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
 
-	void setPreRunBarriers(RenderingContext& ctx);
-	void run(RenderingContext& ctx);
-	void setPostRunBarriers(RenderingContext& ctx);
+	/// Populate the rendergraph.
+	void populateRenderGraph(RenderingContext& ctx);
 
-private:
-	DepthDownscale* m_parent;
-
-	FramebufferPtr m_fb;
-
-	ShaderProgramResourcePtr m_prog;
-	ShaderProgramPtr m_grProg;
-};
+	RenderTargetHandle getHalfDepthColorRt() const
+	{
+		return m_runCtx.m_halfColorRt;
+	}
 
-/// Quick pass to downscale the depth buffer.
-class QuarterDepth : public RendererObject
-{
-anki_internal:
-	TexturePtr m_colorRt;
+	RenderTargetHandle getHalfDepthDepthRt() const
+	{
+		return m_runCtx.m_halfDepthRt;
+	}
 
-	QuarterDepth(Renderer* r, DepthDownscale* depthDownscale)
-		: RendererObject(r)
-		, m_parent(depthDownscale)
+	RenderTargetHandle getQuarterColorRt() const
 	{
+		return m_runCtx.m_quarterRt;
 	}
 
-	~QuarterDepth();
+private:
+	class
+	{
+	public:
+		RenderTargetDescription m_depthRtDescr;
+		RenderTargetDescription m_colorRtDescr;
 
-	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
+		GraphicsRenderPassFramebufferDescription m_fbDescr;
 
-	void setPreRunBarriers(RenderingContext& ctx);
-	void run(RenderingContext& ctx);
-	void setPostRunBarriers(RenderingContext& ctx);
+		ShaderProgramResourcePtr m_prog;
+		ShaderProgramPtr m_grProg;
+	} m_half; ///< Half depth pass.
 
-private:
-	DepthDownscale* m_parent;
+	class
+	{
+	public:
+		RenderTargetDescription m_colorRtDescr;
 
-	FramebufferPtr m_fb;
+		GraphicsRenderPassFramebufferDescription m_fbDescr;
 
-	ShaderProgramResourcePtr m_prog;
-	ShaderProgramPtr m_grProg;
-};
+		ShaderProgramResourcePtr m_prog;
+		ShaderProgramPtr m_grProg;
+	} m_quarter; ///< Quarter depth pass.
 
-class DepthDownscale : public RendererObject
-{
-anki_internal:
-	HalfDepth m_hd;
-	QuarterDepth m_qd;
+	class
+	{
+	public:
+		RenderTargetHandle m_halfDepthRt;
+		RenderTargetHandle m_halfColorRt;
+		RenderTargetHandle m_quarterRt;
+	} m_runCtx; ///< Run context.
 
-	DepthDownscale(Renderer* r)
-		: RendererObject(r)
-		, m_hd(r, this)
-		, m_qd(r, this)
+	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
+	ANKI_USE_RESULT Error initHalf(const ConfigSet& cfg);
+	ANKI_USE_RESULT Error initQuarter(const ConfigSet& cfg);
+
+	void runHalf(CommandBufferPtr& cmdb, const RenderGraph& rgraph);
+	void runQuarter(CommandBufferPtr& cmdb, const RenderGraph& rgraph);
+
+	/// A RenderPassWorkCallback for half depth main pass.
+	static void runHalfCallback(void* userData,
+		CommandBufferPtr cmdb,
+		U32 secondLevelCmdbIdx,
+		U32 secondLevelCmdbCount,
+		const RenderGraph& rgraph)
 	{
+		ANKI_ASSERT(userData);
+		DepthDownscale* self = static_cast<DepthDownscale*>(userData);
+		self->runHalf(cmdb, rgraph);
 	}
 
-	~DepthDownscale();
-
-	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
-
-private:
-	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
+	/// A RenderPassWorkCallback for half depth main pass.
+	static void runQuarterCallback(void* userData,
+		CommandBufferPtr cmdb,
+		U32 secondLevelCmdbIdx,
+		U32 secondLevelCmdbCount,
+		const RenderGraph& rgraph)
+	{
+		ANKI_ASSERT(userData);
+		DepthDownscale* self = static_cast<DepthDownscale*>(userData);
+		self->runQuarter(cmdb, rgraph);
+	}
 };
 /// @}
 
-} // end namespace
+} // end namespace anki

+ 5 - 14
src/anki/renderer/ForwardShading.cpp

@@ -51,7 +51,7 @@ Error ForwardShading::initInternal(const ConfigSet&)
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
 	fbInit.m_colorAttachments[0].m_clearValue.m_colorf = {{0.0, 0.0, 0.0, 1.0}};
-	fbInit.m_depthStencilAttachment.m_texture = m_r->getDepthDownscale().m_hd.m_depthRt;
+	// TODO fbInit.m_depthStencilAttachment.m_texture = m_r->getDepthDownscale().m_hd.m_depthRt;
 	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::LOAD;
 	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
 	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
@@ -109,11 +109,8 @@ void ForwardShading::drawVolumetric(RenderingContext& ctx, CommandBufferPtr cmdb
 	Vec4* unis = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	computeLinearizeDepthOptimal(ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, unis->x(), unis->y());
 
-	cmdb->informTextureSurfaceCurrentUsage(
-		m_r->getDepthDownscale().m_qd.m_colorRt, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::SAMPLED_FRAGMENT);
-
-	cmdb->bindTextureAndSampler(0, 0, m_r->getDepthDownscale().m_hd.m_colorRt, m_r->getNearestSampler());
-	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_qd.m_colorRt, m_r->getNearestSampler());
+	// TODO cmdb->bindTextureAndSampler(0, 0, m_r->getDepthDownscale().m_hd.m_colorRt, m_r->getNearestSampler());
+	// TODO cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_qd.m_colorRt, m_r->getNearestSampler());
 	// TODO cmdb->bindTexture(0, 2, m_r->getVolumetric().m_main.getRt());
 	cmdb->bindTexture(0, 3, m_vol.m_noiseTex->getGrTexture());
 
@@ -134,7 +131,7 @@ void ForwardShading::drawUpscale(RenderingContext& ctx)
 		ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, linearDepth->x(), linearDepth->y());
 
 	// TODO cmdb->bindTexture(0, 0, m_r->getGBuffer().m_depthRt);
-	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_hd.m_colorRt, m_r->getNearestSampler());
+	// TODO cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_hd.m_colorRt, m_r->getNearestSampler());
 	cmdb->bindTexture(0, 2, m_rt);
 	cmdb->bindTexture(0, 3, m_upscale.m_noiseTex->getGrTexture());
 
@@ -172,16 +169,10 @@ void ForwardShading::buildCommandBuffers(RenderingContext& ctx, U threadId, U th
 	CommandBufferPtr cmdb = m_r->getGrManager().newInstance<CommandBuffer>(cinf);
 	ctx.m_forwardShading.m_commandBuffers[threadId] = cmdb;
 
-	cmdb->informTextureCurrentUsage(m_r->getDepthDownscale().m_qd.m_colorRt, TextureUsageBit::SAMPLED_FRAGMENT);
-	cmdb->informTextureSurfaceCurrentUsage(
-		m_r->getDepthDownscale().m_hd.m_colorRt, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::SAMPLED_FRAGMENT);
-	cmdb->informTextureSurfaceCurrentUsage(m_r->getDepthDownscale().m_hd.m_depthRt,
-		TextureSurfaceInfo(0, 0, 0, 0),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ);
 	cmdb->informTextureCurrentUsage(m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
 	// TODO: cmdb->informTextureCurrentUsage(m_r->getShadowMapping().m_shadowAtlas, TextureUsageBit::SAMPLED_FRAGMENT);
 
-	cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_colorRt);
+	// TODO cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_colorRt);
 	// TODO: cmdb->bindTexture(0, 1, m_r->getShadowMapping().m_shadowAtlas);
 	bindUniforms(cmdb, 0, 0, ctx.m_lightShading.m_commonToken);
 	bindUniforms(cmdb, 0, 1, ctx.m_lightShading.m_pointLightsToken);

+ 12 - 3
src/anki/renderer/GBuffer.h

@@ -18,9 +18,6 @@ namespace anki
 class GBuffer : public RendererObject
 {
 anki_internal:
-	Array<RenderTargetHandle, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRts;
-	RenderTargetHandle m_depthRt;
-
 	GBuffer(Renderer* r)
 		: RendererObject(r)
 	{
@@ -33,12 +30,24 @@ anki_internal:
 	/// Populate the rendergraph.
 	void populateRenderGraph(RenderingContext& ctx);
 
+	RenderTargetHandle getColorRt(U idx) const
+	{
+		return m_colorRts[idx];
+	}
+
+	RenderTargetHandle getDepthRt() const
+	{
+		return m_depthRt;
+	}
+
 private:
 	Array<RenderTargetDescription, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRtDescrs;
 	RenderTargetDescription m_depthRtDescr;
 	GraphicsRenderPassFramebufferDescription m_fbDescr;
 
 	RenderingContext* m_ctx = nullptr;
+	Array<RenderTargetHandle, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRts;
+	RenderTargetHandle m_depthRt;
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 

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

@@ -568,11 +568,6 @@ void Renderer::buildCommandBuffersInternal(RenderingContext& ctx, U32 threadId,
 		cmdb->informTextureSurfaceCurrentUsage(m_forwardShading->getRt(),
 			TextureSurfaceInfo(0, 0, 0, 0),
 			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
-		cmdb->informTextureSurfaceCurrentUsage(
-			m_depth->m_hd.m_colorRt, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::SAMPLED_FRAGMENT);
-		cmdb->informTextureSurfaceCurrentUsage(m_depth->m_hd.m_depthRt,
-			TextureSurfaceInfo(0, 0, 0, 0),
-			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
 
 		cmdb->setViewport(0, 0, m_forwardShading->getWidth(), m_forwardShading->getHeight());
 

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

@@ -31,6 +31,11 @@ anki_internal:
 	/// Populate the rendergraph.
 	void populateRenderGraph(RenderingContext& ctx);
 
+	RenderTargetHandle getShadowmapRt() const
+	{
+		return m_esmRt;
+	}
+
 private:
 	/// @name ESM stuff
 	/// @{
@@ -63,7 +68,7 @@ private:
 
 	GraphicsRenderPassFramebufferDescription m_esmFbDescr; ///< The FB for ESM
 	TexturePtr m_esmAtlas; ///< ESM texture atlas.
-	RenderTargetHandle m_esmRt = {};
+	RenderTargetHandle m_esmRt;
 
 	U32 m_tileResolution = 0; ///< Tile resolution.
 	U32 m_atlasResolution = 0; ///< Atlas size is (m_atlasResolution, m_atlasResolution)

+ 14 - 10
src/anki/renderer/Ssao.cpp

@@ -127,8 +127,8 @@ void Ssao::runMain(CommandBufferPtr& cmdb, const RenderingContext& ctx, const Re
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_main.m_grProg);
 
-	cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_colorRt);
-	// TODO cmdb->bindTextureAndSampler(0, 1, m_r->getGBuffer().m_rt2, m_r->getLinearSampler());
+	cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
+	cmdb->bindTextureAndSampler(0, 1, rgraph.getTexture(m_r->getGBuffer().getColorRt(2)), m_r->getLinearSampler());
 	cmdb->bindTexture(0, 2, m_main.m_noiseTex->getGrTexture());
 	cmdb->bindTexture(0, 3, rgraph.getTexture(m_runCtx.m_rts[(m_r->getFrameCount() + 1) & 1]));
 
@@ -156,7 +156,7 @@ void Ssao::runHBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_hblur.m_grProg);
 	cmdb->bindTexture(0, 0, rgraph.getTexture(m_runCtx.m_rts[m_r->getFrameCount() & 1]));
-	cmdb->bindTexture(0, 1, m_r->getDepthDownscale().m_qd.m_colorRt);
+	cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
 	m_r->drawQuad(cmdb);
 }
 
@@ -165,7 +165,7 @@ void Ssao::runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph)
 	cmdb->setViewport(0, 0, m_width, m_height);
 	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, m_r->getDepthDownscale().m_qd.m_colorRt);
+	cmdb->bindTexture(0, 1, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
 	m_r->drawQuad(cmdb);
 }
 
@@ -186,36 +186,40 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("SSAO main");
 
-		pass.setWork(runMain, this, 0);
+		pass.setWork(runMainCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 
+		pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 
 	// Create HBlur pass
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("SSAO hblur");
 
-		pass.setWork(runHBlur, this, 0);
+		pass.setWork(runHBlurCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToReadIdx]}}, {});
 
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 
 	// Create VBlur pass
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("SSAO vblur");
 
-		pass.setWork(runVBlur, this, 0);
+		pass.setWork(runVBlurCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 }
 

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

@@ -77,7 +77,7 @@ private:
 	void runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph);
 
 	/// A RenderPassWorkCallback for SSAO main pass.
-	static void runMain(void* userData,
+	static void runMainCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,
@@ -89,7 +89,7 @@ private:
 	}
 
 	/// A RenderPassWorkCallback for SSAO HBlur.
-	static void runHBlur(void* userData,
+	static void runHBlurCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,
@@ -101,7 +101,7 @@ private:
 	}
 
 	/// A RenderPassWorkCallback for SSAO VBlur.
-	static void runVBlur(void* userData,
+	static void runVBlurCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,

+ 10 - 8
src/anki/renderer/Volumetric.cpp

@@ -124,10 +124,10 @@ void Volumetric::runMain(CommandBufferPtr& cmdb, const RenderingContext& ctx, co
 {
 	cmdb->setViewport(0, 0, m_width, m_height);
 
-	cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_colorRt);
+	cmdb->bindTexture(0, 0, rgraph.getTexture(m_r->getDepthDownscale().getQuarterColorRt()));
 	cmdb->bindTexture(0, 1, m_main.m_noiseTex->getGrTexture());
 	cmdb->bindTexture(0, 2, rgraph.getTexture(m_runCtx.m_rts[(m_r->getFrameCount() + 1) & 1]));
-	// TODO: cmdb->bindTexture(0, 3, m_r->getShadowMapping().m_shadowAtlas);
+	cmdb->bindTexture(0, 3, rgraph.getTexture(m_r->getShadowMapping().getShadowmapRt()));
 
 	bindUniforms(cmdb, 0, 0, ctx.m_lightShading.m_commonToken);
 	bindUniforms(cmdb, 0, 1, ctx.m_lightShading.m_pointLightsToken);
@@ -195,36 +195,38 @@ void Volumetric::populateRenderGraph(RenderingContext& ctx)
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("VOL main");
 
-		pass.setWork(runMain, this, 0);
+		pass.setWork(runMainCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 
+		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 
 	// Create HBlur pass
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("VOL hblur");
 
-		pass.setWork(runHBlur, this, 0);
+		pass.setWork(runHBlurCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToReadIdx]}}, {});
 
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 
 	// Create VBlur pass
 	{
 		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("VOL vblur");
 
-		pass.setWork(runVBlur, this, 0);
+		pass.setWork(runVBlurCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 }
 

+ 3 - 3
src/anki/renderer/Volumetric.h

@@ -86,7 +86,7 @@ private:
 	void runVBlur(CommandBufferPtr& cmdb, const RenderGraph& rgraph);
 
 	/// A RenderPassWorkCallback for SSAO main pass.
-	static void runMain(void* userData,
+	static void runMainCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,
@@ -98,7 +98,7 @@ private:
 	}
 
 	/// A RenderPassWorkCallback for SSAO HBlur.
-	static void runHBlur(void* userData,
+	static void runHBlurCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,
@@ -110,7 +110,7 @@ private:
 	}
 
 	/// A RenderPassWorkCallback for SSAO VBlur.
-	static void runVBlur(void* userData,
+	static void runVBlurCallback(void* userData,
 		CommandBufferPtr cmdb,
 		U32 secondLevelCmdbIdx,
 		U32 secondLevelCmdbCount,