@@ -1288,14 +1288,23 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
12881288 SAFE_ACCESS (compositor, collect_backing_store_callback, nullptr );
12891289 auto c_present_callback =
12901290 SAFE_ACCESS (compositor, present_layers_callback, nullptr );
1291+ auto c_present_view_callback =
1292+ SAFE_ACCESS (compositor, present_view_callback, nullptr );
12911293 bool avoid_backing_store_cache =
12921294 SAFE_ACCESS (compositor, avoid_backing_store_cache, false );
12931295
12941296 // Make sure the required callbacks are present
1295- if (!c_create_callback || !c_collect_callback || !c_present_callback ) {
1297+ if (!c_create_callback || !c_collect_callback) {
12961298 FML_LOG (ERROR) << " Required compositor callbacks absent." ;
12971299 return {nullptr , true };
12981300 }
1301+ // Either the present view or the present layers callback must be provided.
1302+ if ((!c_present_view_callback && !c_present_callback) ||
1303+ (c_present_view_callback && c_present_callback)) {
1304+ FML_LOG (ERROR) << " Either present_layers_callback or present_view_callback "
1305+ " must be provided but not both." ;
1306+ return {nullptr , true };
1307+ }
12991308
13001309 FlutterCompositor captured_compositor = *compositor;
13011310
@@ -1310,15 +1319,33 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
13101319 enable_impeller);
13111320 };
13121321
1313- flutter::EmbedderExternalViewEmbedder::PresentCallback present_callback =
1314- [c_present_callback,
1315- user_data = compositor->user_data ](const auto & layers) {
1316- TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1317- return c_present_callback (
1318- const_cast <const FlutterLayer**>(layers.data ()), layers.size (),
1319- user_data);
1322+ flutter::EmbedderExternalViewEmbedder::PresentCallback present_callback;
1323+ if (c_present_callback) {
1324+ present_callback = [c_present_callback, user_data = compositor->user_data ](
1325+ FlutterViewId view_id, const auto & layers) {
1326+ TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1327+ return c_present_callback (const_cast <const FlutterLayer**>(layers.data ()),
1328+ layers.size (), user_data);
1329+ };
1330+ } else {
1331+ FML_DCHECK (c_present_view_callback != nullptr );
1332+ present_callback = [c_present_view_callback,
1333+ user_data = compositor->user_data ](
1334+ FlutterViewId view_id, const auto & layers) {
1335+ TRACE_EVENT0 (" flutter" , " FlutterCompositorPresentLayers" );
1336+
1337+ FlutterPresentViewInfo info = {
1338+ .struct_size = sizeof (FlutterPresentViewInfo),
1339+ .view_id = view_id,
1340+ .layers = const_cast <const FlutterLayer**>(layers.data ()),
1341+ .layers_count = layers.size (),
1342+ .user_data = user_data,
13201343 };
13211344
1345+ return c_present_view_callback (&info);
1346+ };
1347+ }
1348+
13221349 return {std::make_unique<flutter::EmbedderExternalViewEmbedder>(
13231350 avoid_backing_store_cache, create_render_target_callback,
13241351 present_callback),
0 commit comments