Browse Source

Small refactoring of buffer copies

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
680c788692

+ 46 - 1
AnKi/Gr/CommandBuffer.h

@@ -16,6 +16,41 @@ namespace anki {
 /// @addtogroup graphics
 /// @{
 
+class TextureBarrierInfo
+{
+public:
+	Texture* m_texture = nullptr;
+	TextureUsageBit m_previousUsage = TextureUsageBit::kNone;
+	TextureUsageBit m_nextUsage = TextureUsageBit::kNone;
+	TextureSubresourceInfo m_subresource;
+};
+
+class BufferBarrierInfo
+{
+public:
+	Buffer* m_buffer = nullptr;
+	BufferUsageBit m_previousUsage = BufferUsageBit::kNone;
+	BufferUsageBit m_nextUsage = BufferUsageBit::kNone;
+	PtrSize m_offset = 0;
+	PtrSize m_size = 0;
+};
+
+class AccelerationStructureBarrierInfo
+{
+public:
+	AccelerationStructure* m_as = nullptr;
+	AccelerationStructureUsageBit m_previousUsage = AccelerationStructureUsageBit::kNone;
+	AccelerationStructureUsageBit m_nextUsage = AccelerationStructureUsageBit::kNone;
+};
+
+class CopyBufferToBufferInfo
+{
+public:
+	PtrSize m_sourceOffset = 0;
+	PtrSize m_destinationOffset = 0;
+	PtrSize m_range = 0;
+};
+
 /// Command buffer initialization flags.
 enum class CommandBufferFlag : U8
 {
@@ -339,7 +374,17 @@ public:
 	/// @param dstOffset Offset in the destination buffer.
 	/// @param range Size to copy.
 	void copyBufferToBuffer(const BufferPtr& src, PtrSize srcOffset, const BufferPtr& dst, PtrSize dstOffset,
-							PtrSize range);
+							PtrSize range)
+	{
+		Array<CopyBufferToBufferInfo, 1> copies = {{srcOffset, dstOffset, range}};
+		copyBufferToBuffer(src, dst, copies);
+	}
+
+	/// Copy buffer to buffer.
+	/// @param[in] src Source buffer.
+	/// @param[out] dst Destination buffer.
+	/// @param copies Info on the copies.
+	void copyBufferToBuffer(const BufferPtr& src, const BufferPtr& dst, ConstWeakArray<CopyBufferToBufferInfo> copies);
 
 	/// Build the acceleration structure.
 	void buildAccelerationStructure(const AccelerationStructurePtr& as);

+ 0 - 27
AnKi/Gr/Common.h

@@ -1034,33 +1034,6 @@ public:
 	}
 };
 
-class TextureBarrierInfo
-{
-public:
-	Texture* m_texture = nullptr;
-	TextureUsageBit m_previousUsage = TextureUsageBit::kNone;
-	TextureUsageBit m_nextUsage = TextureUsageBit::kNone;
-	TextureSubresourceInfo m_subresource;
-};
-
-class BufferBarrierInfo
-{
-public:
-	Buffer* m_buffer = nullptr;
-	BufferUsageBit m_previousUsage = BufferUsageBit::kNone;
-	BufferUsageBit m_nextUsage = BufferUsageBit::kNone;
-	PtrSize m_offset = 0;
-	PtrSize m_size = 0;
-};
-
-class AccelerationStructureBarrierInfo
-{
-public:
-	AccelerationStructure* m_as = nullptr;
-	AccelerationStructureUsageBit m_previousUsage = AccelerationStructureUsageBit::kNone;
-	AccelerationStructureUsageBit m_nextUsage = AccelerationStructureUsageBit::kNone;
-};
-
 /// Compute max number of mipmaps for a 2D texture.
 U32 computeMaxMipmapCount2d(U32 w, U32 h, U32 minSizeOfLastMip = 1);
 

+ 3 - 3
AnKi/Gr/Vulkan/CommandBuffer.cpp

@@ -349,11 +349,11 @@ void CommandBuffer::writeOcclusionQueriesResultToBuffer(ConstWeakArray<Occlusion
 	self.writeOcclusionQueriesResultToBufferInternal(queries, offset, buff);
 }
 
-void CommandBuffer::copyBufferToBuffer(const BufferPtr& src, PtrSize srcOffset, const BufferPtr& dst, PtrSize dstOffset,
-									   PtrSize range)
+void CommandBuffer::copyBufferToBuffer(const BufferPtr& src, const BufferPtr& dst,
+									   ConstWeakArray<CopyBufferToBufferInfo> copies)
 {
 	ANKI_VK_SELF(CommandBufferImpl);
-	self.copyBufferToBufferInternal(src, srcOffset, dst, dstOffset, range);
+	self.copyBufferToBufferInternal(src, dst, copies);
 }
 
 void CommandBuffer::buildAccelerationStructure(const AccelerationStructurePtr& as)

+ 2 - 2
AnKi/Gr/Vulkan/CommandBufferImpl.h

@@ -362,8 +362,8 @@ public:
 	void copyBufferToTextureViewInternal(const BufferPtr& buff, PtrSize offset, PtrSize range,
 										 const TextureViewPtr& texView);
 
-	void copyBufferToBufferInternal(const BufferPtr& src, PtrSize srcOffset, const BufferPtr& dst, PtrSize dstOffset,
-									PtrSize range);
+	void copyBufferToBufferInternal(const BufferPtr& src, const BufferPtr& dst,
+									ConstWeakArray<CopyBufferToBufferInfo> copies);
 
 	void buildAccelerationStructureInternal(const AccelerationStructurePtr& as);
 

+ 17 - 9
AnKi/Gr/Vulkan/CommandBufferImpl.inl.h

@@ -635,23 +635,31 @@ inline void CommandBufferImpl::bindShaderProgramInternal(const ShaderProgramPtr&
 #endif
 }
 
-inline void CommandBufferImpl::copyBufferToBufferInternal(const BufferPtr& src, PtrSize srcOffset, const BufferPtr& dst,
-														  PtrSize dstOffset, PtrSize range)
+inline void CommandBufferImpl::copyBufferToBufferInternal(const BufferPtr& src, const BufferPtr& dst,
+														  ConstWeakArray<CopyBufferToBufferInfo> copies)
 {
 	ANKI_ASSERT(static_cast<const BufferImpl&>(*src).usageValid(BufferUsageBit::kTransferSource));
 	ANKI_ASSERT(static_cast<const BufferImpl&>(*dst).usageValid(BufferUsageBit::kTransferDestination));
-	ANKI_ASSERT(srcOffset + range <= src->getSize());
-	ANKI_ASSERT(dstOffset + range <= dst->getSize());
+	ANKI_ASSERT(copies.getSize() > 0);
 
 	commandCommon();
 
-	VkBufferCopy region = {};
-	region.srcOffset = srcOffset;
-	region.dstOffset = dstOffset;
-	region.size = range;
+	DynamicArrayRaii<VkBufferCopy> vkCopies(m_pool, copies.getSize());
+
+	for(U32 i = 0; i < copies.getSize(); ++i)
+	{
+		const CopyBufferToBufferInfo& in = copies[i];
+		VkBufferCopy& out = vkCopies[i];
+		ANKI_ASSERT(in.m_sourceOffset + in.m_range <= src->getSize());
+		ANKI_ASSERT(in.m_destinationOffset + in.m_range <= dst->getSize());
+
+		out.srcOffset = in.m_sourceOffset;
+		out.dstOffset = in.m_destinationOffset;
+		out.size = in.m_range;
+	}
 
 	vkCmdCopyBuffer(m_handle, static_cast<const BufferImpl&>(*src).getHandle(),
-					static_cast<const BufferImpl&>(*dst).getHandle(), 1, &region);
+					static_cast<const BufferImpl&>(*dst).getHandle(), vkCopies.getSize(), &vkCopies[0]);
 
 	m_microCmdb->pushObjectRef(src);
 	m_microCmdb->pushObjectRef(dst);