Browse Source

Renderer: No need for quarter depth to be in D24S8

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
1be26e3d42

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


+ 30 - 0
shaders/DepthDownscaleQuarter.frag.glsl

@@ -0,0 +1,30 @@
+// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include "shaders/Common.glsl"
+
+layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_depthRt;
+
+layout(location = 0) in vec2 in_uv;
+layout(location = 0) out float out_depth;
+
+#define AVG
+
+void main()
+{
+	vec4 depths = textureGather(u_depthRt, in_uv, 0);
+
+#if defined(MIN)
+	vec2 mind2 = min(depths.xy, depths.zw);
+	out_depth = min(mind2.x, mind2.y);
+#elif defined(MAX)
+	vec2 max2 = max(depths.xy, depths.zw);
+	out_depth = max(max2.x, max2.y);
+#elif defined(AVG)
+	out_depth = dot(depths, vec4(1.0 / 4.0));
+#else
+#error See file
+#endif
+}

+ 39 - 9
src/anki/gr/gl/TextureImpl.cpp

@@ -139,17 +139,17 @@ static void convertTextureInformation(const PixelFormat& pf,
 			type = GL_BYTE;
 		}
 		break;
-	case ComponentFormat::R32G32:
+	case ComponentFormat::R32:
 		if(pf.m_transform == TransformFormat::FLOAT)
 		{
-			format = GL_RG;
-			internalFormat = GL_RG32F;
+			format = GL_R;
+			internalFormat = GL_R32F;
 			type = GL_FLOAT;
 		}
 		else if(pf.m_transform == TransformFormat::UINT)
 		{
 			format = GL_RG_INTEGER;
-			internalFormat = GL_RG32UI;
+			internalFormat = GL_R32UI;
 			type = GL_UNSIGNED_INT;
 		}
 		else
@@ -157,20 +157,22 @@ static void convertTextureInformation(const PixelFormat& pf,
 			ANKI_ASSERT(0 && "TODO");
 		}
 		break;
-	case ComponentFormat::R16G16B16A16:
+	case ComponentFormat::R32G32:
 		if(pf.m_transform == TransformFormat::FLOAT)
 		{
-			format = GL_RGBA;
-			internalFormat = GL_RGBA16F;
+			format = GL_RG;
+			internalFormat = GL_RG32F;
 			type = GL_FLOAT;
 		}
 		else if(pf.m_transform == TransformFormat::UINT)
 		{
-			ANKI_ASSERT(!"TODO");
+			format = GL_RG_INTEGER;
+			internalFormat = GL_RG32UI;
+			type = GL_UNSIGNED_INT;
 		}
 		else
 		{
-			ANKI_ASSERT(!"TODO");
+			ANKI_ASSERT(0 && "TODO");
 		}
 		break;
 	case ComponentFormat::R32G32B32:
@@ -209,6 +211,18 @@ static void convertTextureInformation(const PixelFormat& pf,
 			ANKI_ASSERT(!"TODO");
 		}
 		break;
+	case ComponentFormat::R16:
+		if(pf.m_transform == TransformFormat::FLOAT)
+		{
+			format = GL_R;
+			internalFormat = GL_R16F;
+			type = GL_FLOAT;
+		}
+		else
+		{
+			ANKI_ASSERT(0 && "TODO");
+		}
+		break;
 	case ComponentFormat::R16G16B16:
 		if(pf.m_transform == TransformFormat::FLOAT)
 		{
@@ -227,6 +241,22 @@ static void convertTextureInformation(const PixelFormat& pf,
 			ANKI_ASSERT(0 && "TODO");
 		}
 		break;
+	case ComponentFormat::R16G16B16A16:
+		if(pf.m_transform == TransformFormat::FLOAT)
+		{
+			format = GL_RGBA;
+			internalFormat = GL_RGBA16F;
+			type = GL_FLOAT;
+		}
+		else if(pf.m_transform == TransformFormat::UINT)
+		{
+			ANKI_ASSERT(!"TODO");
+		}
+		else
+		{
+			ANKI_ASSERT(!"TODO");
+		}
+		break;
 	case ComponentFormat::R11G11B10:
 		if(pf.m_transform == TransformFormat::FLOAT)
 		{

+ 14 - 22
src/anki/renderer/DepthDownscale.cpp

@@ -34,9 +34,11 @@ Error HalfDepth::init(const ConfigSet&)
 	fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
 	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::DONT_CARE;
 	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
-
 	m_fb = gr.newInstance<Framebuffer>(fbInit);
 
+	ANKI_CHECK(getResourceManager().loadResource("shaders/DepthDownscaleHalf.frag.glsl", m_frag));
+	m_r->createDrawQuadShaderProgram(m_frag->getGrShader(), m_prog);
+
 	return ErrorCode::NONE;
 }
 
@@ -61,7 +63,7 @@ void HalfDepth::run(RenderingContext& ctx)
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 
 	cmdb->beginRenderPass(m_fb);
-	cmdb->bindShaderProgram(m_parent->m_prog);
+	cmdb->bindShaderProgram(m_prog);
 	cmdb->bindTexture(0, 0, m_r->getMs().m_depthRt);
 
 	cmdb->setViewport(0, 0, m_r->getWidth() / 2, m_r->getHeight() / 2);
@@ -85,23 +87,23 @@ Error QuarterDepth::init(const ConfigSet&)
 	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,
+		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_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_aspect = DepthStencilAspectBit::DEPTH;
-
+	fbInit.m_colorAttachments[0].m_texture = m_depthRt;
+	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
+	fbInit.m_colorAttachmentCount = 1;
 	m_fb = gr.newInstance<Framebuffer>(fbInit);
 
+	ANKI_CHECK(getResourceManager().loadResource("shaders/DepthDownscaleQuarter.frag.glsl", m_frag));
+	m_r->createDrawQuadShaderProgram(m_frag->getGrShader(), m_prog);
+
 	return ErrorCode::NONE;
 }
 
@@ -117,7 +119,7 @@ void QuarterDepth::setPostRunBarriers(RenderingContext& ctx)
 {
 	ctx.m_commandBuffer->setTextureSurfaceBarrier(m_depthRt,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
+		TextureUsageBit::SAMPLED_FRAGMENT,
 		TextureSurfaceInfo(0, 0, 0, 0));
 }
 
@@ -126,18 +128,14 @@ void QuarterDepth::run(RenderingContext& ctx)
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 
 	cmdb->beginRenderPass(m_fb);
-	cmdb->bindShaderProgram(m_parent->m_prog);
+	cmdb->bindShaderProgram(m_prog);
 	cmdb->bindTexture(0, 0, m_parent->m_hd.m_depthRt);
 
 	cmdb->setViewport(0, 0, m_r->getWidth() / 4, m_r->getHeight() / 4);
-	cmdb->setDepthCompareOperation(CompareOperation::ALWAYS);
 
 	m_r->drawQuad(cmdb);
 
 	cmdb->endRenderPass();
-
-	// Restore state
-	cmdb->setDepthCompareOperation(CompareOperation::LESS);
 }
 
 DepthDownscale::~DepthDownscale()
@@ -146,12 +144,6 @@ DepthDownscale::~DepthDownscale()
 
 Error DepthDownscale::initInternal(const ConfigSet& cfg)
 {
-	// Create shader
-	ANKI_CHECK(getResourceManager().loadResource("shaders/DepthDownscale.frag.glsl", m_frag));
-
-	// Create prog
-	m_r->createDrawQuadShaderProgram(m_frag->getGrShader(), m_prog);
-
 	ANKI_CHECK(m_hd.init(cfg));
 	ANKI_CHECK(m_qd.init(cfg));
 	return ErrorCode::NONE;

+ 4 - 6
src/anki/renderer/DepthDownscale.h

@@ -43,6 +43,8 @@ private:
 	DepthDownscale* m_parent;
 
 	FramebufferPtr m_fb;
+	ShaderResourcePtr m_frag;
+	ShaderProgramPtr m_prog;
 };
 
 /// Quick pass to downscale the depth buffer.
@@ -69,13 +71,12 @@ private:
 	DepthDownscale* m_parent;
 
 	FramebufferPtr m_fb;
+	ShaderResourcePtr m_frag;
+	ShaderProgramPtr m_prog;
 };
 
 class DepthDownscale : public RenderingPass
 {
-	friend class HalfDepth;
-	friend class QuarterDepth;
-
 anki_internal:
 	HalfDepth m_hd;
 	QuarterDepth m_qd;
@@ -92,9 +93,6 @@ anki_internal:
 	ANKI_USE_RESULT Error init(const ConfigSet& cfg);
 
 private:
-	ShaderResourcePtr m_frag;
-	ShaderProgramPtr m_prog;
-
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& cfg);
 };
 /// @}