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

Move GBuffer to the render graph

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

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

@@ -38,8 +38,6 @@ class RenderTargetHandle
 	friend class RenderPassDescriptionBase;
 
 public:
-	operator TexturePtr() const;
-
 	bool operator==(const RenderTargetHandle& b) const
 	{
 		return m_idx == b.m_idx;

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

@@ -58,7 +58,7 @@ Error Dbg::lazyInit()
 	fbInit.m_colorAttachmentCount = 1;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
-	fbInit.m_depthStencilAttachment.m_texture = m_r->getGBuffer().m_depthRt;
+	// TODO fbInit.m_depthStencilAttachment.m_texture = m_r->getGBuffer().m_depthRt;
 	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::LOAD;
 	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
 

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

@@ -87,7 +87,7 @@ void HalfDepth::run(RenderingContext& ctx)
 
 	cmdb->beginRenderPass(m_fb);
 	cmdb->bindShaderProgram(m_grProg);
-	cmdb->bindTexture(0, 0, m_r->getGBuffer().m_depthRt);
+	// 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);

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

@@ -135,7 +135,7 @@ void ForwardShading::drawUpscale(RenderingContext& ctx)
 	computeLinearizeDepthOptimal(
 		ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, linearDepth->x(), linearDepth->y());
 
-	cmdb->bindTexture(0, 0, m_r->getGBuffer().m_depthRt);
+	// TODO cmdb->bindTexture(0, 0, m_r->getGBuffer().m_depthRt);
 	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());

+ 60 - 126
src/anki/renderer/GBuffer.cpp

@@ -18,68 +18,6 @@ GBuffer::~GBuffer()
 {
 }
 
-Error GBuffer::createRt()
-{
-	m_depthRt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
-		m_r->getHeight(),
-		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE
-			| TextureUsageBit::GENERATE_MIPMAPS,
-		SamplingFilter::NEAREST,
-		1,
-		"gbuffdepth"));
-
-	m_rt0 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
-		m_r->getHeight(),
-		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::NEAREST,
-		1,
-		"gbuffrt0"));
-
-	m_rt1 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
-		m_r->getHeight(),
-		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[1],
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::NEAREST,
-		1,
-		"gbuffrt1"));
-
-	m_rt2 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
-		m_r->getHeight(),
-		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[2],
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
-			| TextureUsageBit::GENERATE_MIPMAPS,
-		SamplingFilter::NEAREST,
-		1,
-		"gbuffrt2"));
-
-	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
-#if ANKI_EXTRA_CHECKS
-	loadop = AttachmentLoadOperation::CLEAR;
-#endif
-
-	FramebufferInitInfo fbInit("gbuffer");
-	fbInit.m_colorAttachmentCount = GBUFFER_COLOR_ATTACHMENT_COUNT;
-	fbInit.m_colorAttachments[0].m_texture = m_rt0;
-	fbInit.m_colorAttachments[0].m_loadOperation = loadop;
-	fbInit.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 0.0, 0.0}};
-	fbInit.m_colorAttachments[1].m_texture = m_rt1;
-	fbInit.m_colorAttachments[1].m_loadOperation = loadop;
-	fbInit.m_colorAttachments[1].m_clearValue.m_colorf = {{0.0, 1.0, 0.0, 0.0}};
-	fbInit.m_colorAttachments[2].m_texture = m_rt2;
-	fbInit.m_colorAttachments[2].m_loadOperation = loadop;
-	fbInit.m_colorAttachments[2].m_clearValue.m_colorf = {{0.0, 0.0, 1.0, 0.0}};
-	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
-	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::CLEAR;
-	fbInit.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0;
-	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
-
-	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
-
-	return Error::NONE;
-}
-
 Error GBuffer::init(const ConfigSet& initializer)
 {
 	ANKI_R_LOGI("Initializing g-buffer pass");
@@ -95,11 +33,49 @@ Error GBuffer::init(const ConfigSet& initializer)
 
 Error GBuffer::initInternal(const ConfigSet& initializer)
 {
-	ANKI_CHECK(createRt());
+	// RT descrs
+	m_depthRtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
+		m_r->getHeight(),
+		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		SamplingFilter::NEAREST,
+		"GBuffer depth");
+	m_depthRtDescr.bake();
+
+	static const char* rtNames[GBUFFER_COLOR_ATTACHMENT_COUNT] = {"GBuffer rt0", "GBuffer rt1", "GBuffer rt2"};
+	for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
+	{
+		m_colorRtDescrs[i] = m_r->create2DRenderTargetDescription(m_r->getWidth(),
+			m_r->getHeight(),
+			MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
+			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+			SamplingFilter::NEAREST,
+			rtNames[i]);
+		m_colorRtDescrs[i].bake();
+	}
+
+	// FB descr
+	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
+#if ANKI_EXTRA_CHECKS
+	loadop = AttachmentLoadOperation::CLEAR;
+#endif
+
+	m_fbDescr.m_colorAttachmentCount = GBUFFER_COLOR_ATTACHMENT_COUNT;
+	m_fbDescr.m_colorAttachments[0].m_loadOperation = loadop;
+	m_fbDescr.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 0.0, 0.0}};
+	m_fbDescr.m_colorAttachments[1].m_loadOperation = loadop;
+	m_fbDescr.m_colorAttachments[1].m_clearValue.m_colorf = {{0.0, 1.0, 0.0, 0.0}};
+	m_fbDescr.m_colorAttachments[2].m_loadOperation = loadop;
+	m_fbDescr.m_colorAttachments[2].m_clearValue.m_colorf = {{0.0, 0.0, 1.0, 0.0}};
+	m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::CLEAR;
+	m_fbDescr.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0;
+	m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
+	m_fbDescr.bake();
+
 	return Error::NONE;
 }
 
-void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCount) const
+void GBuffer::runInThread(CommandBufferPtr& cmdb, U32 threadId, U32 threadCount, const RenderingContext& ctx) const
 {
 	ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
 
@@ -111,24 +87,6 @@ void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCou
 
 	if(start != end)
 	{
-		// Create the command buffer
-		CommandBufferInitInfo cinf;
-		cinf.m_flags = CommandBufferFlag::SECOND_LEVEL | CommandBufferFlag::GRAPHICS_WORK;
-		if(end - start < COMMAND_BUFFER_SMALL_BATCH_MAX_COMMANDS)
-		{
-			cinf.m_flags |= CommandBufferFlag::SMALL_BATCH;
-		}
-		cinf.m_framebuffer = m_fb;
-		CommandBufferPtr cmdb = m_r->getGrManager().newInstance<CommandBuffer>(cinf);
-		ctx.m_gbuffer.m_commandBuffers[threadId] = cmdb;
-
-		// Inform on RTs
-		TextureSurfaceInfo surf(0, 0, 0, 0);
-		cmdb->informTextureSurfaceCurrentUsage(m_rt0, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
-		cmdb->informTextureSurfaceCurrentUsage(m_rt1, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
-		cmdb->informTextureSurfaceCurrentUsage(m_rt2, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
-		cmdb->informTextureSurfaceCurrentUsage(m_depthRt, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
-
 		// Set some state, leave the rest to default
 		cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 
@@ -179,59 +137,35 @@ void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCou
 	}
 }
 
-void GBuffer::run(RenderingContext& ctx)
+void GBuffer::populateRenderGraph(RenderingContext& ctx)
 {
 	ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
 
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-	cmdb->beginRenderPass(m_fb);
-
-	// Set some state anyway because other stages may depend on it
-	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
+	m_ctx = &ctx;
+	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
 
-	for(U i = 0; i < m_r->getThreadPool().getThreadsCount(); ++i)
+	// Create RTs
+	Array<RenderTargetHandle, MAX_COLOR_ATTACHMENTS> rts;
+	for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
 	{
-		if(ctx.m_gbuffer.m_commandBuffers[i].isCreated())
-		{
-			cmdb->pushSecondLevelCommandBuffer(ctx.m_gbuffer.m_commandBuffers[i]);
-		}
+		m_colorRts[i] = rgraph.newRenderTarget(m_colorRtDescrs[i]);
+		rts[i] = m_colorRts[i];
 	}
+	m_depthRt = rgraph.newRenderTarget(m_depthRtDescr);
 
-	cmdb->endRenderPass();
-}
+	// Create pass
+	GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("GBuffer");
 
-void GBuffer::setPreRunBarriers(RenderingContext& ctx)
-{
-	ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
-
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-	TextureSurfaceInfo surf(0, 0, 0, 0);
-
-	cmdb->setTextureSurfaceBarrier(m_rt0, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
-	cmdb->setTextureSurfaceBarrier(m_rt1, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
-	cmdb->setTextureSurfaceBarrier(m_rt2, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
-	cmdb->setTextureSurfaceBarrier(
-		m_depthRt, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, surf);
-}
-
-void GBuffer::setPostRunBarriers(RenderingContext& ctx)
-{
-	ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
-
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-	TextureSurfaceInfo surf(0, 0, 0, 0);
-
-	cmdb->setTextureSurfaceBarrier(
-		m_rt0, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
-
-	cmdb->setTextureSurfaceBarrier(
-		m_rt1, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
+	pass.setFramebufferInfo(m_fbDescr, rts, m_depthRt);
+	pass.setWork(runCallback, this, m_r->getThreadPool().getThreadsCount());
 
-	cmdb->setTextureSurfaceBarrier(
-		m_rt2, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
-
-	cmdb->setTextureSurfaceBarrier(
-		m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
+	for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
+	{
+		pass.newConsumer({m_colorRts[i], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+		pass.newProducer({m_colorRts[i], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+	}
+	pass.newConsumer({m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
+	pass.newProducer({m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
 }
 
 } // end namespace anki

+ 21 - 14
src/anki/renderer/GBuffer.h

@@ -18,10 +18,8 @@ namespace anki
 class GBuffer : public RendererObject
 {
 anki_internal:
-	TexturePtr m_rt0;
-	TexturePtr m_rt1;
-	TexturePtr m_rt2;
-	TexturePtr m_depthRt;
+	Array<RenderTargetHandle, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRts;
+	RenderTargetHandle m_depthRt;
 
 	GBuffer(Renderer* r)
 		: RendererObject(r)
@@ -32,21 +30,30 @@ anki_internal:
 
 	ANKI_USE_RESULT Error init(const ConfigSet& initializer);
 
-	void buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCount) const;
-
-	void setPreRunBarriers(RenderingContext& ctx);
-
-	void run(RenderingContext& ctx);
-
-	void setPostRunBarriers(RenderingContext& ctx);
+	/// Populate the rendergraph.
+	void populateRenderGraph(RenderingContext& ctx);
 
 private:
-	FramebufferPtr m_fb;
+	Array<RenderTargetDescription, GBUFFER_COLOR_ATTACHMENT_COUNT> m_colorRtDescrs;
+	RenderTargetDescription m_depthRtDescr;
+	GraphicsRenderPassFramebufferDescription m_fbDescr;
+
+	RenderingContext* m_ctx = nullptr;
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 
-	/// Create a G buffer FBO
-	ANKI_USE_RESULT Error createRt();
+	// A RenderPassWorkCallback for G-buffer pass.
+	static void runCallback(void* userData,
+		CommandBufferPtr cmdb,
+		U32 secondLevelCmdbIdx,
+		U32 secondLevelCmdbCount,
+		const RenderGraph& rgraph)
+	{
+		GBuffer* self = static_cast<GBuffer*>(userData);
+		self->runInThread(cmdb, secondLevelCmdbIdx, secondLevelCmdbCount, *self->m_ctx);
+	}
+
+	void runInThread(CommandBufferPtr& cmdb, U32 threadId, U32 threadCount, const RenderingContext& ctx) const;
 };
 /// @}
 

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

@@ -157,10 +157,10 @@ void LightShading::run(RenderingContext& ctx)
 	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 	cmdb->bindShaderProgram(m_progVariant->getProgram());
 
-	cmdb->bindTexture(1, 0, m_r->getGBuffer().m_rt0);
-	cmdb->bindTexture(1, 1, m_r->getGBuffer().m_rt1);
-	cmdb->bindTexture(1, 2, m_r->getGBuffer().m_rt2);
-	cmdb->bindTexture(1, 3, m_r->getGBuffer().m_depthRt, DepthStencilAspectBit::DEPTH);
+	// TODO cmdb->bindTexture(1, 0, m_r->getGBuffer().m_rt0);
+	// TODO cmdb->bindTexture(1, 1, m_r->getGBuffer().m_rt1);
+	// TODO cmdb->bindTexture(1, 2, m_r->getGBuffer().m_rt2);
+	// TODO cmdb->bindTexture(1, 3, m_r->getGBuffer().m_depthRt, DepthStencilAspectBit::DEPTH);
 	cmdb->informTextureCurrentUsage(m_r->getSsao().getRt(), TextureUsageBit::SAMPLED_FRAGMENT);
 	cmdb->bindTexture(1, 4, m_r->getSsao().getRt());
 

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

@@ -527,7 +527,7 @@ void Renderer::buildCommandBuffersInternal(RenderingContext& ctx, U32 threadId,
 {
 	// G-Buffer pass
 	//
-	m_gbuffer->buildCommandBuffers(ctx, threadId, threadCount);
+	// TODO m_gbuffer->buildCommandBuffers(ctx, threadId, threadCount);
 
 	// Append to the last MS's cmdb the occlusion tests
 	if(ctx.m_gbuffer.m_lastThreadWithWork == threadId)

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

@@ -55,7 +55,7 @@ void SsaoMain::run(RenderingContext& ctx)
 	cmdb->bindShaderProgram(m_grProg);
 
 	cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_colorRt);
-	cmdb->bindTextureAndSampler(0, 1, m_r->getGBuffer().m_rt2, m_r->getLinearSampler());
+	// TODO cmdb->bindTextureAndSampler(0, 1, m_r->getGBuffer().m_rt2, m_r->getLinearSampler());
 	cmdb->bindTexture(0, 2, m_noiseTex->getGrTexture());
 	cmdb->informTextureCurrentUsage(m_ssao->m_rt[(m_r->getFrameCount() + 1) & 1], TextureUsageBit::SAMPLED_FRAGMENT);
 	cmdb->bindTexture(0, 3, m_ssao->m_rt[(m_r->getFrameCount() + 1) & 1]);

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

@@ -77,7 +77,7 @@ void TemporalAA::run(RenderingContext& ctx)
 	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 
 	cmdb->bindShaderProgram(m_grProg);
-	cmdb->bindTextureAndSampler(0, 0, m_r->getGBuffer().m_depthRt, m_r->getLinearSampler());
+	// TODO cmdb->bindTextureAndSampler(0, 0, m_r->getGBuffer().m_depthRt, m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0, 1, m_r->getLightShading().getRt(), m_r->getLinearSampler());
 	cmdb->informTextureCurrentUsage(m_rts[(m_r->getFrameCount() + 1) & 1], TextureUsageBit::SAMPLED_FRAGMENT);
 	cmdb->bindTextureAndSampler(0, 2, m_rts[(m_r->getFrameCount() + 1) & 1], m_r->getLinearSampler());