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) {
void DisplayScheduler::SetRootSurfaceResourcesLocked(bool locked) {
TRACE_EVENT1("viz", "DisplayScheduler::SetRootSurfaceResourcesLocked",
"locked", locked);
if (root_surface_resources_locked_ == locked)
return;
root_surface_resources_locked_ = locked;
MaybeStartObservingBeginFrames();
ScheduleBeginFrameDeadline();
}
......@@ -292,7 +296,8 @@ void DisplayScheduler::StopObservingBeginFrames() {
bool DisplayScheduler::ShouldDraw() {
// Note: When any of these cases becomes true, MaybeStartObservingBeginFrames
// 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) {
......@@ -478,7 +483,7 @@ bool DisplayScheduler::AttemptDrawAndSwap() {
begin_frame_deadline_task_time_ = base::TimeTicks();
if (ShouldDraw()) {
if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_)
if (pending_swaps_ < max_pending_swaps_)
return DrawAndSwap();
} else {
// We are going idle, so reset expectations.
......
......@@ -629,10 +629,14 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
// Deadline triggers normally when root resources are unlocked.
AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id});
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
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());
scheduler_.SetRootSurfaceResourcesLocked(false);
EXPECT_TRUE(scheduler_.inside_begin_frame_deadline_interval());
SurfaceDamaged(root_surface_id);
EXPECT_EQ(base::TimeTicks(),
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