From b33d57009ab1a8264b6f8844d89bffc2fb6c4351 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 5 Mar 2024 17:34:06 -0800 Subject: [PATCH] [Impeller] Apply padding for alignment when doing HostBuffer::Emplace with a callback --- impeller/core/host_buffer.cc | 17 +++++++++++------ .../entity/contents/host_buffer_unittests.cc | 10 ++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/impeller/core/host_buffer.cc b/impeller/core/host_buffer.cc index 0752818256076..67d3ca260af80 100644 --- a/impeller/core/host_buffer.cc +++ b/impeller/core/host_buffer.cc @@ -110,19 +110,24 @@ std::tuple> HostBuffer::EmplaceInternal( return std::make_tuple(Range{0, length}, device_buffer); } - auto old_length = GetLength(); - if (old_length + length > kAllocatorBlockSize) { + 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> HostBuffer::EmplaceInternal( diff --git a/impeller/entity/contents/host_buffer_unittests.cc b/impeller/entity/contents/host_buffer_unittests.cc index 3ae3c285e07c0..28ac62dccea72 100644 --- a/impeller/entity/contents/host_buffer_unittests.cc +++ b/impeller/entity/contents/host_buffer_unittests.cc @@ -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()); + 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