14#include "third_party/skia/include/core/SkBitmap.h"
15#include "third_party/skia/include/core/SkImage.h"
23 return SkColorType::kRGBA_8888_SkColorType;
25 return SkColorType::kRGBA_F16_SkColorType;
27 return SkColorType::kBGRA_8888_SkColorType;
29 return SkColorType::kBGR_101010x_XR_SkColorType;
31 return SkColorType::kBGRA_10101010_XR_SkColorType;
37sk_sp<SkImage> ConvertBufferToSkImage(
38 const std::shared_ptr<impeller::DeviceBuffer>& buffer,
41 SkImageInfo image_info = SkImageInfo::Make(dimensions,
color_type,
42 SkAlphaType::kPremul_SkAlphaType);
44 auto func = [](
void* addr,
void* context) {
46 static_cast<std::shared_ptr<impeller::DeviceBuffer>*
>(context);
50 auto bytes_per_pixel = image_info.bytesPerPixel();
51 bitmap.installPixels(image_info,
buffer->OnGetContents(),
52 dimensions.width() * bytes_per_pixel, func,
53 new std::shared_ptr<impeller::DeviceBuffer>(buffer));
54 bitmap.setImmutable();
56 sk_sp<SkImage> raster_image = SkImages::RasterFromBitmap(bitmap);
60[[nodiscard]]
fml::Status DoConvertImageToRasterImpeller(
61 const sk_sp<DlImage>& dl_image,
62 const std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)>& encode_task,
64 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
65 const std::shared_ptr<impeller::Context>& impeller_context) {
67 is_gpu_disabled_sync_switch->Execute(
69 .SetIfTrue([&result] {
74 [&dl_image, &encode_task, &snapshot_delegate, &impeller_context] {
76 dl_image, encode_task, snapshot_delegate, impeller_context);
84void DoConvertImageToRasterImpellerWithRetry(
85 const sk_sp<DlImage>& dl_image,
86 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)>&& encode_task,
88 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
89 const std::shared_ptr<impeller::Context>& impeller_context,
91 fml::Status status = DoConvertImageToRasterImpeller(
92 dl_image, encode_task, snapshot_delegate, is_gpu_disabled_sync_switch,
98 impeller_context->StoreTaskForGPU(
99 [dl_image, encode_task, snapshot_delegate,
100 is_gpu_disabled_sync_switch, impeller_context,
101 retry_runner]()
mutable {
102 auto retry_task = [dl_image, encode_task = std::move(encode_task),
103 snapshot_delegate, is_gpu_disabled_sync_switch,
105 fml::Status retry_status = DoConvertImageToRasterImpeller(
106 dl_image, encode_task, snapshot_delegate,
107 is_gpu_disabled_sync_switch, impeller_context);
108 if (!retry_status.
ok()) {
111 encode_task(retry_status);
117 retry_runner->PostTask(retry_task);
136 const sk_sp<DlImage>& dl_image,
137 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)> encode_task,
139 const std::shared_ptr<impeller::Context>& impeller_context) {
140 auto texture = dl_image->impeller_texture();
142 if (impeller_context ==
nullptr) {
144 "Impeller context was null."));
154 auto dimensions = dl_image->GetSize();
157 if (dimensions.IsEmpty()) {
159 "Image dimensions were empty."));
165 "Failed to get color type from pixel format."));
173 if (snapshot_delegate) {
174 if (!snapshot_delegate->MakeRenderContextCurrent()) {
176 "Failed to bind the render context."));
185 texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
187 impeller_context->GetResourceAllocator()->CreateBuffer(buffer_desc);
190 "Failed to allocate destination buffer."));
194 auto command_buffer = impeller_context->CreateCommandBuffer();
195 command_buffer->SetLabel(
"BlitTextureToBuffer Command Buffer");
196 auto pass = command_buffer->CreateBlitPass();
197 pass->SetLabel(
"BlitTextureToBuffer Blit Pass");
199 pass->EncodeCommands();
201 encode_task = std::move(encode_task)](
210 encode_task(sk_image);
213 if (!impeller_context->GetCommandQueue()
214 ->Submit({command_buffer}, completion)
216 FML_LOG(ERROR) <<
"Failed to submit commands.";
219 impeller_context->DisposeThreadLocalCachedResources();
223 const sk_sp<DlImage>& dl_image,
224 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)> encode_task,
228 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
229 const std::shared_ptr<impeller::Context>& impeller_context) {
230 auto original_encode_task = std::move(encode_task);
231 encode_task = [original_encode_task = std::move(original_encode_task),
235 [original_encode_task = std::move(original_encode_task),
240 DoConvertImageToRasterImpellerWithRetry(
241 dl_image, std::move(encode_task),
242 {}, is_gpu_disabled_sync_switch, impeller_context,
247 raster_task_runner->PostTask([dl_image, encode_task = std::move(encode_task),
248 io_task_runner, snapshot_delegate,
249 is_gpu_disabled_sync_switch, impeller_context,
250 raster_task_runner]()
mutable {
251 DoConvertImageToRasterImpellerWithRetry(
252 dl_image, std::move(encode_task), snapshot_delegate,
253 is_gpu_disabled_sync_switch, impeller_context, raster_task_runner);
258 const std::shared_ptr<impeller::Texture>&
texture) {
static int GetColorSpace(const std::shared_ptr< impeller::Texture > &texture)
static void ConvertDlImageToSkImage(const sk_sp< DlImage > &dl_image, std::function< void(fml::StatusOr< sk_sp< SkImage > >)> encode_task, const fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > &snapshot_delegate, const std::shared_ptr< impeller::Context > &impeller_context)
static void ConvertImageToRaster(const sk_sp< DlImage > &dl_image, std::function< void(fml::StatusOr< sk_sp< SkImage > >)> encode_task, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, const fml::RefPtr< fml::TaskRunner > &io_task_runner, const fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > &snapshot_delegate, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch, const std::shared_ptr< impeller::Context > &impeller_context)
fml::StatusCode code() const
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
FlutterVulkanImage * image
#define FML_LOG(severity)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
const SkISize & ToSkISize(const DlISize &size)
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Represents the 2 code paths available when calling |SyncSwitchExecute|.
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...