Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
display_list_deferred_image_gpu_skia.h
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
5#ifndef FLUTTER_LIB_UI_PAINTING_DISPLAY_LIST_DEFERRED_IMAGE_GPU_SKIA_H_
6#define FLUTTER_LIB_UI_PAINTING_DISPLAY_LIST_DEFERRED_IMAGE_GPU_SKIA_H_
7
8#if !SLIMPELLER
9
10#include <memory>
11#include <mutex>
12
18#include "flutter/fml/macros.h"
22
23#include "third_party/skia/include/gpu/ganesh/GrBackendSurface.h"
24
25namespace flutter {
26
27class DlDeferredImageGPUSkia final : public DlImageSkia {
28 public:
29 static sk_sp<DlDeferredImageGPUSkia> Make(
30 const SkImageInfo& image_info,
31 sk_sp<DisplayList> display_list,
33 const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
34 fml::RefPtr<SkiaUnrefQueue> unref_queue);
35
36 static sk_sp<DlDeferredImageGPUSkia> MakeFromLayerTree(
37 const SkImageInfo& image_info,
38 std::unique_ptr<LayerTree> layer_tree,
40 const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
41 fml::RefPtr<SkiaUnrefQueue> unref_queue);
42
43 // |DlImage|
44 ~DlDeferredImageGPUSkia() override;
45
46 // |DlImageSkia|
47 // This method is only safe to call from the raster thread.
48 // Callers must not hold long term references to this image and
49 // only use it for the immediate painting operation. It must be
50 // collected on the raster task runner.
51 sk_sp<SkImage> skia_image() const override;
52
53 // |DlImage|
54 bool isOpaque() const override;
55
56 // |DlImage|
57 bool isUIThreadSafe() const override;
58
59 // |DlImage|
60 DlISize GetSize() const override;
61
62 // |DlImage|
63 virtual size_t GetApproximateByteSize() const override;
64
65 // |DlImage|
66 // This method is safe to call from any thread.
67 std::optional<std::string> get_error() const override;
68
69 // |DlImage|
70 OwningContext owning_context() const override {
72 }
73
74 private:
75 class ImageWrapper final : public std::enable_shared_from_this<ImageWrapper>,
76 public ContextListener {
77 public:
78 static std::shared_ptr<ImageWrapper> Make(
79 const SkImageInfo& image_info,
80 sk_sp<DisplayList> display_list,
82 fml::RefPtr<fml::TaskRunner> raster_task_runner,
83 fml::RefPtr<SkiaUnrefQueue> unref_queue);
84
85 static std::shared_ptr<ImageWrapper> MakeFromLayerTree(
86 const SkImageInfo& image_info,
87 std::unique_ptr<LayerTree> layer_tree,
89 fml::RefPtr<fml::TaskRunner> raster_task_runner,
90 fml::RefPtr<SkiaUnrefQueue> unref_queue);
91
92 const SkImageInfo image_info() const { return image_info_; }
93 const GrBackendTexture& texture() const { return texture_; }
94 std::optional<std::string> get_error();
95 sk_sp<SkImage> CreateSkiaImage() const;
96 void Unregister();
97 void DeleteTexture();
98
99 private:
100 const SkImageInfo image_info_;
101 sk_sp<DisplayList> display_list_;
103 fml::RefPtr<fml::TaskRunner> raster_task_runner_;
104 fml::RefPtr<SkiaUnrefQueue> unref_queue_;
105 std::shared_ptr<TextureRegistry> texture_registry_;
106
107 mutable std::mutex error_mutex_;
108 std::optional<std::string> error_;
109
110 GrBackendTexture texture_;
111 sk_sp<GrDirectContext> context_;
112 // May be used if this image is not texture backed.
113 sk_sp<SkImage> image_;
114
115 ImageWrapper(
116 const SkImageInfo& image_info,
117 sk_sp<DisplayList> display_list,
119 fml::RefPtr<fml::TaskRunner> raster_task_runner,
120 fml::RefPtr<SkiaUnrefQueue> unref_queue);
121
122 // If a layer tree is provided, it will be flattened during the raster
123 // thread task spawned by this method. After being flattened into a display
124 // list, the image wrapper will be updated to hold this display list and the
125 // layer tree can be dropped.
126 void SnapshotDisplayList(std::unique_ptr<LayerTree> layer_tree = nullptr);
127
128 // |ContextListener|
129 void OnGrContextCreated() override;
130
131 // |ContextListener|
132 void OnGrContextDestroyed() override;
133 };
134
135 const std::shared_ptr<ImageWrapper> image_wrapper_;
136
137 fml::RefPtr<fml::TaskRunner> raster_task_runner_;
138
139 DlDeferredImageGPUSkia(std::shared_ptr<ImageWrapper> image_wrapper,
140 fml::RefPtr<fml::TaskRunner> raster_task_runner);
141
142 FML_DISALLOW_COPY_AND_ASSIGN(DlDeferredImageGPUSkia);
143};
144
145} // namespace flutter
146
147#endif // !SLIMPELLER
148
149#endif // FLUTTER_LIB_UI_PAINTING_DISPLAY_LIST_DEFERRED_IMAGE_GPU_SKIA_H_
std::optional< std::string > get_error() const override
static sk_sp< DlDeferredImageGPUSkia > Make(const SkImageInfo &image_info, sk_sp< DisplayList > display_list, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, fml::RefPtr< SkiaUnrefQueue > unref_queue)
bool isOpaque() const override
If the pixel format of this image ignores alpha, this returns true. This method might conservatively ...
static sk_sp< DlDeferredImageGPUSkia > MakeFromLayerTree(const SkImageInfo &image_info, std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, fml::RefPtr< SkiaUnrefQueue > unref_queue)
bool isUIThreadSafe() const override
If the underlying platform image held by this object has no threading requirements for the release of...
virtual size_t GetApproximateByteSize() const override
fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate_
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
FlTexture * texture