@@ -1290,14 +1290,23 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
12901290 SAFE_ACCESS (compositor, collect_backing_store_callback, nullptr );
12911291 auto c_present_callback =
12921292 SAFE_ACCESS (compositor, present_layers_callback, nullptr );
1293+ auto c_present_view_callback =
1294+ SAFE_ACCESS (compositor, present_view_callback, nullptr );
12931295 bool avoid_backing_store_cache =
12941296 SAFE_ACCESS (compositor, avoid_backing_store_cache, false );
12951297
12961298 // Make sure the required callbacks are present
1297- if (!c_create_callback || !c_collect_callback || !c_present_callback ) {
1299+ if (!c_create_callback || !c_collect_callback) {
12981300 FML_LOG (ERROR) << " Required compositor callbacks absent." ;
12991301 return {nullptr , true };
13001302 }
1303+ // Either the present view or the present layers callback must be provided.
1304+ if ((!c_present_view_callback && !c_present_callback) ||
1305+ (c_present_view_callback && c_present_callback)) {
1306+ FML_LOG (ERROR) << " Either present_layers_callback or present_view_callback "
1307+ " must be provided but not both." ;
1308+ return {nullptr , true };
1309+ }
13011310
13021311 FlutterCompositor captured_compositor = *compositor;
13031312
@@ -1312,15 +1321,33 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
13121321 enable_impeller);
13131322 };
13141323
1315- flutter::EmbedderExternalViewEmbedder::PresentCallback present_callback =
1316- [c_present_callback,
1317- user_data = compositor->user_data ](const auto & layers) {
1318- TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1319- return c_present_callback (
1320- const_cast <const FlutterLayer**>(layers.data ()), layers.size (),
1321- user_data);
1324+ flutter::EmbedderExternalViewEmbedder::PresentCallback present_callback;
1325+ if (c_present_callback) {
1326+ present_callback = [c_present_callback, user_data = compositor->user_data ](
1327+ FlutterViewId view_id, const auto & layers) {
1328+ TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1329+ return c_present_callback (const_cast <const FlutterLayer**>(layers.data ()),
1330+ layers.size (), user_data);
1331+ };
1332+ } else {
1333+ FML_DCHECK (c_present_view_callback != nullptr );
1334+ present_callback = [c_present_view_callback,
1335+ user_data = compositor->user_data ](
1336+ FlutterViewId view_id, const auto & layers) {
1337+ TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1338+
1339+ FlutterPresentViewInfo info = {
1340+ .struct_size = sizeof (FlutterPresentViewInfo),
1341+ .view_id = view_id,
1342+ .layers = const_cast <const FlutterLayer**>(layers.data ()),
1343+ .layers_count = layers.size (),
1344+ .user_data = user_data,
13221345 };
13231346
1347+ return c_present_view_callback (&info);
1348+ };
1349+ }
1350+
13241351 return {std::make_unique<flutter::EmbedderExternalViewEmbedder>(
13251352 avoid_backing_store_cache, create_render_target_callback,
13261353 present_callback),
0 commit comments