Jelajahi Sumber

Renderer: Remove one unneeded render pass

Panagiotis Christopoulos Charitos 8 tahun lalu
induk
melakukan
13c4aa52cf

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

@@ -31,7 +31,6 @@ class Bloom;
 class FinalComposite;
 class Dbg;
 class Indirect;
-class ForwardShadingUpscale;
 class DownscaleBlur;
 class Volumetric;
 class DepthDownscale;

+ 44 - 65
src/anki/renderer/ForwardShading.cpp

@@ -57,6 +57,7 @@ Error ForwardShading::initInternal(const ConfigSet&)
 	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
 
 	ANKI_CHECK(initVol());
+	ANKI_CHECK(initUpscale());
 
 	return Error::NONE;
 }
@@ -79,6 +80,25 @@ Error ForwardShading::initVol()
 	return Error::NONE;
 }
 
+Error ForwardShading::initUpscale()
+{
+	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_upscale.m_noiseTex));
+
+	// Shader
+	ANKI_CHECK(getResourceManager().loadResource("programs/ForwardShadingUpscale.ankiprog", m_upscale.m_prog));
+
+	ShaderProgramResourceConstantValueInitList<3> consts(m_upscale.m_prog);
+	consts.add("NOISE_TEX_SIZE", U32(m_upscale.m_noiseTex->getWidth()))
+		.add("SRC_SIZE", Vec2(m_r->getWidth() / FS_FRACTION, m_r->getHeight() / FS_FRACTION))
+		.add("FB_SIZE", Vec2(m_r->getWidth(), m_r->getWidth()));
+
+	const ShaderProgramResourceVariant* variant;
+	m_upscale.m_prog->getOrCreateVariant(consts.get(), variant);
+	m_upscale.m_grProg = variant->getProgram();
+
+	return Error::NONE;
+}
+
 void ForwardShading::drawVolumetric(RenderingContext& ctx, CommandBufferPtr cmdb)
 {
 	cmdb->bindShaderProgram(m_vol.m_grProg);
@@ -105,6 +125,30 @@ void ForwardShading::drawVolumetric(RenderingContext& ctx, CommandBufferPtr cmdb
 	cmdb->setDepthCompareOperation(CompareOperation::LESS);
 }
 
+void ForwardShading::drawUpscale(RenderingContext& ctx)
+{
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+
+	Vec4* linearDepth = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
+	computeLinearizeDepthOptimal(
+		ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, linearDepth->x(), linearDepth->y());
+
+	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());
+
+	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::SRC_ALPHA);
+
+	cmdb->bindShaderProgram(m_upscale.m_grProg);
+	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
+
+	m_r->drawQuad(cmdb);
+
+	// Restore state
+	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
+}
+
 void ForwardShading::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCount) const
 {
 	const U problemSize = ctx.m_renderQueue->m_forwardShadingRenderables.getSize();
@@ -193,69 +237,4 @@ void ForwardShading::run(RenderingContext& ctx)
 	cmdb->endRenderPass();
 }
 
-Error ForwardShadingUpscale::init(const ConfigSet& config)
-{
-	Error err = initInternal(config);
-	if(err)
-	{
-		ANKI_R_LOGE("Failed to initialize forward shading upscale");
-	}
-
-	return err;
-}
-
-Error ForwardShadingUpscale::initInternal(const ConfigSet& config)
-{
-	ANKI_R_LOGI("Initializing forward shading upscale");
-
-	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_noiseTex));
-
-	// Shader
-	ANKI_CHECK(getResourceManager().loadResource("programs/ForwardShadingUpscale.ankiprog", m_prog));
-
-	ShaderProgramResourceConstantValueInitList<3> consts(m_prog);
-	consts.add("NOISE_TEX_SIZE", U32(m_noiseTex->getWidth()))
-		.add("SRC_SIZE", Vec2(m_r->getWidth() / FS_FRACTION, m_r->getHeight() / FS_FRACTION))
-		.add("FB_SIZE", Vec2(m_r->getWidth(), m_r->getWidth()));
-
-	const ShaderProgramResourceVariant* variant;
-	m_prog->getOrCreateVariant(consts.get(), variant);
-	m_grProg = variant->getProgram();
-
-	// Create FB
-	FramebufferInitInfo fbInit("fwdupscale");
-	fbInit.m_colorAttachmentCount = 1;
-	fbInit.m_colorAttachments[0].m_texture = m_r->getLightShading().getRt();
-	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::LOAD;
-	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
-
-	return Error::NONE;
-}
-
-void ForwardShadingUpscale::run(RenderingContext& ctx)
-{
-	CommandBufferPtr cmdb = ctx.m_commandBuffer;
-
-	Vec4* linearDepth = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
-	computeLinearizeDepthOptimal(
-		ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, linearDepth->x(), linearDepth->y());
-
-	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_r->getForwardShading().getRt());
-	cmdb->bindTexture(0, 3, m_noiseTex->getGrTexture());
-
-	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::SRC_ALPHA);
-
-	cmdb->beginRenderPass(m_fb);
-	cmdb->bindShaderProgram(m_grProg);
-	cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
-
-	m_r->drawQuad(cmdb);
-	cmdb->endRenderPass();
-
-	// Restore state
-	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
-}
-
 } // end namespace anki

+ 11 - 24
src/anki/renderer/ForwardShading.h

@@ -36,6 +36,8 @@ anki_internal:
 
 	void drawVolumetric(RenderingContext& ctx, CommandBufferPtr cmdb);
 
+	void drawUpscale(RenderingContext& ctx);
+
 	TexturePtr getRt() const
 	{
 		return m_rt;
@@ -70,32 +72,17 @@ private:
 		TextureResourcePtr m_noiseTex;
 	} m_vol;
 
-	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
-	ANKI_USE_RESULT Error initVol();
-};
-
-/// Upscale some textures and append them to light buffer.
-class ForwardShadingUpscale : public RenderingPass
-{
-public:
-	ForwardShadingUpscale(Renderer* r)
-		: RenderingPass(r)
+	class Upscale
 	{
-	}
-
-	ANKI_USE_RESULT Error init(const ConfigSet& config);
-
-	void run(RenderingContext& ctx);
-
-private:
-	FramebufferPtr m_fb;
-
-	ShaderProgramResourcePtr m_prog;
-	ShaderProgramPtr m_grProg;
-
-	TextureResourcePtr m_noiseTex;
+	public:
+		ShaderProgramResourcePtr m_prog;
+		ShaderProgramPtr m_grProg;
+		TextureResourcePtr m_noiseTex;
+	} m_upscale;
 
-	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
+	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
+	ANKI_USE_RESULT Error initVol();
+	ANKI_USE_RESULT Error initUpscale();
 };
 /// @}
 

+ 13 - 0
src/anki/renderer/LightShading.cpp

@@ -11,6 +11,7 @@
 #include <anki/renderer/GBuffer.h>
 #include <anki/renderer/LightBin.h>
 #include <anki/renderer/RenderQueue.h>
+#include <anki/renderer/ForwardShading.h>
 #include <anki/misc/ConfigSet.h>
 #include <anki/util/HighRezTimer.h>
 
@@ -185,6 +186,10 @@ void LightShading::run(RenderingContext& ctx)
 	bindStorage(cmdb, 0, 1, ctx.m_lightShading.m_lightIndicesToken);
 
 	cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 3);
+
+	// Apply the forward shading result
+	m_r->getForwardShading().drawUpscale(ctx);
+
 	cmdb->endRenderPass();
 }
 
@@ -219,4 +224,12 @@ void LightShading::setPreRunBarriers(RenderingContext& ctx)
 		TextureSurfaceInfo(0, 0, 0, 0));
 }
 
+void LightShading::setPostRunBarriers(RenderingContext& ctx)
+{
+	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_rt,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		TextureUsageBit::SAMPLED_FRAGMENT,
+		TextureSurfaceInfo(0, 0, 0, 0));
+}
+
 } // end namespace anki

+ 2 - 0
src/anki/renderer/LightShading.h

@@ -34,6 +34,8 @@ anki_internal:
 
 	void run(RenderingContext& ctx);
 
+	void setPostRunBarriers(RenderingContext& ctx);
+
 	TexturePtr getRt() const
 	{
 		return m_rt;

+ 3 - 10
src/anki/renderer/Renderer.cpp

@@ -136,9 +136,6 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_ssao.reset(m_alloc.newInstance<Ssao>(this));
 	ANKI_CHECK(m_ssao->init(config));
 
-	m_fsUpscale.reset(m_alloc.newInstance<ForwardShadingUpscale>(this));
-	ANKI_CHECK(m_fsUpscale->init(config));
-
 	m_downscale.reset(getAllocator().newInstance<DownscaleBlur>(this));
 	ANKI_CHECK(m_downscale->init(config));
 
@@ -322,24 +319,20 @@ Error Renderer::render(RenderingContext& ctx)
 	// Barriers
 	m_vol->m_vblur.setPostRunBarriers(ctx);
 	m_ssao->m_vblur.setPostRunBarriers(ctx);
-	m_lightShading->setPreRunBarriers(ctx);
 	m_forwardShading->setPreRunBarriers(ctx);
 
 	// Passes
-	m_lightShading->run(ctx);
 	m_forwardShading->run(ctx);
 
 	// Barriers
 	m_forwardShading->setPostRunBarriers(ctx);
+	m_lightShading->setPreRunBarriers(ctx);
 
 	// Passes
-	m_fsUpscale->run(ctx);
+	m_lightShading->run(ctx);
 
 	// Barriers
-	cmdb->setTextureSurfaceBarrier(m_lightShading->getRt(),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT,
-		TextureSurfaceInfo(0, 0, 0, 0));
+	m_lightShading->setPostRunBarriers(ctx);
 	m_temporalAA->setPreRunBarriers(ctx);
 
 	// Passes

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

@@ -376,7 +376,6 @@ private:
 	UniquePtr<ForwardShading> m_forwardShading; ///< Forward shading.
 	UniquePtr<Volumetric> m_vol; ///< Volumetric effects.
 	UniquePtr<LensFlare> m_lensFlare; ///< Forward shading lens flares.
-	UniquePtr<ForwardShadingUpscale> m_fsUpscale;
 	UniquePtr<DownscaleBlur> m_downscale;
 	UniquePtr<TemporalAA> m_temporalAA;
 	UniquePtr<Tonemapping> m_tonemapping;