Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7fb0b73

Browse files
committed
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/24529 Tested-by: Alexis Hétu <[email protected]> Kokoro-Presubmit: kokoro <[email protected]> Reviewed-by: Nicolas Capens <[email protected]>
1 parent c817663 commit 7fb0b73

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

src/Vulkan/VkBuffer.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ void Buffer::copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const
8989
copyTo(dstBuffer->getOffsetPointer(pRegion.dstOffset), pRegion.size, pRegion.srcOffset);
9090
}
9191

92+
void Buffer::fill(VkDeviceSize dstOffset, VkDeviceSize fillSize, uint32_t data)
93+
{
94+
ASSERT((fillSize + dstOffset) <= size);
95+
96+
memset(getOffsetPointer(dstOffset), data, fillSize);
97+
}
98+
99+
void Buffer::update(VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData)
100+
{
101+
ASSERT((dataSize + dstOffset) <= size);
102+
103+
memcpy(getOffsetPointer(dstOffset), pData, dataSize);
104+
}
105+
92106
void* Buffer::getOffsetPointer(VkDeviceSize offset) const
93107
{
94108
return reinterpret_cast<char*>(memory) + offset;

src/Vulkan/VkBuffer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ class Buffer : public Object<Buffer, VkBuffer>
3434
void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset);
3535
void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const;
3636
void copyTo(Buffer* dstBuffer, const VkBufferCopy& pRegion) const;
37+
void fill(VkDeviceSize dstOffset, VkDeviceSize fillSize, uint32_t data);
38+
void update(VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);
3739
void* getOffsetPointer(VkDeviceSize offset) const;
3840

3941
private:

src/Vulkan/VkCommandBuffer.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,44 @@ struct BufferToImageCopy : public CommandBuffer::Command
251251
const VkBufferImageCopy region;
252252
};
253253

254+
struct FillBuffer : public CommandBuffer::Command
255+
{
256+
FillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) :
257+
dstBuffer(dstBuffer), dstOffset(dstOffset), size(size), data(data)
258+
{
259+
}
260+
261+
void play(CommandBuffer::ExecutionState& executionState)
262+
{
263+
Cast(dstBuffer)->fill(dstOffset, size, data);
264+
}
265+
266+
private:
267+
VkBuffer dstBuffer;
268+
VkDeviceSize dstOffset;
269+
VkDeviceSize size;
270+
uint32_t data;
271+
};
272+
273+
struct UpdateBuffer : public CommandBuffer::Command
274+
{
275+
UpdateBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) :
276+
dstBuffer(dstBuffer), dstOffset(dstOffset), dataSize(dataSize), pData(pData)
277+
{
278+
}
279+
280+
void play(CommandBuffer::ExecutionState& executionState)
281+
{
282+
Cast(dstBuffer)->update(dstOffset, dataSize, pData);
283+
}
284+
285+
private:
286+
VkBuffer dstBuffer;
287+
VkDeviceSize dstOffset;
288+
VkDeviceSize dataSize;
289+
const void* pData;
290+
};
291+
254292
struct ClearColorImage : public CommandBuffer::Command
255293
{
256294
ClearColorImage(VkImage image, const VkClearColorValue& color, const VkImageSubresourceRange& range) :
@@ -710,12 +748,16 @@ void CommandBuffer::copyImageToBuffer(VkImage srcImage, VkImageLayout srcImageLa
710748

711749
void CommandBuffer::updateBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData)
712750
{
713-
UNIMPLEMENTED();
751+
ASSERT(state == RECORDING);
752+
753+
addCommand<UpdateBuffer>(dstBuffer, dstOffset, dataSize, pData);
714754
}
715755

716756
void CommandBuffer::fillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data)
717757
{
718-
UNIMPLEMENTED();
758+
ASSERT(state == RECORDING);
759+
760+
addCommand<FillBuffer>(dstBuffer, dstOffset, size, data);
719761
}
720762

721763
void CommandBuffer::clearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor,

0 commit comments

Comments
 (0)