Explorar o código

SVGF is feature complete. Now the party begins

Panagiotis Christopoulos Charitos %!s(int64=4) %!d(string=hai) anos
pai
achega
7cbded641d

+ 101 - 18
AnKi/Renderer/RtShadows.cpp

@@ -281,16 +281,40 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 	// SVGF Atrous
 	// SVGF Atrous
 	if(m_useSvgf)
 	if(m_useSvgf)
 	{
 	{
-		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("RtShadows SVGF Atrous");
-		rpass.setWork(
-			[](RenderPassWorkContext& rgraphCtx) {
-				static_cast<RtShadows*>(rgraphCtx.m_userData)->runSvgfAtrous(rgraphCtx);
-			},
-			this, 0);
+		m_runCtx.m_atrousPassIdx = 0;
 
 
 		for(U32 i = 0; i < m_atrousPassCount; ++i)
 		for(U32 i = 0; i < m_atrousPassCount; ++i)
 		{
 		{
-			// TODO
+			const Bool lastPass = i == m_atrousPassCount - 1;
+			const U32 readRtIdx = (i + 1) & 1;
+
+			ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("RtShadows SVGF Atrous");
+			rpass.setWork(
+				[](RenderPassWorkContext& rgraphCtx) {
+					static_cast<RtShadows*>(rgraphCtx.m_userData)->runSvgfAtrous(rgraphCtx);
+				},
+				this, 0);
+
+			rpass.newDependency(RenderPassDependency(m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE));
+			rpass.newDependency(
+				RenderPassDependency(m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE));
+			rpass.newDependency(
+				RenderPassDependency(m_runCtx.m_intermediateShadowsRts[readRtIdx], TextureUsageBit::SAMPLED_COMPUTE));
+			rpass.newDependency(
+				RenderPassDependency(m_runCtx.m_varianceRts[readRtIdx], TextureUsageBit::SAMPLED_COMPUTE));
+
+			if(lastPass)
+			{
+				rpass.newDependency(
+					RenderPassDependency(m_runCtx.m_historyAndFinalRt, TextureUsageBit::IMAGE_COMPUTE_WRITE));
+			}
+			else
+			{
+				rpass.newDependency(RenderPassDependency(m_runCtx.m_intermediateShadowsRts[!readRtIdx],
+														 TextureUsageBit::IMAGE_COMPUTE_WRITE));
+				rpass.newDependency(
+					RenderPassDependency(m_runCtx.m_varianceRts[!readRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE));
+			}
 		}
 		}
 	}
 	}
 
 
@@ -402,7 +426,10 @@ void RtShadows::run(RenderPassWorkContext& rgraphCtx)
 	}
 	}
 	else
 	else
 	{
 	{
-		// TODO
+		rgraphCtx.bindColorTexture(0, 16, m_runCtx.m_prevMomentsRt);
+		rgraphCtx.bindImage(0, 17, m_runCtx.m_currentMomentsRt, TextureSubresourceInfo());
+		rgraphCtx.bindColorTexture(0, 18, m_runCtx.m_prevHistoryLengthRt);
+		rgraphCtx.bindImage(0, 19, m_runCtx.m_currentHistoryLengthRt, TextureSubresourceInfo());
 	}
 	}
 
 
 	cmdb->bindAllBindless(1);
 	cmdb->bindAllBindless(1);
@@ -439,6 +466,72 @@ void RtShadows::runDenoise(RenderPassWorkContext& rgraphCtx)
 	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
 	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
 }
 }
 
 
+void RtShadows::runSvgfVariance(RenderPassWorkContext& rgraphCtx)
+{
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+
+	cmdb->bindShaderProgram(m_svgfVarianceGrProg);
+
+	cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
+	cmdb->bindSampler(0, 1, m_r->getSamplers().m_trilinearClamp);
+
+	rgraphCtx.bindColorTexture(0, 2, m_runCtx.m_intermediateShadowsRts[0]);
+	rgraphCtx.bindColorTexture(0, 3, m_runCtx.m_prevMomentsRt);
+	rgraphCtx.bindColorTexture(0, 4, m_runCtx.m_currentHistoryLengthRt);
+	rgraphCtx.bindTexture(0, 5, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
+	rgraphCtx.bindColorTexture(0, 6, m_r->getGBuffer().getColorRt(2));
+
+	rgraphCtx.bindImage(0, 7, m_runCtx.m_intermediateShadowsRts[1], TextureSubresourceInfo());
+	rgraphCtx.bindImage(0, 8, m_runCtx.m_varianceRts[1], TextureSubresourceInfo());
+
+	const Mat4 invViewProjMat = m_runCtx.m_ctx->m_matrices.m_viewProjectionJitter.getInverse();
+	cmdb->setPushConstants(&invViewProjMat, sizeof(invViewProjMat));
+
+	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth() / 2, m_r->getHeight() / 2);
+}
+
+void RtShadows::runSvgfAtrous(RenderPassWorkContext& rgraphCtx)
+{
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+
+	const Bool lastPass = m_runCtx.m_atrousPassIdx == m_atrousPassCount - 1;
+	const U32 readRtIdx = (m_runCtx.m_atrousPassIdx + 1) & 1;
+
+	if(lastPass)
+	{
+		cmdb->bindShaderProgram(m_svgfAtrousLastPassGrProg);
+	}
+	else
+	{
+		cmdb->bindShaderProgram(m_svgfAtrousGrProg);
+	}
+
+	cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
+	cmdb->bindSampler(0, 1, m_r->getSamplers().m_trilinearClamp);
+
+	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
+	rgraphCtx.bindColorTexture(0, 3, m_r->getGBuffer().getColorRt(2));
+	rgraphCtx.bindColorTexture(0, 4, m_runCtx.m_intermediateShadowsRts[readRtIdx]);
+	rgraphCtx.bindColorTexture(0, 5, m_runCtx.m_varianceRts[readRtIdx]);
+
+	if(lastPass)
+	{
+		rgraphCtx.bindImage(0, 6, m_runCtx.m_historyAndFinalRt, TextureSubresourceInfo());
+	}
+	else
+	{
+		rgraphCtx.bindImage(0, 6, m_runCtx.m_intermediateShadowsRts[!readRtIdx], TextureSubresourceInfo());
+		rgraphCtx.bindImage(0, 7, m_runCtx.m_varianceRts[!readRtIdx], TextureSubresourceInfo());
+	}
+
+	const U32 width = (lastPass) ? m_r->getWidth() : m_r->getWidth() / 2;
+	const U32 height = (lastPass) ? m_r->getHeight() : m_r->getHeight() / 2;
+
+	dispatchPPCompute(cmdb, 8, 8, width, height);
+
+	++m_runCtx.m_atrousPassIdx;
+}
+
 void RtShadows::buildSbt()
 void RtShadows::buildSbt()
 {
 {
 	// Get some things
 	// Get some things
@@ -534,16 +627,6 @@ Bool RtShadows::findShadowLayer(U64 lightUuid, U32& layerIdx, Bool& rejectHistor
 	return layerIdx != MAX_U32;
 	return layerIdx != MAX_U32;
 }
 }
 
 
-void RtShadows::runSvgfVariance(RenderPassWorkContext& rgraphCtx)
-{
-	// TODO
-}
-
-void RtShadows::runSvgfAtrous(RenderPassWorkContext& rgraphCtx)
-{
-	// TODO
-}
-
 void RtShadows::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
 void RtShadows::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
 									 ShaderProgramPtr& optionalShaderProgram) const
 									 ShaderProgramPtr& optionalShaderProgram) const
 {
 {

+ 2 - 0
AnKi/Renderer/RtShadows.h

@@ -113,6 +113,8 @@ public:
 		U32 m_hitGroupCount = 0;
 		U32 m_hitGroupCount = 0;
 
 
 		BitSet<MAX_RT_SHADOW_LAYERS, U8> m_layersWithRejectedHistory = {false};
 		BitSet<MAX_RT_SHADOW_LAYERS, U8> m_layersWithRejectedHistory = {false};
+
+		U8 m_atrousPassIdx = 0;
 	} m_runCtx;
 	} m_runCtx;
 
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);

+ 3 - 3
AnKi/Shaders/RtShadowsSvgfAtrous.ankiprog

@@ -21,11 +21,11 @@ layout(set = 0, binding = 1) uniform sampler u_linearAnyClampSampler;
 layout(set = 0, binding = 2) uniform texture2D u_depthTex;
 layout(set = 0, binding = 2) uniform texture2D u_depthTex;
 layout(set = 0, binding = 3) uniform texture2D u_gbuffer2Tex;
 layout(set = 0, binding = 3) uniform texture2D u_gbuffer2Tex;
 layout(set = 0, binding = 4) uniform utexture2D u_shadowsTex;
 layout(set = 0, binding = 4) uniform utexture2D u_shadowsTex;
-layout(set = 0, binding = 4) uniform texture2D u_varianceTex;
+layout(set = 0, binding = 5) uniform texture2D u_varianceTex;
 
 
-layout(set = 0, binding = 5) uniform uimage2D u_shadowsImage;
+layout(set = 0, binding = 6) uniform uimage2D u_shadowsImage;
 #if !LAST_PASS
 #if !LAST_PASS
-layout(set = 0, binding = 6) uniform image2D u_varianceImage;
+layout(set = 0, binding = 7) uniform image2D u_varianceImage;
 #endif
 #endif
 
 
 layout(std430, push_constant, row_major) uniform b_pc
 layout(std430, push_constant, row_major) uniform b_pc