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

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

Issue 1251693002: cc: Consider Surface active if frame received recently (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 20fps + single surface 20fps 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 unified diff | Download patch
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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 ScheduleBeginFrameDeadline(); 89 ScheduleBeginFrameDeadline();
90 } 90 }
91 91
92 void DisplayScheduler::OutputSurfaceLost() { 92 void DisplayScheduler::OutputSurfaceLost() {
93 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost"); 93 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost");
94 output_surface_lost_ = true; 94 output_surface_lost_ = true;
95 begin_frame_source_->SetNeedsBeginFrames(false); 95 begin_frame_source_->SetNeedsBeginFrames(false);
96 ScheduleBeginFrameDeadline(); 96 ScheduleBeginFrameDeadline();
97 } 97 }
98 98
99 void DisplayScheduler::UpdateSurfaceDamageExpectations() {
100 expect_damage_from_root_surface_ = root_surface_damaged_;
sunnyps 2015/07/23 03:02:40 Set root_surface_damaged_ to false here instead of
brianderson 2015/07/23 18:21:46 This will work for the case where this method is c
101
102 std::vector<SurfaceId> partial_union =
103 base::STLSetUnion<std::vector<SurfaceId>>(
104 child_surface_ids_damaged_, child_surface_ids_damaged_prev_);
105 child_surface_ids_to_expect_damage_from_ =
106 base::STLSetUnion<std::vector<SurfaceId>>(
107 partial_union, child_surface_ids_damaged_prev_prev_);
108
109 child_surface_ids_damaged_prev_prev_.swap(child_surface_ids_damaged_prev_);
110 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_);
111 child_surface_ids_damaged_.clear();
112
113 all_active_child_surfaces_ready_to_draw_ =
114 child_surface_ids_to_expect_damage_from_.empty();
115 }
116
99 void DisplayScheduler::DrawAndSwap() { 117 void DisplayScheduler::DrawAndSwap() {
100 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap"); 118 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap");
101 DCHECK_LT(pending_swaps_, max_pending_swaps_); 119 DCHECK_LT(pending_swaps_, max_pending_swaps_);
102 DCHECK(!output_surface_lost_); 120 DCHECK(!output_surface_lost_);
103 121
104 bool success = client_->DrawAndSwap(); 122 bool success = client_->DrawAndSwap();
105 if (!success) 123 if (!success)
106 return; 124 return;
107 125
108 child_surface_ids_to_expect_damage_from_ = 126 UpdateSurfaceDamageExpectations();
109 base::STLSetIntersection<std::vector<SurfaceId>>(
110 child_surface_ids_damaged_, child_surface_ids_damaged_prev_);
111 127
112 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_); 128 // Update state regarding what needs to be drawn.
113 child_surface_ids_damaged_.clear();
114
115 needs_draw_ = false; 129 needs_draw_ = false;
116 entire_display_damaged_ = false; 130 entire_display_damaged_ = false;
117 all_active_child_surfaces_ready_to_draw_ =
118 child_surface_ids_to_expect_damage_from_.empty();
119
120 expect_damage_from_root_surface_ = root_surface_damaged_;
121 root_surface_damaged_ = false; 131 root_surface_damaged_ = false;
122 } 132 }
123 133
124 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) { 134 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) {
125 base::TimeTicks now = base::TimeTicks::Now(); 135 base::TimeTicks now = base::TimeTicks::Now();
126 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(), 136 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(),
127 "now", now); 137 "now", now);
128 138
129 // If we get another BeginFrame before the previous deadline, 139 // If we get another BeginFrame before the previous deadline,
130 // synchronously trigger the previous deadline before progressing. 140 // synchronously trigger the previous deadline before progressing.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 begin_frame_deadline_task_.callback(), delta); 252 begin_frame_deadline_task_.callback(), delta);
243 TRACE_EVENT2("cc", "Using new deadline", "delta", delta.ToInternalValue(), 253 TRACE_EVENT2("cc", "Using new deadline", "delta", delta.ToInternalValue(),
244 "desired_deadline", desired_deadline); 254 "desired_deadline", desired_deadline);
245 } 255 }
246 256
247 void DisplayScheduler::AttemptDrawAndSwap() { 257 void DisplayScheduler::AttemptDrawAndSwap() {
248 inside_begin_frame_deadline_interval_ = false; 258 inside_begin_frame_deadline_interval_ = false;
249 begin_frame_deadline_task_.Cancel(); 259 begin_frame_deadline_task_.Cancel();
250 begin_frame_deadline_task_time_ = base::TimeTicks(); 260 begin_frame_deadline_task_time_ = base::TimeTicks();
251 261
252 if (needs_draw_ && !output_surface_lost_) { 262 bool stay_active = !output_surface_lost_ &&
253 if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_) 263 (needs_draw_ || expect_damage_from_root_surface_ ||
254 DrawAndSwap(); 264 child_surface_ids_to_expect_damage_from_.size() != 0);
sunnyps 2015/07/23 03:02:40 Can you use all_active_child_surfaces_ready_to_dra
brianderson 2015/07/23 18:21:46 I think that would work, however "child_surface_id
265
266 if (stay_active) {
267 if (needs_draw_) {
268 if (pending_swaps_ < max_pending_swaps_ &&
269 !root_surface_resources_locked_)
270 DrawAndSwap();
271 } else {
272 // In order to properly go idle, make sure to update expectations that
273 // will cause stay_active to go false even if we have nothing to draw.
sunnyps 2015/07/23 03:02:40 nit: "stay_active" instead of "stay active"
brianderson 2015/07/23 18:21:46 Looks like it's already stay_active, but I'll add
274 // Verify no child surfaces are currently damaged, since
275 // UpdateSurfaceDamageExpectatations will clear that list.
276 DCHECK(child_surface_ids_damaged_.empty());
sunnyps 2015/07/23 03:02:40 Can probably add more DCHECKs here - like DCHECK(!
brianderson 2015/07/23 18:21:46 Sounds good. I will added a DCHECK(!root_surface_d
277 UpdateSurfaceDamageExpectations();
278 }
255 } else { 279 } else {
256 // We are going idle, so reset expectations. 280 // We are going idle, so reset expectations.
257 child_surface_ids_to_expect_damage_from_.clear(); 281 child_surface_ids_to_expect_damage_from_.clear();
282 child_surface_ids_damaged_prev_prev_.clear();
258 child_surface_ids_damaged_prev_.clear(); 283 child_surface_ids_damaged_prev_.clear();
259 child_surface_ids_damaged_.clear(); 284 child_surface_ids_damaged_.clear();
260 all_active_child_surfaces_ready_to_draw_ = true; 285 all_active_child_surfaces_ready_to_draw_ = true;
261 expect_damage_from_root_surface_ = false; 286 expect_damage_from_root_surface_ = false;
262 287
263 begin_frame_source_->SetNeedsBeginFrames(false); 288 begin_frame_source_->SetNeedsBeginFrames(false);
264 } 289 }
265 } 290 }
266 291
267 void DisplayScheduler::OnBeginFrameDeadline() { 292 void DisplayScheduler::OnBeginFrameDeadline() {
(...skipping 10 matching lines...) Expand all
278 } 303 }
279 304
280 void DisplayScheduler::DidSwapBuffersComplete() { 305 void DisplayScheduler::DidSwapBuffersComplete() {
281 pending_swaps_--; 306 pending_swaps_--;
282 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffersComplete", 307 TRACE_EVENT1("cc", "DisplayScheduler::DidSwapBuffersComplete",
283 "pending_frames", pending_swaps_); 308 "pending_frames", pending_swaps_);
284 ScheduleBeginFrameDeadline(); 309 ScheduleBeginFrameDeadline();
285 } 310 }
286 311
287 } // namespace cc 312 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698