Browse Source

Add HiZ pass

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
c85db56531

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

@@ -67,6 +67,12 @@ const U BLOOM_FRACTION = 4;
 /// Volumetric size is rendererSize/VOLUMETRIC_FRACTION.
 /// Volumetric size is rendererSize/VOLUMETRIC_FRACTION.
 const U VOLUMETRIC_FRACTION = 4;
 const U VOLUMETRIC_FRACTION = 4;
 
 
+/// Number of mipmaps of the HZ map.
+const U HIERARCHICAL_Z_MIPMAP_COUNT = 3;
+
+const TextureSubresourceInfo HIZ_HALF_DEPTH(TextureSurfaceInfo(0, 0, 0, 0));
+const TextureSubresourceInfo HIZ_QUARTER_DEPTH(TextureSurfaceInfo(1, 0, 0, 0));
+
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal (see shaders)
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal (see shaders)
 inline void computeLinearizeDepthOptimal(F32 near, F32 far, F32& a, F32& b)
 inline void computeLinearizeDepthOptimal(F32 near, F32 far, F32& a, F32& b)
 {
 {

+ 96 - 103
src/anki/renderer/DepthDownscale.cpp

@@ -14,82 +14,60 @@ DepthDownscale::~DepthDownscale()
 {
 {
 }
 }
 
 
-Error DepthDownscale::initHalf(const ConfigSet&)
+Error DepthDownscale::initInternal(const ConfigSet&)
 {
 {
-	U width = m_r->getWidth() / 2;
-	U height = m_r->getHeight() / 2;
+	const U width = m_r->getWidth() / 2;
+	const U height = m_r->getHeight() / 2;
 
 
 	// Create RT descrs
 	// Create RT descrs
-	m_half.m_depthRtDescr = m_r->create2DRenderTargetDescription(width,
+	m_depthRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		height,
 		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
 		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		"Half depth");
 		"Half depth");
-	m_half.m_depthRtDescr.bake();
+	m_depthRtDescr.bake();
 
 
-	m_half.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
+	m_hizRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-		"Half depth col");
-	m_half.m_colorRtDescr.bake();
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
+		"HiZ");
+	m_hizRtDescr.m_mipmapCount = HIERARCHICAL_Z_MIPMAP_COUNT;
+	m_hizRtDescr.bake();
 
 
 	// Create FB descr
 	// Create FB descr
-	m_half.m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	m_half.m_fbDescr.m_colorAttachmentCount = 1;
-	m_half.m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	m_half.m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
-	m_half.m_fbDescr.bake();
+	m_passes[0].m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	m_passes[0].m_fbDescr.m_colorAttachmentCount = 1;
+	m_passes[0].m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	m_passes[0].m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
+	m_passes[0].m_fbDescr.bake();
 
 
-	// Prog
-	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_half.m_prog));
-
-	ShaderProgramResourceMutationInitList<2> mutations(m_half.m_prog);
-	mutations.add("TYPE", 0).add("SAMPLE_RESOLVE_TYPE", 0);
-
-	const ShaderProgramResourceVariant* variant;
-	m_half.m_prog->getOrCreateVariant(mutations.get(), variant);
-	m_half.m_grProg = variant->getProgram();
-
-	return Error::NONE;
-}
-
-Error DepthDownscale::initQuarter(const ConfigSet&)
-{
-	U width = m_r->getWidth() / 4;
-	U height = m_r->getHeight() / 4;
-
-	// RT descr
-	m_quarter.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
-		height,
-		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT
-			| TextureUsageBit::SAMPLED_COMPUTE,
-		"quarterdepth");
-	m_quarter.m_colorRtDescr.bake();
-
-	// FB descr
-	m_quarter.m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
-	m_quarter.m_fbDescr.m_colorAttachmentCount = 1;
-	m_quarter.m_fbDescr.bake();
+	for(U i = 1; i < HIERARCHICAL_Z_MIPMAP_COUNT; ++i)
+	{
+		m_passes[i].m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+		m_passes[i].m_fbDescr.m_colorAttachments[0].m_surface.m_level = i;
+		m_passes[i].m_fbDescr.m_colorAttachmentCount = 1;
+		m_passes[i].m_fbDescr.bake();
+	}
 
 
-	// Prog
-	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_quarter.m_prog));
+	// Progs
+	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_prog));
 
 
-	ShaderProgramResourceMutationInitList<2> mutations(m_quarter.m_prog);
-	mutations.add("TYPE", 1).add("SAMPLE_RESOLVE_TYPE", 0);
+	ShaderProgramResourceMutationInitList<2> mutations(m_prog);
+	mutations.add("TYPE", 0).add("SAMPLE_RESOLVE_TYPE", 1);
 
 
 	const ShaderProgramResourceVariant* variant;
 	const ShaderProgramResourceVariant* variant;
-	m_quarter.m_prog->getOrCreateVariant(mutations.get(), variant);
-	m_quarter.m_grProg = variant->getProgram();
+	m_prog->getOrCreateVariant(mutations.get(), variant);
+	m_passes[0].m_grProg = variant->getProgram();
 
 
-	return Error::NONE;
-}
+	for(U i = 1; i < HIERARCHICAL_Z_MIPMAP_COUNT; ++i)
+	{
+		mutations[0].m_value = 1;
+
+		m_prog->getOrCreateVariant(mutations.get(), variant);
+		m_passes[i].m_grProg = variant->getProgram();
+	}
 
 
-Error DepthDownscale::initInternal(const ConfigSet& cfg)
-{
-	ANKI_CHECK(initHalf(cfg));
-	ANKI_CHECK(initQuarter(cfg));
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 
@@ -106,72 +84,87 @@ Error DepthDownscale::init(const ConfigSet& cfg)
 	return err;
 	return err;
 }
 }
 
 
-void DepthDownscale::runHalf(RenderPassWorkContext& rgraphCtx)
+void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 {
 {
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
+	m_runCtx.m_pass = 0;
 
 
-	cmdb->bindShaderProgram(m_half.m_grProg);
-	rgraphCtx.bindTextureAndSampler(0,
-		0,
-		m_r->getGBuffer().getDepthRt(),
-		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
-		m_r->getLinearSampler());
+	static const Array<CString, 5> passNames = {{"HiZ #0", "HiZ #1", "HiZ #2", "HiZ #3", "HiZ #4"}};
 
 
-	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
-	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
+	// Create render targets
+	m_runCtx.m_halfDepthRt = rgraph.newRenderTarget(m_depthRtDescr);
+	m_runCtx.m_hizRt = rgraph.newRenderTarget(m_hizRtDescr);
 
 
-	drawQuad(cmdb);
+	// First render pass
+	{
+		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(passNames[0]);
 
 
-	// Restore state
-	cmdb->setDepthCompareOperation(CompareOperation::LESS);
-}
+		pass.setFramebufferInfo(m_passes[0].m_fbDescr, {{m_runCtx.m_hizRt}}, m_runCtx.m_halfDepthRt);
+		pass.setWork(runCallback, this, 0);
 
 
-void DepthDownscale::runQuarter(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+		TextureSubresourceInfo subresource = TextureSubresourceInfo(DepthStencilAspectBit::DEPTH); // First mip
 
 
-	cmdb->bindShaderProgram(m_quarter.m_grProg);
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_runCtx.m_halfColorRt, m_r->getLinearSampler());
-	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
+		pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT, subresource});
+		pass.newConsumer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, subresource});
+		pass.newConsumer({m_runCtx.m_hizRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, subresource});
 
 
-	drawQuad(cmdb);
+		pass.newProducer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, subresource});
+		pass.newProducer({m_runCtx.m_hizRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+	}
+
+	// Rest of the passes
+	for(U i = 1; i < HIERARCHICAL_Z_MIPMAP_COUNT; ++i)
+	{
+		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(passNames[i]);
+
+		pass.setFramebufferInfo(m_passes[i].m_fbDescr, {{m_runCtx.m_hizRt}}, {});
+		pass.setWork(runCallback, this, 0);
+
+		TextureSubresourceInfo subresourceRead, subresourceWrite;
+		subresourceRead.m_firstMipmap = i - 1;
+		subresourceWrite.m_firstMipmap = i;
+
+		pass.newConsumer({m_runCtx.m_hizRt, TextureUsageBit::SAMPLED_FRAGMENT, subresourceRead});
+		pass.newConsumer({m_runCtx.m_hizRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, subresourceWrite});
+
+		pass.newProducer({m_runCtx.m_hizRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, subresourceWrite});
+	}
 }
 }
 
 
-void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
+void DepthDownscale::run(RenderPassWorkContext& rgraphCtx)
 {
 {
-	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
+	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
 
 
-	// Create render targets
-	m_runCtx.m_halfDepthRt = rgraph.newRenderTarget(m_half.m_depthRtDescr);
-	m_runCtx.m_halfColorRt = rgraph.newRenderTarget(m_half.m_colorRtDescr);
-	m_runCtx.m_quarterRt = rgraph.newRenderTarget(m_quarter.m_colorRtDescr);
+	const U passIdx = m_runCtx.m_pass++;
 
 
-	// Create half depth render pass
-	{
-		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Half depth");
+	cmdb->setViewport(0, 0, m_r->getWidth() >> (passIdx + 1), m_r->getHeight() >> (passIdx + 1));
 
 
-		pass.setFramebufferInfo(m_half.m_fbDescr, {{m_runCtx.m_halfColorRt}}, m_runCtx.m_halfDepthRt);
-		pass.setWork(runHalfCallback, this, 0);
+	if(passIdx == 0)
+	{
+		rgraphCtx.bindTextureAndSampler(0,
+			0,
+			m_r->getGBuffer().getDepthRt(),
+			TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
+			m_r->getNearestSampler());
 
 
-		TextureSubresourceInfo subresource = TextureSubresourceInfo(DepthStencilAspectBit::DEPTH);
+		cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
+	}
+	else
+	{
+		TextureSubresourceInfo sampleSubresource;
+		sampleSubresource.m_firstMipmap = passIdx - 1;
 
 
-		pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT, subresource});
-		pass.newConsumer({m_runCtx.m_halfColorRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newConsumer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, subresource});
-		pass.newProducer({m_runCtx.m_halfColorRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_halfDepthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, subresource});
+		rgraphCtx.bindTextureAndSampler(0, 0, m_runCtx.m_hizRt, sampleSubresource, m_r->getNearestSampler());
 	}
 	}
 
 
-	// Create quarter depth render pass
-	{
-		GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Quarter depth");
+	cmdb->bindShaderProgram(m_passes[passIdx].m_grProg);
 
 
-		pass.setFramebufferInfo(m_quarter.m_fbDescr, {{m_runCtx.m_quarterRt}}, {});
-		pass.setWork(runQuarterCallback, this, 0);
+	drawQuad(cmdb);
 
 
-		pass.newConsumer({m_runCtx.m_halfColorRt, TextureUsageBit::SAMPLED_FRAGMENT});
-		pass.newConsumer({m_runCtx.m_quarterRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
-		pass.newProducer({m_runCtx.m_quarterRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
+	// Restore state
+	if(passIdx == 0)
+	{
+		cmdb->setDepthCompareOperation(CompareOperation::LESS);
 	}
 	}
 }
 }
 
 

+ 17 - 39
src/anki/renderer/DepthDownscale.h

@@ -34,70 +34,48 @@ anki_internal:
 	/// Populate the rendergraph.
 	/// Populate the rendergraph.
 	void populateRenderGraph(RenderingContext& ctx);
 	void populateRenderGraph(RenderingContext& ctx);
 
 
-	RenderTargetHandle getHalfDepthColorRt() const
-	{
-		return m_runCtx.m_halfColorRt;
-	}
-
-	RenderTargetHandle getHalfDepthDepthRt() const
+	/// Return a depth buffer that is a quarter of the resolution of the renderer.
+	RenderTargetHandle getHalfDepthRt() const
 	{
 	{
 		return m_runCtx.m_halfDepthRt;
 		return m_runCtx.m_halfDepthRt;
 	}
 	}
 
 
-	RenderTargetHandle getQuarterColorRt() const
+	/// Return a FP color render target with hierarchical Z (min Z) in it's mips.
+	RenderTargetHandle getHiZRt() const
 	{
 	{
-		return m_runCtx.m_quarterRt;
+		return m_runCtx.m_hizRt;
 	}
 	}
 
 
 private:
 private:
-	class
-	{
-	public:
-		RenderTargetDescription m_depthRtDescr;
-		RenderTargetDescription m_colorRtDescr;
-
-		FramebufferDescription m_fbDescr;
-
-		ShaderProgramResourcePtr m_prog;
-		ShaderProgramPtr m_grProg;
-	} m_half; ///< Half depth pass.
+	RenderTargetDescription m_depthRtDescr;
+	RenderTargetDescription m_hizRtDescr;
+	ShaderProgramResourcePtr m_prog;
 
 
-	class
+	class Pass
 	{
 	{
 	public:
 	public:
-		RenderTargetDescription m_colorRtDescr;
-
 		FramebufferDescription m_fbDescr;
 		FramebufferDescription m_fbDescr;
-
-		ShaderProgramResourcePtr m_prog;
 		ShaderProgramPtr m_grProg;
 		ShaderProgramPtr m_grProg;
-	} m_quarter; ///< Quarter depth pass.
+	};
+
+	Array<Pass, GBUFFER_COLOR_ATTACHMENT_COUNT> m_passes;
 
 
 	class
 	class
 	{
 	{
 	public:
 	public:
 		RenderTargetHandle m_halfDepthRt;
 		RenderTargetHandle m_halfDepthRt;
-		RenderTargetHandle m_halfColorRt;
-		RenderTargetHandle m_quarterRt;
+		RenderTargetHandle m_hizRt;
+		U m_pass;
 	} m_runCtx; ///< Run context.
 	} m_runCtx; ///< Run context.
 
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
-	ANKI_USE_RESULT Error initHalf(const ConfigSet& cfg);
-	ANKI_USE_RESULT Error initQuarter(const ConfigSet& cfg);
 
 
-	void runHalf(RenderPassWorkContext& rgraphCtx);
-	void runQuarter(RenderPassWorkContext& rgraphCtx);
-
-	/// A RenderPassWorkCallback for half depth main pass.
-	static void runHalfCallback(RenderPassWorkContext& rgraphCtx)
-	{
-		scast<DepthDownscale*>(rgraphCtx.m_userData)->runHalf(rgraphCtx);
-	}
+	void run(RenderPassWorkContext& rgraphCtx);
 
 
 	/// A RenderPassWorkCallback for half depth main pass.
 	/// A RenderPassWorkCallback for half depth main pass.
-	static void runQuarterCallback(RenderPassWorkContext& rgraphCtx)
+	static void runCallback(RenderPassWorkContext& rgraphCtx)
 	{
 	{
-		scast<DepthDownscale*>(rgraphCtx.m_userData)->runQuarter(rgraphCtx);
+		static_cast<DepthDownscale*>(rgraphCtx.m_userData)->run(rgraphCtx);
 	}
 	}
 };
 };
 /// @}
 /// @}

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

@@ -110,9 +110,10 @@ void ForwardShading::drawVolumetric(RenderingContext& ctx, RenderPassWorkContext
 	Vec4* unis = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	Vec4* unis = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
 	computeLinearizeDepthOptimal(ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, unis->x(), unis->y());
 	computeLinearizeDepthOptimal(ctx.m_renderQueue->m_cameraNear, ctx.m_renderQueue->m_cameraFar, unis->x(), unis->y());
 
 
-	rgraphCtx.bindColorTextureAndSampler(
-		0, 0, m_r->getDepthDownscale().getHalfDepthColorRt(), m_r->getNearestSampler());
-	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 0, m_r->getDepthDownscale().getHiZRt(), HIZ_HALF_DEPTH, m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 1, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 2, m_r->getVolumetric().getRt(), m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 2, m_r->getVolumetric().getRt(), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0,
 	cmdb->bindTextureAndSampler(0,
 		3,
 		3,
@@ -142,8 +143,8 @@ void ForwardShading::drawUpscale(const RenderingContext& ctx, RenderPassWorkCont
 		m_r->getGBuffer().getDepthRt(),
 		m_r->getGBuffer().getDepthRt(),
 		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
 		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
 		m_r->getNearestSampler());
 		m_r->getNearestSampler());
-	rgraphCtx.bindColorTextureAndSampler(
-		0, 1, m_r->getDepthDownscale().getHalfDepthColorRt(), m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 1, m_r->getDepthDownscale().getHiZRt(), HIZ_HALF_DEPTH, m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 2, m_runCtx.m_rt, m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 2, m_runCtx.m_rt, m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0,
 	cmdb->bindTextureAndSampler(0,
 		3,
 		3,
@@ -174,8 +175,8 @@ void ForwardShading::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	if(start != end)
 	if(start != end)
 	{
 	{
 		const LightShadingResources& rsrc = m_r->getLightShading().getResources();
 		const LightShadingResources& rsrc = m_r->getLightShading().getResources();
-		rgraphCtx.bindColorTextureAndSampler(
-			0, 0, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getLinearSampler());
+		rgraphCtx.bindTextureAndSampler(
+			0, 0, m_r->getDepthDownscale().getHiZRt(), HIZ_HALF_DEPTH, m_r->getLinearSampler());
 		rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getShadowMapping().getShadowmapRt(), m_r->getLinearSampler());
 		rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getShadowMapping().getShadowmapRt(), m_r->getLinearSampler());
 		bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
 		bindUniforms(cmdb, 0, 0, rsrc.m_commonUniformsToken);
 		bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
 		bindUniforms(cmdb, 0, 1, rsrc.m_pointLightsToken);
@@ -223,14 +224,14 @@ void ForwardShading::populateRenderGraph(RenderingContext& ctx)
 	pass.setWork(runCallback,
 	pass.setWork(runCallback,
 		this,
 		this,
 		computeNumberOfSecondLevelCommandBuffers(ctx.m_renderQueue->m_forwardShadingRenderables.getSize()));
 		computeNumberOfSecondLevelCommandBuffers(ctx.m_renderQueue->m_forwardShadingRenderables.getSize()));
-	pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rt}}, m_r->getDepthDownscale().getHalfDepthDepthRt());
+	pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rt}}, m_r->getDepthDownscale().getHalfDepthRt());
 
 
 	pass.newConsumer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
 	pass.newConsumer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
-	pass.newConsumer({m_r->getDepthDownscale().getHalfDepthDepthRt(),
+	pass.newConsumer({m_r->getDepthDownscale().getHalfDepthRt(),
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
 		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)});
 		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)});
-	pass.newConsumer({m_r->getDepthDownscale().getHalfDepthColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
-	pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_HALF_DEPTH});
+	pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 	pass.newConsumer({m_r->getVolumetric().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getVolumetric().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 
 
@@ -240,7 +241,6 @@ void ForwardShading::populateRenderGraph(RenderingContext& ctx)
 	}
 	}
 
 
 	pass.newProducer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
 	pass.newProducer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
-	pass.newProducer({m_r->getDepthDownscale().getHalfDepthDepthRt(), TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ});
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 3 - 2
src/anki/renderer/LensFlare.cpp

@@ -115,7 +115,8 @@ void LensFlare::updateIndirectInfo(const RenderingContext& ctx, RenderPassWorkCo
 
 
 	rgraphCtx.bindStorageBuffer(0, 1, m_runCtx.m_indirectBuffHandle);
 	rgraphCtx.bindStorageBuffer(0, 1, m_runCtx.m_indirectBuffHandle);
 	// Bind neareset because you don't need high quality
 	// Bind neareset because you don't need high quality
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 0, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getNearestSampler());
 	cmdb->dispatchCompute(count, 1, 1);
 	cmdb->dispatchCompute(count, 1, 1);
 }
 }
 
 
@@ -139,7 +140,7 @@ void LensFlare::populateRenderGraph(RenderingContext& ctx)
 		rpass.setWork(runUpdateIndirectCallback, this, 0);
 		rpass.setWork(runUpdateIndirectCallback, this, 0);
 
 
 		rpass.newConsumer({m_runCtx.m_indirectBuffHandle, BufferUsageBit::STORAGE_COMPUTE_WRITE});
 		rpass.newConsumer({m_runCtx.m_indirectBuffHandle, BufferUsageBit::STORAGE_COMPUTE_WRITE});
-		rpass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_COMPUTE});
+		rpass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, HIZ_QUARTER_DEPTH});
 
 
 		rpass.newProducer({m_runCtx.m_indirectBuffHandle, BufferUsageBit::STORAGE_COMPUTE_WRITE});
 		rpass.newProducer({m_runCtx.m_indirectBuffHandle, BufferUsageBit::STORAGE_COMPUTE_WRITE});
 	}
 	}

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

@@ -229,7 +229,7 @@ void LightShading::populateRenderGraph(RenderingContext& ctx)
 	pass.newConsumer({m_r->getIndirect().getReflectionRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getIndirect().getReflectionRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getIndirect().getIrradianceRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getIndirect().getIrradianceRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 
 
-	pass.newConsumer({m_r->getDepthDownscale().getHalfDepthColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+	pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_HALF_DEPTH});
 	pass.newConsumer({m_r->getForwardShading().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newConsumer({m_r->getForwardShading().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 
 
 	pass.newProducer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	pass.newProducer({m_runCtx.m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});

+ 3 - 4
src/anki/renderer/Reflections.cpp

@@ -82,7 +82,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 	rpass.newConsumer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
 	rpass.newConsumer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
 	rpass.newConsumer({m_r->getGBuffer().getColorRt(1), TextureUsageBit::SAMPLED_COMPUTE});
 	rpass.newConsumer({m_r->getGBuffer().getColorRt(1), TextureUsageBit::SAMPLED_COMPUTE});
 	rpass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
 	rpass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
-	rpass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_COMPUTE});
+	rpass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE});
 	rpass.newConsumer({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
 	rpass.newConsumer({m_r->getDownscaleBlur().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
 
 
 	rpass.newProducer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
 	rpass.newProducer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
@@ -114,11 +114,10 @@ void Reflections::run(RenderPassWorkContext& rgraphCtx)
 
 
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getGBuffer().getColorRt(1), m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getGBuffer().getColorRt(1), m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getGBuffer().getColorRt(2), m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getGBuffer().getColorRt(2), m_r->getNearestSampler());
-	rgraphCtx.bindColorTextureAndSampler(0, 2, m_r->getDepthDownscale().getHalfDepthColorRt(), m_r->getLinearSampler());
+	rgraphCtx.bindColorTextureAndSampler(0, 2, m_r->getDepthDownscale().getHiZRt(), m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 3, m_r->getDownscaleBlur().getRt(), m_r->getTrilinearRepeatSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 3, m_r->getDownscaleBlur().getRt(), m_r->getTrilinearRepeatSampler());
 
 
-	TextureSubresourceInfo subresource;
-	rgraphCtx.bindImage(0, 0, m_runCtx.m_rt, subresource);
+	rgraphCtx.bindImage(0, 0, m_runCtx.m_rt, TextureSubresourceInfo());
 
 
 	cmdb->bindShaderProgram(m_grProg[m_r->getFrameCount() & 1]);
 	cmdb->bindShaderProgram(m_grProg[m_r->getFrameCount() & 1]);
 
 

+ 9 - 6
src/anki/renderer/Ssao.cpp

@@ -131,7 +131,8 @@ void Ssao::runMain(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_main.m_grProg);
 	cmdb->bindShaderProgram(m_main.m_grProg);
 
 
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getLinearSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 0, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getGBuffer().getColorRt(2), m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getGBuffer().getColorRt(2), m_r->getLinearSampler());
 	cmdb->bindTextureAndSampler(0,
 	cmdb->bindTextureAndSampler(0,
 		2,
 		2,
@@ -168,7 +169,8 @@ void Ssao::runHBlur(RenderPassWorkContext& rgraphCtx)
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_hblur.m_grProg);
 	cmdb->bindShaderProgram(m_hblur.m_grProg);
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_runCtx.m_rts[m_r->getFrameCount() & 1], m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_runCtx.m_rts[m_r->getFrameCount() & 1], m_r->getLinearSampler());
-	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getLinearSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 1, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getLinearSampler());
 	drawQuad(cmdb);
 	drawQuad(cmdb);
 }
 }
 
 
@@ -179,7 +181,8 @@ void Ssao::runVBlur(RenderPassWorkContext& rgraphCtx)
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindShaderProgram(m_vblur.m_grProg);
 	cmdb->bindShaderProgram(m_vblur.m_grProg);
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_runCtx.m_rts[(m_r->getFrameCount() + 1) & 1], m_r->getLinearSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_runCtx.m_rts[(m_r->getFrameCount() + 1) & 1], m_r->getLinearSampler());
-	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getLinearSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 1, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getLinearSampler());
 	drawQuad(cmdb);
 	drawQuad(cmdb);
 }
 }
 
 
@@ -206,7 +209,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 		pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
-		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 	}
 
 
@@ -219,7 +222,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::SAMPLED_FRAGMENT});
-		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newProducer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 	}
 
 
@@ -232,7 +235,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 
 
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
-		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newProducer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 	}
 	}
 }
 }

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

@@ -124,7 +124,9 @@ void Volumetric::runMain(const RenderingContext& ctx, RenderPassWorkContext& rgr
 
 
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 
 
-	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getDepthDownscale().getQuarterColorRt(), m_r->getLinearSampler());
+	rgraphCtx.bindTextureAndSampler(
+		0, 0, m_r->getDepthDownscale().getHiZRt(), HIZ_QUARTER_DEPTH, m_r->getLinearSampler());
+
 	cmdb->bindTextureAndSampler(0,
 	cmdb->bindTextureAndSampler(0,
 		1,
 		1,
 		m_main.m_noiseTex->getGrTextureView(),
 		m_main.m_noiseTex->getGrTextureView(),
@@ -207,7 +209,7 @@ void Volumetric::populateRenderGraph(RenderingContext& ctx)
 		pass.setWork(runMainCallback, this, 0);
 		pass.setWork(runMainCallback, this, 0);
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 		pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[rtToRenderIdx]}}, {});
 
 
-		pass.newConsumer({m_r->getDepthDownscale().getQuarterColorRt(), TextureUsageBit::SAMPLED_FRAGMENT});
+		pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 		pass.newConsumer({m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_r->getShadowMapping().getShadowmapRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToRenderIdx], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});
 		pass.newConsumer({m_runCtx.m_rts[rtToReadIdx], TextureUsageBit::SAMPLED_FRAGMENT});

+ 1 - 1
src/anki/ui/Font.cpp

@@ -71,7 +71,7 @@ void Font::createTexture(const void* data, U32 width, U32 height)
 	// Create and populate the buffer
 	// Create and populate the buffer
 	PtrSize buffSize = width * height * 4;
 	PtrSize buffSize = width * height * 4;
 	BufferPtr buff = m_manager->getGrManager().newBuffer(
 	BufferPtr buff = m_manager->getGrManager().newBuffer(
-		BufferInitInfo(buffSize, BufferUsageBit::BUFFER_UPLOAD_DESTINATION, BufferMapAccessBit::WRITE, "UI"));
+		BufferInitInfo(buffSize, BufferUsageBit::BUFFER_UPLOAD_SOURCE, BufferMapAccessBit::WRITE, "UI"));
 	void* mapped = buff->map(0, buffSize, BufferMapAccessBit::WRITE);
 	void* mapped = buff->map(0, buffSize, BufferMapAccessBit::WRITE);
 	memcpy(mapped, data, buffSize);
 	memcpy(mapped, data, buffSize);
 	buff->unmap();
 	buff->unmap();