Browse Source

Remove the old SSGI

Panagiotis Christopoulos Charitos 4 years ago
parent
commit
8130f840cd

+ 1 - 2
AnKi/Renderer.h

@@ -20,11 +20,9 @@
 #include <AnKi/Renderer/TemporalAA.h>
 #include <AnKi/Renderer/TemporalAA.h>
 #include <AnKi/Renderer/RenderQueue.h>
 #include <AnKi/Renderer/RenderQueue.h>
 #include <AnKi/Renderer/Ssr.h>
 #include <AnKi/Renderer/Ssr.h>
-#include <AnKi/Renderer/Ssgi.h>
 #include <AnKi/Renderer/ProbeReflections.h>
 #include <AnKi/Renderer/ProbeReflections.h>
 #include <AnKi/Renderer/Dbg.h>
 #include <AnKi/Renderer/Dbg.h>
 #include <AnKi/Renderer/Ssao.h>
 #include <AnKi/Renderer/Ssao.h>
-#include <AnKi/Renderer/Ssgi.h>
 #include <AnKi/Renderer/Drawer.h>
 #include <AnKi/Renderer/Drawer.h>
 #include <AnKi/Renderer/UiStage.h>
 #include <AnKi/Renderer/UiStage.h>
 #include <AnKi/Renderer/Tonemapping.h>
 #include <AnKi/Renderer/Tonemapping.h>
@@ -34,5 +32,6 @@
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/GenericCompute.h>
 #include <AnKi/Renderer/GenericCompute.h>
 #include <AnKi/Renderer/ShadowmapsResolve.h>
 #include <AnKi/Renderer/ShadowmapsResolve.h>
+#include <AnKi/Renderer/IndirectDiffuse.h>
 
 
 /// @defgroup renderer Renderering system
 /// @defgroup renderer Renderering system

+ 16 - 24
AnKi/Renderer/LightShading.cpp

@@ -12,9 +12,7 @@
 #include <AnKi/Renderer/ForwardShading.h>
 #include <AnKi/Renderer/ForwardShading.h>
 #include <AnKi/Renderer/VolumetricFog.h>
 #include <AnKi/Renderer/VolumetricFog.h>
 #include <AnKi/Renderer/DepthDownscale.h>
 #include <AnKi/Renderer/DepthDownscale.h>
-#include <AnKi/Renderer/Ssao.h>
 #include <AnKi/Renderer/Ssr.h>
 #include <AnKi/Renderer/Ssr.h>
-#include <AnKi/Renderer/Ssgi.h>
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/ShadowmapsResolve.h>
 #include <AnKi/Renderer/ShadowmapsResolve.h>
 #include <AnKi/Renderer/RtShadows.h>
 #include <AnKi/Renderer/RtShadows.h>
@@ -156,16 +154,14 @@ void LightShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgrap
 		rgraphCtx.bindTexture(0, 15, m_r->getGBuffer().getDepthRt(),
 		rgraphCtx.bindTexture(0, 15, m_r->getGBuffer().getDepthRt(),
 							  TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
 							  TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
 		rgraphCtx.bindColorTexture(0, 16, m_r->getSsr().getRt());
 		rgraphCtx.bindColorTexture(0, 16, m_r->getSsr().getRt());
-		rgraphCtx.bindColorTexture(0, 17, m_r->getSsao().getRt());
-		rgraphCtx.bindColorTexture(0, 18, m_r->getSsgi().getRt());
 
 
 		if(m_r->getRtShadowsEnabled())
 		if(m_r->getRtShadowsEnabled())
 		{
 		{
-			rgraphCtx.bindColorTexture(0, 19, m_r->getRtShadows().getRt());
+			rgraphCtx.bindColorTexture(0, 17, m_r->getRtShadows().getRt());
 		}
 		}
 		else
 		else
 		{
 		{
-			rgraphCtx.bindColorTexture(0, 20, m_r->getShadowmapsResolve().getRt());
+			rgraphCtx.bindColorTexture(0, 18, m_r->getShadowmapsResolve().getRt());
 		}
 		}
 
 
 		// Draw
 		// Draw
@@ -249,45 +245,41 @@ void LightShading::populateRenderGraph(RenderingContext& ctx)
 				 [this, &ctx](RenderPassWorkContext& rgraphCtx) { run(ctx, rgraphCtx); });
 				 [this, &ctx](RenderPassWorkContext& rgraphCtx) { run(ctx, rgraphCtx); });
 	pass.setFramebufferInfo(m_lightShading.m_fbDescr, {{m_runCtx.m_rt}}, {m_r->getGBuffer().getDepthRt()});
 	pass.setFramebufferInfo(m_lightShading.m_fbDescr, {{m_runCtx.m_rt}}, {m_r->getGBuffer().getDepthRt()});
 
 
+	const TextureUsageBit readUsage = TextureUsageBit::SAMPLED_FRAGMENT;
+
 	// Light shading
 	// Light shading
 	pass.newDependency(RenderPassDependency(m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE));
 	pass.newDependency(RenderPassDependency(m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE));
-	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(0), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(1), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT));
+	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(0), readUsage));
+	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(1), readUsage));
+	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getColorRt(2), readUsage));
 	pass.newDependency(
 	pass.newDependency(
 		RenderPassDependency(m_r->getGBuffer().getDepthRt(),
 		RenderPassDependency(m_r->getGBuffer().getDepthRt(),
 							 TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
 							 TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
 							 TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)));
 							 TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)));
-	pass.newDependency(
-		RenderPassDependency(m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(RenderPassDependency(m_r->getSsao().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(RenderPassDependency(m_r->getSsgi().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
+	pass.newDependency(RenderPassDependency(m_r->getShadowMapping().getShadowmapRt(), readUsage));
 	if(m_r->getRtShadowsEnabled())
 	if(m_r->getRtShadowsEnabled())
 	{
 	{
-		pass.newDependency(RenderPassDependency(m_r->getRtShadows().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
+		pass.newDependency(RenderPassDependency(m_r->getRtShadows().getRt(), readUsage));
 	}
 	}
 	else
 	else
 	{
 	{
-		pass.newDependency(
-			RenderPassDependency(m_r->getShadowmapsResolve().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
+		pass.newDependency(RenderPassDependency(m_r->getShadowmapsResolve().getRt(), readUsage));
 	}
 	}
 	pass.newDependency(
 	pass.newDependency(
 		RenderPassDependency(ctx.m_clusteredShading.m_clustersBufferHandle, BufferUsageBit::STORAGE_FRAGMENT_READ));
 		RenderPassDependency(ctx.m_clusteredShading.m_clustersBufferHandle, BufferUsageBit::STORAGE_FRAGMENT_READ));
 
 
 	// Refl & indirect
 	// Refl & indirect
-	pass.newDependency(RenderPassDependency(m_r->getSsr().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(
-		RenderPassDependency(m_r->getProbeReflections().getReflectionRt(), TextureUsageBit::SAMPLED_FRAGMENT));
+	pass.newDependency(RenderPassDependency(m_r->getSsr().getRt(), readUsage));
+	pass.newDependency(RenderPassDependency(m_r->getProbeReflections().getReflectionRt(), readUsage));
 
 
-	m_r->getGlobalIllumination().setRenderGraphDependencies(ctx, pass, TextureUsageBit::SAMPLED_FRAGMENT);
+	m_r->getGlobalIllumination().setRenderGraphDependencies(ctx, pass, readUsage);
 
 
 	// Apply indirect
 	// Apply indirect
-	pass.newDependency(RenderPassDependency(m_r->getIndirectDiffuse().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
-	pass.newDependency(
-		RenderPassDependency(m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_HALF_DEPTH));
+	pass.newDependency(RenderPassDependency(m_r->getIndirectDiffuse().getRt(), readUsage));
+	pass.newDependency(RenderPassDependency(m_r->getDepthDownscale().getHiZRt(), readUsage, HIZ_HALF_DEPTH));
 
 
 	// Fog
 	// Fog
-	pass.newDependency(RenderPassDependency(m_r->getVolumetricFog().getRt(), TextureUsageBit::SAMPLED_FRAGMENT));
+	pass.newDependency(RenderPassDependency(m_r->getVolumetricFog().getRt(), readUsage));
 
 
 	// For forward shading
 	// For forward shading
 	m_r->getForwardShading().setDependencies(ctx, pass);
 	m_r->getForwardShading().setDependencies(ctx, pass);

+ 0 - 5
AnKi/Renderer/Renderer.cpp

@@ -32,7 +32,6 @@
 #include <AnKi/Renderer/TemporalAA.h>
 #include <AnKi/Renderer/TemporalAA.h>
 #include <AnKi/Renderer/UiStage.h>
 #include <AnKi/Renderer/UiStage.h>
 #include <AnKi/Renderer/Ssr.h>
 #include <AnKi/Renderer/Ssr.h>
-#include <AnKi/Renderer/Ssgi.h>
 #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
 #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/GlobalIllumination.h>
 #include <AnKi/Renderer/GenericCompute.h>
 #include <AnKi/Renderer/GenericCompute.h>
@@ -185,9 +184,6 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_ssr.reset(m_alloc.newInstance<Ssr>(this));
 	m_ssr.reset(m_alloc.newInstance<Ssr>(this));
 	ANKI_CHECK(m_ssr->init(config));
 	ANKI_CHECK(m_ssr->init(config));
 
 
-	m_ssgi.reset(m_alloc.newInstance<Ssgi>(this));
-	ANKI_CHECK(m_ssgi->init(config));
-
 	m_tonemapping.reset(getAllocator().newInstance<Tonemapping>(this));
 	m_tonemapping.reset(getAllocator().newInstance<Tonemapping>(this));
 	ANKI_CHECK(m_tonemapping->init(config));
 	ANKI_CHECK(m_tonemapping->init(config));
 
 
@@ -367,7 +363,6 @@ Error Renderer::populateRenderGraph(RenderingContext& ctx)
 	m_ssao->populateRenderGraph(ctx);
 	m_ssao->populateRenderGraph(ctx);
 	m_lensFlare->populateRenderGraph(ctx);
 	m_lensFlare->populateRenderGraph(ctx);
 	m_ssr->populateRenderGraph(ctx);
 	m_ssr->populateRenderGraph(ctx);
-	m_ssgi->populateRenderGraph(ctx);
 	m_indirectDiffuse->populateRenderGraph(ctx);
 	m_indirectDiffuse->populateRenderGraph(ctx);
 	m_lightShading->populateRenderGraph(ctx);
 	m_lightShading->populateRenderGraph(ctx);
 	m_temporalAA->populateRenderGraph(ctx);
 	m_temporalAA->populateRenderGraph(ctx);

+ 0 - 1
AnKi/Renderer/RendererObjectDefs.h

@@ -21,7 +21,6 @@ ANKI_RENDERER_OBJECT_DEF(DepthDownscale, depthDownscale)
 ANKI_RENDERER_OBJECT_DEF(TemporalAA, temporalAA)
 ANKI_RENDERER_OBJECT_DEF(TemporalAA, temporalAA)
 ANKI_RENDERER_OBJECT_DEF(UiStage, uiStage)
 ANKI_RENDERER_OBJECT_DEF(UiStage, uiStage)
 ANKI_RENDERER_OBJECT_DEF(Ssr, ssr)
 ANKI_RENDERER_OBJECT_DEF(Ssr, ssr)
-ANKI_RENDERER_OBJECT_DEF(Ssgi, ssgi)
 ANKI_RENDERER_OBJECT_DEF(VolumetricLightingAccumulation, volumetricLightingAccumulation)
 ANKI_RENDERER_OBJECT_DEF(VolumetricLightingAccumulation, volumetricLightingAccumulation)
 ANKI_RENDERER_OBJECT_DEF(GlobalIllumination, globalIllumination)
 ANKI_RENDERER_OBJECT_DEF(GlobalIllumination, globalIllumination)
 ANKI_RENDERER_OBJECT_DEF(GenericCompute, genericCompute)
 ANKI_RENDERER_OBJECT_DEF(GenericCompute, genericCompute)

+ 0 - 277
AnKi/Renderer/Ssgi.cpp

@@ -1,277 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include <AnKi/Renderer/Ssgi.h>
-#include <AnKi/Renderer/Renderer.h>
-#include <AnKi/Renderer/DepthDownscale.h>
-#include <AnKi/Renderer/GBuffer.h>
-#include <AnKi/Renderer/DownscaleBlur.h>
-#include <AnKi/Renderer/MotionVectors.h>
-#include <AnKi/Core/ConfigSet.h>
-#include <AnKi/Shaders/Include/SsgiTypes.h>
-
-namespace anki
-{
-
-static constexpr U32 WRITE = 0;
-static constexpr U32 READ = 1;
-
-Ssgi::~Ssgi()
-{
-}
-
-Error Ssgi::init(const ConfigSet& cfg)
-{
-	const Error err = initInternal(cfg);
-	if(err)
-	{
-		ANKI_R_LOGE("Failed to initialize SSGI pass");
-	}
-	return err;
-}
-
-Error Ssgi::initInternal(const ConfigSet& cfg)
-{
-	const U32 width = m_r->getInternalResolution().x();
-	const U32 height = m_r->getInternalResolution().y();
-	ANKI_ASSERT((width % 2) == 0 && (height % 2) == 0 && "The algorithms won't work");
-	ANKI_R_LOGI("Initializing SSGI pass");
-	m_main.m_maxSteps = cfg.getNumberU32("r_ssgiMaxSteps");
-	m_main.m_depthLod = min(cfg.getNumberU32("r_ssgiDepthLod"), m_r->getDepthDownscale().getMipmapCount() - 1);
-	m_main.m_firstStepPixels = 32;
-
-	ANKI_CHECK(getResourceManager().loadResource("EngineAssets/BlueNoise_Rgba8_16x16.png", m_main.m_noiseImage));
-
-	// Init main
-	{
-		m_main.m_rtDescr =
-			m_r->create2DRenderTargetDescription(width / 2, height / 2, Format::B10G11R11_UFLOAT_PACK32, "SSGI_tmp");
-		m_main.m_rtDescr.bake();
-
-		ANKI_CHECK(getResourceManager().loadResource("Shaders/Ssgi.ankiprog", m_main.m_prog));
-
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_main.m_prog);
-
-		for(U32 i = 0; i < 4; ++i)
-		{
-			variantInitInfo.addMutation("VARIANT", i);
-
-			const ShaderProgramResourceVariant* variant;
-			m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
-			m_main.m_grProg[i] = variant->getProgram();
-		}
-	}
-
-	// Init denoise
-	{
-		ANKI_CHECK(getResourceManager().loadResource("Shaders/SsgiDenoise.ankiprog", m_denoise.m_prog));
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_denoise.m_prog);
-		const ShaderProgramResourceVariant* variant;
-
-		variantInitInfo.addConstant("IN_TEXTURE_SIZE", UVec2(width / 2, height / 2));
-
-		for(U32 i = 0; i < 4; ++i)
-		{
-			variantInitInfo.addMutation("VARIANT", i);
-
-			variantInitInfo.addMutation("SAMPLE_COUNT", 11);
-			variantInitInfo.addMutation("ORIENTATION", 0);
-			m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
-			m_denoise.m_grProg[0][i] = variant->getProgram();
-
-			variantInitInfo.addMutation("SAMPLE_COUNT", 15);
-			variantInitInfo.addMutation("ORIENTATION", 1);
-			m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
-			m_denoise.m_grProg[1][i] = variant->getProgram();
-		}
-	}
-
-	// Init reconstruction
-	{
-		ANKI_CHECK(getResourceManager().loadResource("Shaders/SsgiReconstruct.ankiprog", m_recontruction.m_prog));
-		ShaderProgramResourceVariantInitInfo variantInitInfo(m_recontruction.m_prog);
-		variantInitInfo.addConstant("FB_SIZE",
-									UVec2(m_r->getInternalResolution().x(), m_r->getInternalResolution().y()));
-		const ShaderProgramResourceVariant* variant;
-
-		for(U32 i = 0; i < 4; ++i)
-		{
-			variantInitInfo.addMutation("VARIANT", i);
-			m_recontruction.m_prog->getOrCreateVariant(variantInitInfo, variant);
-			m_recontruction.m_grProg[i] = variant->getProgram();
-		}
-
-		TextureInitInfo initInfo = m_r->create2DRenderTargetInitInfo(
-			width, height, Format::B10G11R11_UFLOAT_PACK32,
-			TextureUsageBit::ALL_SAMPLED | TextureUsageBit::IMAGE_COMPUTE_WRITE, "SSGI");
-		initInfo.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;
-		m_recontruction.m_rt = m_r->createAndClearRenderTarget(initInfo);
-	}
-
-	return Error::NONE;
-}
-
-void Ssgi::populateRenderGraph(RenderingContext& ctx)
-{
-	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
-	m_runCtx.m_ctx = &ctx;
-
-	// Main pass
-	{
-		// Create RTs
-		if(ANKI_LIKELY(m_recontruction.m_rtImportedOnce))
-		{
-			m_runCtx.m_finalRt = rgraph.importRenderTarget(m_recontruction.m_rt);
-		}
-		else
-		{
-			m_runCtx.m_finalRt = rgraph.importRenderTarget(m_recontruction.m_rt, TextureUsageBit::SAMPLED_FRAGMENT);
-			m_recontruction.m_rtImportedOnce = true;
-		}
-		m_runCtx.m_intermediateRts[WRITE] = rgraph.newRenderTarget(m_main.m_rtDescr);
-		m_runCtx.m_intermediateRts[READ] = rgraph.newRenderTarget(m_main.m_rtDescr);
-
-		// Create pass
-		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI");
-		rpass.setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) { run(ctx, rgraphCtx); });
-
-		rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::IMAGE_COMPUTE_WRITE});
-		rpass.newDependency({m_runCtx.m_finalRt, TextureUsageBit::SAMPLED_COMPUTE});
-
-		TextureSubresourceInfo hizSubresource;
-		hizSubresource.m_firstMipmap = m_main.m_depthLod;
-		rpass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, hizSubresource});
-		rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getMotionVectors().getRejectionFactorRt(), TextureUsageBit::SAMPLED_COMPUTE});
-	}
-
-	// Blur vertical
-	{
-		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_blur_v");
-
-		rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_runCtx.m_intermediateRts[READ], TextureUsageBit::IMAGE_COMPUTE_WRITE});
-		rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
-
-		rpass.setWork([this](RenderPassWorkContext& rgraphCtx) { runVBlur(rgraphCtx); });
-	}
-
-	// Blur horizontal
-	{
-		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_blur_h");
-
-		rpass.newDependency({m_runCtx.m_intermediateRts[READ], TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::IMAGE_COMPUTE_WRITE});
-		rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
-
-		rpass.setWork([this](RenderPassWorkContext& rgraphCtx) { runHBlur(rgraphCtx); });
-	}
-
-	// Reconstruction
-	{
-		ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_recon");
-
-		rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_runCtx.m_finalRt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
-		rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
-		rpass.newDependency({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
-
-		rpass.setWork([this](RenderPassWorkContext& rgraphCtx) { runRecontruct(rgraphCtx); });
-	}
-}
-
-void Ssgi::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-	cmdb->bindShaderProgram(m_main.m_grProg[m_r->getFrameCount() % 4]);
-
-	rgraphCtx.bindImage(0, 0, m_runCtx.m_intermediateRts[WRITE], TextureSubresourceInfo());
-
-	// Bind uniforms
-	SsgiUniforms* unis = allocateAndBindUniforms<SsgiUniforms*>(sizeof(SsgiUniforms), cmdb, 0, 1);
-	unis->m_depthBufferSize =
-		UVec2(m_r->getInternalResolution().x(), m_r->getInternalResolution().y()) >> (m_main.m_depthLod + 1);
-	unis->m_framebufferSize = UVec2(m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
-	unis->m_invProjMat = ctx.m_matrices.m_projectionJitter.getInverse();
-	unis->m_projMat = ctx.m_matrices.m_projectionJitter;
-	unis->m_prevViewProjMatMulInvViewProjMat =
-		ctx.m_prevMatrices.m_viewProjection * ctx.m_matrices.m_viewProjectionJitter.getInverse();
-	unis->m_normalMat = Mat3x4(Vec3(0.0f), ctx.m_matrices.m_view.getRotationPart());
-	unis->m_frameCount = m_r->getFrameCount() & MAX_U32;
-	unis->m_maxSteps = m_main.m_maxSteps;
-	unis->m_firstStepPixels = m_main.m_firstStepPixels;
-
-	cmdb->bindSampler(0, 2, m_r->getSamplers().m_trilinearClamp);
-
-	rgraphCtx.bindColorTexture(0, 3, m_r->getGBuffer().getColorRt(2));
-
-	TextureSubresourceInfo hizSubresource;
-	hizSubresource.m_firstMipmap = m_main.m_depthLod;
-	rgraphCtx.bindTexture(0, 4, m_r->getDepthDownscale().getHiZRt(), hizSubresource);
-
-	rgraphCtx.bindColorTexture(0, 5, m_r->getDownscaleBlur().getRt());
-	rgraphCtx.bindColorTexture(0, 6, m_runCtx.m_finalRt);
-	rgraphCtx.bindColorTexture(0, 7, m_r->getMotionVectors().getMotionVectorsRt());
-	rgraphCtx.bindColorTexture(0, 8, m_r->getMotionVectors().getRejectionFactorRt());
-
-	// Dispatch
-	dispatchPPCompute(cmdb, 16, 16, m_r->getInternalResolution().x() / 2, m_r->getInternalResolution().y() / 2);
-}
-
-void Ssgi::runVBlur(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-	cmdb->bindShaderProgram(m_denoise.m_grProg[0][m_r->getFrameCount() % 4]);
-
-	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
-	rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[WRITE]);
-	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
-	rgraphCtx.bindColorTexture(0, 3, m_r->getGBuffer().getColorRt(2));
-
-	rgraphCtx.bindImage(0, 4, m_runCtx.m_intermediateRts[READ], TextureSubresourceInfo());
-
-	const Mat4 mat = m_runCtx.m_ctx->m_matrices.m_viewProjectionJitter.getInverse();
-	cmdb->setPushConstants(&mat, sizeof(mat));
-
-	dispatchPPCompute(cmdb, 8, 8, m_r->getInternalResolution().x() / 2, m_r->getInternalResolution().y() / 2);
-}
-
-void Ssgi::runHBlur(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-	cmdb->bindShaderProgram(m_denoise.m_grProg[1][m_r->getFrameCount() % 4]);
-
-	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
-	rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[READ]);
-	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
-	rgraphCtx.bindColorTexture(0, 3, m_r->getGBuffer().getColorRt(2));
-
-	rgraphCtx.bindImage(0, 4, m_runCtx.m_intermediateRts[WRITE], TextureSubresourceInfo());
-
-	const Mat4 mat = m_runCtx.m_ctx->m_matrices.m_viewProjectionJitter.getInverse();
-	cmdb->setPushConstants(&mat, sizeof(mat));
-
-	dispatchPPCompute(cmdb, 8, 8, m_r->getInternalResolution().x() / 2, m_r->getInternalResolution().y() / 2);
-}
-
-void Ssgi::runRecontruct(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-	cmdb->bindShaderProgram(m_recontruction.m_grProg[m_r->getFrameCount() % 4]);
-
-	cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
-	rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[WRITE]);
-	rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
-
-	rgraphCtx.bindImage(0, 3, m_runCtx.m_finalRt, TextureSubresourceInfo());
-
-	dispatchPPCompute(cmdb, 16, 16, m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
-}
-
-} // end namespace anki

+ 0 - 93
AnKi/Renderer/Ssgi.h

@@ -1,93 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma once
-
-#include <AnKi/Renderer/RendererObject.h>
-#include <AnKi/Resource/ImageResource.h>
-#include <AnKi/Gr.h>
-
-namespace anki
-{
-
-/// @addtogroup renderer
-/// @{
-
-/// Screen space global illumination.
-class Ssgi : public RendererObject
-{
-public:
-	Ssgi(Renderer* r)
-		: RendererObject(r)
-	{
-		registerDebugRenderTarget("SSGI");
-	}
-
-	~Ssgi();
-
-	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
-
-	/// Populate the rendergraph.
-	void populateRenderGraph(RenderingContext& ctx);
-
-	RenderTargetHandle getRt() const
-	{
-		return m_runCtx.m_finalRt;
-	}
-
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
-							  ShaderProgramPtr& optionalShaderProgram) const override
-	{
-		ANKI_ASSERT(rtName == "SSGI");
-		handle = m_runCtx.m_finalRt;
-	}
-
-private:
-	class
-	{
-	public:
-		ShaderProgramResourcePtr m_prog;
-		Array<ShaderProgramPtr, 4> m_grProg;
-		RenderTargetDescription m_rtDescr;
-		ImageResourcePtr m_noiseImage;
-		U32 m_maxSteps = 32;
-		U32 m_firstStepPixels = 16;
-		U32 m_depthLod = 0;
-	} m_main;
-
-	class
-	{
-	public:
-		ShaderProgramResourcePtr m_prog;
-		Array2d<ShaderProgramPtr, 2, 4> m_grProg;
-	} m_denoise;
-
-	class
-	{
-	public:
-		TexturePtr m_rt;
-		ShaderProgramResourcePtr m_prog;
-		Array<ShaderProgramPtr, 4> m_grProg;
-		Bool m_rtImportedOnce = false;
-	} m_recontruction;
-
-	class
-	{
-	public:
-		Array<RenderTargetHandle, 2> m_intermediateRts;
-		RenderTargetHandle m_finalRt;
-		RenderingContext* m_ctx = nullptr;
-	} m_runCtx;
-
-	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
-
-	void run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
-	void runVBlur(RenderPassWorkContext& rgraphCtx);
-	void runHBlur(RenderPassWorkContext& rgraphCtx);
-	void runRecontruct(RenderPassWorkContext& rgraphCtx);
-};
-/// @}
-
-} // namespace anki

+ 2 - 56
AnKi/Shaders/LightShading.ankiprog

@@ -35,12 +35,10 @@ layout(set = 0, binding = 13) uniform texture2D u_msRt1;
 layout(set = 0, binding = 14) uniform texture2D u_msRt2;
 layout(set = 0, binding = 14) uniform texture2D u_msRt2;
 layout(set = 0, binding = 15) uniform texture2D u_msDepthRt;
 layout(set = 0, binding = 15) uniform texture2D u_msDepthRt;
 layout(set = 0, binding = 16) uniform texture2D u_ssrRt;
 layout(set = 0, binding = 16) uniform texture2D u_ssrRt;
-layout(set = 0, binding = 17) uniform texture2D u_ssaoRt;
-layout(set = 0, binding = 18) uniform texture2D u_ssgiRt;
 #if USE_SHADOW_LAYERS
 #if USE_SHADOW_LAYERS
-layout(set = 0, binding = 19) uniform utexture2D u_shadowLayersTex;
+layout(set = 0, binding = 17) uniform utexture2D u_shadowLayersTex;
 #else
 #else
-layout(set = 0, binding = 20) uniform texture2D u_resolvedSm;
+layout(set = 0, binding = 18) uniform texture2D u_resolvedSm;
 #endif
 #endif
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
@@ -91,10 +89,6 @@ void main()
 	U32 resolvedSmIdx = 0u;
 	U32 resolvedSmIdx = 0u;
 #endif
 #endif
 
 
-	// SSAO
-	const F32 ssao = textureLod(u_ssaoRt, u_trilinearClampSampler, in_uv, 0.0).r;
-	// gbuffer.m_diffuse *= ssao;
-
 	// Ambient and emissive color
 	// Ambient and emissive color
 	out_color = gbuffer.m_diffuse * gbuffer.m_emission;
 	out_color = gbuffer.m_diffuse * gbuffer.m_emission;
 
 
@@ -235,53 +229,5 @@ void main()
 
 
 		out_color += finalSpecIndirect * env;
 		out_color += finalSpecIndirect * env;
 	}
 	}
-
-	// Indirect diffuse
-	{
-		Vec3 diffIndirect;
-
-		if(bitCount(cluster.m_giProbesMask) == 1)
-		{
-			// All subgroups point to the same probe and there is only one probe, do a fast path without blend weight
-
-			const GlobalIlluminationProbe probe = u_giProbes[findLSB2(cluster.m_giProbesMask)];
-
-			// Sample
-			diffIndirect = sampleGlobalIllumination(worldPos, gbuffer.m_normal, probe, u_globalIlluminationTextures,
-													u_trilinearClampSampler);
-		}
-		else
-		{
-			// Zero or more than one probes, do a slow path that blends them together
-
-			F32 totalBlendWeight = EPSILON;
-			diffIndirect = Vec3(0.0);
-
-			// Loop probes
-			ANKI_LOOP while(cluster.m_giProbesMask != 0u)
-			{
-				const U32 idx = U32(findLSB2(cluster.m_giProbesMask));
-				cluster.m_giProbesMask &= ~(1u << idx);
-				const GlobalIlluminationProbe probe = u_giProbes[idx];
-
-				// Compute blend weight
-				const F32 blendWeight =
-					computeProbeBlendWeight(worldPos, probe.m_aabbMin, probe.m_aabbMax, probe.m_fadeDistance);
-				totalBlendWeight += blendWeight;
-
-				// Sample
-				const Vec3 c = sampleGlobalIllumination(worldPos, gbuffer.m_normal, probe, u_globalIlluminationTextures,
-														u_trilinearClampSampler);
-				diffIndirect += c * blendWeight;
-			}
-
-			// Normalize
-			diffIndirect /= totalBlendWeight;
-		}
-
-		const Vec3 ssgi = textureLod(u_ssgiRt, u_trilinearClampSampler, in_uv, 0.0).rgb;
-		diffIndirect += ssgi;
-		// out_color += diffIndirect * gbuffer.m_diffuse;
-	}
 }
 }
 #pragma anki end
 #pragma anki end

+ 0 - 156
AnKi/Shaders/Ssgi.ankiprog

@@ -1,156 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// The VARIANT points to the fragment in the quad that will be processed:
-// -----
-// |3|2|
-// |0|1|
-// -----
-
-#pragma anki mutator VARIANT 0 1 2 3
-
-#pragma anki start comp
-#include <AnKi/Shaders/SsRaymarching.glsl>
-#include <AnKi/Shaders/Functions.glsl>
-#include <AnKi/Shaders/PackFunctions.glsl>
-#include <AnKi/Shaders/ImportanceSampling.glsl>
-#include <AnKi/Shaders/Include/SsgiTypes.h>
-
-const UVec2 WORKGROUP_SIZE = UVec2(16, 16);
-layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
-
-layout(set = 0, binding = 0, rgba16f) uniform image2D out_img;
-
-layout(set = 0, binding = 1, row_major, std140) uniform u_
-{
-	SsgiUniforms u_unis;
-};
-
-layout(set = 0, binding = 2) uniform sampler u_trilinearClampSampler;
-layout(set = 0, binding = 3) uniform texture2D u_gbufferRt2;
-layout(set = 0, binding = 4) uniform texture2D u_depthRt;
-layout(set = 0, binding = 5) uniform texture2D u_lightBufferRt;
-layout(set = 0, binding = 6) uniform texture2D u_historyTex;
-layout(set = 0, binding = 7) uniform texture2D u_motionVectorsTex;
-layout(set = 0, binding = 8) uniform texture2D u_motionVectorRejectionTex;
-
-void main()
-{
-	// Compute a global invocation ID that takes the checkerboard pattern into account
-	UVec2 fixedGlobalInvocationId = gl_GlobalInvocationID.xy;
-	fixedGlobalInvocationId *= 2u;
-#if VARIANT == 0
-	// Nothing
-#elif VARIANT == 1
-	fixedGlobalInvocationId.x += 1u;
-#elif VARIANT == 2
-	fixedGlobalInvocationId += 1u;
-#else
-	fixedGlobalInvocationId.y += 1u;
-#endif
-
-	if(fixedGlobalInvocationId.x >= u_unis.m_framebufferSize.x
-	   || fixedGlobalInvocationId.y >= u_unis.m_framebufferSize.y)
-	{
-		// Skip threads outside the writable image
-		return;
-	}
-
-	const Vec2 uv = (Vec2(fixedGlobalInvocationId.xy) + 0.5) / Vec2(u_unis.m_framebufferSize);
-	const Vec2 ndc = UV_TO_NDC(uv);
-
-	// Get normal
-	const Vec3 worldNormal = readNormalFromGBuffer(u_gbufferRt2, u_trilinearClampSampler, uv);
-	const Vec3 viewNormal = u_unis.m_normalMat * worldNormal;
-
-	// Get depth
-	const F32 depth = textureLod(u_depthRt, u_trilinearClampSampler, uv, 0.0).r;
-
-	// Compute view pos
-	const Vec4 viewPos4 = u_unis.m_invProjMat * Vec4(ndc, depth, 1.0);
-	const Vec3 viewPos = viewPos4.xyz / viewPos4.w;
-
-	// Get a random point inside the hemisphere. Use hemisphereSampleCos to avoid perpendicular vecs to viewNormal
-	const UVec2 random = rand3DPCG16(UVec3(gl_GlobalInvocationID.xy, u_unis.m_frameCount)).xy;
-	Vec2 randomCircle = hammersleyRandom16(0u, 0xFFFFu, random);
-	randomCircle.x *= 0.85; // Reduce the cone angle a bit to avoid self-collisions
-	const Vec3 randomHemisphere = rotationFromDirection(viewNormal) * hemisphereSampleCos(randomCircle);
-
-	// Trace
-	Vec3 hitPoint;
-	F32 hitAttenuation;
-	const U32 lod = 0u;
-	const F32 minStepf = 4.0;
-	const F32 noise = F32(random.x) * (1.0 / 65536.0);
-	raymarchGroundTruth(viewPos, randomHemisphere, uv, depth, u_unis.m_projMat, u_unis.m_maxSteps, u_depthRt,
-						u_trilinearClampSampler, F32(lod), u_unis.m_depthBufferSize, u_unis.m_firstStepPixels,
-						U32(mix(minStepf, F32(u_unis.m_firstStepPixels), noise)), hitPoint, hitAttenuation);
-
-	// Reject backfacing
-	ANKI_BRANCH if(hitAttenuation > 0.0)
-	{
-		const Vec3 hitNormal =
-			u_unis.m_normalMat * readNormalFromGBuffer(u_gbufferRt2, u_trilinearClampSampler, hitPoint.xy);
-		F32 backFaceAttenuation;
-		rejectBackFaces(randomHemisphere, hitNormal, backFaceAttenuation);
-
-		hitAttenuation *= backFaceAttenuation;
-	}
-
-	// Read the light buffer
-	Vec3 outColor;
-	ANKI_BRANCH if(hitAttenuation > 0.0)
-	{
-		// Reproject the UV because you are reading the previous frame
-		const Vec4 v4 = u_unis.m_prevViewProjMatMulInvViewProjMat * Vec4(UV_TO_NDC(hitPoint.xy), hitPoint.z, 1.0);
-		hitPoint.xy = NDC_TO_UV(v4.xy / v4.w);
-
-		// Read the light buffer
-		outColor = textureLod(u_lightBufferRt, u_trilinearClampSampler, hitPoint.xy, 100.0).rgb;
-		outColor = clamp(outColor, 0.0, FLT_MAX); // Fix the value just in case
-		outColor *= hitAttenuation;
-
-#if 0
-		// Compute a new normal based on the new hit point
-		const F32 depth = textureLod(u_depthRt, u_trilinearClampSampler, hitPoint.xy, 0.0).r;
-		const Vec4 viewPos4 = u_unis.m_invProjMat * Vec4(UV_TO_NDC(hitPoint.xy), depth, 1.0);
-		const Vec3 hitViewPos = viewPos4.xyz / viewPos4.w;
-		const Vec3 newViewNormal = normalize(hitViewPos - viewPos);
-#else
-		const Vec3 newViewNormal = viewNormal;
-#endif
-
-		// Modulate
-		const F32 NoL = max(0.0, dot(randomHemisphere, newViewNormal));
-		outColor *= NoL;
-		outColor *= 2.0 * PI;
-	}
-	else
-	{
-		outColor = Vec3(0.0, 0.0, 0.0);
-	}
-
-	// Blend with history
-	{
-		const Vec2 historyUv = uv + textureLod(u_motionVectorsTex, u_trilinearClampSampler, uv, 0.0).rg;
-		const F32 rejection = textureLod(u_motionVectorRejectionTex, u_trilinearClampSampler, uv, 0.0).r;
-		const Vec3 history = textureLod(u_historyTex, u_trilinearClampSampler, historyUv, 0.0).rgb;
-
-		const F32 MAX_BLEND = 0.05;
-		const F32 blend = mix(MAX_BLEND, 1.0, rejection);
-		outColor = mix(history, outColor, blend);
-	}
-
-	// Remove fireflies
-#if 0
-	const Vec3 avgColor = subgroupAdd(outColor) / F32(gl_SubgroupSize);
-	outColor = min(outColor, avgColor);
-#endif
-
-	// Store
-	imageStore(out_img, IVec2(gl_GlobalInvocationID.xy), Vec4(outColor, 1.0));
-}
-
-#pragma anki end

+ 0 - 124
AnKi/Shaders/SsgiDenoise.ankiprog

@@ -1,124 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma anki mutator VARIANT 0 1 2 3
-#pragma anki mutator ORIENTATION 0 1 // 0: VERTICAL, 1: HORIZONTAL
-#pragma anki mutator SAMPLE_COUNT 3 5 7 9 11 13 15
-
-ANKI_SPECIALIZATION_CONSTANT_UVEC2(IN_TEXTURE_SIZE, 0u);
-
-#pragma anki start comp
-
-#include <AnKi/Shaders/BilateralFilter.glsl>
-#include <AnKi/Shaders/PackFunctions.glsl>
-
-#if SAMPLE_COUNT < 3
-#	error See file
-#endif
-
-const UVec2 WORKGROUP_SIZE = UVec2(8u, 8u);
-layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
-
-layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
-layout(set = 0, binding = 1) uniform texture2D u_inTex;
-layout(set = 0, binding = 2) uniform texture2D u_depthTex;
-layout(set = 0, binding = 3) uniform texture2D u_gbuffer2Tex;
-layout(set = 0, binding = 4) writeonly uniform image2D u_outImg;
-
-layout(std140, push_constant, row_major) uniform b_pc
-{
-	Mat4 u_invViewProjMat;
-};
-
-Vec3 unproject(Vec2 ndc, F32 depth)
-{
-	const Vec4 worldPos4 = u_invViewProjMat * Vec4(ndc, depth, 1.0);
-	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
-	return worldPos;
-}
-
-F32 readDepth(Vec2 uv)
-{
-	return textureLod(u_depthTex, u_linearAnyClampSampler, uv, 0.0).r;
-}
-
-Vec3 readNormal(Vec2 uv)
-{
-	return readNormalFromGBuffer(u_gbuffer2Tex, u_linearAnyClampSampler, uv);
-}
-
-void sampleTex(Vec2 colorUv, Vec2 fullUv, Vec3 positionCenter, Vec3 normalCenter, inout Vec3 col, inout F32 weight)
-{
-	const Vec3 color = textureLod(u_inTex, u_linearAnyClampSampler, colorUv, 0.0).rgb;
-
-	const F32 depthTap = readDepth(fullUv);
-	const Vec3 positionTap = unproject(UV_TO_NDC(fullUv), depthTap);
-	const Vec3 normalTap = readNormal(fullUv);
-
-	F32 w = calculateBilateralWeightPlane(positionCenter, normalCenter, positionTap, normalTap, 0.5);
-	w *= calculateBilateralWeightNormal(normalCenter, normalTap, 0.5);
-	col += color * w;
-	weight += w;
-}
-
-void main()
-{
-	// Set UVs
-	ANKI_BRANCH if(gl_GlobalInvocationID.x >= IN_TEXTURE_SIZE.x || gl_GlobalInvocationID.y >= IN_TEXTURE_SIZE.y)
-	{
-		// Out of bounds
-		return;
-	}
-
-	const Vec2 inUv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(IN_TEXTURE_SIZE);
-#if VARIANT == 0
-	const UVec2 depthReadOffset = UVec2(0, 0);
-#elif VARIANT == 1
-	const UVec2 depthReadOffset = UVec2(1, 0);
-#elif VARIANT == 2
-	const UVec2 depthReadOffset = UVec2(1, 1);
-#else
-	const UVec2 depthReadOffset = UVec2(1, 0);
-#endif
-	const Vec2 depthUv = (Vec2(gl_GlobalInvocationID.xy * 2u + depthReadOffset) + 0.5) / Vec2(IN_TEXTURE_SIZE * 2u);
-
-	const Vec2 IN_TEXEL_SIZE = 1.0 / Vec2(IN_TEXTURE_SIZE);
-	const Vec2 DEPTH_TEXEL_SIZE = 1.0 / Vec2(IN_TEXTURE_SIZE * 2u);
-
-	// Reference
-	Vec3 color = textureLod(u_inTex, u_linearAnyClampSampler, inUv, 0.0).rgb;
-	F32 weight = 1.0;
-
-	const F32 depthCenter = readDepth(depthUv);
-	const Vec3 positionCenter = unproject(UV_TO_NDC(depthUv), depthCenter);
-	const Vec3 normalCenter = readNormal(depthUv);
-
-#if ORIENTATION == 1
-#	define X_OR_Y x
-#else
-#	define X_OR_Y y
-#endif
-
-	Vec2 inUvOffset = Vec2(0.0);
-	inUvOffset.X_OR_Y = 1.0 * IN_TEXEL_SIZE.X_OR_Y;
-	Vec2 depthUvOffset = Vec2(0.0);
-	depthUvOffset.X_OR_Y = 2.0 * DEPTH_TEXEL_SIZE.X_OR_Y;
-
-	ANKI_UNROLL for(U32 i = 0u; i < (U32(SAMPLE_COUNT) - 1u) / 2u; ++i)
-	{
-		sampleTex(inUv + inUvOffset, depthUv + depthUvOffset, positionCenter, normalCenter, color, weight);
-		sampleTex(inUv - inUvOffset, depthUv - depthUvOffset, positionCenter, normalCenter, color, weight);
-
-		inUvOffset.X_OR_Y += IN_TEXEL_SIZE.X_OR_Y;
-		depthUvOffset.X_OR_Y += 2.0 * DEPTH_TEXEL_SIZE.X_OR_Y;
-	}
-
-	color /= weight;
-
-	// Write value
-	imageStore(u_outImg, IVec2(gl_GlobalInvocationID.xy), Vec4(color, 0.0));
-}
-
-#pragma anki end

+ 0 - 125
AnKi/Shaders/SsgiReconstruct.ankiprog

@@ -1,125 +0,0 @@
-// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-// The VARIANT points to the master fragment in the quad:
-// -----
-// |3|2|
-// |0|1|
-// -----
-
-#pragma anki mutator VARIANT 0 1 2 3
-
-ANKI_SPECIALIZATION_CONSTANT_UVEC2(FB_SIZE, 0u);
-
-#pragma anki start comp
-
-#include <AnKi/Shaders/Common.glsl>
-
-const UVec2 WORKGROUP_SIZE = UVec2(16u, 16u);
-layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
-
-layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
-layout(set = 0, binding = 1) uniform texture2D u_inTex;
-layout(set = 0, binding = 2) uniform texture2D u_depthTex;
-layout(set = 0, binding = 3) writeonly uniform image2D u_outImg;
-
-shared Vec3 s_colors[WORKGROUP_SIZE.y][WORKGROUP_SIZE.x];
-shared Vec4 s_depths[WORKGROUP_SIZE.y][WORKGROUP_SIZE.x];
-
-F32 computeDepthWeights(F32 refDepth, F32 depth)
-{
-	const F32 diff = abs(refDepth - depth);
-	const F32 weight = sqrt(1.0 / (EPSILON + diff));
-	return weight;
-}
-
-void reconstruct(IVec2 storeCoord, F32 depthRef, Vec4 colorAndDepth0, Vec4 colorAndDepth1)
-{
-	F32 weight = computeDepthWeights(depthRef, colorAndDepth0.w);
-	Vec3 col = colorAndDepth0.rgb * weight;
-	F32 weightSum = weight;
-
-	weight = computeDepthWeights(depthRef, colorAndDepth1.w);
-	col += colorAndDepth1.rgb * weight;
-	weightSum += weight;
-
-	col /= weightSum;
-
-	imageStore(u_outImg, storeCoord, Vec4(col, 0.0));
-}
-
-void reconstructAll(Vec4 depthRefs, Vec3 masterColor)
-{
-	const IVec2 localInvocationId = IVec2(gl_LocalInvocationID.xy);
-
-#if VARIANT == 0
-	const IVec2 masterStoreCoord = IVec2(gl_GlobalInvocationID.xy * 2u);
-	const IVec2 slaveRelativeCoords[3] = IVec2[](IVec2(1, 0), IVec2(1, 1), IVec2(0, 1));
-	const U32 masterDrefIdx = 3u;
-	const U32 slaveDrefIdx[3] = U32[](2u, 1u, 0u);
-#elif VARIANT == 1
-	const IVec2 masterStoreCoord = IVec2(gl_GlobalInvocationID.xy * 2u) + IVec2(1, 0);
-	const IVec2 slaveRelativeCoords[3] = IVec2[](IVec2(-1, 0), IVec2(0, 1), IVec2(-1, 1));
-	const U32 masterDrefIdx = 2u;
-	const U32 slaveDrefIdx[3] = U32[](3u, 1u, 0u);
-#elif VARIANT == 2
-	const IVec2 masterStoreCoord = IVec2(gl_GlobalInvocationID.xy * 2u) + IVec2(1, 1);
-	const IVec2 slaveRelativeCoords[3] = IVec2[](IVec2(-1, -1), IVec2(0, -1), IVec2(-1, 0));
-	const U32 masterDrefIdx = 1u;
-	const U32 slaveDrefIdx[3] = U32[](3u, 2u, 0u);
-#else
-	const IVec2 masterStoreCoord = IVec2(gl_GlobalInvocationID.xy * 2u) + IVec2(0, 1);
-	const IVec2 slaveRelativeCoords[3] = IVec2[](IVec2(0, -1), IVec2(1, -1), IVec2(1, 0));
-	const U32 masterDrefIdx = 0u;
-	const U32 slaveDrefIdx[3] = U32[](3u, 2u, 1u);
-#endif
-
-	const Vec4 masterColorAndDepth = Vec4(masterColor, depthRefs[masterDrefIdx]);
-	imageStore(u_outImg, masterStoreCoord, Vec4(masterColor, 0.0));
-
-	ANKI_UNROLL for(U32 i = 0u; i < 3u; ++i)
-	{
-		const IVec2 sharedCoord =
-			clamp(localInvocationId + slaveRelativeCoords[i], IVec2(0), IVec2(WORKGROUP_SIZE) - 1);
-		const Vec3 masterColor2 = s_colors[sharedCoord.y][sharedCoord.x];
-		const F32 masterDepth2 = s_depths[sharedCoord.y][sharedCoord.x][masterDrefIdx];
-		const IVec2 storeCoord = masterStoreCoord + slaveRelativeCoords[i];
-		reconstruct(storeCoord, depthRefs[slaveDrefIdx[i]], masterColorAndDepth, Vec4(masterColor2, masterDepth2));
-	}
-}
-
-void main()
-{
-	const UVec2 IN_TEXTURE_SIZE = FB_SIZE / 2u;
-
-	Vec3 color;
-	Vec4 depthRefs;
-	ANKI_BRANCH if(gl_GlobalInvocationID.x < IN_TEXTURE_SIZE.x && gl_GlobalInvocationID.y < IN_TEXTURE_SIZE.y)
-	{
-		const Vec2 inTexelSize = 1.0 / Vec2(IN_TEXTURE_SIZE);
-		const Vec2 fbTexelSize = 1.0 / Vec2(FB_SIZE);
-
-		const Vec2 inUv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(IN_TEXTURE_SIZE);
-		const Vec2 fbUv = (Vec2(gl_GlobalInvocationID.xy) * 2.0 + 1.0) / Vec2(FB_SIZE);
-
-		color = textureLod(u_inTex, u_linearAnyClampSampler, inUv, 0.0).rgb;
-		depthRefs = textureGather(sampler2D(u_depthTex, u_linearAnyClampSampler), fbUv, 0);
-	}
-	else
-	{
-		color = Vec3(0.0);
-		depthRefs = Vec4(1000.0);
-	}
-
-	s_colors[gl_LocalInvocationID.y][gl_LocalInvocationID.x] = color;
-	s_depths[gl_LocalInvocationID.y][gl_LocalInvocationID.x] = depthRefs;
-
-	memoryBarrierShared();
-	barrier();
-
-	reconstructAll(depthRefs, color);
-}
-
-#pragma anki end