Procházet zdrojové kódy

Adding some barriers in the renderer

Panagiotis Christopoulos Charitos před 9 roky
rodič
revize
b9db478c6c

+ 5 - 0
include/anki/renderer/Common.h

@@ -59,6 +59,11 @@ inline U getIsMipmapCount(U width, U height)
 	return count;
 }
 
+inline U getMsDepthRtMipmapCount()
+{
+	return log2(SSAO_FRACTION) + 1;
+}
+
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal
 inline void computeLinearizeDepthOptimal(F32 near, F32 far, F32& a, F32& b)
 {

+ 4 - 0
include/anki/renderer/Ms.h

@@ -38,8 +38,12 @@ anki_internal:
 	ANKI_USE_RESULT Error buildCommandBuffers(
 		RenderingContext& ctx, U threadId, U threadCount) const;
 
+	void setPreRunBarriers(RenderingContext& ctx);
+
 	void run(RenderingContext& ctx);
 
+	void setPostRunBarriers(RenderingContext& ctx);
+
 	TexturePtr& getRt0()
 	{
 		return m_rt0;

+ 5 - 0
include/anki/renderer/Renderer.h

@@ -63,6 +63,9 @@ public:
 		DynamicArrayAuto<FramebufferPtr> m_spotFramebuffers;
 		DynamicArrayAuto<Array<FramebufferPtr, 6>> m_omniFramebuffers;
 
+		DynamicArrayAuto<U> m_spotCacheIndices;
+		DynamicArrayAuto<U> m_omniCacheIndices;
+
 		/// [casterIdx][threadIdx]
 		DynamicArrayAuto<CommandBufferPtr> m_spotCommandBuffers;
 		/// [casterIdx][threadIdx][faceIdx]
@@ -74,6 +77,8 @@ public:
 		Sm(const StackAllocator<U8>& alloc)
 			: m_spotFramebuffers(alloc)
 			, m_omniFramebuffers(alloc)
+			, m_spotCacheIndices(alloc)
+			, m_omniCacheIndices(alloc)
 			, m_spotCommandBuffers(alloc)
 			, m_omniCommandBuffers(alloc)
 			, m_spots(alloc)

+ 4 - 0
include/anki/renderer/Sm.h

@@ -43,8 +43,12 @@ anki_internal:
 	ANKI_USE_RESULT Error buildCommandBuffers(
 		RenderingContext& ctx, U threadId, U threadCount) const;
 
+	void setPreRunBarriers(RenderingContext& ctx);
+
 	void run(RenderingContext& ctx);
 
+	void setPostRunBarriers(RenderingContext& ctx);
+
 	Bool getPoissonEnabled() const
 	{
 		return m_poissonEnabled;

+ 64 - 2
src/renderer/Ms.cpp

@@ -38,7 +38,7 @@ Error Ms::createRt(U32 samples)
 		DEPTH_RT_PIXEL_FORMAT,
 		samples,
 		SamplingFilter::NEAREST,
-		log2(SSAO_FRACTION) + 1,
+		getMsDepthRtMipmapCount(),
 		m_depthRt);
 
 	m_r->createRenderTarget(m_r->getWidth(),
@@ -62,7 +62,7 @@ Error Ms::createRt(U32 samples)
 		RT_PIXEL_FORMATS[2],
 		samples,
 		SamplingFilter::NEAREST,
-		log2(SSAO_FRACTION) + 1,
+		getMsDepthRtMipmapCount(),
 		m_rt2);
 
 	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
@@ -178,4 +178,66 @@ void Ms::run(RenderingContext& ctx)
 	ANKI_TRACE_STOP_EVENT(RENDER_MS);
 }
 
+//==============================================================================
+void Ms::setPreRunBarriers(RenderingContext& ctx)
+{
+	ANKI_TRACE_START_EVENT(RENDER_MS);
+
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+	TextureSurfaceInfo surf(0, 0, 0, 0);
+
+	cmdb->setTextureBarrier(m_rt0,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		surf);
+
+	cmdb->setTextureBarrier(m_rt1,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		surf);
+
+	cmdb->setTextureBarrier(m_rt2,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		surf);
+
+	cmdb->setTextureBarrier(m_depthRt,
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		surf);
+
+	ANKI_TRACE_STOP_EVENT(RENDER_MS);
+}
+
+//==============================================================================
+void Ms::setPostRunBarriers(RenderingContext& ctx)
+{
+	ANKI_TRACE_START_EVENT(RENDER_MS);
+
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+	TextureSurfaceInfo surf(0, 0, 0, 0);
+
+	cmdb->setTextureBarrier(m_rt0,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		surf);
+
+	cmdb->setTextureBarrier(m_rt1,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		surf);
+
+	cmdb->setTextureBarrier(m_rt2,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		surf);
+
+	cmdb->setTextureBarrier(m_depthRt,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		surf);
+
+	ANKI_TRACE_STOP_EVENT(RENDER_MS);
+}
+
 } // end namespace anki

+ 52 - 0
src/renderer/Renderer.cpp

@@ -257,6 +257,13 @@ Error Renderer::render(RenderingContext& ctx)
 	ANKI_CHECK(m_is->binLights(ctx));
 	ANKI_CHECK(buildCommandBuffers(ctx));
 
+	// Set barriers for SM and MS
+	if(m_sm)
+	{
+		m_sm->setPreRunBarriers(ctx);
+	}
+	m_ms->setPreRunBarriers(ctx);
+
 	if(m_sm)
 	{
 		m_sm->run(ctx);
@@ -266,11 +273,56 @@ Error Renderer::render(RenderingContext& ctx)
 	m_lf->runOcclusionTests(ctx);
 	cmdb->endRenderPass();
 
+	m_ms->setPostRunBarriers(ctx);
+	m_sm->setPostRunBarriers(ctx);
+
+	cmdb->setTextureBarrier(m_is->getRt(),
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+		TextureSurfaceInfo(0, 0, 0, 0));
+
 	m_is->run(ctx);
 
+	cmdb->setTextureBarrier(m_ms->getDepthRt(),
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		TextureUsageBit::GENERATE_MIPMAPS,
+		TextureSurfaceInfo(0, 0, 0, 0));
+
+	cmdb->setTextureBarrier(m_ms->getRt2(),
+		TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+		TextureUsageBit::GENERATE_MIPMAPS,
+		TextureSurfaceInfo(0, 0, 0, 0));
+
 	cmdb->generateMipmaps(m_ms->getDepthRt(), 0, 0, 0);
 	cmdb->generateMipmaps(m_ms->getRt2(), 0, 0, 0);
 
+	for(U i = 0; i < getMsDepthRtMipmapCount(); ++i)
+	{
+		cmdb->setTextureBarrier(m_ms->getDepthRt(),
+			TextureUsageBit::GENERATE_MIPMAPS,
+			TextureUsageBit::FRAGMENT_SHADER_SAMPLED
+				| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
+			TextureSurfaceInfo(i, 0, 0, 0));
+
+		cmdb->setTextureBarrier(m_ms->getRt2(),
+			TextureUsageBit::GENERATE_MIPMAPS,
+			TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+			TextureSurfaceInfo(i, 0, 0, 0));
+	}
+
+	cmdb->setTextureBarrier(m_fs->getRt(),
+		TextureUsageBit::NONE,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		TextureSurfaceInfo(0, 0, 0, 0));
+
+	if(m_ssao)
+	{
+		cmdb->setTextureBarrier(m_ssao->getRt(),
+			TextureUsageBit::NONE,
+			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+			TextureSurfaceInfo(0, 0, 0, 0));
+	}
+
 	m_fs->run(ctx);
 	m_lf->run(ctx);
 	m_vol->run(ctx);

+ 85 - 0
src/renderer/Sm.cpp

@@ -394,6 +394,13 @@ void Sm::prepareBuildCommandBuffers(RenderingContext& ctx)
 		ctx.m_sm.m_spotCommandBuffers.create(
 			spotCastersCount * m_r->getThreadPool().getThreadsCount());
 
+		ctx.m_sm.m_spotCacheIndices.create(spotCastersCount);
+#if ANKI_ASSERTIONS
+		memset(&ctx.m_sm.m_spotCacheIndices[0],
+			0xFF,
+			sizeof(ctx.m_sm.m_spotCacheIndices[0]) * spotCastersCount);
+#endif
+
 		ctx.m_sm.m_spotFramebuffers.create(spotCastersCount);
 		for(U i = 0; i < spotCastersCount; ++i)
 		{
@@ -402,6 +409,7 @@ void Sm::prepareBuildCommandBuffers(RenderingContext& ctx)
 			U idx = lightc.getShadowMapIndex();
 
 			ctx.m_sm.m_spotFramebuffers[i] = m_spots[idx].m_fb;
+			ctx.m_sm.m_spotCacheIndices[i] = idx;
 		}
 	}
 
@@ -415,6 +423,13 @@ void Sm::prepareBuildCommandBuffers(RenderingContext& ctx)
 		ctx.m_sm.m_omniCommandBuffers.create(
 			omniCastersCount * 6 * m_r->getThreadPool().getThreadsCount());
 
+		ctx.m_sm.m_omniCacheIndices.create(omniCastersCount);
+#if ANKI_ASSERTIONS
+		memset(&ctx.m_sm.m_omniCacheIndices[0],
+			0xFF,
+			sizeof(ctx.m_sm.m_omniCacheIndices[0]) * omniCastersCount);
+#endif
+
 		ctx.m_sm.m_omniFramebuffers.create(omniCastersCount);
 		for(U i = 0; i < omniCastersCount; ++i)
 		{
@@ -426,6 +441,76 @@ void Sm::prepareBuildCommandBuffers(RenderingContext& ctx)
 			{
 				ctx.m_sm.m_omniFramebuffers[i][j] = m_omnis[idx].m_fb[j];
 			}
+
+			ctx.m_sm.m_omniCacheIndices[i] = idx;
+		}
+	}
+
+	ANKI_TRACE_STOP_EVENT(RENDER_SM);
+}
+
+//==============================================================================
+void Sm::setPreRunBarriers(RenderingContext& ctx)
+{
+	ANKI_TRACE_START_EVENT(RENDER_SM);
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+
+	// Spot lights
+	for(U i = 0; i < ctx.m_sm.m_spotCacheIndices.getSize(); ++i)
+	{
+		U layer = ctx.m_sm.m_spotCacheIndices[i];
+
+		cmdb->setTextureBarrier(m_spotTexArray,
+			TextureUsageBit::NONE,
+			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+			TextureSurfaceInfo(0, 0, 0, layer));
+	}
+
+	// Omni lights
+	for(U i = 0; i < ctx.m_sm.m_omniCacheIndices.getSize(); ++i)
+	{
+		for(U j = 0; j < 6; ++j)
+		{
+			U layer = ctx.m_sm.m_omniCacheIndices[i];
+
+			cmdb->setTextureBarrier(m_omniTexArray,
+				TextureUsageBit::NONE,
+				TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+				TextureSurfaceInfo(0, 0, j, layer));
+		}
+	}
+
+	ANKI_TRACE_STOP_EVENT(RENDER_SM);
+}
+
+//==============================================================================
+void Sm::setPostRunBarriers(RenderingContext& ctx)
+{
+	ANKI_TRACE_START_EVENT(RENDER_SM);
+	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
+
+	// Spot lights
+	for(U i = 0; i < ctx.m_sm.m_spotCacheIndices.getSize(); ++i)
+	{
+		U layer = ctx.m_sm.m_spotCacheIndices[i];
+
+		cmdb->setTextureBarrier(m_spotTexArray,
+			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+			TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+			TextureSurfaceInfo(0, 0, 0, layer));
+	}
+
+	// Omni lights
+	for(U i = 0; i < ctx.m_sm.m_omniCacheIndices.getSize(); ++i)
+	{
+		for(U j = 0; j < 6; ++j)
+		{
+			U layer = ctx.m_sm.m_omniCacheIndices[i];
+
+			cmdb->setTextureBarrier(m_omniTexArray,
+				TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+				TextureUsageBit::FRAGMENT_SHADER_SAMPLED,
+				TextureSurfaceInfo(0, 0, j, layer));
 		}
 	}