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

Commit 7442ecf

Browse files
authored
[Impeller] Don't discard GLES buffer for each copy; respect destination offset (#33545)
1 parent 1c55450 commit 7442ecf

File tree

4 files changed

+45
-22
lines changed

4 files changed

+45
-22
lines changed

impeller/renderer/backend/gles/allocator_gles.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
#include "impeller/renderer/backend/gles/allocator_gles.h"
66

7+
#include <memory>
8+
9+
#include "impeller/base/allocation.h"
710
#include "impeller/base/config.h"
811
#include "impeller/renderer/backend/gles/device_buffer_gles.h"
912
#include "impeller/renderer/backend/gles/texture_gles.h"
@@ -24,7 +27,12 @@ bool AllocatorGLES::IsValid() const {
2427
// |Allocator|
2528
std::shared_ptr<DeviceBuffer> AllocatorGLES::CreateBuffer(StorageMode mode,
2629
size_t length) {
27-
return std::make_shared<DeviceBufferGLES>(reactor_, length, mode);
30+
auto backing_store = std::make_shared<Allocation>();
31+
if (!backing_store->Truncate(length)) {
32+
return nullptr;
33+
}
34+
return std::make_shared<DeviceBufferGLES>(reactor_, std::move(backing_store),
35+
length, mode);
2836
}
2937

3038
// |Allocator|

impeller/renderer/backend/gles/buffer_bindings_gles.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ bool BufferBindingsGLES::BindUniformBuffer(const ProcTableGLES& gl,
192192
return false;
193193
}
194194
const auto& device_buffer_gles = DeviceBufferGLES::Cast(*device_buffer);
195-
const uint8_t* buffer_ptr = device_buffer_gles.GetBufferData()->GetMapping() +
196-
buffer.resource.range.offset;
195+
const uint8_t* buffer_ptr =
196+
device_buffer_gles.GetBufferData() + buffer.resource.range.offset;
197197

198198
if (metadata->members.empty()) {
199199
VALIDATION_LOG << "Uniform buffer had no members. This is currently "

impeller/renderer/backend/gles/device_buffer_gles.cc

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
#include "impeller/renderer/backend/gles/device_buffer_gles.h"
66

7+
#include <cstring>
8+
#include <memory>
9+
710
#include "flutter/fml/trace_event.h"
811
#include "impeller/base/allocation.h"
912
#include "impeller/base/config.h"
@@ -12,12 +15,14 @@
1215
namespace impeller {
1316

1417
DeviceBufferGLES::DeviceBufferGLES(ReactorGLES::Ref reactor,
18+
std::shared_ptr<Allocation> backing_store,
1519
size_t size,
1620
StorageMode mode)
1721
: DeviceBuffer(size, mode),
1822
reactor_(std::move(reactor)),
1923
handle_(reactor_ ? reactor_->CreateHandle(HandleType::kBuffer)
20-
: HandleGLES::DeadHandle()) {}
24+
: HandleGLES::DeadHandle()),
25+
backing_store_(std::move(backing_store)) {}
2126

2227
// |DeviceBuffer|
2328
DeviceBufferGLES::~DeviceBufferGLES() {
@@ -35,21 +40,23 @@ bool DeviceBufferGLES::CopyHostBuffer(const uint8_t* source,
3540
return false;
3641
}
3742

38-
if (offset + source_range.length > size_) {
39-
// Out of bounds of this buffer.
43+
if (!reactor_) {
4044
return false;
4145
}
4246

43-
if (!reactor_) {
47+
if (offset + source_range.length > size_) {
48+
// Out of bounds of this buffer.
4449
return false;
4550
}
4651

47-
auto mapping =
48-
CreateMappingWithCopy(source + source_range.offset, source_range.length);
49-
if (!mapping) {
52+
if (offset + source_range.length > backing_store_->GetLength()) {
5053
return false;
5154
}
52-
data_ = std::move(mapping);
55+
56+
std::memmove(backing_store_->GetBuffer() + offset,
57+
source + source_range.offset, source_range.length);
58+
++generation_;
59+
5360
return true;
5461
}
5562

@@ -78,11 +85,12 @@ bool DeviceBufferGLES::BindAndUploadDataIfNecessary(BindingType type) const {
7885

7986
gl.BindBuffer(target_type, buffer.value());
8087

81-
if (!uploaded_) {
88+
if (upload_generation_ != generation_) {
8289
TRACE_EVENT0("impeller", "BufferData");
83-
gl.BufferData(target_type, data_->GetSize(), data_->GetMapping(),
84-
GL_STATIC_DRAW);
85-
uploaded_ = true;
90+
gl.BufferData(target_type, backing_store_->GetLength(),
91+
backing_store_->GetBuffer(), GL_STATIC_DRAW);
92+
upload_generation_ = generation_;
93+
8694
reactor_->SetDebugLabel(handle_, label_);
8795
}
8896

@@ -92,7 +100,7 @@ bool DeviceBufferGLES::BindAndUploadDataIfNecessary(BindingType type) const {
92100
// |DeviceBuffer|
93101
bool DeviceBufferGLES::SetLabel(const std::string& label) {
94102
label_ = label;
95-
if (uploaded_) {
103+
if (upload_generation_ > 0) {
96104
reactor_->SetDebugLabel(handle_, label_);
97105
}
98106
return true;
@@ -105,7 +113,7 @@ bool DeviceBufferGLES::SetLabel(const std::string& label, Range range) {
105113
return SetLabel(label);
106114
}
107115

108-
std::shared_ptr<fml::Mapping> DeviceBufferGLES::GetBufferData() const {
109-
return data_;
116+
const uint8_t* DeviceBufferGLES::GetBufferData() const {
117+
return backing_store_->GetBuffer();
110118
}
111119
} // namespace impeller

impeller/renderer/backend/gles/device_buffer_gles.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
#pragma once
66

7+
#include <memory>
8+
79
#include "flutter/fml/macros.h"
10+
#include "impeller/base/allocation.h"
811
#include "impeller/base/backend_cast.h"
912
#include "impeller/renderer/backend/gles/reactor_gles.h"
1013
#include "impeller/renderer/device_buffer.h"
@@ -15,12 +18,15 @@ class DeviceBufferGLES final
1518
: public DeviceBuffer,
1619
public BackendCast<DeviceBufferGLES, DeviceBuffer> {
1720
public:
18-
DeviceBufferGLES(ReactorGLES::Ref reactor, size_t size, StorageMode mode);
21+
DeviceBufferGLES(ReactorGLES::Ref reactor,
22+
std::shared_ptr<Allocation> buffer,
23+
size_t size,
24+
StorageMode mode);
1925

2026
// |DeviceBuffer|
2127
~DeviceBufferGLES() override;
2228

23-
std::shared_ptr<fml::Mapping> GetBufferData() const;
29+
const uint8_t* GetBufferData() const;
2430

2531
enum class BindingType {
2632
kArrayBuffer,
@@ -33,8 +39,9 @@ class DeviceBufferGLES final
3339
ReactorGLES::Ref reactor_;
3440
HandleGLES handle_;
3541
std::string label_;
36-
mutable std::shared_ptr<fml::Mapping> data_;
37-
mutable bool uploaded_ = false;
42+
mutable std::shared_ptr<Allocation> backing_store_;
43+
mutable uint32_t generation_ = 0;
44+
mutable uint32_t upload_generation_ = 0;
3845

3946
// |DeviceBuffer|
4047
bool CopyHostBuffer(const uint8_t* source,

0 commit comments

Comments
 (0)