Skip to content

Commit aef7995

Browse files
Implemented ICommandBuffer::cmdUpdateBuffer()
1 parent cc0e612 commit aef7995

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

lvk/LVK.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,12 @@ class ICommandBuffer {
905905
this->cmdPushConstants(&data, sizeof(Struct), offset);
906906
}
907907

908+
virtual void cmdUpdateBuffer(BufferHandle buffer, size_t bufferOffset, size_t size, const void* data) = 0;
909+
template<typename Struct>
910+
void cmdUpdateBuffer(BufferHandle buffer, const Struct& data, size_t bufferOffset = 0) {
911+
this->cmdUpdateBuffer(buffer, bufferOffset, sizeof(Struct), &data);
912+
}
913+
908914
virtual void cmdDraw(uint32_t vertexCount, uint32_t instanceCount = 1, uint32_t firstVertex = 0, uint32_t baseInstance = 0) = 0;
909915
virtual void cmdDrawIndexed(uint32_t indexCount,
910916
uint32_t instanceCount = 1,

lvk/vulkan/VulkanClasses.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,6 +2355,32 @@ void lvk::CommandBuffer::cmdPushConstants(const void* data, size_t size, size_t
23552355
vkCmdPushConstants(wrapper_->cmdBuf_, layout, shaderStageFlags, (uint32_t)offset, (uint32_t)size, data);
23562356
}
23572357

2358+
void lvk::CommandBuffer::cmdUpdateBuffer(BufferHandle buffer, size_t bufferOffset, size_t size, const void* data) {
2359+
LVK_PROFILER_FUNCTION();
2360+
LVK_ASSERT(buffer.valid());
2361+
LVK_ASSERT(data);
2362+
LVK_ASSERT(size && size <= 65536);
2363+
LVK_ASSERT(size % 4 == 0);
2364+
LVK_ASSERT(bufferOffset % 4 == 0);
2365+
2366+
lvk::VulkanBuffer* buf = ctx_->buffersPool_.get(buffer);
2367+
2368+
bufferBarrier(buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
2369+
2370+
vkCmdUpdateBuffer(wrapper_->cmdBuf_, buf->vkBuffer_, bufferOffset, size, data);
2371+
2372+
VkPipelineStageFlags dstStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
2373+
2374+
if (buf->vkUsageFlags_ & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
2375+
dstStage |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
2376+
}
2377+
if (buf->vkUsageFlags_ & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
2378+
dstStage |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
2379+
}
2380+
2381+
bufferBarrier(buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, dstStage);
2382+
}
2383+
23582384
void lvk::CommandBuffer::cmdDraw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) {
23592385
LVK_PROFILER_FUNCTION();
23602386

lvk/vulkan/VulkanClasses.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ class CommandBuffer final : public ICommandBuffer {
356356
void cmdBindIndexBuffer(BufferHandle indexBuffer, IndexFormat indexFormat, uint64_t indexBufferOffset) override;
357357
void cmdPushConstants(const void* data, size_t size, size_t offset) override;
358358

359+
void cmdUpdateBuffer(BufferHandle buffer, size_t bufferOffset, size_t size, const void* data) override;
360+
359361
void cmdDraw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) override;
360362
void cmdDrawIndexed(uint32_t indexCount,
361363
uint32_t instanceCount,

0 commit comments

Comments
 (0)