@@ -356,13 +356,65 @@ FlutterResult FlutterEngineRun(size_t version,
356
356
return std::make_unique<shell::Rasterizer>(shell.GetTaskRunners ());
357
357
};
358
358
359
+ // TODO(chinmaygarde): This is the wrong spot for this. It belongs in the
360
+ // platform view jump table.
361
+ shell::EmbedderExternalTextureGL::ExternalTextureCallback
362
+ external_texture_callback;
363
+ if (config->type == kOpenGL ) {
364
+ const FlutterOpenGLRendererConfig* open_gl_config = &config->open_gl ;
365
+ if (SAFE_ACCESS (open_gl_config, gl_external_texture_frame_callback,
366
+ nullptr ) != nullptr ) {
367
+ external_texture_callback =
368
+ [ptr = open_gl_config->gl_external_texture_frame_callback , user_data](
369
+ int64_t texture_identifier, GrContext* context,
370
+ const SkISize& size) -> sk_sp<SkImage> {
371
+ FlutterOpenGLTexture texture = {};
372
+
373
+ if (!ptr (user_data, texture_identifier, size.width (), size.height (),
374
+ &texture)) {
375
+ return nullptr ;
376
+ }
377
+
378
+ GrGLTextureInfo gr_texture_info = {texture.target , texture.name ,
379
+ texture.format };
380
+
381
+ GrBackendTexture gr_backend_texture (size.width (), size.height (),
382
+ GrMipMapped::kNo , gr_texture_info);
383
+ SkImage::TextureReleaseProc release_proc = texture.destruction_callback ;
384
+ auto image = SkImage::MakeFromTexture (
385
+ context, // context
386
+ gr_backend_texture, // texture handle
387
+ kTopLeft_GrSurfaceOrigin , // origin
388
+ kRGBA_8888_SkColorType , // color type
389
+ kPremul_SkAlphaType , // alpha type
390
+ nullptr , // colorspace
391
+ release_proc, // texture release proc
392
+ texture.user_data // texture release context
393
+ );
394
+
395
+ if (!image) {
396
+ // In case Skia rejects the image, call the release proc so that
397
+ // embedders can perform collection of intermediates.
398
+ if (release_proc) {
399
+ release_proc (texture.user_data );
400
+ }
401
+ FML_LOG (ERROR) << " Could not create external texture." ;
402
+ return nullptr ;
403
+ }
404
+
405
+ return image;
406
+ };
407
+ }
408
+ }
409
+
359
410
// Step 1: Create the engine.
360
411
auto embedder_engine =
361
- std::make_unique<shell::EmbedderEngine>(std::move (thread_host), //
362
- std::move (task_runners), //
363
- settings, //
364
- on_create_platform_view, //
365
- on_create_rasterizer //
412
+ std::make_unique<shell::EmbedderEngine>(std::move (thread_host), //
413
+ std::move (task_runners), //
414
+ settings, //
415
+ on_create_platform_view, //
416
+ on_create_rasterizer, //
417
+ external_texture_callback //
366
418
);
367
419
368
420
if (!embedder_engine->IsValid ()) {
@@ -524,3 +576,43 @@ FlutterResult __FlutterEngineFlushPendingTasksNow() {
524
576
fml::MessageLoop::GetCurrent ().RunExpiredTasksNow ();
525
577
return kSuccess ;
526
578
}
579
+
580
+ FlutterResult FlutterEngineRegisterExternalTexture (FlutterEngine engine,
581
+ int64_t texture_identifier) {
582
+ if (engine == nullptr || texture_identifier == 0 ) {
583
+ return kInvalidArguments ;
584
+ }
585
+ if (!reinterpret_cast <shell::EmbedderEngine*>(engine)->RegisterTexture (
586
+ texture_identifier)) {
587
+ return kInternalInconsistency ;
588
+ }
589
+ return kSuccess ;
590
+ }
591
+
592
+ FlutterResult FlutterEngineUnregisterExternalTexture (
593
+ FlutterEngine engine,
594
+ int64_t texture_identifier) {
595
+ if (engine == nullptr || texture_identifier == 0 ) {
596
+ return kInvalidArguments ;
597
+ }
598
+
599
+ if (!reinterpret_cast <shell::EmbedderEngine*>(engine)->UnregisterTexture (
600
+ texture_identifier)) {
601
+ return kInternalInconsistency ;
602
+ }
603
+
604
+ return kSuccess ;
605
+ }
606
+
607
+ FlutterResult FlutterEngineMarkExternalTextureFrameAvailable (
608
+ FlutterEngine engine,
609
+ int64_t texture_identifier) {
610
+ if (engine == nullptr || texture_identifier == 0 ) {
611
+ return kInvalidArguments ;
612
+ }
613
+ if (!reinterpret_cast <shell::EmbedderEngine*>(engine)
614
+ ->MarkTextureFrameAvailable (texture_identifier)) {
615
+ return kInternalInconsistency ;
616
+ }
617
+ return kSuccess ;
618
+ }
0 commit comments