Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1406)

Unified Diff: cc/surfaces/display_scheduler.cc

Issue 1251823005: cc: Make DisplayScheduler aware of resize and add tracing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tests; small logic changes Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/surfaces/display_scheduler.h ('k') | cc/surfaces/display_scheduler_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/surfaces/display_scheduler.h ('k') | cc/surfaces/display_scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698