15#include "third_party/skia/include/core/SkBitmap.h"
16#include "third_party/skia/include/core/SkImage.h"
24 return SkColorType::kRGBA_8888_SkColorType;
26 return SkColorType::kRGBA_F16_SkColorType;
28 return SkColorType::kBGRA_8888_SkColorType;
30 return SkColorType::kBGR_101010x_XR_SkColorType;
32 return SkColorType::kBGRA_10101010_XR_SkColorType;
34 return SkColorType::kRGBA_F32_SkColorType;
40sk_sp<SkImage> ConvertBufferToSkImage(
41 const std::shared_ptr<impeller::DeviceBuffer>& buffer,
44 SkImageInfo image_info = SkImageInfo::Make(dimensions,
color_type,
45 SkAlphaType::kPremul_SkAlphaType);
47 auto func = [](
void* addr,
void* context) {
49 static_cast<std::shared_ptr<impeller::DeviceBuffer>*
>(context);
53 auto bytes_per_pixel = image_info.bytesPerPixel();
54 bitmap.installPixels(image_info,
buffer->OnGetContents(),
55 dimensions.width() * bytes_per_pixel, func,
56 new std::shared_ptr<impeller::DeviceBuffer>(buffer));
59 sk_sp<SkImage> raster_image = SkImages::RasterFromBitmap(
bitmap);
63[[nodiscard]]
fml::Status DoConvertImageToRasterImpeller(
64 const sk_sp<DlImage>& dl_image,
65 const std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)>& encode_task,
67 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
68 const std::shared_ptr<impeller::Context>& impeller_context) {
70 is_gpu_disabled_sync_switch->Execute(
72 .SetIfTrue([&result] {
77 [&dl_image, &encode_task, &snapshot_delegate, &impeller_context] {
79 dl_image, encode_task, snapshot_delegate, impeller_context);
87void DoConvertImageToRasterImpellerWithRetry(
88 const sk_sp<DlImage>& dl_image,
89 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)>&& encode_task,
91 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
92 const std::shared_ptr<impeller::Context>& impeller_context,
94 fml::Status status = DoConvertImageToRasterImpeller(
95 dl_image, encode_task, snapshot_delegate, is_gpu_disabled_sync_switch,
101 impeller_context->StoreTaskForGPU(
102 [dl_image, encode_task, snapshot_delegate,
103 is_gpu_disabled_sync_switch, impeller_context,
104 retry_runner]()
mutable {
105 auto retry_task = [dl_image, encode_task = std::move(encode_task),
106 snapshot_delegate, is_gpu_disabled_sync_switch,
108 fml::Status retry_status = DoConvertImageToRasterImpeller(
109 dl_image, encode_task, snapshot_delegate,
110 is_gpu_disabled_sync_switch, impeller_context);
111 if (!retry_status.
ok()) {
114 encode_task(retry_status);
120 retry_runner->PostTask(retry_task);
139 const sk_sp<DlImage>& dl_image,
140 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)> encode_task,
142 const std::shared_ptr<impeller::Context>& impeller_context) {
143 auto impeller_image = dl_image->asImpellerImage();
144 if (!impeller_image) {
146 "Image is not an Impeller image."));
149 auto texture = impeller_image->GetImpellerTexture(impeller_context);
151 if (impeller_context ==
nullptr) {
153 "Impeller context was null."));
163 auto dimensions = dl_image->GetSize();
166 if (dimensions.IsEmpty()) {
168 "Image dimensions were empty."));
174 "Failed to get color type from pixel format."));
182 if (snapshot_delegate) {
183 if (!snapshot_delegate->MakeRenderContextCurrent()) {
185 "Failed to bind the render context."));
194 texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
196 impeller_context->GetResourceAllocator()->CreateBuffer(buffer_desc);
199 "Failed to allocate destination buffer."));
203 auto command_buffer = impeller_context->CreateCommandBuffer();
204 command_buffer->SetLabel(
"BlitTextureToBuffer Command Buffer");
205 auto pass = command_buffer->CreateBlitPass();
206 pass->SetLabel(
"BlitTextureToBuffer Blit Pass");
208 pass->EncodeCommands();
210 encode_task = std::move(encode_task)](
219 encode_task(sk_image);
222 if (!impeller_context->GetCommandQueue()
223 ->Submit({command_buffer}, completion)
225 FML_LOG(ERROR) <<
"Failed to submit commands.";
228 impeller_context->DisposeThreadLocalCachedResources();
232 const sk_sp<DlImage>& dl_image,
233 std::function<
void(
fml::StatusOr<sk_sp<SkImage>>)> encode_task,
237 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
238 const std::shared_ptr<impeller::Context>& impeller_context) {
239 auto original_encode_task = std::move(encode_task);
240 encode_task = [original_encode_task = std::move(original_encode_task),
244 [original_encode_task = std::move(original_encode_task),
249 DoConvertImageToRasterImpellerWithRetry(
250 dl_image, std::move(encode_task),
251 {}, is_gpu_disabled_sync_switch, impeller_context,
256 raster_task_runner->PostTask([dl_image, encode_task = std::move(encode_task),
257 io_task_runner, snapshot_delegate,
258 is_gpu_disabled_sync_switch, impeller_context,
259 raster_task_runner]()
mutable {
260 DoConvertImageToRasterImpellerWithRetry(
261 dl_image, std::move(encode_task), snapshot_delegate,
262 is_gpu_disabled_sync_switch, impeller_context, raster_task_runner);
267 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)
std::shared_ptr< SkBitmap > bitmap
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...