Buffer copy

Buffer now has the ability to copy its content to or from memory.

Bug b/118383648

Change-Id: Ic01bf049fe054559299830ca750263c2277e4d86
Reviewed-on: https://swiftshader-review.googlesource.com/c/23069
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkBuffer.cpp b/src/Vulkan/VkBuffer.cpp
index c0e478c..93c509a 100644
--- a/src/Vulkan/VkBuffer.cpp
+++ b/src/Vulkan/VkBuffer.cpp
@@ -55,4 +55,23 @@
 	memory = Cast(pDeviceMemory)->getOffsetPointer(pMemoryOffset);
 }
 
+void Buffer::copyFrom(const void* srcMemory, VkDeviceSize pSize, VkDeviceSize pOffset)
+{
+	ASSERT((pSize + pOffset) <= size);
+
+	memcpy(map(pOffset), srcMemory, pSize);
+}
+
+void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) const
+{
+	ASSERT((pSize + pOffset) <= size);
+
+	memcpy(dstMemory, map(pOffset), pSize);
+}
+
+void* Buffer::map(VkDeviceSize offset) const
+{
+	return reinterpret_cast<char*>(memory) + offset;
+}
+
 } // namespace vk
diff --git a/src/Vulkan/VkBuffer.hpp b/src/Vulkan/VkBuffer.hpp
index f25a717..7dcdb29 100644
--- a/src/Vulkan/VkBuffer.hpp
+++ b/src/Vulkan/VkBuffer.hpp
@@ -31,6 +31,9 @@
 
 	const VkMemoryRequirements getMemoryRequirements() const;
 	void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset);
+	void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset);
+	void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const;
+	void* map(VkDeviceSize offset) const;
 
 private:
 	void*                 memory = nullptr;