5#include "flutter/lib/ui/painting/display_list_deferred_image_gpu_skia.h"
7#include "flutter/fml/make_copyable.h"
21 ImageWrapper::Make(image_info, std::move(display_list),
22 std::move(snapshot_delegate), raster_task_runner,
23 std::move(unref_queue)),
29 std::unique_ptr<LayerTree> layer_tree,
34 ImageWrapper::MakeFromLayerTree(
35 image_info, std::move(layer_tree), std::move(snapshot_delegate),
36 raster_task_runner, std::move(unref_queue)),
40DlDeferredImageGPUSkia::DlDeferredImageGPUSkia(
41 std::shared_ptr<ImageWrapper> image_wrapper,
43 : image_wrapper_(
std::move(image_wrapper)),
44 raster_task_runner_(
std::move(raster_task_runner)) {}
49 [image_wrapper = image_wrapper_]() {
53 image_wrapper->Unregister();
54 image_wrapper->DeleteTexture();
60 return image_wrapper_ ? image_wrapper_->CreateSkiaImage() :
nullptr;
71 return image_wrapper_ ? image_wrapper_->image_info().isOpaque() :
false;
76 return image_wrapper_ ? image_wrapper_->isTextureBacked() :
false;
86 return image_wrapper_ ? image_wrapper_->image_info().dimensions()
92 return sizeof(*this) +
93 (image_wrapper_ ? image_wrapper_->image_info().computeMinByteSize()
98 return image_wrapper_ ? image_wrapper_->get_error() : std::nullopt;
101std::shared_ptr<DlDeferredImageGPUSkia::ImageWrapper>
102DlDeferredImageGPUSkia::ImageWrapper::Make(
108 auto wrapper = std::shared_ptr<ImageWrapper>(
new ImageWrapper(
109 image_info, std::move(display_list), std::move(snapshot_delegate),
110 std::move(raster_task_runner), std::move(unref_queue)));
111 wrapper->SnapshotDisplayList();
115std::shared_ptr<DlDeferredImageGPUSkia::ImageWrapper>
116DlDeferredImageGPUSkia::ImageWrapper::MakeFromLayerTree(
118 std::unique_ptr<LayerTree> layer_tree,
122 auto wrapper = std::shared_ptr<ImageWrapper>(
123 new ImageWrapper(image_info,
nullptr, std::move(snapshot_delegate),
124 std::move(raster_task_runner), std::move(unref_queue)));
125 wrapper->SnapshotDisplayList(std::move(layer_tree));
129DlDeferredImageGPUSkia::ImageWrapper::ImageWrapper(
135 : image_info_(image_info),
136 display_list_(
std::move(display_list)),
138 raster_task_runner_(
std::move(raster_task_runner)),
139 unref_queue_(
std::move(unref_queue)) {}
141void DlDeferredImageGPUSkia::ImageWrapper::OnGrContextCreated() {
142 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
143 SnapshotDisplayList();
146void DlDeferredImageGPUSkia::ImageWrapper::OnGrContextDestroyed() {
147 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
151sk_sp<SkImage> DlDeferredImageGPUSkia::ImageWrapper::CreateSkiaImage()
const {
152 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
154 if (texture_.isValid() && context_) {
157 image_info_.colorType(), image_info_.alphaType(),
158 image_info_.refColorSpace());
163bool DlDeferredImageGPUSkia::ImageWrapper::isTextureBacked()
const {
164 return texture_.isValid();
167void DlDeferredImageGPUSkia::ImageWrapper::SnapshotDisplayList(
168 std::unique_ptr<LayerTree> layer_tree) {
172 layer_tree = std::move(layer_tree)]()
mutable {
173 auto wrapper = weak_this.lock();
177 auto snapshot_delegate = wrapper->snapshot_delegate_;
178 if (!snapshot_delegate) {
184 wrapper->image_info_.height()),
185 snapshot_delegate->GetTextureRegistry(),
186 snapshot_delegate->GetGrContext());
187 wrapper->display_list_ = std::move(display_list);
189 auto result = snapshot_delegate->MakeSkiaGpuImage(
190 wrapper->display_list_, wrapper->image_info_);
191 if (
result->texture.isValid()) {
192 wrapper->texture_ =
result->texture;
193 wrapper->context_ = std::move(
result->context);
194 wrapper->texture_registry_ =
195 wrapper->snapshot_delegate_->GetTextureRegistry();
196 wrapper->texture_registry_->RegisterContextListener(
197 reinterpret_cast<uintptr_t
>(wrapper.get()), weak_this);
198 }
else if (
result->image) {
199 wrapper->image_ = std::move(
result->image);
201 std::scoped_lock lock(wrapper->error_mutex_);
202 wrapper->error_ =
result->error;
207std::optional<std::string> DlDeferredImageGPUSkia::ImageWrapper::get_error() {
208 std::scoped_lock lock(error_mutex_);
212void DlDeferredImageGPUSkia::ImageWrapper::Unregister() {
213 if (texture_registry_) {
214 texture_registry_->UnregisterContextListener(
215 reinterpret_cast<uintptr_t
>(
this));
219void DlDeferredImageGPUSkia::ImageWrapper::DeleteTexture() {
220 if (texture_.isValid()) {
221 unref_queue_->DeleteTexture(texture_);
@ kTopLeft_GrSurfaceOrigin
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 isTextureBacked() const override
SkISize dimensions() const override
~DlDeferredImageGPUSkia() override
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
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate_
#define FML_DCHECK(condition)
SK_API sk_sp< SkImage > BorrowTextureFrom(GrRecordingContext *context, const GrBackendTexture &backendTexture, GrSurfaceOrigin origin, SkColorType colorType, SkAlphaType alphaType, sk_sp< SkColorSpace > colorSpace, TextureReleaseProc textureReleaseProc=nullptr, ReleaseContext releaseContext=nullptr)
internal::CopyableLambda< T > MakeCopyable(T lambda)
static constexpr SkISize MakeEmpty()
static constexpr SkRect MakeWH(float w, float h)