Commit bb0a7f09 by Alexis Hetu Committed by Alexis Hétu

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/23229Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent 753c67c0
...@@ -69,6 +69,11 @@ void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) c ...@@ -69,6 +69,11 @@ void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) c
memcpy(dstMemory, getOffsetPointer(pOffset), pSize); 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 void* Buffer::getOffsetPointer(VkDeviceSize offset) const
{ {
return reinterpret_cast<char*>(memory) + offset; return reinterpret_cast<char*>(memory) + offset;
......
...@@ -33,6 +33,7 @@ public: ...@@ -33,6 +33,7 @@ public:
void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset); void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset);
void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset); void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset);
void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const; void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const;
void copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const;
void* getOffsetPointer(VkDeviceSize offset) const; void* getOffsetPointer(VkDeviceSize offset) const;
private: private:
......
...@@ -166,6 +166,24 @@ private: ...@@ -166,6 +166,24 @@ private:
const VkImageCopy region; 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 struct ImageToBufferCopy : public CommandBuffer::Command
{ {
ImageToBufferCopy(VkImage pSrcImage, VkBuffer pDstBuffer, const VkBufferImageCopy& pRegion) : ImageToBufferCopy(VkImage pSrcImage, VkBuffer pDstBuffer, const VkBufferImageCopy& pRegion) :
...@@ -486,7 +504,12 @@ void CommandBuffer::dispatchIndirect(VkBuffer buffer, VkDeviceSize offset) ...@@ -486,7 +504,12 @@ void CommandBuffer::dispatchIndirect(VkBuffer buffer, VkDeviceSize offset)
void CommandBuffer::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions) 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, void CommandBuffer::copyImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment