Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter::ImageEncodingImpeller Class Reference

#include <image_encoding_impeller.h>

Static Public Member Functions

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)
 

Detailed Description

Definition at line 21 of file image_encoding_impeller.h.

Member Function Documentation

◆ ConvertDlImageToSkImage()

void flutter::ImageEncodingImpeller::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

Converts a DlImage to a SkImage. This should be called from the thread that corresponds to dl_image->owning_context() when gpu access is guaranteed. See also: ConvertImageToRaster. Visible for testing.

Definition at line 138 of file image_encoding_impeller.cc.

142 {
143 auto impeller_image = dl_image->asImpellerImage();
144 if (!impeller_image) {
146 "Image is not an Impeller image."));
147 return;
148 }
149 auto texture = impeller_image->GetImpellerTexture(impeller_context);
150
151 if (impeller_context == nullptr) {
153 "Impeller context was null."));
154 return;
155 }
156
157 if (texture == nullptr) {
158 encode_task(
160 return;
161 }
162
163 auto dimensions = dl_image->GetSize();
164 auto color_type = ToSkColorType(texture->GetTextureDescriptor().format);
165
166 if (dimensions.IsEmpty()) {
168 "Image dimensions were empty."));
169 return;
170 }
171
172 if (!color_type.has_value()) {
174 "Failed to get color type from pixel format."));
175 return;
176 }
177
178 // Ensure that this thread has a context that can execute rendering
179 // commands. The thread may not already have a context if the raster
180 // task runner was assigned to a new thread and no previous rendering
181 // task has run on that thread.
182 if (snapshot_delegate) {
183 if (!snapshot_delegate->MakeRenderContextCurrent()) {
185 "Failed to bind the render context."));
186 return;
187 }
188 }
189
192 buffer_desc.readback = true; // set to false for testing.
193 buffer_desc.size =
194 texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
195 auto buffer =
196 impeller_context->GetResourceAllocator()->CreateBuffer(buffer_desc);
197 if (!buffer) {
199 "Failed to allocate destination buffer."));
200 return;
201 }
202
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");
207 pass->AddCopy(texture, buffer);
208 pass->EncodeCommands();
209 auto completion = [buffer, color_type = color_type.value(), dimensions,
210 encode_task = std::move(encode_task)](
213 encode_task(fml::Status(fml::StatusCode::kUnknown, ""));
214 return;
215 }
216 buffer->Invalidate();
217 auto sk_image =
218 ConvertBufferToSkImage(buffer, color_type, ToSkISize(dimensions));
219 encode_task(sk_image);
220 };
221
222 if (!impeller_context->GetCommandQueue()
223 ->Submit({command_buffer}, completion)
224 .ok()) {
225 FML_LOG(ERROR) << "Failed to submit commands.";
226 }
227
228 impeller_context->DisposeThreadLocalCachedResources();
229}
#define FML_LOG(severity)
Definition logging.h:101
FlTexture * texture
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
Definition switch_defs.h:98
const SkISize & ToSkISize(const DlISize &size)
uint32_t color_type

References flutter::buffer, color_type, FML_LOG, impeller::CommandBuffer::kCompleted, fml::kFailedPrecondition, impeller::kHostVisible, fml::kUnimplemented, fml::kUnknown, impeller::DeviceBufferDescriptor::readback, impeller::DeviceBufferDescriptor::size, impeller::DeviceBufferDescriptor::storage_mode, texture, and flutter::ToSkISize().

◆ ConvertImageToRaster()

void flutter::ImageEncodingImpeller::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 
)
static

Converts a DlImage to a SkImage. encode_task is executed with the resulting SkImage.

Definition at line 231 of file image_encoding_impeller.cc.

238 {
239 auto original_encode_task = std::move(encode_task);
240 encode_task = [original_encode_task = std::move(original_encode_task),
241 io_task_runner](fml::StatusOr<sk_sp<SkImage>> image) mutable {
243 io_task_runner,
244 [original_encode_task = std::move(original_encode_task),
245 image = std::move(image)]() { original_encode_task(image); });
246 };
247
248 if (dl_image->owning_context() != DlImage::OwningContext::kRaster) {
249 DoConvertImageToRasterImpellerWithRetry(
250 dl_image, std::move(encode_task),
251 /*snapshot_delegate=*/{}, is_gpu_disabled_sync_switch, impeller_context,
252 /*retry_runner=*/nullptr);
253 return;
254 }
255
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);
263 });
264}
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
virtual void PostTask(const fml::closure &task) override
FlutterVulkanImage * image

References image, flutter::DlImage::kRaster, and fml::TaskRunner::RunNowOrPostTask().

◆ GetColorSpace()

int flutter::ImageEncodingImpeller::GetColorSpace ( const std::shared_ptr< impeller::Texture > &  texture)
static

Definition at line 266 of file image_encoding_impeller.cc.

267 {
268 const impeller::TextureDescriptor& desc = texture->GetTextureDescriptor();
269 switch (desc.format) {
270 case impeller::PixelFormat::kB10G10R10XR: // intentional_fallthrough
273 default:
274 return ColorSpace::kSRGB;
275 }
276}
@ kExtendedSRGB
Definition image.h:26
@ kSRGB
Definition image.h:25
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...

References impeller::TextureDescriptor::format, impeller::kB10G10R10XR, flutter::kExtendedSRGB, impeller::kR16G16B16A16Float, flutter::kSRGB, and texture.


The documentation for this class was generated from the following files: