OSDN Git Service

Update and Fill Buffers
authorAlexis Hetu <sugoi@google.com>
Thu, 7 Feb 2019 18:50:10 +0000 (13:50 -0500)
committerAlexis Hétu <sugoi@google.com>
Fri, 8 Feb 2019 01:55:46 +0000 (01:55 +0000)
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 <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
src/Vulkan/VkBuffer.cpp
src/Vulkan/VkBuffer.hpp
src/Vulkan/VkCommandBuffer.cpp

index 721f75e..6b12067 100644 (file)
@@ -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;
index 45645e5..19dfc55 100644 (file)
@@ -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:
index 52bde46..b3bca2f 100644 (file)
@@ -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,