Blender V5.0
vk_streaming_buffer.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
10#include "vk_buffer.hh"
11#include "vk_context.hh"
12
13namespace blender::gpu {
14VKStreamingBuffer::VKStreamingBuffer(VKBuffer &buffer, VkDeviceSize min_offset_alignment)
15 : min_offset_alignment_(min_offset_alignment),
16 vk_buffer_dst_(buffer.vk_handle()),
17 vk_buffer_size_(buffer.size_in_bytes())
18{
19}
20
22{
23 vk_buffer_dst_ = VK_NULL_HANDLE;
24}
25
26VkDeviceSize VKStreamingBuffer::update(VKContext &context, const void *data, size_t data_size)
27{
28 render_graph::VKRenderGraph &render_graph = context.render_graph();
29 const bool allocate_new_buffer = !(host_buffer_.has_value() &&
30 data_size <
31 host_buffer_.value().get()->size_in_bytes() - offset_);
32 if (allocate_new_buffer) {
33 host_buffer_.emplace(std::make_unique<VKBuffer>());
34 VKBuffer &host_buffer = *host_buffer_.value().get();
35 host_buffer.create(vk_buffer_size_,
36 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
37 VMA_MEMORY_USAGE_AUTO,
38 VMA_ALLOCATION_CREATE_MAPPED_BIT |
39 VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
40 0.4f);
41 offset_ = 0;
42
44 host_buffer.vk_handle(), vk_buffer_dst(), {0, 0, 0}};
45 copy_buffer_handle_ = render_graph.add_node(copy_buffer);
46 }
47 VKBuffer &host_buffer = *host_buffer_.value().get();
48
49 VkDeviceSize start_offset = offset_;
50 /* Advance the offset to the next possible offset considering the minimum allowed offset
51 * alignment. */
52 offset_ += data_size;
53 if (min_offset_alignment_ > 1) {
54 offset_ = ceil_to_multiple_ul(offset_, min_offset_alignment_);
55 }
56
57 memcpy(
58 static_cast<void *>(static_cast<uint8_t *>(host_buffer.mapped_memory_get()) + start_offset),
59 data,
60 data_size);
61
62 /* Increace the region size to copy to include the min offset alignment. */
63 render_graph::VKCopyBufferNode::Data &copy_buffer_data = render_graph.get_node_data(
64 copy_buffer_handle_);
65 copy_buffer_data.region.size += offset_ - start_offset;
66 return start_offset;
67}
68
69} // namespace blender::gpu
MINLINE uint64_t ceil_to_multiple_ul(uint64_t a, uint64_t b)
BMesh const char void * data
VkBuffer vk_handle() const
Definition vk_buffer.hh:101
bool create(size_t size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage vma_memory_usage, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
Definition vk_buffer.cc:27
void * mapped_memory_get() const
Definition vk_buffer.hh:134
VKStreamingBuffer(VKBuffer &buffer, VkDeviceSize min_offset_alligment)
VkDeviceSize update(VKContext &context, const void *data, size_t data_size)