Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
device_buffer_gles.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <cstring>
8#include <memory>
9
10#include "flutter/fml/trace_event.h"
14
15namespace impeller {
16
18 ReactorGLES::Ref reactor,
19 std::shared_ptr<Allocation> backing_store)
20 : DeviceBuffer(desc),
21 reactor_(std::move(reactor)),
22 handle_(reactor_ ? reactor_->CreateHandle(HandleType::kBuffer)
23 : HandleGLES::DeadHandle()),
24 backing_store_(std::move(backing_store)) {}
25
26// |DeviceBuffer|
28 if (!handle_.IsDead()) {
29 reactor_->CollectHandle(handle_);
30 }
31}
32
33// |DeviceBuffer|
35 if (!reactor_) {
36 return nullptr;
37 }
38 return backing_store_->GetBuffer();
39}
40
41// |DeviceBuffer|
43 Range source_range,
44 size_t offset) {
45 if (!reactor_) {
46 return false;
47 }
48
49 if (offset + source_range.length > backing_store_->GetLength()) {
50 return false;
51 }
52
53 std::memmove(backing_store_->GetBuffer() + offset,
54 source + source_range.offset, source_range.length);
55 ++generation_;
56
57 return true;
58}
59
60void DeviceBufferGLES::Flush(std::optional<Range> range) const {
61 generation_++;
62}
63
65 switch (type) {
67 return GL_ARRAY_BUFFER;
69 return GL_ELEMENT_ARRAY_BUFFER;
70 }
72}
73
75 if (!reactor_) {
76 return false;
77 }
78
79 auto buffer = reactor_->GetGLHandle(handle_);
80 if (!buffer.has_value()) {
81 return false;
82 }
83
84 const auto target_type = ToTarget(type);
85 const auto& gl = reactor_->GetProcTable();
86
87 gl.BindBuffer(target_type, buffer.value());
88
89 if (upload_generation_ != generation_) {
90 TRACE_EVENT1("impeller", "BufferData", "Bytes",
91 std::to_string(backing_store_->GetLength()).c_str());
92 gl.BufferData(target_type, backing_store_->GetLength(),
93 backing_store_->GetBuffer(), GL_STATIC_DRAW);
94 upload_generation_ = generation_;
95 }
96
97 return true;
98}
99
100// |DeviceBuffer|
101bool DeviceBufferGLES::SetLabel(const std::string& label) {
102 reactor_->SetDebugLabel(handle_, label);
103 return true;
104}
105
106// |DeviceBuffer|
107bool DeviceBufferGLES::SetLabel(const std::string& label, Range range) {
108 // Cannot support debug label on the range. Set the label for the entire
109 // range.
110 return SetLabel(label);
111}
112
113const uint8_t* DeviceBufferGLES::GetBufferData() const {
114 return backing_store_->GetBuffer();
115}
116
118 const std::function<void(uint8_t* data, size_t length)>&
119 update_buffer_data) {
120 if (update_buffer_data) {
121 update_buffer_data(backing_store_->GetBuffer(),
122 backing_store_->GetLength());
123 ++generation_;
124 }
125}
126
127} // namespace impeller
void Flush(std::optional< Range > range=std::nullopt) const override
DeviceBufferGLES(DeviceBufferDescriptor desc, ReactorGLES::Ref reactor, std::shared_ptr< Allocation > backing_store)
void UpdateBufferData(const std::function< void(uint8_t *, size_t length)> &update_buffer_data)
uint8_t * OnGetContents() const override
bool BindAndUploadDataIfNecessary(BindingType type) const
bool SetLabel(const std::string &label) override
bool OnCopyHostBuffer(const uint8_t *source, Range source_range, size_t offset) override
const uint8_t * GetBufferData() const
std::shared_ptr< ReactorGLES > Ref
SkBitmap source
Definition examples.cpp:28
static const uint8_t buffer[]
#define FML_UNREACHABLE()
Definition logging.h:109
size_t length
static GLenum ToTarget(DeviceBufferGLES::BindingType type)
Definition ref_ptr.h:256
fuchsia::ui::composition::ParentViewportWatcherHandle handle_
Point offset
constexpr bool IsDead() const
Definition handle_gles.h:43
size_t length
Definition range.h:16
size_t offset
Definition range.h:15
#define TRACE_EVENT1(category_group, name, arg1_name, arg1_val)