From 7fb0b73b1aa74b33c08258cef1fe800dc8a94e26 Mon Sep 17 00:00:00 2001 From: Alexis Hetu Date: Thu, 7 Feb 2019 13:50:10 -0500 Subject: [PATCH] Update and Fill Buffers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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/24529 Tested-by: Alexis Hétu Kokoro-Presubmit: kokoro Reviewed-by: Nicolas Capens --- src/Vulkan/VkBuffer.cpp | 14 +++++++++++++ src/Vulkan/VkBuffer.hpp | 2 ++ src/Vulkan/VkCommandBuffer.cpp | 46 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/Vulkan/VkBuffer.cpp b/src/Vulkan/VkBuffer.cpp index 721f75e9b..6b120671e 100644 --- a/src/Vulkan/VkBuffer.cpp +++ b/src/Vulkan/VkBuffer.cpp @@ -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(memory) + offset; diff --git a/src/Vulkan/VkBuffer.hpp b/src/Vulkan/VkBuffer.hpp index 45645e50d..19dfc5522 100644 --- a/src/Vulkan/VkBuffer.hpp +++ b/src/Vulkan/VkBuffer.hpp @@ -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: diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp index 52bde469a..b3bca2f96 100644 --- a/src/Vulkan/VkCommandBuffer.cpp +++ b/src/Vulkan/VkCommandBuffer.cpp @@ -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(dstBuffer, dstOffset, dataSize, pData); } void CommandBuffer::fillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { - UNIMPLEMENTED(); + ASSERT(state == RECORDING); + + addCommand(dstBuffer, dstOffset, size, data); } void CommandBuffer::clearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, -- 2.11.0