mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[Impeller] Apply padding for alignment when doing HostBuffer::Emplace with a callback (flutter/engine#51221)
This commit is contained in:
parent
1b1eaf37d5
commit
a72fddf954
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user