16 std::shared_ptr<ReactorGLES> reactor,
17 std::shared_ptr<Allocation> backing_store)
19 reactor_(
std::move(reactor)),
20 backing_store_(
std::move(backing_store)) {}
24 if (handle_.has_value() && !handle_->IsDead()) {
25 reactor_->CollectHandle(*handle_);
30 uint8_t* DeviceBufferGLES::OnGetContents()
const {
34 return backing_store_->GetBuffer();
38 bool DeviceBufferGLES::OnCopyHostBuffer(
const uint8_t* source,
45 if (offset + source_range.length >
46 backing_store_->GetLength().GetByteSize()) {
50 std::memmove(backing_store_->GetBuffer() + offset,
51 source + source_range.offset, source_range.length);
52 Flush(Range{offset, source_range.length});
58 if (handle_.has_value()) {
59 return reactor_->GetGLHandle(*handle_);
66 if (!range.has_value()) {
68 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())};
70 if (dirty_range_.has_value()) {
71 dirty_range_ = dirty_range_->Merge(range.value());
73 dirty_range_ = range.value();
81 return GL_ARRAY_BUFFER;
83 return GL_ELEMENT_ARRAY_BUFFER;
85 return GL_UNIFORM_BUFFER;
95 if (!handle_.has_value()) {
98 if (handle_.has_value() && label_.has_value()) {
99 reactor_->SetDebugLabel(*handle_, *label_);
104 auto buffer = reactor_->GetGLHandle(*handle_);
105 if (!buffer.has_value()) {
110 const auto& gl = reactor_->GetProcTable();
112 gl.BindBuffer(target_type, buffer.value());
114 gl.BufferData(target_type, backing_store_->GetLength().GetByteSize(),
115 nullptr, GL_DYNAMIC_DRAW);
119 if (dirty_range_.has_value()) {
120 auto range = dirty_range_.value();
121 gl.BufferSubData(target_type, range.offset, range.length,
122 backing_store_->GetBuffer() + range.offset);
123 dirty_range_ = std::nullopt;
130 bool DeviceBufferGLES::SetLabel(std::string_view label) {
131 #ifdef IMPELLER_DEBUG
133 if (handle_.has_value()) {
134 reactor_->SetDebugLabel(*handle_, label);
141 bool DeviceBufferGLES::SetLabel(std::string_view label, Range range) {
144 return SetLabel(label);
148 return backing_store_->GetBuffer();
152 const std::function<
void(uint8_t*
data,
size_t length)>&
153 update_buffer_data) {
154 if (update_buffer_data) {
155 update_buffer_data(backing_store_->GetBuffer(),
156 backing_store_->GetLength().GetByteSize());
158 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())});
void Flush(std::optional< Range > range=std::nullopt) const override
void UpdateBufferData(const std::function< void(uint8_t *, size_t length)> &update_buffer_data)
DeviceBufferGLES(DeviceBufferDescriptor desc, std::shared_ptr< ReactorGLES > reactor, std::shared_ptr< Allocation > backing_store)
bool BindAndUploadDataIfNecessary(BindingType type) const
~DeviceBufferGLES() override
const uint8_t * GetBufferData() const
std::optional< GLuint > GetHandle() const
static GLenum ToTarget(DeviceBufferGLES::BindingType type)
std::shared_ptr< const fml::Mapping > data