Browse Source

Optimize HiZ

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
155ea58305

+ 18 - 0
programs/DepthDownscale.ankiprog

@@ -8,6 +8,7 @@ http://www.anki3d.org/LICENSE
 	<mutators>
 		<mutator name="TYPE" values="0 1"/> <!-- 0: write to depth&color, 1: write to depth -->
 		<mutator name="SAMPLE_RESOLVE_TYPE" values="0 1 2"/> <!-- 0: average, 1: min, 2: max -->
+		<mutator name="COPY_TO_CLIENT" values="0 1"/>
 	</mutators>
 
 	<shaders>
@@ -25,6 +26,19 @@ http://www.anki3d.org/LICENSE
 #define MIN 1
 #define MAX 2
 
+#if COPY_TO_CLIENT
+struct PushConsts
+{
+	uvec2 textureSize;
+};
+ANKI_PUSH_CONSTANTS(PushConsts, u_regs);
+
+layout(std430, ANKI_SS_BINDING(0, 0)) writeonly buffer s1_
+{
+	float u_clientBuf[];
+};
+#endif
+
 layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_depthRt;
 
 layout(location = 0) in vec2 in_uv;
@@ -50,6 +64,10 @@ void main()
 #if TYPE == 0
 	gl_FragDepth = out_color;
 #endif
+
+#if COPY_TO_CLIENT
+	u_clientBuf[uint(gl_FragCoord.y) * u_regs.textureSize.x + uint(gl_FragCoord.x)] = out_color;
+#endif
 }
 			]]></source>
 		</shader>

+ 0 - 46
programs/HiZCopyToClient.ankiprog

@@ -1,46 +0,0 @@
-<!-- 
-Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
-All rights reserved.
-Code licensed under the BSD License.
-http://www.anki3d.org/LICENSE
--->
-<shaderProgram>
-	<shaders>
-		<shader type="comp">
-			<inputs>
-				<input name="HIZ_MIP_SIZE" type="uvec2" const="1"/>
-			</inputs>
-
-			<source><![CDATA[
-#include "shaders/Common.glsl"
-
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-
-layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_hizTex;
-
-layout(std430, ANKI_SS_BINDING(0, 0)) writeonly buffer s1_
-{
-	float u_outBuff[];
-};
-
-void main()
-{
-	uint x = gl_GlobalInvocationID.x;
-	uint y = gl_GlobalInvocationID.y;
-
-	if(x >= HIZ_MIP_SIZE.x || y >= HIZ_MIP_SIZE.y)
-	{
-		// Skip if it's out of bounds
-		return;
-	}
-
-	// Read the tex
-	float depth = texelFetch(u_hizTex, ivec2(x, y), 0).r;
-
-	// Write the depth
-	u_outBuff[y * HIZ_MIP_SIZE.x + x] = depth;
-}
-			]]></source>
-		</shader>
-	</shaders>
-</shaderProgram>

+ 16 - 42
src/anki/renderer/DepthDownscale.cpp

@@ -61,8 +61,8 @@ Error DepthDownscale::initInternal(const ConfigSet&)
 	// Progs
 	ANKI_CHECK(getResourceManager().loadResource("programs/DepthDownscale.ankiprog", m_prog));
 
-	ShaderProgramResourceMutationInitList<2> mutations(m_prog);
-	mutations.add("TYPE", 0).add("SAMPLE_RESOLVE_TYPE", 2);
+	ShaderProgramResourceMutationInitList<3> mutations(m_prog);
+	mutations.add("COPY_TO_CLIENT", 0).add("TYPE", 0).add("SAMPLE_RESOLVE_TYPE", 2);
 
 	const ShaderProgramResourceVariant* variant;
 	m_prog->getOrCreateVariant(mutations.get(), variant);
@@ -70,7 +70,12 @@ Error DepthDownscale::initInternal(const ConfigSet&)
 
 	for(U i = 1; i < m_passes.getSize(); ++i)
 	{
-		mutations[0].m_value = 1;
+		mutations[1].m_value = 1;
+
+		if(i == m_passes.getSize() - 1)
+		{
+			mutations[0].m_value = 1;
+		}
 
 		m_prog->getOrCreateVariant(mutations.get(), variant);
 		m_passes[i].m_grProg = variant->getProgram();
@@ -81,17 +86,6 @@ Error DepthDownscale::initInternal(const ConfigSet&)
 		m_copyToBuff.m_lastMipWidth = lastMipWidth;
 		m_copyToBuff.m_lastMipHeight = lastMipHeight;
 
-		// Create program
-		ANKI_CHECK(getResourceManager().loadResource("programs/HiZCopyToClient.ankiprog", m_copyToBuff.m_prog));
-
-		ShaderProgramResourceConstantValueInitList<1> consts(m_copyToBuff.m_prog);
-		consts.add("HIZ_MIP_SIZE", UVec2(lastMipWidth, lastMipHeight));
-
-		const ShaderProgramResourceVariant* variant;
-		m_copyToBuff.m_prog->getOrCreateVariant(consts.get(), variant);
-
-		m_copyToBuff.m_grProg = variant->getProgram();
-
 		// Create buffer
 		BufferInitInfo buffInit("HiZ Client");
 		buffInit.m_access = BufferMapAccessBit::READ;
@@ -166,18 +160,6 @@ void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 
 		pass.newProducer({m_runCtx.m_hizRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, subresourceWrite});
 	}
-
-	// Copy to buffer pass
-	{
-		ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("HiZ Copy");
-
-		pass.setWork(runCopyToBufferCallback, this, 0);
-
-		TextureSubresourceInfo subresource;
-		subresource.m_firstMipmap = getMipmapCount() - 1;
-
-		pass.newConsumer({m_runCtx.m_hizRt, TextureUsageBit::SAMPLED_COMPUTE, subresource});
-	}
 }
 
 void DepthDownscale::run(RenderPassWorkContext& rgraphCtx)
@@ -186,6 +168,7 @@ void DepthDownscale::run(RenderPassWorkContext& rgraphCtx)
 
 	const U passIdx = m_runCtx.m_pass++;
 
+	cmdb->bindShaderProgram(m_passes[passIdx].m_grProg);
 	cmdb->setViewport(0, 0, m_r->getWidth() >> (passIdx + 1), m_r->getHeight() >> (passIdx + 1));
 
 	if(passIdx == 0)
@@ -206,7 +189,13 @@ void DepthDownscale::run(RenderPassWorkContext& rgraphCtx)
 		rgraphCtx.bindTextureAndSampler(0, 0, m_runCtx.m_hizRt, sampleSubresource, m_r->getNearestSampler());
 	}
 
-	cmdb->bindShaderProgram(m_passes[passIdx].m_grProg);
+	if(passIdx == m_passes.getSize() - 1)
+	{
+		UVec2 size(m_copyToBuff.m_lastMipWidth, m_copyToBuff.m_lastMipHeight);
+		cmdb->setPushConstants(&size, sizeof(size));
+
+		cmdb->bindStorageBuffer(0, 0, m_copyToBuff.m_buff, 0, m_copyToBuff.m_buff->getSize());
+	}
 
 	drawQuad(cmdb);
 
@@ -217,19 +206,4 @@ void DepthDownscale::run(RenderPassWorkContext& rgraphCtx)
 	}
 }
 
-void DepthDownscale::runCopyToBuffer(RenderPassWorkContext& rgraphCtx)
-{
-	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
-
-	cmdb->bindShaderProgram(m_copyToBuff.m_grProg);
-
-	TextureSubresourceInfo sampleSubresource;
-	sampleSubresource.m_firstMipmap = getMipmapCount() - 1;
-	rgraphCtx.bindTextureAndSampler(0, 0, m_runCtx.m_hizRt, sampleSubresource, m_r->getNearestSampler());
-
-	cmdb->bindStorageBuffer(0, 0, m_copyToBuff.m_buff, 0, m_copyToBuff.m_buff->getSize());
-
-	dispatchPPCompute(cmdb, 8, 8, m_copyToBuff.m_lastMipWidth, m_copyToBuff.m_lastMipHeight);
-}
-
 } // end namespace anki

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

@@ -84,8 +84,6 @@ private:
 	class
 	{
 	public:
-		ShaderProgramResourcePtr m_prog;
-		ShaderProgramPtr m_grProg;
 		BufferPtr m_buff;
 		void* m_buffAddr = nullptr;
 		U32 m_lastMipWidth = MAX_U32, m_lastMipHeight = MAX_U32;
@@ -95,18 +93,11 @@ private:
 
 	void run(RenderPassWorkContext& rgraphCtx);
 
-	void runCopyToBuffer(RenderPassWorkContext& rgraphCtx);
-
 	/// A RenderPassWorkCallback for half depth main pass.
 	static void runCallback(RenderPassWorkContext& rgraphCtx)
 	{
 		static_cast<DepthDownscale*>(rgraphCtx.m_userData)->run(rgraphCtx);
 	}
-
-	static void runCopyToBufferCallback(RenderPassWorkContext& rgraphCtx)
-	{
-		static_cast<DepthDownscale*>(rgraphCtx.m_userData)->runCopyToBuffer(rgraphCtx);
-	}
 };
 /// @}