@@ -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+
23582384void lvk::CommandBuffer::cmdDraw (uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t baseInstance) {
23592385 LVK_PROFILER_FUNCTION ();
23602386
0 commit comments