8
8
#include < zircon/status.h>
9
9
10
10
#include " ../runtime/dart/utils/files.h"
11
- #include " compositor_context.h"
12
11
#include " flutter/common/task_runners.h"
13
12
#include " flutter/fml/make_copyable.h"
14
13
#include " flutter/fml/synchronization/waitable_event.h"
15
14
#include " flutter/fml/task_runner.h"
16
15
#include " flutter/runtime/dart_vm_lifecycle.h"
17
16
#include " flutter/shell/common/rasterizer.h"
18
17
#include " flutter/shell/common/run_configuration.h"
18
+ #include " third_party/skia/include/ports/SkFontMgr_fuchsia.h"
19
+
19
20
#include " flutter_runner_product_configuration.h"
21
+ #include " fuchsia_external_view_embedder.h"
20
22
#include " fuchsia_intl.h"
21
23
#include " platform_view.h"
24
+ #include " surface.h"
22
25
#include " task_runner_adapter.h"
23
- #include " third_party/skia/include/ports/SkFontMgr_fuchsia.h"
24
26
#include " thread.h"
25
27
28
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
29
+ #include " compositor_context.h" // nogncheck
30
+ #endif
31
+
26
32
namespace flutter_runner {
27
33
namespace {
28
34
@@ -65,6 +71,9 @@ Engine::Engine(Delegate& delegate,
65
71
FlutterRunnerProductConfiguration product_config)
66
72
: delegate_(delegate),
67
73
thread_label_ (std::move(thread_label)),
74
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
75
+ use_legacy_renderer_ (product_config.use_legacy_renderer()),
76
+ #endif
68
77
weak_factory_ (this ) {
69
78
if (zx::event::create (0 , &vsync_event_) != ZX_OK) {
70
79
FML_DLOG (ERROR) << " Could not create the vsync event." ;
@@ -124,9 +133,18 @@ Engine::Engine(Delegate& delegate,
124
133
thread_label_, std::move (session),
125
134
std::move (session_error_callback), [](auto ) {}, vsync_handle);
126
135
surface_producer_.emplace (session_connection_->get ());
127
- scene_update_context_.emplace (thread_label_, std::move (view_token),
128
- std::move (view_ref_pair),
129
- session_connection_.value ());
136
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
137
+ if (use_legacy_renderer_) {
138
+ legacy_external_view_embedder_.emplace (
139
+ thread_label_, std::move (view_token), std::move (view_ref_pair),
140
+ session_connection_.value ());
141
+ } else
142
+ #endif
143
+ {
144
+ external_view_embedder_.emplace (
145
+ thread_label_, std::move (view_token), std::move (view_ref_pair),
146
+ session_connection_.value (), surface_producer_.value ());
147
+ }
130
148
}));
131
149
132
150
// Grab the parent environment services. The platform view may want to
@@ -152,11 +170,8 @@ Engine::Engine(Delegate& delegate,
152
170
OnDestroyView on_destroy_view_callback =
153
171
std::bind (&Engine::DestroyView, this , std::placeholders::_1);
154
172
155
- OnGetViewEmbedder on_get_view_embedder_callback =
156
- std::bind (&Engine::GetViewEmbedder, this );
157
-
158
- OnGetGrContext on_get_gr_context_callback =
159
- std::bind (&Engine::GetGrContext, this );
173
+ OnCreateSurface on_create_surface_callback =
174
+ std::bind (&Engine::CreateSurface, this );
160
175
161
176
// SessionListener has a OnScenicError method; invoke this callback on the
162
177
// platform thread when that happens. The Session itself should also be
@@ -187,11 +202,9 @@ Engine::Engine(Delegate& delegate,
187
202
on_create_view_callback = std::move (on_create_view_callback),
188
203
on_update_view_callback = std::move (on_update_view_callback),
189
204
on_destroy_view_callback = std::move (on_destroy_view_callback),
190
- on_get_view_embedder_callback =
191
- std::move (on_get_view_embedder_callback),
192
- on_get_gr_context_callback = std::move (on_get_gr_context_callback),
193
- vsync_handle = vsync_event_.get (),
194
- product_config = product_config](flutter::Shell& shell) mutable {
205
+ on_create_surface_callback = std::move (on_create_surface_callback),
206
+ vsync_offset = product_config.get_vsync_offset (),
207
+ vsync_handle = vsync_event_.get ()](flutter::Shell& shell) mutable {
195
208
return std::make_unique<flutter_runner::PlatformView>(
196
209
shell, // delegate
197
210
debug_label, // debug label
@@ -206,27 +219,35 @@ Engine::Engine(Delegate& delegate,
206
219
std::move (on_create_view_callback),
207
220
std::move (on_update_view_callback),
208
221
std::move (on_destroy_view_callback),
209
- std::move (on_get_view_embedder_callback),
210
- std::move (on_get_gr_context_callback),
211
- vsync_handle, // vsync handle
212
- product_config);
222
+ std::move (on_create_surface_callback),
223
+ std::move (vsync_offset), // vsync offset
224
+ vsync_handle);
213
225
});
214
226
215
227
// Setup the callback that will instantiate the rasterizer.
216
- flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer =
217
- fml::MakeCopyable ([this ](flutter::Shell& shell) mutable {
218
- FML_DCHECK (session_connection_);
219
- FML_DCHECK (surface_producer_);
220
- FML_DCHECK (scene_update_context_);
221
-
222
- std::unique_ptr<flutter_runner::CompositorContext> compositor_context =
223
- std::make_unique<flutter_runner::CompositorContext>(
224
- session_connection_.value (), surface_producer_.value (),
225
- scene_update_context_.value ());
226
-
227
- return std::make_unique<flutter::Rasterizer>(
228
- shell, std::move (compositor_context));
229
- });
228
+ flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer;
229
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
230
+ on_create_rasterizer = [this ](flutter::Shell& shell) {
231
+ if (use_legacy_renderer_) {
232
+ FML_DCHECK (session_connection_);
233
+ FML_DCHECK (surface_producer_);
234
+ FML_DCHECK (legacy_external_view_embedder_);
235
+
236
+ auto compositor_context =
237
+ std::make_unique<flutter_runner::CompositorContext>(
238
+ session_connection_.value (), surface_producer_.value (),
239
+ legacy_external_view_embedder_.value ());
240
+ return std::make_unique<flutter::Rasterizer>(
241
+ shell, std::move (compositor_context));
242
+ } else {
243
+ return std::make_unique<flutter::Rasterizer>(shell);
244
+ }
245
+ };
246
+ #else
247
+ on_create_rasterizer = [](flutter::Shell& shell) {
248
+ return std::make_unique<flutter::Rasterizer>(shell);
249
+ };
250
+ #endif
230
251
231
252
settings.root_isolate_create_callback =
232
253
std::bind (&Engine::OnMainIsolateStart, this );
@@ -479,59 +500,97 @@ void Engine::Terminate() {
479
500
}
480
501
481
502
void Engine::DebugWireframeSettingsChanged (bool enabled) {
482
- if (!shell_ || !scene_update_context_) {
483
- return ;
484
- }
485
-
486
- shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask (
487
- [this , enabled]() { scene_update_context_->EnableWireframe (enabled); });
503
+ FML_CHECK (shell_);
504
+
505
+ shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask ([this , enabled]() {
506
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
507
+ if (use_legacy_renderer_) {
508
+ FML_CHECK (legacy_external_view_embedder_);
509
+ legacy_external_view_embedder_->EnableWireframe (enabled);
510
+ } else
511
+ #endif
512
+ {
513
+ FML_CHECK (external_view_embedder_);
514
+ external_view_embedder_->EnableWireframe (enabled);
515
+ }
516
+ });
488
517
}
489
518
490
519
void Engine::CreateView (int64_t view_id, bool hit_testable, bool focusable) {
491
- if (!shell_ || !scene_update_context_) {
492
- return ;
493
- }
520
+ FML_CHECK (shell_);
494
521
495
522
shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask (
496
523
[this , view_id, hit_testable, focusable]() {
497
- scene_update_context_->CreateView (view_id, hit_testable, focusable);
524
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
525
+ if (use_legacy_renderer_) {
526
+ FML_CHECK (legacy_external_view_embedder_);
527
+ legacy_external_view_embedder_->CreateView (view_id, hit_testable,
528
+ focusable);
529
+ } else
530
+ #endif
531
+ {
532
+ FML_CHECK (external_view_embedder_);
533
+ external_view_embedder_->CreateView (view_id);
534
+ external_view_embedder_->SetViewProperties (view_id, hit_testable,
535
+ focusable);
536
+ }
498
537
});
499
538
}
500
539
501
540
void Engine::UpdateView (int64_t view_id, bool hit_testable, bool focusable) {
502
- if (!shell_ || !scene_update_context_) {
503
- return ;
504
- }
541
+ FML_CHECK (shell_);
505
542
506
543
shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask (
507
544
[this , view_id, hit_testable, focusable]() {
508
- scene_update_context_->UpdateView (view_id, hit_testable, focusable);
545
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
546
+ if (use_legacy_renderer_) {
547
+ FML_CHECK (legacy_external_view_embedder_);
548
+ legacy_external_view_embedder_->UpdateView (view_id, hit_testable,
549
+ focusable);
550
+ } else
551
+ #endif
552
+ {
553
+ FML_CHECK (external_view_embedder_);
554
+ external_view_embedder_->SetViewProperties (view_id, hit_testable,
555
+ focusable);
556
+ }
509
557
});
510
558
}
511
559
512
560
void Engine::DestroyView (int64_t view_id) {
513
- if (!shell_ || !scene_update_context_) {
514
- return ;
515
- }
516
-
517
- shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask (
518
- [this , view_id]() { scene_update_context_->DestroyView (view_id); });
561
+ FML_CHECK (shell_);
562
+
563
+ shell_->GetTaskRunners ().GetRasterTaskRunner ()->PostTask ([this , view_id]() {
564
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
565
+ if (use_legacy_renderer_) {
566
+ FML_CHECK (legacy_external_view_embedder_);
567
+ legacy_external_view_embedder_->DestroyView (view_id);
568
+ } else
569
+ #endif
570
+ {
571
+ FML_CHECK (external_view_embedder_);
572
+ external_view_embedder_->DestroyView (view_id);
573
+ }
574
+ });
519
575
}
520
576
521
- flutter::ExternalViewEmbedder* Engine::GetViewEmbedder () {
522
- if (!scene_update_context_) {
523
- return nullptr ;
524
- }
525
-
526
- return &scene_update_context_.value ();
527
- }
577
+ std::unique_ptr<flutter::Surface> Engine::CreateSurface () {
578
+ flutter::ExternalViewEmbedder* external_view_embedder = nullptr ;
528
579
529
- GrDirectContext* Engine::GetGrContext () {
530
- // GetGrContext should be called only after rasterizer is created.
531
- FML_DCHECK (shell_);
532
- FML_DCHECK (shell_->GetRasterizer ());
580
+ #if defined(LEGACY_FUCHSIA_EMBEDDER)
581
+ if (use_legacy_renderer_) {
582
+ FML_CHECK (legacy_external_view_embedder_);
583
+ external_view_embedder = &legacy_external_view_embedder_.value ();
584
+ } else
585
+ #endif
586
+ {
587
+ FML_CHECK (external_view_embedder_);
588
+ external_view_embedder = &external_view_embedder_.value ();
589
+ }
590
+ FML_CHECK (external_view_embedder);
533
591
534
- return surface_producer_->gr_context ();
592
+ return std::make_unique<Surface>(thread_label_, external_view_embedder,
593
+ surface_producer_->gr_context ());
535
594
}
536
595
537
596
#if !defined(DART_PRODUCT)
0 commit comments