17 std::shared_ptr<Allocation> backing_store)
19 reactor_(
std::move(reactor)),
22 backing_store_(
std::move(backing_store)) {}
27 reactor_->CollectHandle(handle_);
32 uint8_t* DeviceBufferGLES::OnGetContents()
const {
36 return backing_store_->GetBuffer();
40 bool DeviceBufferGLES::OnCopyHostBuffer(
const uint8_t* source,
47 if (
offset + source_range.length >
48 backing_store_->GetLength().GetByteSize()) {
52 std::memmove(backing_store_->GetBuffer() +
offset,
53 source + source_range.offset, source_range.length);
60 if (!range.has_value()) {
62 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())};
64 if (dirty_range_.has_value()) {
65 dirty_range_ = dirty_range_->Merge(range.value());
67 dirty_range_ = range.value();
75 return GL_ARRAY_BUFFER;
77 return GL_ELEMENT_ARRAY_BUFFER;
87 auto buffer = reactor_->GetGLHandle(handle_);
88 if (!buffer.has_value()) {
93 const auto& gl = reactor_->GetProcTable();
95 gl.BindBuffer(target_type, buffer.value());
97 gl.BufferData(target_type, backing_store_->GetLength().GetByteSize(),
98 nullptr, GL_DYNAMIC_DRAW);
102 if (dirty_range_.has_value()) {
103 auto range = dirty_range_.value();
104 gl.BufferSubData(target_type, range.offset, range.length,
105 backing_store_->GetBuffer() + range.offset);
106 dirty_range_ = std::nullopt;
113 bool DeviceBufferGLES::SetLabel(
const std::string& label) {
114 reactor_->SetDebugLabel(handle_, label);
119 bool DeviceBufferGLES::SetLabel(
const std::string& label, Range range) {
122 return SetLabel(label);
126 return backing_store_->GetBuffer();
130 const std::function<
void(uint8_t*
data,
size_t length)>&
131 update_buffer_data) {
132 if (update_buffer_data) {
133 update_buffer_data(backing_store_->GetBuffer(),
134 backing_store_->GetLength().GetByteSize());
136 0,
static_cast<size_t>(backing_store_->GetLength().GetByteSize())});