Forráskód Böngészése

Minor opts in render graph

Panagiotis Christopoulos Charitos 7 éve
szülő
commit
fe7093602f
3 módosított fájl, 64 hozzáadás és 59 törlés
  1. 48 51
      src/anki/gr/RenderGraph.cpp
  2. 8 4
      src/anki/gr/RenderGraph.h
  3. 8 4
      src/anki/gr/RenderGraph.inl.h

+ 48 - 51
src/anki/gr/RenderGraph.cpp

@@ -471,13 +471,13 @@ Bool RenderGraph::passADependsOnB(const RenderPassDescriptionBase& a, const Rend
 		{
 			// There might be an overlap
 
-			for(const RenderPassDependency& consumer : a.m_consumers)
+			for(const RenderPassDependency& consumer : a.m_rtConsumers)
 			{
-				if(consumer.m_isTexture && fullDep.get(consumer.m_texture.m_handle.m_idx))
+				if(fullDep.get(consumer.m_texture.m_handle.m_idx))
 				{
-					for(const RenderPassDependency& producer : b.m_producers)
+					for(const RenderPassDependency& producer : b.m_rtProducers)
 					{
-						if(producer.m_isTexture && overlappingDependency<true>(producer, consumer))
+						if(overlappingDependency<true>(producer, consumer))
 						{
 							return true;
 						}
@@ -500,13 +500,13 @@ Bool RenderGraph::passADependsOnB(const RenderPassDescriptionBase& a, const Rend
 		{
 			// There might be an overlap
 
-			for(const RenderPassDependency& consumer : a.m_consumers)
+			for(const RenderPassDependency& consumer : a.m_buffConsumers)
 			{
-				if(!consumer.m_isTexture && fullDep.get(consumer.m_buffer.m_handle.m_idx))
+				if(fullDep.get(consumer.m_buffer.m_handle.m_idx))
 				{
-					for(const RenderPassDependency& producer : b.m_producers)
+					for(const RenderPassDependency& producer : b.m_buffProducers)
 					{
-						if(!producer.m_isTexture && overlappingDependency<false>(producer, consumer))
+						if(overlappingDependency<false>(producer, consumer))
 						{
 							return true;
 						}
@@ -620,17 +620,16 @@ void RenderGraph::initRenderPassesAndSetDeps(const RenderGraphDescription& descr
 		outPass.m_userData = inPass.m_userData;
 
 		// Create consumer info
-		for(U consumerIdx = 0; consumerIdx < inPass.m_consumers.getSize(); ++consumerIdx)
+		for(U consumerIdx = 0; consumerIdx < inPass.m_rtConsumers.getSize(); ++consumerIdx)
 		{
-			const RenderPassDependency& inConsumer = inPass.m_consumers[consumerIdx];
-			if(inConsumer.m_isTexture)
-			{
-				outPass.m_consumedTextures.emplaceBack(alloc);
-				Pass::ConsumedTextureInfo& inf = outPass.m_consumedTextures.getBack();
+			const RenderPassDependency& inConsumer = inPass.m_rtConsumers[consumerIdx];
+			ANKI_ASSERT(inConsumer.m_isTexture);
 
-				ANKI_ASSERT(sizeof(inf) == sizeof(inConsumer.m_texture));
-				memcpy(&inf, &inConsumer.m_texture, sizeof(inf));
-			}
+			outPass.m_consumedTextures.emplaceBack(alloc);
+			Pass::ConsumedTextureInfo& inf = outPass.m_consumedTextures.getBack();
+
+			ANKI_ASSERT(sizeof(inf) == sizeof(inConsumer.m_texture));
+			memcpy(&inf, &inConsumer.m_texture, sizeof(inf));
 		}
 
 		// Create command buffers and framebuffer
@@ -848,53 +847,51 @@ void RenderGraph::setBatchBarriers(const RenderGraphDescription& descr)
 			const RenderPassDescriptionBase& pass = *descr.m_passes[passIdx];
 
 			// For all consumers
-			for(const RenderPassDependency& consumer : pass.m_consumers)
+			for(const RenderPassDependency& consumer : pass.m_rtConsumers)
 			{
-				if(consumer.m_isTexture)
-				{
-					setTextureBarrier(batch, consumer);
-				}
-				else
+				setTextureBarrier(batch, consumer);
+			}
+
+			for(const RenderPassDependency& consumer : pass.m_buffConsumers)
+			{
+				const U32 buffIdx = consumer.m_buffer.m_handle.m_idx;
+				const BufferUsageBit consumerUsage = consumer.m_buffer.m_usage;
+
+				if(consumerUsage != ctx.m_buffers[buffIdx].m_usage)
 				{
-					const U32 buffIdx = consumer.m_buffer.m_handle.m_idx;
-					const BufferUsageBit consumerUsage = consumer.m_buffer.m_usage;
+					const Bool buffHasBarrier = buffHasBarrierMask.get(buffIdx);
 
-					if(consumerUsage != ctx.m_buffers[buffIdx].m_usage)
+					if(!buffHasBarrier)
 					{
-						const Bool buffHasBarrier = buffHasBarrierMask.get(buffIdx);
+						// Buff hasn't had a barrier in this batch, add a new barrier
 
-						if(!buffHasBarrier)
-						{
-							// Buff hasn't had a barrier in this batch, add a new barrier
+						batch.m_barriersBefore.emplaceBack(
+							alloc, buffIdx, ctx.m_buffers[buffIdx].m_usage, consumerUsage);
 
-							batch.m_barriersBefore.emplaceBack(
-								alloc, buffIdx, ctx.m_buffers[buffIdx].m_usage, consumerUsage);
+						ctx.m_buffers[buffIdx].m_usage = consumerUsage;
+						buffHasBarrierMask.set(buffIdx);
+					}
+					else
+					{
+						// Buff already in a barrier, merge the 2 barriers
 
-							ctx.m_buffers[buffIdx].m_usage = consumerUsage;
-							buffHasBarrierMask.set(buffIdx);
-						}
-						else
+						Barrier* barrierToMergeTo = nullptr;
+						for(Barrier& b : batch.m_barriersBefore)
 						{
-							// Buff already in a barrier, merge the 2 barriers
-
-							Barrier* barrierToMergeTo = nullptr;
-							for(Barrier& b : batch.m_barriersBefore)
+							if(!b.m_isTexture && b.m_buffer.m_idx == buffIdx)
 							{
-								if(!b.m_isTexture && b.m_buffer.m_idx == buffIdx)
-								{
-									barrierToMergeTo = &b;
-									break;
-								}
+								barrierToMergeTo = &b;
+								break;
 							}
-
-							ANKI_ASSERT(barrierToMergeTo);
-							ANKI_ASSERT(!!barrierToMergeTo->m_buffer.m_usageAfter);
-							barrierToMergeTo->m_buffer.m_usageAfter |= consumerUsage;
-							ctx.m_buffers[buffIdx].m_usage = barrierToMergeTo->m_buffer.m_usageAfter;
 						}
+
+						ANKI_ASSERT(barrierToMergeTo);
+						ANKI_ASSERT(!!barrierToMergeTo->m_buffer.m_usageAfter);
+						barrierToMergeTo->m_buffer.m_usageAfter |= consumerUsage;
+						ctx.m_buffers[buffIdx].m_usage = barrierToMergeTo->m_buffer.m_usageAfter;
 					}
 				}
-			} // For all consumers
+			}
 		} // For all passes
 
 #if ANKI_DBG_RENDER_GRAPH

+ 8 - 4
src/anki/gr/RenderGraph.h

@@ -265,8 +265,10 @@ public:
 	virtual ~RenderPassDescriptionBase()
 	{
 		m_name.destroy(m_alloc); // To avoid the assertion
-		m_consumers.destroy(m_alloc);
-		m_producers.destroy(m_alloc);
+		m_rtConsumers.destroy(m_alloc);
+		m_rtProducers.destroy(m_alloc);
+		m_buffConsumers.destroy(m_alloc);
+		m_buffProducers.destroy(m_alloc);
 	}
 
 	void setWork(RenderPassWorkCallback callback, void* userData, U32 secondLeveCmdbCount)
@@ -300,8 +302,10 @@ protected:
 	void* m_userData = nullptr;
 	U32 m_secondLevelCmdbsCount = 0;
 
-	DynamicArray<RenderPassDependency> m_consumers;
-	DynamicArray<RenderPassDependency> m_producers;
+	DynamicArray<RenderPassDependency> m_rtConsumers;
+	DynamicArray<RenderPassDependency> m_rtProducers;
+	DynamicArray<RenderPassDependency> m_buffConsumers;
+	DynamicArray<RenderPassDependency> m_buffProducers;
 
 	BitSet<MAX_RENDER_GRAPH_RENDER_TARGETS, U64> m_consumerRtMask = {false};
 	BitSet<MAX_RENDER_GRAPH_RENDER_TARGETS, U64> m_producerRtMask = {false};

+ 8 - 4
src/anki/gr/RenderGraph.inl.h

@@ -55,11 +55,13 @@ inline void RenderPassDescriptionBase::fixSubresource(RenderPassDependency& dep)
 
 inline void RenderPassDescriptionBase::newConsumer(const RenderPassDependency& dep)
 {
-	m_consumers.emplaceBack(m_alloc, dep);
+	DynamicArray<RenderPassDependency>& consumers = (dep.m_isTexture) ? m_rtConsumers : m_buffConsumers;
+
+	consumers.emplaceBack(m_alloc, dep);
 
 	if(dep.m_isTexture && dep.m_texture.m_usage != TextureUsageBit::NONE)
 	{
-		fixSubresource(m_consumers.getBack());
+		fixSubresource(consumers.getBack());
 		m_consumerRtMask.set(dep.m_texture.m_handle.m_idx);
 
 		// Try to derive the usage by that dep
@@ -74,10 +76,12 @@ inline void RenderPassDescriptionBase::newConsumer(const RenderPassDependency& d
 
 inline void RenderPassDescriptionBase::newProducer(const RenderPassDependency& dep)
 {
-	m_producers.emplaceBack(m_alloc, dep);
+	DynamicArray<RenderPassDependency>& producers = (dep.m_isTexture) ? m_rtProducers : m_buffProducers;
+
+	producers.emplaceBack(m_alloc, dep);
 	if(dep.m_isTexture)
 	{
-		fixSubresource(m_producers.getBack());
+		fixSubresource(producers.getBack());
 		m_producerRtMask.set(dep.m_texture.m_handle.m_idx);
 	}
 	else