Commit cfb85583 authored by Fady Samuel's avatar Fady Samuel Committed by Commit Bot

Display Scheduler: Don't request BeginFrames while waiting for a root surface

When the root surface changes, we cannot draw to the display until a surface
activates. This CL stops draws (and BeginFrames) until activation. If a root surface is never
submitted then the display will not listen for BeginFrames.

Bug: 821940
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: I749c0ca8e85a3dbc7eccaa0799add81afb15beb9
Reviewed-on: https://chromium-review.googlesource.com/964595Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Commit-Queue: Fady Samuel <fsamuel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543548}
parent 89abaf82
...@@ -70,7 +70,11 @@ void DisplayScheduler::SetVisible(bool visible) { ...@@ -70,7 +70,11 @@ void DisplayScheduler::SetVisible(bool visible) {
void DisplayScheduler::SetRootSurfaceResourcesLocked(bool locked) { void DisplayScheduler::SetRootSurfaceResourcesLocked(bool locked) {
TRACE_EVENT1("viz", "DisplayScheduler::SetRootSurfaceResourcesLocked", TRACE_EVENT1("viz", "DisplayScheduler::SetRootSurfaceResourcesLocked",
"locked", locked); "locked", locked);
if (root_surface_resources_locked_ == locked)
return;
root_surface_resources_locked_ = locked; root_surface_resources_locked_ = locked;
MaybeStartObservingBeginFrames();
ScheduleBeginFrameDeadline(); ScheduleBeginFrameDeadline();
} }
...@@ -292,7 +296,8 @@ void DisplayScheduler::StopObservingBeginFrames() { ...@@ -292,7 +296,8 @@ void DisplayScheduler::StopObservingBeginFrames() {
bool DisplayScheduler::ShouldDraw() { bool DisplayScheduler::ShouldDraw() {
// Note: When any of these cases becomes true, MaybeStartObservingBeginFrames // Note: When any of these cases becomes true, MaybeStartObservingBeginFrames
// must be called to ensure the draw will happen. // must be called to ensure the draw will happen.
return needs_draw_ && !output_surface_lost_ && visible_; return needs_draw_ && !output_surface_lost_ && visible_ &&
!root_surface_resources_locked_;
} }
void DisplayScheduler::OnBeginFrameSourcePausedChanged(bool paused) { void DisplayScheduler::OnBeginFrameSourcePausedChanged(bool paused) {
...@@ -478,7 +483,7 @@ bool DisplayScheduler::AttemptDrawAndSwap() { ...@@ -478,7 +483,7 @@ bool DisplayScheduler::AttemptDrawAndSwap() {
begin_frame_deadline_task_time_ = base::TimeTicks(); begin_frame_deadline_task_time_ = base::TimeTicks();
if (ShouldDraw()) { if (ShouldDraw()) {
if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_) if (pending_swaps_ < max_pending_swaps_)
return DrawAndSwap(); return DrawAndSwap();
} else { } else {
// We are going idle, so reset expectations. // We are going idle, so reset expectations.
......
...@@ -629,10 +629,14 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { ...@@ -629,10 +629,14 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
// Deadline triggers normally when root resources are unlocked. // Deadline triggers normally when root resources are unlocked.
AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id}); AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id});
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
SurfaceDamaged(sid1); SurfaceDamaged(sid1);
// The deadline is not updated because the display scheduler does not receive
// a BeginFrame while root resources are locked.
EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SetRootSurfaceResourcesLocked(false); scheduler_.SetRootSurfaceResourcesLocked(false);
EXPECT_TRUE(scheduler_.inside_begin_frame_deadline_interval());
SurfaceDamaged(root_surface_id); SurfaceDamaged(root_surface_id);
EXPECT_EQ(base::TimeTicks(), EXPECT_EQ(base::TimeTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest()); scheduler_.DesiredBeginFrameDeadlineTimeForTest());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment