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

Commit 80cfd35

Browse files
author
Jonah Williams
authored
[Impeller] remove Buffer type and associated abstractions. (#49702)
Now that the HostBuffer isn't implementing Buffer, there is really no reason to have a Buffer/DeviceBuffer split. make BufferViews use a DeviceBuffer, and remove the data ptr from buffer views (as we can always reach into the device buffer). Makes some other cleanups too, since we always use a std::shared_ptr<DeviceBuffer>, then we can eliminated the shared_from_this call for AsBufferView by making this a static method.
1 parent d437533 commit 80cfd35

32 files changed

+199
-262
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5050,8 +5050,6 @@ ORIGIN: ../../../flutter/impeller/compiler/utilities.cc + ../../../flutter/LICEN
50505050
ORIGIN: ../../../flutter/impeller/compiler/utilities.h + ../../../flutter/LICENSE
50515051
ORIGIN: ../../../flutter/impeller/core/allocator.cc + ../../../flutter/LICENSE
50525052
ORIGIN: ../../../flutter/impeller/core/allocator.h + ../../../flutter/LICENSE
5053-
ORIGIN: ../../../flutter/impeller/core/buffer.cc + ../../../flutter/LICENSE
5054-
ORIGIN: ../../../flutter/impeller/core/buffer.h + ../../../flutter/LICENSE
50555053
ORIGIN: ../../../flutter/impeller/core/buffer_view.cc + ../../../flutter/LICENSE
50565054
ORIGIN: ../../../flutter/impeller/core/buffer_view.h + ../../../flutter/LICENSE
50575055
ORIGIN: ../../../flutter/impeller/core/capture.cc + ../../../flutter/LICENSE
@@ -7877,8 +7875,6 @@ FILE: ../../../flutter/impeller/compiler/utilities.cc
78777875
FILE: ../../../flutter/impeller/compiler/utilities.h
78787876
FILE: ../../../flutter/impeller/core/allocator.cc
78797877
FILE: ../../../flutter/impeller/core/allocator.h
7880-
FILE: ../../../flutter/impeller/core/buffer.cc
7881-
FILE: ../../../flutter/impeller/core/buffer.h
78827878
FILE: ../../../flutter/impeller/core/buffer_view.cc
78837879
FILE: ../../../flutter/impeller/core/buffer_view.h
78847880
FILE: ../../../flutter/impeller/core/capture.cc

impeller/base/backend_cast.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#ifndef FLUTTER_IMPELLER_BASE_BACKEND_CAST_H_
66
#define FLUTTER_IMPELLER_BASE_BACKEND_CAST_H_
77

8-
#include "flutter/fml/macros.h"
9-
108
namespace impeller {
119

1210
template <class Sub, class Base>

impeller/core/BUILD.gn

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ impeller_component("core") {
88
sources = [
99
"allocator.cc",
1010
"allocator.h",
11-
"buffer.cc",
12-
"buffer.h",
1311
"buffer_view.cc",
1412
"buffer_view.h",
1513
"capture.cc",

impeller/core/buffer.cc

Lines changed: 0 additions & 11 deletions
This file was deleted.

impeller/core/buffer.h

Lines changed: 0 additions & 24 deletions
This file was deleted.

impeller/core/buffer_view.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
#ifndef FLUTTER_IMPELLER_CORE_BUFFER_VIEW_H_
66
#define FLUTTER_IMPELLER_CORE_BUFFER_VIEW_H_
77

8-
#include "impeller/core/buffer.h"
8+
#include <memory>
99
#include "impeller/core/range.h"
1010

1111
namespace impeller {
1212

13+
class DeviceBuffer;
14+
1315
struct BufferView {
14-
std::shared_ptr<const Buffer> buffer;
15-
uint8_t* contents;
16+
std::shared_ptr<const DeviceBuffer> buffer;
1617
Range range;
1718

1819
constexpr explicit operator bool() const { return static_cast<bool>(buffer); }

impeller/core/device_buffer.cc

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,13 @@ DeviceBuffer::DeviceBuffer(DeviceBufferDescriptor desc) : desc_(desc) {}
1010

1111
DeviceBuffer::~DeviceBuffer() = default;
1212

13-
// |Buffer|
14-
std::shared_ptr<const DeviceBuffer> DeviceBuffer::GetDeviceBuffer() const {
15-
return shared_from_this();
16-
}
17-
1813
void DeviceBuffer::Flush(std::optional<Range> range) const {}
1914

20-
BufferView DeviceBuffer::AsBufferView() const {
15+
// static
16+
BufferView DeviceBuffer::AsBufferView(std::shared_ptr<DeviceBuffer> buffer) {
2117
BufferView view;
22-
view.buffer = shared_from_this();
23-
view.contents = OnGetContents();
24-
view.range = {0u, desc_.size};
18+
view.buffer = std::move(buffer);
19+
view.range = {0u, view.buffer->desc_.size};
2520
return view;
2621
}
2722

impeller/core/device_buffer.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@
99
#include <string>
1010

1111
#include "impeller/core/allocator.h"
12-
#include "impeller/core/buffer.h"
1312
#include "impeller/core/buffer_view.h"
1413
#include "impeller/core/device_buffer_descriptor.h"
1514
#include "impeller/core/range.h"
1615
#include "impeller/core/texture.h"
1716

1817
namespace impeller {
1918

20-
class DeviceBuffer : public Buffer,
21-
public std::enable_shared_from_this<DeviceBuffer> {
19+
class DeviceBuffer {
2220
public:
2321
virtual ~DeviceBuffer();
2422

@@ -30,16 +28,14 @@ class DeviceBuffer : public Buffer,
3028

3129
virtual bool SetLabel(const std::string& label, Range range) = 0;
3230

33-
BufferView AsBufferView() const;
31+
/// @brief Create a buffer view of this entire buffer.
32+
static BufferView AsBufferView(std::shared_ptr<DeviceBuffer> buffer);
3433

3534
virtual std::shared_ptr<Texture> AsTexture(
3635
Allocator& allocator,
3736
const TextureDescriptor& descriptor,
3837
uint16_t row_bytes) const;
3938

40-
// |Buffer|
41-
std::shared_ptr<const DeviceBuffer> GetDeviceBuffer() const;
42-
4339
const DeviceBufferDescriptor& GetDeviceBufferDescriptor() const;
4440

4541
virtual uint8_t* OnGetContents() const = 0;

impeller/core/host_buffer.cc

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,29 @@ void HostBuffer::SetLabel(std::string label) {
4141
BufferView HostBuffer::Emplace(const void* buffer,
4242
size_t length,
4343
size_t align) {
44-
auto [data, range, device_buffer] = EmplaceInternal(buffer, length, align);
44+
auto [range, device_buffer] = EmplaceInternal(buffer, length, align);
4545
if (!device_buffer) {
4646
return {};
4747
}
48-
return BufferView{std::move(device_buffer), data, range};
48+
return BufferView{std::move(device_buffer), range};
4949
}
5050

5151
BufferView HostBuffer::Emplace(const void* buffer, size_t length) {
52-
auto [data, range, device_buffer] = EmplaceInternal(buffer, length);
52+
auto [range, device_buffer] = EmplaceInternal(buffer, length);
5353
if (!device_buffer) {
5454
return {};
5555
}
56-
return BufferView{std::move(device_buffer), data, range};
56+
return BufferView{std::move(device_buffer), range};
5757
}
5858

5959
BufferView HostBuffer::Emplace(size_t length,
6060
size_t align,
6161
const EmplaceProc& cb) {
62-
auto [data, range, device_buffer] = EmplaceInternal(length, align, cb);
62+
auto [range, device_buffer] = EmplaceInternal(length, align, cb);
6363
if (!device_buffer) {
6464
return {};
6565
}
66-
return BufferView{std::move(device_buffer), data, range};
66+
return BufferView{std::move(device_buffer), range};
6767
}
6868

6969
HostBuffer::TestStateQuery HostBuffer::GetStateForTest() {
@@ -74,10 +74,9 @@ HostBuffer::TestStateQuery HostBuffer::GetStateForTest() {
7474
};
7575
}
7676

77-
void HostBuffer::MaybeCreateNewBuffer(size_t required_size) {
77+
void HostBuffer::MaybeCreateNewBuffer() {
7878
current_buffer_++;
7979
if (current_buffer_ >= device_buffers_[frame_index_].size()) {
80-
FML_DCHECK(required_size <= kAllocatorBlockSize);
8180
DeviceBufferDescriptor desc;
8281
desc.size = kAllocatorBlockSize;
8382
desc.storage_mode = StorageMode::kHostVisible;
@@ -86,10 +85,10 @@ void HostBuffer::MaybeCreateNewBuffer(size_t required_size) {
8685
offset_ = 0;
8786
}
8887

89-
std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
90-
HostBuffer::EmplaceInternal(size_t length,
91-
size_t align,
92-
const EmplaceProc& cb) {
88+
std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(
89+
size_t length,
90+
size_t align,
91+
const EmplaceProc& cb) {
9392
if (!cb) {
9493
return {};
9594
}
@@ -108,28 +107,27 @@ HostBuffer::EmplaceInternal(size_t length,
108107
cb(device_buffer->OnGetContents());
109108
device_buffer->Flush(Range{0, length});
110109
}
111-
return std::make_tuple(device_buffer->OnGetContents(), Range{0, length},
112-
device_buffer);
110+
return std::make_tuple(Range{0, length}, device_buffer);
113111
}
114112

115113
auto old_length = GetLength();
116114
if (old_length + length > kAllocatorBlockSize) {
117-
MaybeCreateNewBuffer(length);
115+
MaybeCreateNewBuffer();
118116
}
119117
old_length = GetLength();
120118

121119
auto current_buffer = GetCurrentBuffer();
122-
cb(current_buffer->OnGetContents() + old_length);
120+
auto contents = current_buffer->OnGetContents();
121+
cb(contents + old_length);
123122
current_buffer->Flush(Range{old_length, length});
124123

125124
offset_ += length;
126-
auto contents = current_buffer->OnGetContents();
127-
return std::make_tuple(contents, Range{old_length, length},
128-
std::move(current_buffer));
125+
return std::make_tuple(Range{old_length, length}, std::move(current_buffer));
129126
}
130127

131-
std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
132-
HostBuffer::EmplaceInternal(const void* buffer, size_t length) {
128+
std::tuple<Range, std::shared_ptr<DeviceBuffer>> HostBuffer::EmplaceInternal(
129+
const void* buffer,
130+
size_t length) {
133131
// If the requested allocation is bigger than the block size, create a one-off
134132
// device buffer and write to that.
135133
if (length > kAllocatorBlockSize) {
@@ -146,38 +144,37 @@ HostBuffer::EmplaceInternal(const void* buffer, size_t length) {
146144
return {};
147145
}
148146
}
149-
return std::make_tuple(device_buffer->OnGetContents(), Range{0, length},
150-
device_buffer);
147+
return std::make_tuple(Range{0, length}, device_buffer);
151148
}
152149

153150
auto old_length = GetLength();
154151
if (old_length + length > kAllocatorBlockSize) {
155-
MaybeCreateNewBuffer(length);
152+
MaybeCreateNewBuffer();
156153
}
157154
old_length = GetLength();
158155

159156
auto current_buffer = GetCurrentBuffer();
157+
auto contents = current_buffer->OnGetContents();
160158
if (buffer) {
161-
::memmove(current_buffer->OnGetContents() + old_length, buffer, length);
159+
::memmove(contents + old_length, buffer, length);
162160
current_buffer->Flush(Range{old_length, length});
163161
}
164162
offset_ += length;
165-
auto contents = current_buffer->OnGetContents();
166-
return std::make_tuple(contents, Range{old_length, length},
167-
std::move(current_buffer));
163+
return std::make_tuple(Range{old_length, length}, std::move(current_buffer));
168164
}
169165

170-
std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
166+
std::tuple<Range, std::shared_ptr<DeviceBuffer>>
171167
HostBuffer::EmplaceInternal(const void* buffer, size_t length, size_t align) {
172168
if (align == 0 || (GetLength() % align) == 0) {
173169
return EmplaceInternal(buffer, length);
174170
}
175171

176172
{
177-
auto [buffer, range, device_buffer] =
178-
EmplaceInternal(nullptr, align - (GetLength() % align));
179-
if (!buffer) {
180-
return {};
173+
auto padding = align - (GetLength() % align);
174+
if (offset_ + padding < kAllocatorBlockSize) {
175+
offset_ += padding;
176+
} else {
177+
MaybeCreateNewBuffer();
181178
}
182179
}
183180

impeller/core/host_buffer.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <string>
1313
#include <type_traits>
1414

15-
#include "impeller/core/buffer.h"
15+
#include "impeller/core/allocator.h"
1616
#include "impeller/core/buffer_view.h"
1717
#include "impeller/core/platform.h"
1818

@@ -134,18 +134,18 @@ class HostBuffer {
134134
TestStateQuery GetStateForTest();
135135

136136
private:
137-
[[nodiscard]] std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
137+
[[nodiscard]] std::tuple<Range, std::shared_ptr<DeviceBuffer>>
138138
EmplaceInternal(const void* buffer, size_t length);
139139

140-
std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
140+
std::tuple<Range, std::shared_ptr<DeviceBuffer>>
141141
EmplaceInternal(size_t length, size_t align, const EmplaceProc& cb);
142142

143-
std::tuple<uint8_t*, Range, std::shared_ptr<DeviceBuffer>>
143+
std::tuple<Range, std::shared_ptr<DeviceBuffer>>
144144
EmplaceInternal(const void* buffer, size_t length, size_t align);
145145

146146
size_t GetLength() const { return offset_; }
147147

148-
void MaybeCreateNewBuffer(size_t required_size);
148+
void MaybeCreateNewBuffer();
149149

150150
std::shared_ptr<DeviceBuffer>& GetCurrentBuffer() {
151151
return device_buffers_[frame_index_][current_buffer_];

0 commit comments

Comments
 (0)