10 #include "flutter/fml/logging.h"
19 return std::shared_ptr<HostBuffer>(
new HostBuffer());
22 HostBuffer::HostBuffer() =
default;
27 state_->label = std::move(label);
33 auto [device_buffer, range] = state_->Emplace(buffer, length, align);
37 return BufferView{state_, device_buffer, range};
41 auto [device_buffer, range] = state_->Emplace(buffer, length);
45 return BufferView{state_, device_buffer, range};
51 auto [buffer, range] = state_->Emplace(length, align, cb);
58 std::shared_ptr<const DeviceBuffer> HostBuffer::GetDeviceBuffer(
60 return state_->GetDeviceBuffer(allocator);
68 return state_->GetReservedLength();
72 return state_->GetLength();
75 std::pair<uint8_t*, Range> HostBuffer::HostBufferState::Emplace(
78 const EmplaceProc& cb) {
82 auto old_length = GetLength();
83 if (!Truncate(old_length + length)) {
87 cb(GetBuffer() + old_length);
89 return std::make_pair(GetBuffer(), Range{old_length, length});
92 std::shared_ptr<const DeviceBuffer>
93 HostBuffer::HostBufferState::GetDeviceBuffer(Allocator& allocator)
const {
94 if (generation == device_buffer_generation) {
97 auto new_buffer = allocator.CreateBufferWithCopy(GetBuffer(), GetLength());
101 new_buffer->SetLabel(label);
102 device_buffer_generation = generation;
103 device_buffer = std::move(new_buffer);
104 return device_buffer;
107 std::pair<uint8_t*, Range> HostBuffer::HostBufferState::Emplace(
110 auto old_length = GetLength();
111 if (!Truncate(old_length + length)) {
116 ::memmove(GetBuffer() + old_length, buffer, length);
118 return std::make_pair(GetBuffer(), Range{old_length, length});
121 std::pair<uint8_t*, Range> HostBuffer::HostBufferState::Emplace(
125 if (align == 0 || (GetLength() % align) == 0) {
126 return Emplace(buffer, length);
130 auto [buffer, range] = Emplace(
nullptr, align - (GetLength() % align));
136 return Emplace(buffer, length);
139 void HostBuffer::HostBufferState::Reset() {
141 device_buffer =
nullptr;
142 bool did_truncate = Truncate(0);
143 FML_CHECK(did_truncate);