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

Commit 71727f1

Browse files
committed
Do not call EndFrame when no surface is set
1 parent 5f35e02 commit 71727f1

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

shell/common/rasterizer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ void Rasterizer::Draw(fml::RefPtr<Pipeline<flutter::LayerTree>> pipeline,
191191
}
192192

193193
// EndFrame should perform cleanups for the external_view_embedder.
194-
if (external_view_embedder_) {
194+
if (surface_ && raster_thread_merger_ && external_view_embedder_) {
195195
external_view_embedder_->EndFrame(should_resubmit_frame,
196196
raster_thread_merger_);
197197
}

shell/common/rasterizer_unittests.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,40 @@ TEST(
261261
auto no_discard = [](LayerTree&) { return false; };
262262
rasterizer->Draw(pipeline, no_discard);
263263
}
264+
265+
TEST(RasterizerTest, externalViewEmbedderDoesntEndFrameWhenNoSurfaceIsSet) {
266+
std::string test_name =
267+
::testing::UnitTest::GetInstance()->current_test_info()->name();
268+
ThreadHost thread_host("io.flutter.test." + test_name + ".",
269+
ThreadHost::Type::Platform | ThreadHost::Type::GPU |
270+
ThreadHost::Type::IO | ThreadHost::Type::UI);
271+
TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(),
272+
thread_host.raster_thread->GetTaskRunner(),
273+
thread_host.ui_thread->GetTaskRunner(),
274+
thread_host.io_thread->GetTaskRunner());
275+
MockDelegate delegate;
276+
EXPECT_CALL(delegate, GetTaskRunners())
277+
.WillRepeatedly(ReturnRef(task_runners));
278+
auto rasterizer = std::make_unique<Rasterizer>(delegate);
279+
280+
std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
281+
std::make_shared<MockExternalViewEmbedder>();
282+
rasterizer->SetExternalViewEmbedder(external_view_embedder);
283+
284+
EXPECT_CALL(
285+
*external_view_embedder,
286+
EndFrame(/*should_resubmit_frame=*/false,
287+
/*raster_thread_merger=*/fml::RefPtr<fml::RasterThreadMerger>(
288+
nullptr)))
289+
.Times(0);
290+
291+
fml::AutoResetWaitableEvent latch;
292+
thread_host.raster_thread->GetTaskRunner()->PostTask([&] {
293+
auto pipeline = fml::AdoptRef(new Pipeline<LayerTree>(/*depth=*/10));
294+
auto no_discard = [](LayerTree&) { return false; };
295+
rasterizer->Draw(pipeline, no_discard);
296+
latch.Signal();
297+
});
298+
latch.Wait();
299+
}
264300
} // namespace flutter

0 commit comments

Comments
 (0)