28 static std::shared_ptr<HostBuffer>
Create(
29 const std::shared_ptr<Allocator>& allocator,
30 const std::shared_ptr<const IdleWaiter>& idle_waiter,
31 size_t minimum_uniform_alignment);
45 template <
class UniformType,
46 class = std::enable_if_t<std::is_standard_layout_v<UniformType>>>
48 const auto alignment =
50 return Emplace(
reinterpret_cast<const void*
>(&uniform),
67 class StorageBufferType,
68 class = std::enable_if_t<std::is_standard_layout_v<StorageBufferType>>>
70 const StorageBufferType& buffer) {
71 const auto alignment =
74 sizeof(StorageBufferType),
90 template <
class BufferType,
91 class = std::enable_if_t<std::is_standard_layout_v<BufferType>>>
93 size_t alignment = 0) {
94 return Emplace(
reinterpret_cast<const void*
>(&buffer),
96 std::max(alignment,
alignof(BufferType))
139 [[nodiscard]] std::tuple<Range, std::shared_ptr<DeviceBuffer>,
DeviceBuffer*>
140 EmplaceInternal(
const void* buffer,
size_t length);
142 std::tuple<Range, std::shared_ptr<DeviceBuffer>,
DeviceBuffer*>
145 std::tuple<Range, std::shared_ptr<DeviceBuffer>,
DeviceBuffer*>
146 EmplaceInternal(
const void* buffer,
size_t length,
size_t align);
148 size_t GetLength()
const {
return offset_; }
154 [[nodiscard]]
bool MaybeCreateNewBuffer();
156 const std::shared_ptr<DeviceBuffer>& GetCurrentBuffer()
const;
160 explicit HostBuffer(
const std::shared_ptr<Allocator>& allocator,
161 const std::shared_ptr<const IdleWaiter>& idle_waiter,
162 size_t minimum_uniform_alignment);
168 std::shared_ptr<Allocator> allocator_;
169 std::shared_ptr<const IdleWaiter> idle_waiter_;
172 size_t current_buffer_ = 0u;
174 size_t frame_index_ = 0u;
175 size_t minimum_uniform_alignment_ = 0u;