Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 5945dad

Browse files
[Impeller] Apply padding for alignment when doing HostBuffer::Emplace with a callback (#51221)
1 parent 792bfc7 commit 5945dad

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

impeller/core/host_buffer.cc

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,24 @@ std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(
110110
return std::make_tuple(Range{0, length}, device_buffer);
111111
}
112112

113-
auto old_length = GetLength();
114-
if (old_length + length > kAllocatorBlockSize) {
113+
size_t padding = 0;
114+
if (align > 0 && offset_ % align) {
115+
padding = align - (offset_ % align);
116+
}
117+
if (offset_ + padding + length > kAllocatorBlockSize) {
115118
MaybeCreateNewBuffer();
119+
} else {
120+
offset_ += padding;
116121
}
117-
old_length = GetLength();
118122

119123
auto current_buffer = GetCurrentBuffer();
120124
auto contents = current_buffer->OnGetContents();
121-
cb(contents + old_length);
122-
current_buffer->Flush(Range{old_length, length});
125+
cb(contents + offset_);
126+
Range output_range(offset_, length);
127+
current_buffer->Flush(output_range);
123128

124129
offset_ += length;
125-
return std::make_tuple(Range{old_length, length}, std::move(current_buffer));
130+
return std::make_tuple(output_range, std::move(current_buffer));
126131
}
127132

128133
std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(

impeller/entity/contents/host_buffer_unittests.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,5 +146,15 @@ TEST_P(HostBufferTest, UnusedBuffersAreDiscardedWhenResetting) {
146146
EXPECT_EQ(buffer->GetStateForTest().current_frame, 0u);
147147
}
148148

149+
TEST_P(HostBufferTest, EmplaceWithProcIsAligned) {
150+
auto buffer = HostBuffer::Create(GetContext()->GetResourceAllocator());
151+
152+
BufferView view = buffer->Emplace(std::array<char, 21>());
153+
EXPECT_EQ(view.range, Range(0, 21));
154+
155+
view = buffer->Emplace(64, 16, [](uint8_t*) {});
156+
EXPECT_EQ(view.range, Range(32, 64));
157+
}
158+
149159
} // namespace testing
150160
} // namespace impeller

0 commit comments

Comments
 (0)