Implement buffer to buffer copy command Added buffer copy command and support for VkBufferCopy regions. Passes all tests in: dEQP-VK.api.copy_and_blit.core.buffer_to_buffer Bug b/118619338 Change-Id: Id69cd3f089b07343a7209290808c11d4c17f1a49 Reviewed-on: https://swiftshader-review.googlesource.com/c/23229 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Vulkan/VkBuffer.cpp b/src/Vulkan/VkBuffer.cpp index 7772420..1a772cc 100644 --- a/src/Vulkan/VkBuffer.cpp +++ b/src/Vulkan/VkBuffer.cpp
@@ -69,6 +69,11 @@ memcpy(dstMemory, getOffsetPointer(pOffset), pSize); } +void Buffer::copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const +{ + copyTo(dstBuffer->getOffsetPointer(pRegion.dstOffset), pRegion.size, pRegion.srcOffset); +} + void* Buffer::getOffsetPointer(VkDeviceSize offset) const { return reinterpret_cast<char*>(memory) + offset;
diff --git a/src/Vulkan/VkBuffer.hpp b/src/Vulkan/VkBuffer.hpp index 8bdf0e9..45645e5 100644 --- a/src/Vulkan/VkBuffer.hpp +++ b/src/Vulkan/VkBuffer.hpp
@@ -33,6 +33,7 @@ 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 copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const; void* getOffsetPointer(VkDeviceSize offset) const; private:
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp index 013d3be..7525749 100644 --- a/src/Vulkan/VkCommandBuffer.cpp +++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -166,6 +166,24 @@ const VkImageCopy region; }; +struct BufferToBufferCopy : public CommandBuffer::Command +{ + BufferToBufferCopy(VkBuffer pSrcBuffer, VkBuffer pDstBuffer, const VkBufferCopy& pRegion) : + srcBuffer(pSrcBuffer), dstBuffer(pDstBuffer), region(pRegion) + { + } + + void play(CommandBuffer::ExecutionState& executionState) + { + Cast(srcBuffer)->copyTo(Cast(dstBuffer), region); + } + +private: + VkBuffer srcBuffer; + VkBuffer dstBuffer; + const VkBufferCopy region; +}; + struct ImageToBufferCopy : public CommandBuffer::Command { ImageToBufferCopy(VkImage pSrcImage, VkBuffer pDstBuffer, const VkBufferImageCopy& pRegion) : @@ -486,7 +504,12 @@ void CommandBuffer::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions) { - UNIMPLEMENTED(); + ASSERT(state == RECORDING); + + for(uint32_t i = 0; i < regionCount; i++) + { + commands->push_back(std::make_unique<BufferToBufferCopy>(srcBuffer, dstBuffer, pRegions[i])); + } } void CommandBuffer::copyImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,