Ver código fonte

RenderGraph: Some changes around handles

Panagiotis Christopoulos Charitos 8 anos atrás
pai
commit
b5615241dc
3 arquivos alterados com 79 adições e 22 exclusões
  1. 12 11
      src/anki/gr/RenderGraph.cpp
  2. 65 9
      src/anki/gr/RenderGraph.h
  3. 2 2
      src/anki/renderer/Bloom.h

+ 12 - 11
src/anki/gr/RenderGraph.cpp

@@ -351,13 +351,14 @@ FramebufferPtr RenderGraph::getOrCreateFramebuffer(
 		{
 		{
 			for(U i = 0; i < fbInit.m_colorAttachmentCount; ++i)
 			for(U i = 0; i < fbInit.m_colorAttachmentCount; ++i)
 			{
 			{
-				fbInit.m_colorAttachments[i].m_texture = m_ctx->m_rts[rtHandles[i]].m_texture;
+				fbInit.m_colorAttachments[i].m_texture = m_ctx->m_rts[rtHandles[i].m_idx].m_texture;
 				ANKI_ASSERT(fbInit.m_colorAttachments[i].m_texture.isCreated());
 				ANKI_ASSERT(fbInit.m_colorAttachments[i].m_texture.isCreated());
 			}
 			}
 
 
 			if(!!fbInit.m_depthStencilAttachment.m_aspect)
 			if(!!fbInit.m_depthStencilAttachment.m_aspect)
 			{
 			{
-				fbInit.m_depthStencilAttachment.m_texture = m_ctx->m_rts[rtHandles[MAX_COLOR_ATTACHMENTS]].m_texture;
+				fbInit.m_depthStencilAttachment.m_texture =
+					m_ctx->m_rts[rtHandles[MAX_COLOR_ATTACHMENTS].m_idx].m_texture;
 				ANKI_ASSERT(fbInit.m_depthStencilAttachment.m_texture.isCreated());
 				ANKI_ASSERT(fbInit.m_depthStencilAttachment.m_texture.isCreated());
 			}
 			}
 		}
 		}
@@ -389,7 +390,7 @@ Bool RenderGraph::passADependsOnB(
 
 
 			for(const RenderPassDependency& consumer : a.m_consumers)
 			for(const RenderPassDependency& consumer : a.m_consumers)
 			{
 			{
-				if(consumer.m_isTexture && fullDep.get(consumer.m_texture.m_handle))
+				if(consumer.m_isTexture && fullDep.get(consumer.m_texture.m_handle.m_idx))
 				{
 				{
 					for(const RenderPassDependency& producer : b.m_producers)
 					for(const RenderPassDependency& producer : b.m_producers)
 					{
 					{
@@ -418,7 +419,7 @@ Bool RenderGraph::passADependsOnB(
 
 
 			for(const RenderPassDependency& consumer : a.m_consumers)
 			for(const RenderPassDependency& consumer : a.m_consumers)
 			{
 			{
-				if(!consumer.m_isTexture && fullDep.get(consumer.m_buffer.m_handle))
+				if(!consumer.m_isTexture && fullDep.get(consumer.m_buffer.m_handle.m_idx))
 				{
 				{
 					for(const RenderPassDependency& producer : b.m_producers)
 					for(const RenderPassDependency& producer : b.m_producers)
 					{
 					{
@@ -634,7 +635,7 @@ void RenderGraph::setBatchBarriers(const RenderGraphDescription& descr, BakeCont
 			{
 			{
 				if(consumer.m_isTexture)
 				if(consumer.m_isTexture)
 				{
 				{
-					const U32 rtIdx = consumer.m_texture.m_handle;
+					const U32 rtIdx = consumer.m_texture.m_handle.m_idx;
 					const TextureUsageBit consumerUsage = consumer.m_texture.m_usage;
 					const TextureUsageBit consumerUsage = consumer.m_texture.m_usage;
 
 
 					Bool anySurfaceFound = false;
 					Bool anySurfaceFound = false;
@@ -647,7 +648,7 @@ void RenderGraph::setBatchBarriers(const RenderGraphDescription& descr, BakeCont
 							if(u.m_usage != consumerUsage)
 							if(u.m_usage != consumerUsage)
 							{
 							{
 								batch.m_barriersBefore.emplaceBack(
 								batch.m_barriersBefore.emplaceBack(
-									alloc, consumer.m_texture.m_handle, u.m_usage, consumerUsage, u.m_surface);
+									alloc, consumer.m_texture.m_handle.m_idx, u.m_usage, consumerUsage, u.m_surface);
 
 
 								u.m_usage = consumer.m_texture.m_usage;
 								u.m_usage = consumer.m_texture.m_usage;
 							}
 							}
@@ -668,7 +669,7 @@ void RenderGraph::setBatchBarriers(const RenderGraphDescription& descr, BakeCont
 				}
 				}
 				else
 				else
 				{
 				{
-					const U32 buffIdx = consumer.m_buffer.m_handle;
+					const U32 buffIdx = consumer.m_buffer.m_handle.m_idx;
 					const BufferUsageBit consumerUsage = consumer.m_buffer.m_usage;
 					const BufferUsageBit consumerUsage = consumer.m_buffer.m_usage;
 
 
 					if(consumerUsage != ctx.m_buffers[buffIdx].m_usage)
 					if(consumerUsage != ctx.m_buffers[buffIdx].m_usage)
@@ -888,14 +889,14 @@ Error RenderGraph::dumpDependencyDotFile(
 
 
 TexturePtr RenderGraph::getTexture(RenderTargetHandle handle) const
 TexturePtr RenderGraph::getTexture(RenderTargetHandle handle) const
 {
 {
-	ANKI_ASSERT(m_ctx->m_rts[handle].m_texture.isCreated());
-	return m_ctx->m_rts[handle].m_texture;
+	ANKI_ASSERT(m_ctx->m_rts[handle.m_idx].m_texture.isCreated());
+	return m_ctx->m_rts[handle.m_idx].m_texture;
 }
 }
 
 
 BufferPtr RenderGraph::getBuffer(RenderPassBufferHandle handle) const
 BufferPtr RenderGraph::getBuffer(RenderPassBufferHandle handle) const
 {
 {
-	ANKI_ASSERT(m_ctx->m_buffers[handle].m_buffer.isCreated());
-	return m_ctx->m_buffers[handle].m_buffer;
+	ANKI_ASSERT(m_ctx->m_buffers[handle.m_idx].m_buffer.isCreated());
+	return m_ctx->m_buffers[handle.m_idx].m_buffer;
 }
 }
 
 
 void RenderGraph::runSecondLevel(U32 threadIdx) const
 void RenderGraph::runSecondLevel(U32 threadIdx) const

+ 65 - 9
src/anki/gr/RenderGraph.h

@@ -30,10 +30,54 @@ static constexpr U MAX_RENDER_GRAPH_BUFFERS = 64;
 /// @}
 /// @}
 
 
 /// Render target handle used in the RenderGraph.
 /// Render target handle used in the RenderGraph.
-using RenderTargetHandle = U32;
+class RenderTargetHandle
+{
+	friend class RenderPassDependency;
+	friend class RenderGraphDescription;
+	friend class RenderGraph;
+	friend class RenderPassDescriptionBase;
+
+public:
+	operator TexturePtr() const;
+
+	bool operator==(const RenderTargetHandle& b) const
+	{
+		return m_idx == b.m_idx;
+	}
+
+private:
+	U32 m_idx = MAX_U32;
+
+	Bool valid() const
+	{
+		return m_idx != MAX_U32;
+	}
+};
 
 
 /// Buffer handle used in the RenderGraph.
 /// Buffer handle used in the RenderGraph.
-using RenderPassBufferHandle = U32;
+class RenderPassBufferHandle
+{
+	friend class RenderPassDependency;
+	friend class RenderGraphDescription;
+	friend class RenderGraph;
+	friend class RenderPassDescriptionBase;
+
+public:
+	operator BufferPtr() const;
+
+	bool operator==(const RenderPassBufferHandle& b) const
+	{
+		return m_idx == b.m_idx;
+	}
+
+private:
+	U32 m_idx = MAX_U32;
+
+	Bool valid() const
+	{
+		return m_idx != MAX_U32;
+	}
+};
 
 
 /// Describes the render target.
 /// Describes the render target.
 class RenderTargetDescription : public TextureInitInfo
 class RenderTargetDescription : public TextureInitInfo
@@ -76,6 +120,7 @@ public:
 		: m_texture({handle, usage, surface, false})
 		: m_texture({handle, usage, surface, false})
 		, m_isTexture(true)
 		, m_isTexture(true)
 	{
 	{
+		ANKI_ASSERT(handle.valid());
 	}
 	}
 
 
 	/// Dependency to the whole texture.
 	/// Dependency to the whole texture.
@@ -83,12 +128,14 @@ public:
 		: m_texture({handle, usage, TextureSurfaceInfo(0, 0, 0, 0), true})
 		: m_texture({handle, usage, TextureSurfaceInfo(0, 0, 0, 0), true})
 		, m_isTexture(true)
 		, m_isTexture(true)
 	{
 	{
+		ANKI_ASSERT(handle.valid());
 	}
 	}
 
 
 	RenderPassDependency(RenderPassBufferHandle handle, BufferUsageBit usage)
 	RenderPassDependency(RenderPassBufferHandle handle, BufferUsageBit usage)
 		: m_buffer({handle, usage})
 		: m_buffer({handle, usage})
 		, m_isTexture(false)
 		, m_isTexture(false)
 	{
 	{
+		ANKI_ASSERT(handle.valid());
 	}
 	}
 
 
 private:
 private:
@@ -144,11 +191,11 @@ public:
 
 
 		if(dep.m_isTexture && dep.m_texture.m_usage != TextureUsageBit::NONE)
 		if(dep.m_isTexture && dep.m_texture.m_usage != TextureUsageBit::NONE)
 		{
 		{
-			m_consumerRtMask.set(dep.m_texture.m_handle);
+			m_consumerRtMask.set(dep.m_texture.m_handle.m_idx);
 		}
 		}
 		else if(dep.m_buffer.m_usage != BufferUsageBit::NONE)
 		else if(dep.m_buffer.m_usage != BufferUsageBit::NONE)
 		{
 		{
-			m_consumerBufferMask.set(dep.m_buffer.m_handle);
+			m_consumerBufferMask.set(dep.m_buffer.m_handle.m_idx);
 		}
 		}
 	}
 	}
 
 
@@ -158,11 +205,11 @@ public:
 		m_producers.emplaceBack(m_alloc, dep);
 		m_producers.emplaceBack(m_alloc, dep);
 		if(dep.m_isTexture)
 		if(dep.m_isTexture)
 		{
 		{
-			m_producerRtMask.set(dep.m_texture.m_handle);
+			m_producerRtMask.set(dep.m_texture.m_handle.m_idx);
 		}
 		}
 		else
 		else
 		{
 		{
-			m_producerBufferMask.set(dep.m_buffer.m_handle);
+			m_producerBufferMask.set(dep.m_buffer.m_handle.m_idx);
 		}
 		}
 	}
 	}
 
 
@@ -346,7 +393,10 @@ public:
 		rt.m_importedTex = tex;
 		rt.m_importedTex = tex;
 		rt.m_usage = usage;
 		rt.m_usage = usage;
 		rt.setName(name);
 		rt.setName(name);
-		return m_renderTargets.getSize() - 1;
+
+		RenderTargetHandle out;
+		out.m_idx = m_renderTargets.getSize() - 1;
+		return out;
 	}
 	}
 
 
 	/// Get or create a new render target.
 	/// Get or create a new render target.
@@ -358,7 +408,10 @@ public:
 		rt.m_hash = initInf.m_hash;
 		rt.m_hash = initInf.m_hash;
 		rt.m_usage = TextureUsageBit::NONE;
 		rt.m_usage = TextureUsageBit::NONE;
 		rt.setName(initInf.getName());
 		rt.setName(initInf.getName());
-		return m_renderTargets.getSize() - 1;
+
+		RenderTargetHandle out;
+		out.m_idx = m_renderTargets.getSize() - 1;
+		return out;
 	}
 	}
 
 
 	/// Import a buffer.
 	/// Import a buffer.
@@ -368,7 +421,10 @@ public:
 		b.setName(name);
 		b.setName(name);
 		b.m_usage = usage;
 		b.m_usage = usage;
 		b.m_importedBuff = buff;
 		b.m_importedBuff = buff;
-		return m_buffers.getSize() - 1;
+
+		RenderPassBufferHandle out;
+		out.m_idx = m_buffers.getSize() - 1;
+		return out;
 	}
 	}
 
 
 private:
 private:

+ 2 - 2
src/anki/renderer/Bloom.h

@@ -53,7 +53,7 @@ private:
 
 
 		GraphicsRenderPassFramebufferDescription m_fbDescr;
 		GraphicsRenderPassFramebufferDescription m_fbDescr;
 		RenderTargetDescription m_rtDescr;
 		RenderTargetDescription m_rtDescr;
-		RenderTargetHandle m_rt = 0;
+		RenderTargetHandle m_rt;
 	} m_exposure;
 	} m_exposure;
 
 
 	class
 	class
@@ -67,7 +67,7 @@ private:
 
 
 		RenderTargetDescription m_rtDescr;
 		RenderTargetDescription m_rtDescr;
 		GraphicsRenderPassFramebufferDescription m_fbDescr;
 		GraphicsRenderPassFramebufferDescription m_fbDescr;
-		RenderTargetHandle m_rt = 0;
+		RenderTargetHandle m_rt;
 	} m_upscale;
 	} m_upscale;
 
 
 	class
 	class