Commit 7fb0b73b by Alexis Hetu Committed by Alexis Hétu

Update and Fill Buffers

Implemented vkCmdUpdateBuffer and vkCmdFillBuffer. Passes all tests in: dEQP-VK.api.fill_and_update_buffer.* Bug b/118619338 b/118383648 Change-Id: I3cf317b4cb766618a54b2550019ac2702c24bfed Reviewed-on: https://swiftshader-review.googlesource.com/c/24529Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent c8176632
......@@ -89,6 +89,20 @@ void Buffer::copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const
copyTo(dstBuffer->getOffsetPointer(pRegion.dstOffset), pRegion.size, pRegion.srcOffset);
}
void Buffer::fill(VkDeviceSize dstOffset, VkDeviceSize fillSize, uint32_t data)
{
ASSERT((fillSize + dstOffset) <= size);
memset(getOffsetPointer(dstOffset), data, fillSize);
}
void Buffer::update(VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData)
{
ASSERT((dataSize + dstOffset) <= size);
memcpy(getOffsetPointer(dstOffset), pData, dataSize);
}
void* Buffer::getOffsetPointer(VkDeviceSize offset) const
{
return reinterpret_cast<char*>(memory) + offset;
......
......@@ -34,6 +34,8 @@ public:
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 fill(VkDeviceSize dstOffset, VkDeviceSize fillSize, uint32_t data);
void update(VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);
void* getOffsetPointer(VkDeviceSize offset) const;
private:
......
......@@ -251,6 +251,44 @@ private:
const VkBufferImageCopy region;
};
struct FillBuffer : public CommandBuffer::Command
{
FillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) :
dstBuffer(dstBuffer), dstOffset(dstOffset), size(size), data(data)
{
}
void play(CommandBuffer::ExecutionState& executionState)
{
Cast(dstBuffer)->fill(dstOffset, size, data);
}
private:
VkBuffer dstBuffer;
VkDeviceSize dstOffset;
VkDeviceSize size;
uint32_t data;
};
struct UpdateBuffer : public CommandBuffer::Command
{
UpdateBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) :
dstBuffer(dstBuffer), dstOffset(dstOffset), dataSize(dataSize), pData(pData)
{
}
void play(CommandBuffer::ExecutionState& executionState)
{
Cast(dstBuffer)->update(dstOffset, dataSize, pData);
}
private:
VkBuffer dstBuffer;
VkDeviceSize dstOffset;
VkDeviceSize dataSize;
const void* pData;
};
struct ClearColorImage : public CommandBuffer::Command
{
ClearColorImage(VkImage image, const VkClearColorValue& color, const VkImageSubresourceRange& range) :
......@@ -710,12 +748,16 @@ void CommandBuffer::copyImageToBuffer(VkImage srcImage, VkImageLayout srcImageLa
void CommandBuffer::updateBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData)
{
UNIMPLEMENTED();
ASSERT(state == RECORDING);
addCommand<UpdateBuffer>(dstBuffer, dstOffset, dataSize, pData);
}
void CommandBuffer::fillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data)
{
UNIMPLEMENTED();
ASSERT(state == RECORDING);
addCommand<FillBuffer>(dstBuffer, dstOffset, size, data);
}
void CommandBuffer::clearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor,
......
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