OSDN Git Service

Implement buffer to buffer copy command
authorAlexis Hetu <sugoi@google.com>
Fri, 14 Dec 2018 21:50:43 +0000 (16:50 -0500)
committerAlexis Hétu <sugoi@google.com>
Fri, 21 Dec 2018 18:27:26 +0000 (18:27 +0000)
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>
src/Vulkan/VkBuffer.cpp
src/Vulkan/VkBuffer.hpp
src/Vulkan/VkCommandBuffer.cpp

index 7772420..1a772cc 100644 (file)
@@ -69,6 +69,11 @@ void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) c
        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;
index 8bdf0e9..45645e5 100644 (file)
@@ -33,6 +33,7 @@ public:
        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:
index 013d3be..7525749 100644 (file)
@@ -166,6 +166,24 @@ private:
        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::dispatchIndirect(VkBuffer buffer, VkDeviceSize offset)
 
 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,