Flutter Engine
The Flutter Engine
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#include <memory>
9#include <mutex>
10
11#include "flutter/common/graphics/texture.h"
12#include "flutter/display_list/display_list.h"
13#include "flutter/display_list/image/dl_image.h"
14#include "flutter/flow/layers/layer_tree.h"
15#include "flutter/fml/macros.h"
16#include "flutter/fml/memory/weak_ptr.h"
17#include "flutter/lib/ui/io_manager.h"
18#include "flutter/lib/ui/snapshot_delegate.h"
19
21
22namespace flutter {
23
24class DlDeferredImageGPUSkia final : public DlImage {
25 public:
27 const SkImageInfo& image_info,
28 sk_sp<DisplayList> display_list,
30 const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
31 fml::RefPtr<SkiaUnrefQueue> unref_queue);
32
34 const SkImageInfo& image_info,
35 std::unique_ptr<LayerTree> layer_tree,
37 const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
38 fml::RefPtr<SkiaUnrefQueue> unref_queue);
39
40 // |DlImage|
41 ~DlDeferredImageGPUSkia() override;
42
43 // |DlImage|
44 // This method is only safe to call from the raster thread.
45 // Callers must not hold long term references to this image and
46 // only use it for the immediate painting operation. It must be
47 // collected on the raster task runner.
48 sk_sp<SkImage> skia_image() const override;
49
50 // |DlImage|
51 std::shared_ptr<impeller::Texture> impeller_texture() const override;
52
53 // |DlImage|
54 bool isOpaque() const override;
55
56 // |DlImage|
57 bool isTextureBacked() const override;
58
59 // |DlImage|
60 bool isUIThreadSafe() const override;
61
62 // |DlImage|
63 SkISize dimensions() const override;
64
65 // |DlImage|
66 virtual size_t GetApproximateByteSize() const override;
67
68 // |DlImage|
69 // This method is safe to call from any thread.
70 std::optional<std::string> get_error() const override;
71
72 // |DlImage|
73 OwningContext owning_context() const override {
75 }
76
77 private:
78 class ImageWrapper final : public std::enable_shared_from_this<ImageWrapper>,
79 public ContextListener {
80 public:
81 static std::shared_ptr<ImageWrapper> Make(
82 const SkImageInfo& image_info,
83 sk_sp<DisplayList> display_list,
85 fml::RefPtr<fml::TaskRunner> raster_task_runner,
86 fml::RefPtr<SkiaUnrefQueue> unref_queue);
87
88 static std::shared_ptr<ImageWrapper> MakeFromLayerTree(
89 const SkImageInfo& image_info,
90 std::unique_ptr<LayerTree> layer_tree,
92 fml::RefPtr<fml::TaskRunner> raster_task_runner,
93 fml::RefPtr<SkiaUnrefQueue> unref_queue);
94
95 const SkImageInfo image_info() const { return image_info_; }
96 const GrBackendTexture& texture() const { return texture_; }
97 bool isTextureBacked() const;
98 std::optional<std::string> get_error();
99 sk_sp<SkImage> CreateSkiaImage() const;
100 void Unregister();
101 void DeleteTexture();
102
103 private:
104 const SkImageInfo image_info_;
105 sk_sp<DisplayList> display_list_;
107 fml::RefPtr<fml::TaskRunner> raster_task_runner_;
108 fml::RefPtr<SkiaUnrefQueue> unref_queue_;
109 std::shared_ptr<TextureRegistry> texture_registry_;
110
111 mutable std::mutex error_mutex_;
112 std::optional<std::string> error_;
113
114 GrBackendTexture texture_;
115 sk_sp<GrDirectContext> context_;
116 // May be used if this image is not texture backed.
117 sk_sp<SkImage> image_;
118
119 ImageWrapper(
120 const SkImageInfo& image_info,
121 sk_sp<DisplayList> display_list,
123 fml::RefPtr<fml::TaskRunner> raster_task_runner,
124 fml::RefPtr<SkiaUnrefQueue> unref_queue);
125
126 // If a layer tree is provided, it will be flattened during the raster
127 // thread task spawned by this method. After being flattened into a display
128 // list, the image wrapper will be updated to hold this display list and the
129 // layer tree can be dropped.
130 void SnapshotDisplayList(std::unique_ptr<LayerTree> layer_tree = nullptr);
131
132 // |ContextListener|
133 void OnGrContextCreated() override;
134
135 // |ContextListener|
136 void OnGrContextDestroyed() override;
137 };
138
139 const std::shared_ptr<ImageWrapper> image_wrapper_;
140
141 fml::RefPtr<fml::TaskRunner> raster_task_runner_;
142
143 DlDeferredImageGPUSkia(std::shared_ptr<ImageWrapper> image_wrapper,
144 fml::RefPtr<fml::TaskRunner> raster_task_runner);
145
146 FML_DISALLOW_COPY_AND_ASSIGN(DlDeferredImageGPUSkia);
147};
148
149} // namespace flutter
150
151#endif // FLUTTER_LIB_UI_PAINTING_DISPLAY_LIST_DEFERRED_IMAGE_GPU_SKIA_H_
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::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)
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....
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
Represents an image whose allocation is (usually) resident on device memory.
Definition dl_image.h:30
fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate_
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
FlTexture * texture