Index: cc/surfaces/display_scheduler.cc |
diff --git a/cc/surfaces/display_scheduler.cc b/cc/surfaces/display_scheduler.cc |
index 98f52e52b60ca4c53a846032eb57eaf77017ef1e..0b40b3ef680d9e7267cb40dd2439ba4b005fc25b 100644 |
--- a/cc/surfaces/display_scheduler.cc |
+++ b/cc/surfaces/display_scheduler.cc |
@@ -23,7 +23,7 @@ DisplayScheduler::DisplayScheduler(DisplaySchedulerClient* client, |
root_surface_resources_locked_(true), |
inside_begin_frame_deadline_interval_(false), |
needs_draw_(false), |
- entire_display_damaged_(false), |
+ expecting_root_surface_damage_because_of_resize_(false), |
all_active_child_surfaces_ready_to_draw_(false), |
pending_swaps_(0), |
max_pending_swaps_(max_pending_swaps), |
@@ -42,28 +42,33 @@ DisplayScheduler::~DisplayScheduler() { |
// If we try to draw when the root surface resources are locked, the |
// draw will fail. |
void DisplayScheduler::SetRootSurfaceResourcesLocked(bool locked) { |
+ TRACE_EVENT1("cc", "DisplayScheduler::SetRootSurfaceResourcesLocked", |
+ "locked", locked); |
root_surface_resources_locked_ = locked; |
ScheduleBeginFrameDeadline(); |
} |
// This is used to force an immediate swap before a resize. |
void DisplayScheduler::ForceImmediateSwapIfPossible() { |
+ TRACE_EVENT0("cc", "DisplayScheduler::ForceImmediateSwapIfPossible"); |
bool in_begin = inside_begin_frame_deadline_interval_; |
AttemptDrawAndSwap(); |
if (in_begin) |
begin_frame_source_->DidFinishFrame(0); |
} |
+void DisplayScheduler::DisplayResized() { |
+ expecting_root_surface_damage_because_of_resize_ = true; |
+ expect_damage_from_root_surface_ = true; |
+ ScheduleBeginFrameDeadline(); |
+} |
+ |
// Notification that there was a resize or the root surface changed and |
// that we should just draw immediately. |
-void DisplayScheduler::EntireDisplayDamaged(SurfaceId root_surface_id) { |
- TRACE_EVENT0("cc", "DisplayScheduler::EntireDisplayDamaged"); |
- needs_draw_ = true; |
- entire_display_damaged_ = true; |
+void DisplayScheduler::SetNewRootSurface(SurfaceId root_surface_id) { |
+ TRACE_EVENT0("cc", "DisplayScheduler::SetNewRootSurface"); |
root_surface_id_ = root_surface_id; |
- |
- begin_frame_source_->SetNeedsBeginFrames(!output_surface_lost_); |
- ScheduleBeginFrameDeadline(); |
+ SurfaceDamaged(root_surface_id); |
} |
// Indicates that there was damage to one of the surfaces. |
@@ -77,6 +82,7 @@ void DisplayScheduler::SurfaceDamaged(SurfaceId surface_id) { |
if (surface_id == root_surface_id_) { |
root_surface_damaged_ = true; |
+ expecting_root_surface_damage_because_of_resize_ = false; |
} else { |
child_surface_ids_damaged_.insert(surface_id); |
@@ -113,7 +119,6 @@ void DisplayScheduler::DrawAndSwap() { |
child_surface_ids_damaged_.clear(); |
needs_draw_ = false; |
- entire_display_damaged_ = false; |
all_active_child_surfaces_ready_to_draw_ = |
child_surface_ids_to_expect_damage_from_.empty(); |
@@ -167,13 +172,6 @@ base::TimeTicks DisplayScheduler::DesiredBeginFrameDeadlineTime() { |
current_begin_frame_args_.interval; |
} |
- // TODO(mithro): Be smarter about resize deadlines. |
- if (entire_display_damaged_) { |
- TRACE_EVENT_INSTANT0("cc", "Entire display damaged", |
- TRACE_EVENT_SCOPE_THREAD); |
- return base::TimeTicks(); |
- } |
- |
bool root_ready_to_draw = |
!expect_damage_from_root_surface_ || root_surface_damaged_; |
@@ -183,6 +181,14 @@ base::TimeTicks DisplayScheduler::DesiredBeginFrameDeadlineTime() { |
return base::TimeTicks(); |
} |
+ // TODO(mithro): Be smarter about resize deadlines. |
+ if (expecting_root_surface_damage_because_of_resize_) { |
+ TRACE_EVENT_INSTANT0("cc", "Entire display damaged", |
+ TRACE_EVENT_SCOPE_THREAD); |
+ return current_begin_frame_args_.frame_time + |
+ current_begin_frame_args_.interval; |
+ } |
+ |
// Use an earlier deadline if we are only waiting for the root surface |
// in case our expect_damage_from_root_surface heuristic is incorrect. |
// TODO(mithro): Replace this with SetNeedsBeginFrame and SwapAbort |