diff options
author | sunnyps <sunnyps@chromium.org> | 2016-02-02 12:53:54 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-02 20:54:44 +0000 |
commit | 6ab38e4f06caa13bbcdfaa652109d114576c1cbe (patch) | |
tree | f4598dab99df0df2f41b317c85e15129e91d236b /cc/surfaces | |
parent | f6ce6c613ba8ea75fe56125dc67bac6f22454738 (diff) | |
download | chromium_src-6ab38e4f06caa13bbcdfaa652109d114576c1cbe.zip chromium_src-6ab38e4f06caa13bbcdfaa652109d114576c1cbe.tar.gz chromium_src-6ab38e4f06caa13bbcdfaa652109d114576c1cbe.tar.bz2 |
cc: Add support for multiple observers to BeginFrameSource.
Multiple observers can be added to BeginFrameSource. The
SetNeedsBeginFrames method was removed because it doesn't make sense
with multiple observers. BeginFrameSources are expected to produce
BeginFrames as long as there are registered observers. There are helper
methods in BeginFrameSourceBase to make this easy.
Changes had to be made to DelayBasedTimeSource as its MISSED BeginFrame
logic was moved to SyntheticBFS for dealing with multiple observers.
BUG=580352
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1611633004
Cr-Commit-Position: refs/heads/master@{#373031}
Diffstat (limited to 'cc/surfaces')
-rw-r--r-- | cc/surfaces/display_scheduler.cc | 17 | ||||
-rw-r--r-- | cc/surfaces/display_scheduler.h | 2 | ||||
-rw-r--r-- | cc/surfaces/display_scheduler_unittest.cc | 23 |
3 files changed, 36 insertions, 6 deletions
diff --git a/cc/surfaces/display_scheduler.cc b/cc/surfaces/display_scheduler.cc index 58a1b72..28f7808 100644 --- a/cc/surfaces/display_scheduler.cc +++ b/cc/surfaces/display_scheduler.cc @@ -27,10 +27,10 @@ DisplayScheduler::DisplayScheduler(DisplaySchedulerClient* client, all_active_child_surfaces_ready_to_draw_(false), pending_swaps_(0), max_pending_swaps_(max_pending_swaps), + observing_begin_frame_source_(false), root_surface_damaged_(false), expect_damage_from_root_surface_(false), weak_ptr_factory_(this) { - begin_frame_source_->AddObserver(this); begin_frame_deadline_closure_ = base::Bind( &DisplayScheduler::OnBeginFrameDeadline, weak_ptr_factory_.GetWeakPtr()); @@ -40,7 +40,8 @@ DisplayScheduler::DisplayScheduler(DisplaySchedulerClient* client, } DisplayScheduler::~DisplayScheduler() { - begin_frame_source_->RemoveObserver(this); + if (observing_begin_frame_source_) + begin_frame_source_->RemoveObserver(this); } // If we try to draw when the root surface resources are locked, the @@ -96,14 +97,17 @@ void DisplayScheduler::SurfaceDamaged(SurfaceId surface_id) { child_surface_ids_damaged_, child_surface_ids_to_expect_damage_from_); } - begin_frame_source_->SetNeedsBeginFrames(!output_surface_lost_); + if (!output_surface_lost_ && !observing_begin_frame_source_) { + observing_begin_frame_source_ = true; + begin_frame_source_->AddObserver(this); + } + ScheduleBeginFrameDeadline(); } void DisplayScheduler::OutputSurfaceLost() { TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost"); output_surface_lost_ = true; - begin_frame_source_->SetNeedsBeginFrames(false); ScheduleBeginFrameDeadline(); } @@ -278,7 +282,10 @@ void DisplayScheduler::AttemptDrawAndSwap() { all_active_child_surfaces_ready_to_draw_ = true; expect_damage_from_root_surface_ = false; - begin_frame_source_->SetNeedsBeginFrames(false); + if (observing_begin_frame_source_) { + observing_begin_frame_source_ = false; + begin_frame_source_->RemoveObserver(this); + } } } diff --git a/cc/surfaces/display_scheduler.h b/cc/surfaces/display_scheduler.h index 69e39fd..90e99f4 100644 --- a/cc/surfaces/display_scheduler.h +++ b/cc/surfaces/display_scheduler.h @@ -83,6 +83,8 @@ class CC_SURFACES_EXPORT DisplayScheduler : public BeginFrameObserverBase { int pending_swaps_; int max_pending_swaps_; + bool observing_begin_frame_source_; + SurfaceId root_surface_id_; bool root_surface_damaged_; bool expect_damage_from_root_surface_; diff --git a/cc/surfaces/display_scheduler_unittest.cc b/cc/surfaces/display_scheduler_unittest.cc index 0f2725d..18e6303 100644 --- a/cc/surfaces/display_scheduler_unittest.cc +++ b/cc/surfaces/display_scheduler_unittest.cc @@ -241,8 +241,12 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) { } TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { + SurfaceId root_surface_id(0); SurfaceId sid1(1); + // Set the root surface + scheduler_->SetNewRootSurface(root_surface_id); + // DrawAndSwap normally. BeginFrameForTest(); EXPECT_LT(now_src().NowTicks(), @@ -268,8 +272,12 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { } TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { + SurfaceId root_surface_id(0); SurfaceId sid1(1); + // Set the root surface + scheduler_->SetNewRootSurface(root_surface_id); + // DrawAndSwap normally. BeginFrameForTest(); EXPECT_LT(now_src().NowTicks(), @@ -287,9 +295,13 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { } TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { + SurfaceId root_surface_id(0); SurfaceId sid1(1); base::TimeTicks late_deadline; + // Set the root surface + scheduler_->SetNewRootSurface(root_surface_id); + // DrawAndSwap normally. BeginFrameForTest(); EXPECT_LT(now_src().NowTicks(), @@ -319,6 +331,7 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { scheduler_->SurfaceDamaged(sid1); EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); scheduler_->SetRootSurfaceResourcesLocked(false); + scheduler_->SurfaceDamaged(root_surface_id); EXPECT_EQ(base::TimeTicks(), scheduler_->DesiredBeginFrameDeadlineTimeForTest()); @@ -328,9 +341,13 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { } TEST_F(DisplaySchedulerTest, DidSwapBuffers) { + SurfaceId root_surface_id(0); SurfaceId sid1(1); SurfaceId sid2(2); + // Set the root surface + scheduler_->SetNewRootSurface(root_surface_id); + // Get scheduler to detect surface 1 and 2 as active. BeginFrameForTest(); scheduler_->SurfaceDamaged(sid1); @@ -369,7 +386,7 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) { // Deadline triggers normally once not swap throttled. // Damage from previous BeginFrame should cary over, so don't damage again. base::TimeTicks expected_deadline = - fake_begin_frame_source_.TestLastUsedBeginFrameArgs().deadline - + scheduler_->LastUsedBeginFrameArgs().deadline - BeginFrameArgs::DefaultEstimatedParentDrawTime(); scheduler_->DidSwapBuffersComplete(); BeginFrameForTest(); @@ -394,6 +411,10 @@ TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { int count = 1; EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); + // Set the root surface + scheduler_->SetNewRootSurface(root_surface_id); + EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); + BeginFrameForTest(); EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |