@@ -64,9 +64,20 @@ extern const intptr_t kPlatformStrongDillSize;
6464#include " rapidjson/rapidjson.h"
6565#include " rapidjson/writer.h"
6666
67+ // Note: the IMPELLER_SUPPORTS_RENDERING may be defined even when the
68+ // embedder/BUILD.gn variable impeller_supports_rendering is disabled.
6769#ifdef SHELL_ENABLE_GL
6870#include " flutter/shell/platform/embedder/embedder_external_texture_gl.h"
69- #endif
71+ #ifdef IMPELLER_SUPPORTS_RENDERING
72+ #include " flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck
73+ #include " flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" // nogncheck
74+ #include " impeller/core/texture.h" // nogncheck
75+ #include " impeller/renderer/backend/gles/context_gles.h" // nogncheck
76+ #include " impeller/renderer/backend/gles/texture_gles.h" // nogncheck
77+ #include " impeller/renderer/context.h" // nogncheck
78+ #include " impeller/renderer/render_target.h" // nogncheck
79+ #endif // IMPELLER_SUPPORTS_RENDERING
80+ #endif // SHELL_ENABLE_GL
7081
7182#ifdef SHELL_ENABLE_METAL
7283#include " flutter/shell/platform/embedder/embedder_surface_metal.h"
@@ -265,7 +276,8 @@ InferOpenGLPlatformViewCreationCallback(
265276 const flutter::PlatformViewEmbedder::PlatformDispatchTable&
266277 platform_dispatch_table,
267278 std::unique_ptr<flutter::EmbedderExternalViewEmbedder>
268- external_view_embedder) {
279+ external_view_embedder,
280+ bool enable_impeller) {
269281#ifdef SHELL_ENABLE_GL
270282 if (config->type != kOpenGL ) {
271283 return nullptr ;
@@ -441,15 +453,30 @@ InferOpenGLPlatformViewCreationCallback(
441453
442454 return fml::MakeCopyable (
443455 [gl_dispatch_table, fbo_reset_after_present, platform_dispatch_table,
456+ enable_impeller,
444457 external_view_embedder =
445458 std::move (external_view_embedder)](flutter::Shell& shell) mutable {
459+ std::shared_ptr<flutter::EmbedderExternalViewEmbedder> view_embedder =
460+ std::move (external_view_embedder);
461+ if (enable_impeller) {
462+ return std::make_unique<flutter::PlatformViewEmbedder>(
463+ shell, // delegate
464+ shell.GetTaskRunners (), // task runners
465+ std::make_unique<flutter::EmbedderSurfaceGLImpeller>(
466+ gl_dispatch_table, fbo_reset_after_present,
467+ view_embedder), // embedder_surface
468+ platform_dispatch_table, // embedder platform dispatch table
469+ view_embedder // external view embedder
470+ );
471+ }
446472 return std::make_unique<flutter::PlatformViewEmbedder>(
447- shell, // delegate
448- shell.GetTaskRunners (), // task runners
449- gl_dispatch_table, // embedder GL dispatch table
450- fbo_reset_after_present, // fbo reset after present
473+ shell, // delegate
474+ shell.GetTaskRunners (), // task runners
475+ std::make_unique<flutter::EmbedderSurfaceGL>(
476+ gl_dispatch_table, fbo_reset_after_present,
477+ view_embedder), // embedder_surface
451478 platform_dispatch_table, // embedder platform dispatch table
452- std::move (external_view_embedder) // external view embedder
479+ view_embedder // external view embedder
453480 );
454481 });
455482#else
@@ -686,7 +713,7 @@ InferPlatformViewCreationCallback(
686713 case kOpenGL :
687714 return InferOpenGLPlatformViewCreationCallback (
688715 config, user_data, platform_dispatch_table,
689- std::move (external_view_embedder));
716+ std::move (external_view_embedder), enable_impeller );
690717 case kSoftware :
691718 return InferSoftwarePlatformViewCreationCallback (
692719 config, user_data, platform_dispatch_table,
@@ -924,6 +951,66 @@ static sk_sp<SkSurface> MakeSkSurfaceFromBackingStore(
924951#endif
925952}
926953
954+ static std::unique_ptr<flutter::EmbedderRenderTarget>
955+ MakeRenderTargetFromBackingStoreImpeller (
956+ FlutterBackingStore backing_store,
957+ const fml::closure& on_release,
958+ const std::shared_ptr<impeller::AiksContext>& aiks_context,
959+ const FlutterBackingStoreConfig& config,
960+ const FlutterOpenGLFramebuffer* framebuffer) {
961+ #if defined(SHELL_ENABLE_GL) && defined(IMPELLER_SUPPORTS_RENDERING)
962+
963+ const auto & gl_context =
964+ impeller::ContextGLES::Cast (*aiks_context->GetContext ());
965+ const auto size = impeller::ISize (config.size .width , config.size .height );
966+
967+ impeller::TextureDescriptor color0_tex;
968+ color0_tex.type = impeller::TextureType::kTexture2D ;
969+ color0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt ;
970+ color0_tex.size = size;
971+ color0_tex.usage = static_cast <impeller::TextureUsageMask>(
972+ impeller::TextureUsage::kRenderTarget );
973+ color0_tex.sample_count = impeller::SampleCount::kCount1 ;
974+ color0_tex.storage_mode = impeller::StorageMode::kDevicePrivate ;
975+
976+ impeller::ColorAttachment color0;
977+ color0.texture = std::make_shared<impeller::TextureGLES>(
978+ gl_context.GetReactor (), color0_tex,
979+ impeller::TextureGLES::IsWrapped::kWrapped );
980+ color0.clear_color = impeller::Color::DarkSlateGray ();
981+ color0.load_action = impeller::LoadAction::kClear ;
982+ color0.store_action = impeller::StoreAction::kStore ;
983+
984+ impeller::TextureDescriptor stencil0_tex;
985+ stencil0_tex.type = impeller::TextureType::kTexture2D ;
986+ stencil0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt ;
987+ stencil0_tex.size = size;
988+ stencil0_tex.usage = static_cast <impeller::TextureUsageMask>(
989+ impeller::TextureUsage::kRenderTarget );
990+ stencil0_tex.sample_count = impeller::SampleCount::kCount1 ;
991+
992+ impeller::StencilAttachment stencil0;
993+ stencil0.clear_stencil = 0 ;
994+ stencil0.texture = std::make_shared<impeller::TextureGLES>(
995+ gl_context.GetReactor (), stencil0_tex,
996+ impeller::TextureGLES::IsWrapped::kWrapped );
997+ stencil0.load_action = impeller::LoadAction::kClear ;
998+ stencil0.store_action = impeller::StoreAction::kDontCare ;
999+
1000+ impeller::RenderTarget render_target_desc;
1001+
1002+ render_target_desc.SetColorAttachment (color0, framebuffer->target );
1003+ render_target_desc.SetStencilAttachment (stencil0);
1004+
1005+ return std::make_unique<flutter::EmbedderRenderTargetImpeller>(
1006+ backing_store, aiks_context,
1007+ std::make_unique<impeller::RenderTarget>(std::move (render_target_desc)),
1008+ on_release);
1009+ #else
1010+ return nullptr ;
1011+ #endif
1012+ }
1013+
9271014static std::unique_ptr<flutter::EmbedderRenderTarget>
9281015MakeRenderTargetFromBackingStoreImpeller (
9291016 FlutterBackingStore backing_store,
@@ -1113,12 +1200,19 @@ CreateEmbedderRenderTarget(
11131200 break ;
11141201 }
11151202 case kFlutterOpenGLTargetTypeFramebuffer : {
1116- auto skia_surface = MakeSkSurfaceFromBackingStore (
1117- context, config, &backing_store.open_gl .framebuffer );
1118- render_target = MakeRenderTargetFromSkSurface (
1119- backing_store, std::move (skia_surface),
1120- collect_callback.Release ());
1121- break ;
1203+ if (enable_impeller) {
1204+ render_target = MakeRenderTargetFromBackingStoreImpeller (
1205+ backing_store, collect_callback.Release (), aiks_context, config,
1206+ &backing_store.open_gl .framebuffer );
1207+ break ;
1208+ } else {
1209+ auto skia_surface = MakeSkSurfaceFromBackingStore (
1210+ context, config, &backing_store.open_gl .framebuffer );
1211+ render_target = MakeRenderTargetFromSkSurface (
1212+ backing_store, std::move (skia_surface),
1213+ collect_callback.Release ());
1214+ break ;
1215+ }
11221216 }
11231217 }
11241218 break ;
0 commit comments