Jelajahi Sumber

Renderer: Prepare the ground for proper upsample of volumetrics

Panagiotis Christopoulos Charitos 9 tahun lalu
induk
melakukan
7d30ad2fa3

+ 0 - 0
shaders/HalfDepth.frag.glsl → shaders/DepthDownscale.frag.glsl


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

@@ -29,7 +29,7 @@ class Ir;
 class FsUpscale;
 class FsUpscale;
 class DownscaleBlur;
 class DownscaleBlur;
 class Volumetric;
 class Volumetric;
-class HalfDepth;
+class DepthDownscale;
 class Smaa;
 class Smaa;
 
 
 class RenderingContext;
 class RenderingContext;

+ 178 - 0
src/anki/renderer/DepthDownscale.cpp

@@ -0,0 +1,178 @@
+// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <anki/renderer/DepthDownscale.h>
+#include <anki/renderer/Renderer.h>
+#include <anki/renderer/Ms.h>
+
+namespace anki
+{
+
+HalfDepth::~HalfDepth()
+{
+}
+
+Error HalfDepth::init(const ConfigSet&)
+{
+	GrManager& gr = getGrManager();
+	U width = m_r->getWidth() / 2;
+	U height = m_r->getHeight() / 2;
+
+	// Create RT
+	m_r->createRenderTarget(width,
+		height,
+		MS_DEPTH_ATTACHMENT_PIXEL_FORMAT,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
+		SamplingFilter::LINEAR,
+		1,
+		m_depthRt);
+
+	// Create FB
+	FramebufferInitInfo fbInit;
+	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
+	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	fbInit.m_depthStencilAttachment.m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
+	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectMask::DEPTH;
+
+	m_fb = gr.newInstance<Framebuffer>(fbInit);
+
+	// Create RC group
+	ResourceGroupInitInfo rcinit;
+	rcinit.m_textures[0].m_texture = m_r->getMs().m_depthRt;
+	rcinit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
+
+	m_rcgroup = gr.newInstance<ResourceGroup>(rcinit);
+
+	return ErrorCode::NONE;
+}
+
+void HalfDepth::setPreRunBarriers(RenderingContext& ctx)
+{
+	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureSurfaceInfo(0, 0, 0, 0));
+}
+
+void HalfDepth::setPostRunBarriers(RenderingContext& ctx)
+{
+	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
+		TextureSurfaceInfo(0, 0, 0, 0));
+}
+
+void HalfDepth::run(RenderingContext& ctx)
+{
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+
+	cmdb->beginRenderPass(m_fb);
+	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
+	cmdb->bindPipeline(m_parent->m_ppline);
+	cmdb->bindResourceGroup(m_rcgroup, 0, nullptr);
+
+	m_r->drawQuad(cmdb);
+
+	cmdb->endRenderPass();
+}
+
+QuarterDepth::~QuarterDepth()
+{
+}
+
+Error QuarterDepth::init(const ConfigSet&)
+{
+	GrManager& gr = getGrManager();
+	U width = m_r->getWidth() / 4;
+	U height = m_r->getHeight() / 4;
+
+	// Create RT
+	m_r->createRenderTarget(width,
+		height,
+		MS_DEPTH_ATTACHMENT_PIXEL_FORMAT,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
+		SamplingFilter::LINEAR,
+		1,
+		m_depthRt);
+
+	// Create FB
+	FramebufferInitInfo fbInit;
+	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
+	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	fbInit.m_depthStencilAttachment.m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
+	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectMask::DEPTH;
+
+	m_fb = gr.newInstance<Framebuffer>(fbInit);
+
+	// Create RC group
+	ResourceGroupInitInfo rcinit;
+	rcinit.m_textures[0].m_texture = m_parent->m_hd.m_depthRt;
+	rcinit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
+
+	m_rcgroup = gr.newInstance<ResourceGroup>(rcinit);
+
+	return ErrorCode::NONE;
+}
+
+void QuarterDepth::setPreRunBarriers(RenderingContext& ctx)
+{
+	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureSurfaceInfo(0, 0, 0, 0));
+}
+
+void QuarterDepth::setPostRunBarriers(RenderingContext& ctx)
+{
+	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
+		TextureSurfaceInfo(0, 0, 0, 0));
+}
+
+void QuarterDepth::run(RenderingContext& ctx)
+{
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+
+	cmdb->beginRenderPass(m_fb);
+	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
+	cmdb->bindPipeline(m_parent->m_ppline);
+	cmdb->bindResourceGroup(m_rcgroup, 0, nullptr);
+
+	m_r->drawQuad(cmdb);
+
+	cmdb->endRenderPass();
+}
+
+DepthDownscale::~DepthDownscale()
+{
+}
+
+Error DepthDownscale::init(const ConfigSet& cfg)
+{
+	GrManager& gr = getGrManager();
+
+	// Create shader
+	ANKI_CHECK(getResourceManager().loadResource("shaders/DepthDownscale.frag.glsl", m_frag));
+
+	// Create pipeline
+	PipelineInitInfo pinit;
+
+	pinit.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;
+
+	pinit.m_depthStencil.m_depthWriteEnabled = true;
+	pinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
+	pinit.m_depthStencil.m_format = MS_DEPTH_ATTACHMENT_PIXEL_FORMAT;
+
+	pinit.m_shaders[ShaderType::VERTEX] = m_r->getDrawQuadVertexShader();
+	pinit.m_shaders[ShaderType::FRAGMENT] = m_frag->getGrShader();
+	m_ppline = gr.newInstance<Pipeline>(pinit);
+
+	ANKI_CHECK(m_hd.init(cfg));
+	ANKI_CHECK(m_qd.init(cfg));
+	return ErrorCode::NONE;
+}
+
+} // end namespace anki

+ 102 - 0
src/anki/renderer/DepthDownscale.h

@@ -0,0 +1,102 @@
+// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma once
+
+#include <anki/renderer/RenderingPass.h>
+#include <anki/Gr.h>
+#include <anki/resource/TextureResource.h>
+#include <anki/resource/ShaderResource.h>
+
+namespace anki
+{
+
+// Forward
+class DepthDownscale;
+
+/// @addtogroup renderer
+/// @{
+
+/// Quick pass to downscale the depth buffer.
+class HalfDepth : public RenderingPass
+{
+anki_internal:
+	TexturePtr m_depthRt;
+
+	HalfDepth(Renderer* r, DepthDownscale* depthDownscale)
+		: RenderingPass(r)
+		, m_parent(depthDownscale)
+	{
+	}
+
+	~HalfDepth();
+
+	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
+
+	void setPreRunBarriers(RenderingContext& ctx);
+	void run(RenderingContext& ctx);
+	void setPostRunBarriers(RenderingContext& ctx);
+
+private:
+	DepthDownscale* m_parent;
+
+	ResourceGroupPtr m_rcgroup;
+	FramebufferPtr m_fb;
+};
+
+/// Quick pass to downscale the depth buffer.
+class QuarterDepth : public RenderingPass
+{
+anki_internal:
+	TexturePtr m_depthRt;
+
+	QuarterDepth(Renderer* r, DepthDownscale* depthDownscale)
+		: RenderingPass(r)
+		, m_parent(depthDownscale)
+	{
+	}
+
+	~QuarterDepth();
+
+	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
+
+	void setPreRunBarriers(RenderingContext& ctx);
+	void run(RenderingContext& ctx);
+	void setPostRunBarriers(RenderingContext& ctx);
+
+private:
+	DepthDownscale* m_parent;
+
+	ResourceGroupPtr m_rcgroup;
+	FramebufferPtr m_fb;
+};
+
+class DepthDownscale : public RenderingPass
+{
+	friend class HalfDepth;
+	friend class QuarterDepth;
+
+anki_internal:
+	HalfDepth m_hd;
+	QuarterDepth m_qd;
+
+	DepthDownscale(Renderer* r)
+		: RenderingPass(r)
+		, m_hd(r, this)
+		, m_qd(r, this)
+	{
+	}
+
+	~DepthDownscale();
+
+	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
+
+private:
+	ShaderResourcePtr m_frag;
+	PipelinePtr m_ppline;
+};
+/// @}
+
+} // end namespace

+ 12 - 3
src/anki/renderer/Fs.cpp

@@ -8,7 +8,7 @@
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/Sm.h>
 #include <anki/renderer/Sm.h>
-#include <anki/renderer/HalfDepth.h>
+#include <anki/renderer/DepthDownscale.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/scene/FrustumComponent.h>
 #include <anki/scene/FrustumComponent.h>
 
 
@@ -42,7 +42,7 @@ Error Fs::init(const ConfigSet&)
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
 	fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
 	fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
-	fbInit.m_depthStencilAttachment.m_texture = m_r->getHalfDepth().m_depthRt;
+	fbInit.m_depthStencilAttachment.m_texture = m_r->getDepthDownscale().m_hd.m_depthRt;
 	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::LOAD;
 	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::LOAD;
 	fbInit.m_depthStencilAttachment.m_usageInsideRenderPass =
 	fbInit.m_depthStencilAttachment.m_usageInsideRenderPass =
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
@@ -52,7 +52,7 @@ Error Fs::init(const ConfigSet&)
 	// Init the global resources
 	// Init the global resources
 	{
 	{
 		ResourceGroupInitInfo init;
 		ResourceGroupInitInfo init;
-		init.m_textures[0].m_texture = m_r->getHalfDepth().m_depthRt;
+		init.m_textures[0].m_texture = m_r->getDepthDownscale().m_hd.m_depthRt;
 		init.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 		init.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 		init.m_textures[1].m_texture = m_r->getSm().getSpotTextureArray();
 		init.m_textures[1].m_texture = m_r->getSm().getSpotTextureArray();
 		init.m_textures[2].m_texture = m_r->getSm().getOmniTextureArray();
 		init.m_textures[2].m_texture = m_r->getSm().getOmniTextureArray();
@@ -86,6 +86,15 @@ Error Fs::init(const ConfigSet&)
 
 
 	m_pplineCache = getAllocator().newInstance<GrObjectCache>(&getGrManager());
 	m_pplineCache = getAllocator().newInstance<GrObjectCache>(&getGrManager());
 
 
+	ANKI_CHECK(initVol());
+
+	return ErrorCode::NONE;
+}
+
+Error Fs::initVol()
+{
+	// TODO
+
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }
 
 

+ 12 - 0
src/anki/renderer/Fs.h

@@ -34,6 +34,8 @@ anki_internal:
 
 
 	void setPostRunBarriers(RenderingContext& ctx);
 	void setPostRunBarriers(RenderingContext& ctx);
 
 
+	void drawVolumetric(CommandBufferPtr cmdb);
+
 	TexturePtr getRt() const
 	TexturePtr getRt() const
 	{
 	{
 		return m_rt;
 		return m_rt;
@@ -62,6 +64,16 @@ private:
 	ResourceGroupPtr m_globalResources;
 	ResourceGroupPtr m_globalResources;
 	PipelineInitInfo m_state;
 	PipelineInitInfo m_state;
 	GrObjectCache* m_pplineCache = nullptr;
 	GrObjectCache* m_pplineCache = nullptr;
+
+	class
+	{
+	public:
+		ShaderResourcePtr m_frag;
+		PipelinePtr m_ppline;
+		ResourceGroupPtr m_rc;
+	} m_vol;
+
+	ANKI_USE_RESULT Error initVol();
 };
 };
 /// @}
 /// @}
 
 

+ 2 - 2
src/anki/renderer/FsUpscale.cpp

@@ -10,7 +10,7 @@
 #include <anki/renderer/Fs.h>
 #include <anki/renderer/Fs.h>
 #include <anki/renderer/Ssao.h>
 #include <anki/renderer/Ssao.h>
 #include <anki/renderer/Volumetric.h>
 #include <anki/renderer/Volumetric.h>
-#include <anki/renderer/HalfDepth.h>
+#include <anki/renderer/DepthDownscale.h>
 #include <anki/scene/FrustumComponent.h>
 #include <anki/scene/FrustumComponent.h>
 
 
 namespace anki
 namespace anki
@@ -29,7 +29,7 @@ Error FsUpscale::init(const ConfigSet& config)
 	rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 	rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 
 
 	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
 	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
-	rcInit.m_textures[1].m_texture = m_r->getHalfDepth().m_depthRt;
+	rcInit.m_textures[1].m_texture = m_r->getDepthDownscale().m_hd.m_depthRt;
 	rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcInit.m_textures[1].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 	rcInit.m_textures[1].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 
 

+ 0 - 81
src/anki/renderer/HalfDepth.cpp

@@ -1,81 +0,0 @@
-// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include <anki/renderer/HalfDepth.h>
-#include <anki/renderer/Renderer.h>
-#include <anki/renderer/Ms.h>
-
-namespace anki
-{
-
-HalfDepth::~HalfDepth()
-{
-}
-
-Error HalfDepth::init(const ConfigSet&)
-{
-	GrManager& gr = getGrManager();
-	U width = m_r->getWidth() / 2;
-	U height = m_r->getHeight() / 2;
-
-	// Create shader
-	ANKI_CHECK(getResourceManager().loadResource("shaders/HalfDepth.frag.glsl", m_frag));
-
-	// Create pipeline
-	PipelineInitInfo pinit;
-
-	pinit.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;
-
-	pinit.m_depthStencil.m_depthWriteEnabled = true;
-	pinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
-	pinit.m_depthStencil.m_format = MS_DEPTH_ATTACHMENT_PIXEL_FORMAT;
-
-	pinit.m_shaders[ShaderType::VERTEX] = m_r->getDrawQuadVertexShader();
-	pinit.m_shaders[ShaderType::FRAGMENT] = m_frag->getGrShader();
-	m_ppline = gr.newInstance<Pipeline>(pinit);
-
-	// Create RT
-	m_r->createRenderTarget(width,
-		height,
-		MS_DEPTH_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-		SamplingFilter::LINEAR,
-		1,
-		m_depthRt);
-
-	// Create FB
-	FramebufferInitInfo fbInit;
-	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
-	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	fbInit.m_depthStencilAttachment.m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
-	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectMask::DEPTH;
-
-	m_fb = gr.newInstance<Framebuffer>(fbInit);
-
-	// Create RC group
-	ResourceGroupInitInfo rcinit;
-	rcinit.m_textures[0].m_texture = m_r->getMs().m_depthRt;
-	rcinit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
-
-	m_rcgroup = gr.newInstance<ResourceGroup>(rcinit);
-
-	return ErrorCode::NONE;
-}
-
-void HalfDepth::run(RenderingContext& ctx)
-{
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-
-	cmdb->beginRenderPass(m_fb);
-	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
-	cmdb->bindPipeline(m_ppline);
-	cmdb->bindResourceGroup(m_rcgroup, 0, nullptr);
-
-	m_r->drawQuad(cmdb);
-
-	cmdb->endRenderPass();
-}
-
-} // end namespace anki

+ 0 - 44
src/anki/renderer/HalfDepth.h

@@ -1,44 +0,0 @@
-// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#pragma once
-
-#include <anki/renderer/RenderingPass.h>
-#include <anki/Gr.h>
-#include <anki/resource/TextureResource.h>
-#include <anki/resource/ShaderResource.h>
-
-namespace anki
-{
-
-/// @addtogroup renderer
-/// @{
-
-// Quick pass to downscale the depth buffer.
-class HalfDepth : public RenderingPass
-{
-anki_internal:
-	TexturePtr m_depthRt;
-
-	HalfDepth(Renderer* r)
-		: RenderingPass(r)
-	{
-	}
-
-	~HalfDepth();
-
-	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
-
-	void run(RenderingContext& ctx);
-
-private:
-	ShaderResourcePtr m_frag;
-	PipelinePtr m_ppline;
-	ResourceGroupPtr m_rcgroup;
-	FramebufferPtr m_fb;
-};
-/// @}
-
-} // end namespace

+ 12 - 15
src/anki/renderer/Renderer.cpp

@@ -24,7 +24,7 @@
 #include <anki/renderer/FsUpscale.h>
 #include <anki/renderer/FsUpscale.h>
 #include <anki/renderer/DownscaleBlur.h>
 #include <anki/renderer/DownscaleBlur.h>
 #include <anki/renderer/Volumetric.h>
 #include <anki/renderer/Volumetric.h>
-#include <anki/renderer/HalfDepth.h>
+#include <anki/renderer/DepthDownscale.h>
 #include <anki/renderer/Smaa.h>
 #include <anki/renderer/Smaa.h>
 
 
 #include <cstdarg> // For var args
 #include <cstdarg> // For var args
@@ -146,8 +146,8 @@ Error Renderer::initInternal(const ConfigSet& config)
 	m_is.reset(m_alloc.newInstance<Is>(this));
 	m_is.reset(m_alloc.newInstance<Is>(this));
 	ANKI_CHECK(m_is->init(config));
 	ANKI_CHECK(m_is->init(config));
 
 
-	m_hd.reset(m_alloc.newInstance<HalfDepth>(this));
-	ANKI_CHECK(m_hd->init(config));
+	m_depth.reset(m_alloc.newInstance<DepthDownscale>(this));
+	ANKI_CHECK(m_depth->init(config));
 
 
 	m_fs.reset(m_alloc.newInstance<Fs>(this));
 	m_fs.reset(m_alloc.newInstance<Fs>(this));
 	ANKI_CHECK(m_fs->init(config));
 	ANKI_CHECK(m_fs->init(config));
@@ -221,12 +221,8 @@ Error Renderer::render(RenderingContext& ctx)
 	m_ssao->setPreRunBarriers(ctx);
 	m_ssao->setPreRunBarriers(ctx);
 	m_bloom->m_extractExposure.setPreRunBarriers(ctx);
 	m_bloom->m_extractExposure.setPreRunBarriers(ctx);
 	m_bloom->m_upscale.setPreRunBarriers(ctx);
 	m_bloom->m_upscale.setPreRunBarriers(ctx);
-
-	cmdb->setTextureSurfaceBarrier(m_hd->m_depthRt,
-		TextureUsageBit::NONE,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureSurfaceInfo(0, 0, 0, 0));
-
+	m_depth->m_hd.setPreRunBarriers(ctx);
+	m_depth->m_qd.setPreRunBarriers(ctx);
 	m_smaa->m_edge.setPreRunBarriers(ctx);
 	m_smaa->m_edge.setPreRunBarriers(ctx);
 	m_smaa->m_weights.setPreRunBarriers(ctx);
 	m_smaa->m_weights.setPreRunBarriers(ctx);
 	m_vol->setPreRunBarriers(ctx);
 	m_vol->setPreRunBarriers(ctx);
@@ -241,14 +237,15 @@ Error Renderer::render(RenderingContext& ctx)
 
 
 	// Batch IS + HD
 	// Batch IS + HD
 	m_is->run(ctx);
 	m_is->run(ctx);
-	m_hd->run(ctx);
+	m_depth->m_hd.run(ctx);
 
 
-	m_lf->updateIndirectInfo(ctx, cmdb);
+	m_depth->m_hd.setPostRunBarriers(ctx);
 
 
-	cmdb->setTextureSurfaceBarrier(m_hd->m_depthRt,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
-		TextureSurfaceInfo(0, 0, 0, 0));
+	m_depth->m_qd.run(ctx);
+
+	m_depth->m_qd.setPostRunBarriers(ctx);
+
+	m_lf->updateIndirectInfo(ctx, cmdb);
 
 
 	// Batch FS & SSAO & VOL
 	// Batch FS & SSAO & VOL
 	m_fs->run(ctx);
 	m_fs->run(ctx);

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

@@ -154,9 +154,9 @@ public:
 		return *m_is;
 		return *m_is;
 	}
 	}
 
 
-	HalfDepth& getHalfDepth()
+	DepthDownscale& getDepthDownscale()
 	{
 	{
-		return *m_hd;
+		return *m_depth;
 	}
 	}
 
 
 	Fs& getFs()
 	Fs& getFs()
@@ -370,7 +370,7 @@ private:
 	UniquePtr<Sm> m_sm; ///< Shadow mapping.
 	UniquePtr<Sm> m_sm; ///< Shadow mapping.
 	UniquePtr<Ms> m_ms; ///< Material rendering stage
 	UniquePtr<Ms> m_ms; ///< Material rendering stage
 	UniquePtr<Is> m_is; ///< Illumination rendering stage
 	UniquePtr<Is> m_is; ///< Illumination rendering stage
-	UniquePtr<HalfDepth> m_hd;
+	UniquePtr<DepthDownscale> m_depth;
 	UniquePtr<Fs> m_fs; ///< Forward shading.
 	UniquePtr<Fs> m_fs; ///< Forward shading.
 	UniquePtr<Volumetric> m_vol; ///< Volumetric effects.
 	UniquePtr<Volumetric> m_vol; ///< Volumetric effects.
 	UniquePtr<Lf> m_lf; ///< Forward shading lens flares.
 	UniquePtr<Lf> m_lf; ///< Forward shading lens flares.

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

@@ -6,7 +6,7 @@
 #include <anki/renderer/Ssao.h>
 #include <anki/renderer/Ssao.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Ms.h>
 #include <anki/renderer/Ms.h>
-#include <anki/renderer/HalfDepth.h>
+#include <anki/renderer/DepthDownscale.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/scene/SceneGraph.h>
 #include <anki/util/Functions.h>
 #include <anki/util/Functions.h>
 #include <anki/misc/ConfigSet.h>
 #include <anki/misc/ConfigSet.h>
@@ -229,7 +229,7 @@ Error Ssao::initInternal(const ConfigSet& config)
 	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
 	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
 	sinit.m_repeat = false;
 	sinit.m_repeat = false;
 
 
-	rcinit.m_textures[0].m_texture = m_r->getHalfDepth().m_depthRt;
+	rcinit.m_textures[0].m_texture = m_r->getDepthDownscale().m_qd.m_depthRt;
 	rcinit.m_textures[0].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcinit.m_textures[0].m_sampler = gr.newInstance<Sampler>(sinit);
 	rcinit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 	rcinit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 
 

+ 2 - 2
src/anki/renderer/Volumetric.cpp

@@ -5,7 +5,7 @@
 
 
 #include <anki/renderer/Volumetric.h>
 #include <anki/renderer/Volumetric.h>
 #include <anki/renderer/Renderer.h>
 #include <anki/renderer/Renderer.h>
-#include <anki/renderer/HalfDepth.h>
+#include <anki/renderer/DepthDownscale.h>
 #include <anki/renderer/Sm.h>
 #include <anki/renderer/Sm.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/Is.h>
 #include <anki/renderer/LightBin.h>
 #include <anki/renderer/LightBin.h>
@@ -56,7 +56,7 @@ Error Volumetric::init(const ConfigSet& config)
 
 
 	// Create the resource groups
 	// Create the resource groups
 	ResourceGroupInitInfo rcInit;
 	ResourceGroupInitInfo rcInit;
-	rcInit.m_textures[0].m_texture = m_r->getHalfDepth().m_depthRt;
+	rcInit.m_textures[0].m_texture = m_r->getDepthDownscale().m_qd.m_depthRt;
 	rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 	rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 	rcInit.m_textures[1].m_texture = m_r->getSm().getSpotTextureArray();
 	rcInit.m_textures[1].m_texture = m_r->getSm().getSpotTextureArray();
 	rcInit.m_textures[2].m_texture = m_r->getSm().getOmniTextureArray();
 	rcInit.m_textures[2].m_texture = m_r->getSm().getOmniTextureArray();