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

Commit 5f8e91c

Browse files
author
Emmanuel Garcia
authored
Resubmit frame when the surface is switched (#19555)
1 parent ab0abdd commit 5f8e91c

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

shell/platform/android/external_view_embedder/external_view_embedder.cc

+6-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ bool AndroidExternalViewEmbedder::SubmitFrame(
146146
// Submit the background canvas frame before switching the GL context to
147147
// the overlay surfaces.
148148
//
149-
// Skip a frame if the embedding is switching surfaces.
149+
// Skip a frame if the embedding is switching surfaces, and indicate in
150+
// `PostPrerollAction` that this frame must be resubmitted.
150151
auto should_submit_current_frame =
151152
previous_frame_view_count_ > 0 || current_frame_view_count == 0;
152153
if (should_submit_current_frame) {
@@ -233,6 +234,10 @@ PostPrerollResult AndroidExternalViewEmbedder::PostPrerollAction(
233234
CancelFrame();
234235
return PostPrerollResult::kResubmitFrame;
235236
}
237+
// Surface switch requires to resubmit the frame.
238+
if (previous_frame_view_count_ == 0) {
239+
return PostPrerollResult::kResubmitFrame;
240+
}
236241
}
237242
return PostPrerollResult::kSuccess;
238243
}

shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc

+21-6
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,19 @@ class SurfaceMock : public Surface {
4343
(override));
4444
};
4545

46-
fml::RefPtr<fml::RasterThreadMerger> GetThreadMergerFromPlatformThread() {
47-
auto rasterizer_thread = new fml::Thread("rasterizer");
48-
auto rasterizer_queue_id =
49-
rasterizer_thread->GetTaskRunner()->GetTaskQueueId();
50-
46+
fml::RefPtr<fml::RasterThreadMerger> GetThreadMergerFromPlatformThread(
47+
bool merged = false) {
5148
// Assume the current thread is the platform thread.
5249
fml::MessageLoop::EnsureInitializedForCurrentThread();
5350
auto platform_queue_id = fml::MessageLoop::GetCurrentTaskQueueId();
5451

52+
if (merged) {
53+
return fml::MakeRefCounted<fml::RasterThreadMerger>(platform_queue_id,
54+
platform_queue_id);
55+
}
56+
auto rasterizer_thread = new fml::Thread("rasterizer");
57+
auto rasterizer_queue_id =
58+
rasterizer_thread->GetTaskRunner()->GetTaskQueueId();
5559
return fml::MakeRefCounted<fml::RasterThreadMerger>(platform_queue_id,
5660
rasterizer_queue_id);
5761
}
@@ -291,7 +295,9 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) {
291295
};
292296
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
293297
android_context, jni_mock, surface_factory);
294-
auto raster_thread_merger = GetThreadMergerFromPlatformThread();
298+
299+
auto raster_thread_merger =
300+
GetThreadMergerFromPlatformThread(/*merged=*/true);
295301

296302
// ------------------ First frame ------------------ //
297303
{
@@ -309,6 +315,9 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) {
309315
embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
310316
// Submits frame if no Android view in the current frame.
311317
EXPECT_TRUE(did_submit_frame);
318+
// Doesn't resubmit frame.
319+
auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
320+
ASSERT_EQ(PostPrerollResult::kSuccess, postpreroll_result);
312321

313322
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
314323
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -373,6 +382,9 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) {
373382
embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
374383
// Doesn't submit frame if there aren't Android views in the previous frame.
375384
EXPECT_FALSE(did_submit_frame);
385+
// Resubmits frame.
386+
auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
387+
ASSERT_EQ(PostPrerollResult::kResubmitFrame, postpreroll_result);
376388

377389
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
378390
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
@@ -434,6 +446,9 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame) {
434446
embedder->SubmitFrame(gr_context.get(), std::move(surface_frame));
435447
// Submits frame if there are Android views in the previous frame.
436448
EXPECT_TRUE(did_submit_frame);
449+
// Doesn't resubmit frame.
450+
auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
451+
ASSERT_EQ(PostPrerollResult::kSuccess, postpreroll_result);
437452

438453
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
439454
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);

0 commit comments

Comments
 (0)