Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
display_list_deferred_image_gpu_impeller.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 <utility>
8#include <variant>
9
11
12namespace flutter {
13
14sk_sp<DlDeferredImageGPUImpeller> DlDeferredImageGPUImpeller::Make(
15 std::unique_ptr<LayerTree> layer_tree,
17 fml::RefPtr<fml::TaskRunner> raster_task_runner) {
18 return sk_sp<DlDeferredImageGPUImpeller>(new DlDeferredImageGPUImpeller(
19 DlDeferredImageGPUImpeller::ImageWrapper::Make(
20 std::move(layer_tree), std::move(snapshot_delegate),
21 std::move(raster_task_runner))));
22}
23
24sk_sp<DlDeferredImageGPUImpeller> DlDeferredImageGPUImpeller::Make(
25 sk_sp<DisplayList> display_list,
26 const DlISize& size,
28 fml::RefPtr<fml::TaskRunner> raster_task_runner) {
29 return sk_sp<DlDeferredImageGPUImpeller>(new DlDeferredImageGPUImpeller(
30 DlDeferredImageGPUImpeller::ImageWrapper::Make(
31 std::move(display_list), size, std::move(snapshot_delegate),
32 std::move(raster_task_runner))));
33}
34
35DlDeferredImageGPUImpeller::DlDeferredImageGPUImpeller(
36 std::shared_ptr<ImageWrapper> wrapper)
37 : wrapper_(std::move(wrapper)) {}
38
39// |DlImage|
41
42// |DlImage|
44 return nullptr;
45};
46
47// |DlImage|
48std::shared_ptr<impeller::Texture>
50 if (!wrapper_) {
51 return nullptr;
52 }
53 return wrapper_->texture();
54}
55
56// |DlImage|
58 // Impeller doesn't currently implement opaque alpha types.
59 return false;
60}
61
62// |DlImage|
64 return wrapper_ && wrapper_->isTextureBacked();
65}
66
67// |DlImage|
69 return true;
70}
71
72// |DlImage|
74 return wrapper_ ? wrapper_->size() : DlISize();
75}
76
77// |DlImage|
79 auto size = sizeof(DlDeferredImageGPUImpeller);
80 if (wrapper_) {
81 if (wrapper_->texture()) {
82 size += wrapper_->texture()
83 ->GetTextureDescriptor()
84 .GetByteSizeOfBaseMipLevel();
85 } else {
86 size += wrapper_->size().Area() * 4;
87 }
88 }
89 return size;
90}
91
92std::shared_ptr<DlDeferredImageGPUImpeller::ImageWrapper>
93DlDeferredImageGPUImpeller::ImageWrapper::Make(
94 sk_sp<DisplayList> display_list,
95 const DlISize& size,
97 fml::RefPtr<fml::TaskRunner> raster_task_runner) {
98 auto wrapper = std::shared_ptr<ImageWrapper>(new ImageWrapper(
99 size, std::move(snapshot_delegate), std::move(raster_task_runner)));
100 wrapper->SnapshotDisplayList(std::move(display_list));
101 return wrapper;
102}
103
104std::shared_ptr<DlDeferredImageGPUImpeller::ImageWrapper>
105DlDeferredImageGPUImpeller::ImageWrapper::Make(
106 std::unique_ptr<LayerTree> layer_tree,
108 fml::RefPtr<fml::TaskRunner> raster_task_runner) {
109 auto wrapper = std::shared_ptr<ImageWrapper>(
110 new ImageWrapper(layer_tree->frame_size(), std::move(snapshot_delegate),
111 std::move(raster_task_runner)));
112 wrapper->SnapshotDisplayList(std::move(layer_tree));
113 return wrapper;
114}
115
116DlDeferredImageGPUImpeller::ImageWrapper::ImageWrapper(
117 const DlISize& size,
119 fml::RefPtr<fml::TaskRunner> raster_task_runner)
120 : size_(size),
121 snapshot_delegate_(std::move(snapshot_delegate)),
122 raster_task_runner_(std::move(raster_task_runner)) {}
123
124DlDeferredImageGPUImpeller::ImageWrapper::~ImageWrapper() = default;
125
126void DlDeferredImageGPUImpeller::ImageWrapper::OnGrContextCreated() {}
127
128void DlDeferredImageGPUImpeller::ImageWrapper::OnGrContextDestroyed() {}
129
130bool DlDeferredImageGPUImpeller::ImageWrapper::isTextureBacked() const {
131 return texture_ && texture_->IsValid();
132}
133
134void DlDeferredImageGPUImpeller::ImageWrapper::SnapshotDisplayList(
135 std::variant<sk_sp<DisplayList>, std::unique_ptr<LayerTree>> content) {
137 raster_task_runner_,
138 fml::MakeCopyable([weak_this = weak_from_this(),
139 content = std::move(content)]() mutable {
140 TRACE_EVENT0("flutter", "SnapshotDisplayList (impeller)");
141 auto wrapper = weak_this.lock();
142 if (!wrapper) {
143 return;
144 }
145 auto snapshot_delegate = wrapper->snapshot_delegate_;
146 if (!snapshot_delegate) {
147 return;
148 }
149
150 sk_sp<DisplayList> display_list;
151
152 if (std::holds_alternative<sk_sp<DisplayList>>(content)) {
153 display_list = std::get<sk_sp<DisplayList>>(std::move(content));
154 } else if (std::holds_alternative<std::unique_ptr<LayerTree>>(
155 content)) {
156 std::unique_ptr<LayerTree> layer_tree =
157 std::get<std::unique_ptr<LayerTree>>(std::move(content));
158 display_list = layer_tree->Flatten(
159 DlRect::MakeWH(wrapper->size_.width, wrapper->size_.height),
160 snapshot_delegate->GetTextureRegistry());
161 }
162
163 auto snapshot = snapshot_delegate->MakeRasterSnapshotSync(
164 display_list, wrapper->size_);
165 if (!snapshot) {
166 std::scoped_lock lock(wrapper->error_mutex_);
167 wrapper->error_ = "Failed to create snapshot.";
168 return;
169 }
170 wrapper->texture_ = snapshot->impeller_texture();
171 }));
172}
173
174std::optional<std::string>
175DlDeferredImageGPUImpeller::ImageWrapper::get_error() {
176 std::scoped_lock lock(error_mutex_);
177 return error_;
178}
179
180} // namespace flutter
bool isUIThreadSafe() const override
If the underlying platform image held by this object has no threading requirements for the release of...
bool isOpaque() const override
If the pixel format of this image ignores alpha, this returns true. This method might conservatively ...
sk_sp< SkImage > skia_image() const override
If this display list image is meant to be used by the Skia backend, an SkImage instance....
std::shared_ptr< impeller::Texture > impeller_texture() const override
If this display list image is meant to be used by the Impeller backend, an Impeller texture instance....
static sk_sp< DlDeferredImageGPUImpeller > Make(std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner)
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate_
union flutter::testing::@2827::KeyboardChange::@78 content
impeller::ISize32 DlISize
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
internal::CopyableLambda< T > MakeCopyable(T lambda)
Definition ref_ptr.h:261
static constexpr TRect MakeWH(Type width, Type height)
Definition rect.h:140
#define TRACE_EVENT0(category_group, name)