Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 08e8ff1

Browse files
committed
State machine
1 parent e095f1f commit 08e8ff1

9 files changed

Lines changed: 67 additions & 48 deletions

File tree

flow/embedded_views.cc

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ bool DisplayListEmbedderViewSlice::recording_ended() {
4242
return builder_ == nullptr;
4343
}
4444

45+
void ExternalViewEmbedder::BeginFrame(
46+
GrDirectContext* context,
47+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
48+
SetState(State::kFrameStarted);
49+
}
50+
51+
void ExternalViewEmbedder::PrepareView(int64_t native_view_id,
52+
SkISize frame_size,
53+
double device_pixel_ratio) {
54+
SetState(State::kViewPrepared);
55+
}
56+
4557
void ExternalViewEmbedder::SubmitView(
4658
GrDirectContext* context,
4759
const std::shared_ptr<impeller::AiksContext>& aiks_context,
@@ -50,6 +62,16 @@ void ExternalViewEmbedder::SubmitView(
5062
frame->Submit();
5163
}
5264

65+
void ExternalViewEmbedder::EndFrame(
66+
bool should_resubmit_frame,
67+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
68+
SetState(State::kIdle);
69+
}
70+
71+
void ExternalViewEmbedder::CancelFrame() {
72+
SetState(State::kIdle);
73+
}
74+
5375
void ExternalViewEmbedder::EndFrameIfNecessary(
5476
bool should_resubmit_frame,
5577
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
@@ -67,25 +89,47 @@ bool ExternalViewEmbedder::SupportsDynamicThreadMerging() {
6789
void ExternalViewEmbedder::Teardown() {}
6890

6991
void ExternalViewEmbedder::SetState(State new_state) {
92+
#ifdef NDEBUG
93+
return;
94+
#else
95+
auto CheckState = [current_state = state_](bool condition) {
96+
auto StateToString = [](State state) -> const char* {
97+
switch (state) {
98+
case State::kIdle:
99+
return "kIdle";
100+
case State::kFrameStarted:
101+
return "kFrameStarted";
102+
case State::kViewPrepared:
103+
return "kViewPrepared";
104+
};
105+
FML_UNREACHABLE();
106+
return "";
107+
};
108+
109+
FML_DCHECK(condition) << "Current state is "
110+
<< StateToString(current_state);
111+
};
112+
70113
switch (state_) {
71114
case State::kIdle:
72-
FML_DCHECK(new_state == State::kFrameStarted);
115+
CheckState(new_state == State::kFrameStarted);
73116
break;
74117

75118
case State::kFrameStarted:
76-
FML_DCHECK(new_state == State::kIdle ||
119+
CheckState(new_state == State::kIdle ||
77120
new_state == State::kViewPrepared);
78121
break;
79122

80123
case State::kViewPrepared:
81-
FML_DCHECK(new_state == State::kFrameStarted);
124+
CheckState(new_state == State::kFrameStarted);
82125
break;
83126

84127
default:
85128
FML_UNREACHABLE();
86129
break;
87130
}
88131
state_ = new_state;
132+
#endif
89133
}
90134

91135
void MutatorsStack::PushClipRect(const SkRect& rect) {

flow/embedded_views.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -381,15 +381,15 @@ class ExternalViewEmbedder {
381381

382382
// Call this in-lieu of |SubmitView| to clear pre-roll state and
383383
// sets the stage for the next pre-roll.
384-
virtual void CancelFrame() = 0;
384+
virtual void CancelFrame();
385385

386386
// Indicates the beginning of a frame.
387387
//
388388
// The `raster_thread_merger` will be null if |SupportsDynamicThreadMerging|
389389
// returns false.
390390
virtual void BeginFrame(
391391
GrDirectContext* context,
392-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) = 0;
392+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger);
393393

394394
virtual void PrerollCompositeEmbeddedView(
395395
int64_t view_id,
@@ -409,7 +409,7 @@ class ExternalViewEmbedder {
409409

410410
virtual void PrepareView(int64_t native_view_id,
411411
SkISize frame_size,
412-
double device_pixel_ratio) = 0;
412+
double device_pixel_ratio);
413413

414414
// Implementers must submit the frame by calling frame.Submit().
415415
//
@@ -434,7 +434,7 @@ class ExternalViewEmbedder {
434434
// returns false.
435435
virtual void EndFrame(
436436
bool should_resubmit_frame,
437-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {}
437+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger);
438438

439439
void EndFrameIfNecessary(
440440
bool should_resubmit_frame,
@@ -480,7 +480,6 @@ class ExternalViewEmbedder {
480480

481481
private:
482482
FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder);
483-
484483
}; // ExternalViewEmbedder
485484

486485
} // namespace flutter

flow/testing/mock_embedder.cc

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,6 @@ DlCanvas* MockViewEmbedder::GetRootCanvas() {
2020
return nullptr;
2121
}
2222

23-
// |ExternalViewEmbedder|
24-
void MockViewEmbedder::CancelFrame() {}
25-
26-
// |ExternalViewEmbedder|
27-
void MockViewEmbedder::BeginFrame(
28-
GrDirectContext* context,
29-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {}
30-
31-
// |ExternalViewEmbedder|
32-
void MockViewEmbedder::PrepareView(int64_t native_view_id,
33-
SkISize frame_size,
34-
double device_pixel_ratio) {}
35-
3623
// |ExternalViewEmbedder|
3724
void MockViewEmbedder::PrerollCompositeEmbeddedView(
3825
int64_t view_id,

flow/testing/mock_embedder.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,6 @@ class MockViewEmbedder : public ExternalViewEmbedder {
2121
// |ExternalViewEmbedder|
2222
DlCanvas* GetRootCanvas() override;
2323

24-
// |ExternalViewEmbedder|
25-
void CancelFrame() override;
26-
27-
// |ExternalViewEmbedder|
28-
void BeginFrame(
29-
GrDirectContext* context,
30-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
31-
32-
// |ExternalViewEmbedder|
33-
void PrepareView(int64_t native_view_id,
34-
SkISize frame_size,
35-
double device_pixel_ratio) override;
36-
3724
// |ExternalViewEmbedder|
3825
void PrerollCompositeEmbeddedView(
3926
int64_t view_id,

shell/platform/android/external_view_embedder/external_view_embedder.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ void AndroidExternalViewEmbedder::Reset() {
260260
void AndroidExternalViewEmbedder::BeginFrame(
261261
GrDirectContext* context,
262262
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
263+
SetState(State::kFrameStarted);
263264
// JNI method must be called on the platform thread.
264265
if (raster_thread_merger->IsOnPlatformThread()) {
265266
jni_facade_->FlutterViewBeginFrame();
@@ -273,6 +274,7 @@ void AndroidExternalViewEmbedder::PrepareView(int64_t native_view_id,
273274
// TODO(dkwingsmt): This class only supports rendering into the implicit view.
274275
// Properly support multi-view in the future.
275276
FML_DCHECK(native_view_id == kFlutterImplicitViewId);
277+
SetState(State::kViewPrepared);
276278
Reset();
277279

278280
// The surface size changed. Therefore, destroy existing surfaces as
@@ -288,13 +290,15 @@ void AndroidExternalViewEmbedder::PrepareView(int64_t native_view_id,
288290

289291
// |ExternalViewEmbedder|
290292
void AndroidExternalViewEmbedder::CancelFrame() {
293+
SetState(State::kIdle);
291294
Reset();
292295
}
293296

294297
// |ExternalViewEmbedder|
295298
void AndroidExternalViewEmbedder::EndFrame(
296299
bool should_resubmit_frame,
297300
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
301+
SetState(State::kIdle);
298302
surface_pool_->RecycleLayers();
299303
// JNI method must be called on the platform thread.
300304
if (raster_thread_merger->IsOnPlatformThread()) {

shell/platform/darwin/ios/ios_external_view_embedder.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
void IOSExternalViewEmbedder::CancelFrame() {
2929
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CancelFrame");
3030
FML_CHECK(platform_views_controller_);
31+
SetState(State::kIdle);
3132
platform_views_controller_->CancelFrame();
3233
}
3334

@@ -36,6 +37,7 @@
3637
GrDirectContext* context,
3738
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
3839
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::BeginFrame");
40+
SetState(State::kFrameStarted);
3941
}
4042

4143
// |ExternalViewEmbedder|
@@ -45,6 +47,7 @@
4547
// TODO(dkwingsmt): This class only supports rendering into the implicit view.
4648
// Properly support multi-view in the future.
4749
FML_DCHECK(native_view_id == kFlutterImplicitViewId);
50+
SetState(State::kViewPrepared);
4851
FML_CHECK(platform_views_controller_);
4952
platform_views_controller_->BeginFrame(frame_size);
5053
}
@@ -79,6 +82,7 @@
7982
const std::shared_ptr<impeller::AiksContext>& aiks_context,
8083
std::unique_ptr<SurfaceFrame> frame) {
8184
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::SubmitView");
85+
SetState(State::kFrameStarted);
8286
FML_CHECK(platform_views_controller_);
8387
platform_views_controller_->SubmitFrame(context, ios_context_, std::move(frame));
8488
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::DidSubmitFrame");
@@ -87,6 +91,7 @@
8791
// |ExternalViewEmbedder|
8892
void IOSExternalViewEmbedder::EndFrame(bool should_resubmit_frame,
8993
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
94+
SetState(State::kIdle);
9095
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::EndFrame");
9196
platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger);
9297
}

shell/platform/embedder/embedder_external_view_embedder.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,16 @@ void EmbedderExternalViewEmbedder::Reset() {
4747

4848
// |ExternalViewEmbedder|
4949
void EmbedderExternalViewEmbedder::CancelFrame() {
50+
SetState(State::kIdle);
5051
Reset();
5152
}
5253

5354
// |ExternalViewEmbedder|
5455
void EmbedderExternalViewEmbedder::BeginFrame(
5556
GrDirectContext* context,
56-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {}
57+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
58+
SetState(State::kFrameStarted);
59+
}
5760

5861
// |ExternalViewEmbedder|
5962
void EmbedderExternalViewEmbedder::PrepareView(int64_t native_view_id,
@@ -62,6 +65,7 @@ void EmbedderExternalViewEmbedder::PrepareView(int64_t native_view_id,
6265
// TODO(dkwingsmt): This class only supports rendering into the implicit view.
6366
// Properly support multi-view in the future.
6467
FML_DCHECK(native_view_id == kFlutterImplicitViewId);
68+
SetState(State::kViewPrepared);
6569
Reset();
6670

6771
pending_frame_size_ = frame_size;
@@ -134,6 +138,7 @@ void EmbedderExternalViewEmbedder::SubmitView(
134138
GrDirectContext* context,
135139
const std::shared_ptr<impeller::AiksContext>& aiks_context,
136140
std::unique_ptr<SurfaceFrame> frame) {
141+
SetState(State::kFrameStarted);
137142
auto [matched_render_targets, pending_keys] =
138143
render_target_cache_.GetExistingTargetsInCache(pending_views_);
139144

shell/platform/fuchsia/flutter/external_view_embedder.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ void ExternalViewEmbedder::BeginFrame(
112112
GrDirectContext* context,
113113
double device_pixel_ratio,
114114
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
115+
SetState(State::kFrameStarted);
115116
TRACE_EVENT0("flutter", "ExternalViewEmbedder::BeginFrame");
116117

117118
// Reset for new frame.

shell/testing/tester_main.cc

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,19 +134,6 @@ class TesterExternalViewEmbedder : public ExternalViewEmbedder {
134134
// |ExternalViewEmbedder|
135135
DlCanvas* GetRootCanvas() override { return nullptr; }
136136

137-
// |ExternalViewEmbedder|
138-
void CancelFrame() override {}
139-
140-
// |ExternalViewEmbedder|
141-
void BeginFrame(
142-
GrDirectContext* context,
143-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override {}
144-
145-
// |ExternalViewEmbedder|
146-
void PrepareView(int64_t native_view_id,
147-
SkISize frame_size,
148-
double device_pixel_ratio) override {}
149-
150137
// |ExternalViewEmbedder|
151138
void PrerollCompositeEmbeddedView(
152139
int64_t view_id,

0 commit comments

Comments
 (0)