[Impeller] Apply padding for alignment when doing HostBuffer::Emplace with a callback (flutter/engine#51221)

This commit is contained in:
Jason Simmons 2024-03-06 10:58:46 -08:00 committed by GitHub
parent 1b1eaf37d5
commit a72fddf954
2 changed files with 22 additions and 7 deletions

View File

@ -110,19 +110,24 @@ std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(
return std::make_tuple(Range{0, length}, device_buffer);
}
auto old_length = GetLength();
if (old_length + length > kAllocatorBlockSize) {
MaybeCreateNewBuffer();
size_t padding = 0;
if (align > 0 && offset_ % align) {
padding = align - (offset_ % align);
}
if (offset_ + padding + length > kAllocatorBlockSize) {
MaybeCreateNewBuffer();
} else {
offset_ += padding;
}
old_length = GetLength();
auto current_buffer = GetCurrentBuffer();
auto contents = current_buffer->OnGetContents();
cb(contents + old_length);
current_buffer->Flush(Range{old_length, length});
cb(contents + offset_);
Range output_range(offset_, length);
current_buffer->Flush(output_range);
offset_ += length;
return std::make_tuple(Range{old_length, length}, std::move(current_buffer));
return std::make_tuple(output_range, std::move(current_buffer));
}
std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(

View File

@ -146,5 +146,15 @@ TEST_P(HostBufferTest, UnusedBuffersAreDiscardedWhenResetting) {
EXPECT_EQ(buffer->GetStateForTest().current_frame, 0u);
}
TEST_P(HostBufferTest, EmplaceWithProcIsAligned) {
auto buffer = HostBuffer::Create(GetContext()->GetResourceAllocator());
BufferView view = buffer->Emplace(std::array<char, 21>());
EXPECT_EQ(view.range, Range(0, 21));
view = buffer->Emplace(64, 16, [](uint8_t*) {});
EXPECT_EQ(view.range, Range(32, 64));
}
} // namespace testing
} // namespace impeller