10#include "third_party/skia/include/core/SkColorSpace.h"
11#include "third_party/skia/include/core/SkImage.h"
12#include "third_party/skia/include/gpu/ganesh/SkImageGanesh.h"
17 const SkImageInfo& image_info,
18 sk_sp<DisplayList> display_list,
23 ImageWrapper::Make(image_info, std::move(display_list),
24 std::move(snapshot_delegate), raster_task_runner,
25 std::move(unref_queue)),
30 const SkImageInfo& image_info,
31 std::unique_ptr<LayerTree> layer_tree,
36 ImageWrapper::MakeFromLayerTree(
37 image_info, std::move(layer_tree), std::move(snapshot_delegate),
38 raster_task_runner, std::move(unref_queue)),
42DlDeferredImageGPUSkia::DlDeferredImageGPUSkia(
43 std::shared_ptr<ImageWrapper> image_wrapper,
46 image_wrapper_(
std::move(image_wrapper)),
47 raster_task_runner_(
std::move(raster_task_runner)) {}
52 [image_wrapper = image_wrapper_]() {
56 image_wrapper->Unregister();
57 image_wrapper->DeleteTexture();
63 return image_wrapper_ ? image_wrapper_->CreateSkiaImage() :
nullptr;
68 return image_wrapper_ ? image_wrapper_->image_info().isOpaque() :
false;
78 return image_wrapper_ ?
ToDlISize(image_wrapper_->image_info().dimensions())
84 return sizeof(*this) +
85 (image_wrapper_ ? image_wrapper_->image_info().computeMinByteSize()
90 return image_wrapper_ ? image_wrapper_->get_error() : std::nullopt;
93std::shared_ptr<DlDeferredImageGPUSkia::ImageWrapper>
94DlDeferredImageGPUSkia::ImageWrapper::Make(
95 const SkImageInfo& image_info,
96 sk_sp<DisplayList> display_list,
100 auto wrapper = std::shared_ptr<ImageWrapper>(
new ImageWrapper(
101 image_info, std::move(display_list), std::move(snapshot_delegate),
102 std::move(raster_task_runner), std::move(unref_queue)));
103 wrapper->SnapshotDisplayList();
107std::shared_ptr<DlDeferredImageGPUSkia::ImageWrapper>
108DlDeferredImageGPUSkia::ImageWrapper::MakeFromLayerTree(
109 const SkImageInfo& image_info,
110 std::unique_ptr<LayerTree> layer_tree,
114 auto wrapper = std::shared_ptr<ImageWrapper>(
115 new ImageWrapper(image_info,
nullptr, std::move(snapshot_delegate),
116 std::move(raster_task_runner), std::move(unref_queue)));
117 wrapper->SnapshotDisplayList(std::move(layer_tree));
121DlDeferredImageGPUSkia::ImageWrapper::ImageWrapper(
122 const SkImageInfo& image_info,
123 sk_sp<DisplayList> display_list,
127 : image_info_(image_info),
128 display_list_(
std::move(display_list)),
130 raster_task_runner_(
std::move(raster_task_runner)),
131 unref_queue_(
std::move(unref_queue)) {}
133void DlDeferredImageGPUSkia::ImageWrapper::OnGrContextCreated() {
134 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
135 SnapshotDisplayList();
138void DlDeferredImageGPUSkia::ImageWrapper::OnGrContextDestroyed() {
139 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
143sk_sp<SkImage> DlDeferredImageGPUSkia::ImageWrapper::CreateSkiaImage()
const {
144 FML_DCHECK(raster_task_runner_->RunsTasksOnCurrentThread());
146 if (texture_.isValid() && context_) {
147 return SkImages::BorrowTextureFrom(
148 context_.get(), texture_, kTopLeft_GrSurfaceOrigin,
149 image_info_.colorType(), image_info_.alphaType(),
150 image_info_.refColorSpace());
155void DlDeferredImageGPUSkia::ImageWrapper::SnapshotDisplayList(
156 std::unique_ptr<LayerTree> layer_tree) {
160 layer_tree = std::move(layer_tree)]()
mutable {
161 auto wrapper = weak_this.lock();
165 auto snapshot_delegate = wrapper->snapshot_delegate_;
166 if (!snapshot_delegate) {
172 wrapper->image_info_.height()),
173 snapshot_delegate->GetTextureRegistry(),
174 snapshot_delegate->GetGrContext());
175 wrapper->display_list_ = std::move(display_list);
177 auto result = snapshot_delegate->MakeSkiaGpuImage(
178 wrapper->display_list_, wrapper->image_info_);
179 if (result->texture.isValid()) {
180 wrapper->texture_ = result->texture;
181 wrapper->context_ = std::move(result->context);
182 wrapper->texture_registry_ =
183 wrapper->snapshot_delegate_->GetTextureRegistry();
184 wrapper->texture_registry_->RegisterContextListener(
185 reinterpret_cast<uintptr_t
>(wrapper.get()), weak_this);
186 }
else if (result->image) {
187 wrapper->image_ = std::move(result->image);
189 std::scoped_lock lock(wrapper->error_mutex_);
190 wrapper->error_ = result->error;
195std::optional<std::string> DlDeferredImageGPUSkia::ImageWrapper::get_error() {
196 std::scoped_lock lock(error_mutex_);
200void DlDeferredImageGPUSkia::ImageWrapper::Unregister() {
201 if (texture_registry_) {
202 texture_registry_->UnregisterContextListener(
203 reinterpret_cast<uintptr_t
>(
this));
207void DlDeferredImageGPUSkia::ImageWrapper::DeleteTexture() {
208 if (texture_.isValid()) {
209 unref_queue_->DeleteTexture(texture_);
210 texture_ = GrBackendTexture();
sk_sp< SkImage > skia_image() const override
DlISize GetSize() const override
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)
~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)
const DlISize & ToDlISize(const SkISize &size)
impeller::ISize32 DlISize
internal::CopyableLambda< T > MakeCopyable(T lambda)
static constexpr TRect MakeWH(Type width, Type height)