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"
1215namespace impeller {
1316
1417DeviceBufferGLES::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|
2328DeviceBufferGLES::~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|
93101bool 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
0 commit comments