16 std::shared_ptr<ReactorGLES>
reactor,
17 std::unique_ptr<Allocation> backing_store)
20 backing_store_(
std::move(backing_store)) {}
24 if (handle_.has_value() && !handle_->IsDead()) {
25 reactor_->CollectHandle(*handle_);
30uint8_t* DeviceBufferGLES::OnGetContents()
const {
34 return backing_store_->GetBuffer();
38bool 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 Lock lock(dirty_range_mutex_);
67 if (!range.has_value()) {
69 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())};
71 if (dirty_range_.has_value()) {
72 dirty_range_ = dirty_range_->
Merge(range.value());
74 dirty_range_ = range.value();
82 return GL_ARRAY_BUFFER;
84 return GL_ELEMENT_ARRAY_BUFFER;
86 return GL_UNIFORM_BUFFER;
96 if (!handle_.has_value()) {
99 if (handle_.has_value() && label_.has_value()) {
100 reactor_->SetDebugLabel(*handle_, *label_);
105 auto buffer = reactor_->GetGLHandle(*handle_);
106 if (!buffer.has_value()) {
111 const auto& gl = reactor_->GetProcTable();
113 gl.BindBuffer(target_type, buffer.value());
115 gl.BufferData(target_type, backing_store_->GetLength().GetByteSize(),
116 nullptr, GL_DYNAMIC_DRAW);
124 std::optional<Range> dirty;
126 Lock lock(dirty_range_mutex_);
127 std::swap(dirty_range_, dirty);
129 if (dirty.has_value()) {
130 gl.BufferSubData(target_type, dirty->offset, dirty->length,
131 backing_store_->GetBuffer() + dirty->offset);
138bool DeviceBufferGLES::SetLabel(std::string_view label) {
141 if (handle_.has_value()) {
142 reactor_->SetDebugLabel(*handle_, label);
149bool DeviceBufferGLES::SetLabel(std::string_view label, Range range) {
152 return SetLabel(label);
156 return backing_store_->GetBuffer();
160 const std::function<
void(uint8_t* data,
size_t length)>&
161 update_buffer_data) {
162 if (update_buffer_data) {
163 update_buffer_data(backing_store_->GetBuffer(),
164 backing_store_->GetLength().GetByteSize());
166 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())});
void Flush(std::optional< Range > range=std::nullopt) const override
DeviceBufferGLES(DeviceBufferDescriptor desc, std::shared_ptr< ReactorGLES > reactor, std::unique_ptr< Allocation > backing_store)
void UpdateBufferData(const std::function< void(uint8_t *, size_t length)> &update_buffer_data)
bool BindAndUploadDataIfNecessary(BindingType type) const
~DeviceBufferGLES() override
const uint8_t * GetBufferData() const
std::optional< GLuint > GetHandle() const
#define FML_UNREACHABLE()
static GLenum ToTarget(DeviceBufferGLES::BindingType type)
std::shared_ptr< ReactorGLES > reactor
impeller::ShaderType type
constexpr Range Merge(const Range &other)
Create a new range that is a union of this range and other.