summaryrefslogtreecommitdiffstats
path: root/cc/surfaces
diff options
context:
space:
mode:
authorsunnyps <sunnyps@chromium.org>2016-02-02 12:53:54 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-02 20:54:44 +0000
commit6ab38e4f06caa13bbcdfaa652109d114576c1cbe (patch)
treef4598dab99df0df2f41b317c85e15129e91d236b /cc/surfaces
parentf6ce6c613ba8ea75fe56125dc67bac6f22454738 (diff)
downloadchromium_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.cc17
-rw-r--r--cc/surfaces/display_scheduler.h2
-rw-r--r--cc/surfaces/display_scheduler_unittest.cc23
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());