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

Side by Side Diff: cc/surfaces/display_scheduler.cc

Issue 1155183004: cc: Properly detect when child Surfaces idle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | cc/surfaces/display_scheduler_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/surfaces/display_scheduler.h" 5 #include "cc/surfaces/display_scheduler.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 99
100 void DisplayScheduler::DrawAndSwap() { 100 void DisplayScheduler::DrawAndSwap() {
101 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap"); 101 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap");
102 DCHECK_LT(pending_swaps_, max_pending_swaps_); 102 DCHECK_LT(pending_swaps_, max_pending_swaps_);
103 DCHECK(!output_surface_lost_); 103 DCHECK(!output_surface_lost_);
104 104
105 bool success = client_->DrawAndSwap(); 105 bool success = client_->DrawAndSwap();
106 if (!success) 106 if (!success)
107 return; 107 return;
108 108
109 needs_draw_ = false;
110 entire_display_damaged_ = false;
111 all_active_child_surfaces_ready_to_draw_ = false;
112
113 expect_damage_from_root_surface_ = root_surface_damaged_;
114 root_surface_damaged_ = false;
115
116 child_surface_ids_to_expect_damage_from_ = 109 child_surface_ids_to_expect_damage_from_ =
117 base::STLSetIntersection<std::vector<SurfaceId>>( 110 base::STLSetIntersection<std::vector<SurfaceId>>(
118 child_surface_ids_damaged_, child_surface_ids_damaged_prev_); 111 child_surface_ids_damaged_, child_surface_ids_damaged_prev_);
119 112
120 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_); 113 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_);
121 child_surface_ids_damaged_.clear(); 114 child_surface_ids_damaged_.clear();
115
116 needs_draw_ = false;
117 entire_display_damaged_ = false;
118 all_active_child_surfaces_ready_to_draw_ =
119 child_surface_ids_to_expect_damage_from_.empty();
120
121 expect_damage_from_root_surface_ = root_surface_damaged_;
122 root_surface_damaged_ = false;
122 } 123 }
123 124
124 bool DisplayScheduler::OnBeginFrameMixInDelegate(const BeginFrameArgs& args) { 125 bool DisplayScheduler::OnBeginFrameMixInDelegate(const BeginFrameArgs& args) {
125 base::TimeTicks now = base::TimeTicks::Now(); 126 base::TimeTicks now = base::TimeTicks::Now();
126 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(), 127 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(),
127 "now", now); 128 "now", now);
128 129
129 // Only service missed BeginFrames if they haven't already expired. 130 // Only service missed BeginFrames if they haven't already expired.
130 base::TimeTicks adjusted_deadline = 131 base::TimeTicks adjusted_deadline =
131 args.deadline - BeginFrameArgs::DefaultEstimatedParentDrawTime(); 132 args.deadline - BeginFrameArgs::DefaultEstimatedParentDrawTime();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 251
251 void DisplayScheduler::AttemptDrawAndSwap() { 252 void DisplayScheduler::AttemptDrawAndSwap() {
252 inside_begin_frame_deadline_interval_ = false; 253 inside_begin_frame_deadline_interval_ = false;
253 begin_frame_deadline_task_.Cancel(); 254 begin_frame_deadline_task_.Cancel();
254 begin_frame_deadline_task_time_ = base::TimeTicks(); 255 begin_frame_deadline_task_time_ = base::TimeTicks();
255 256
256 if (needs_draw_ && !output_surface_lost_) { 257 if (needs_draw_ && !output_surface_lost_) {
257 if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_) 258 if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_)
258 DrawAndSwap(); 259 DrawAndSwap();
259 } else { 260 } else {
261 // We are going idle, so reset expectations.
262 child_surface_ids_to_expect_damage_from_.clear();
263 child_surface_ids_damaged_prev_.clear();
264 child_surface_ids_damaged_.clear();
265 all_active_child_surfaces_ready_to_draw_ = true;
266 expect_damage_from_root_surface_ = false;
267
260 begin_frame_source_->SetNeedsBeginFrames(false); 268 begin_frame_source_->SetNeedsBeginFrames(false);
261 } 269 }
262 } 270 }
263 271
264 void DisplayScheduler::OnBeginFrameDeadline() { 272 void DisplayScheduler::OnBeginFrameDeadline() {
265 TRACE_EVENT0("cc", "DisplayScheduler::OnBeginFrameDeadline"); 273 TRACE_EVENT0("cc", "DisplayScheduler::OnBeginFrameDeadline");
266 274
267 AttemptDrawAndSwap(); 275 AttemptDrawAndSwap();
268 begin_frame_source_->DidFinishFrame(0); 276 begin_frame_source_->DidFinishFrame(0);
269 } 277 }
270 278
271 void DisplayScheduler::DidSwapBuffers() { 279 void DisplayScheduler::DidSwapBuffers() {
272 pending_swaps_++; 280 pending_swaps_++;
273 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffers", "pending_frames", 281 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffers", "pending_frames",
274 pending_swaps_); 282 pending_swaps_);
275 } 283 }
276 284
277 void DisplayScheduler::DidSwapBuffersComplete() { 285 void DisplayScheduler::DidSwapBuffersComplete() {
278 pending_swaps_--; 286 pending_swaps_--;
279 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffersComplete", 287 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffersComplete",
280 "pending_frames", pending_swaps_); 288 "pending_frames", pending_swaps_);
281 ScheduleBeginFrameDeadline(); 289 ScheduleBeginFrameDeadline();
282 } 290 }
283 291
284 } // namespace cc 292 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/surfaces/display_scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698