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

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

Issue 2591013004: [cc] Add and use BeginFrameAck for DidFinishFrame. (Closed)
Patch Set: remove ipc struct traits for BeginFrameAck. Created 3 years, 11 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 | « cc/surfaces/display_scheduler.h ('k') | 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/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 TRACE_EVENT1("cc", "DisplayScheduler::SetRootSurfaceResourcesLocked", 66 TRACE_EVENT1("cc", "DisplayScheduler::SetRootSurfaceResourcesLocked",
67 "locked", locked); 67 "locked", locked);
68 root_surface_resources_locked_ = locked; 68 root_surface_resources_locked_ = locked;
69 ScheduleBeginFrameDeadline(); 69 ScheduleBeginFrameDeadline();
70 } 70 }
71 71
72 // This is used to force an immediate swap before a resize. 72 // This is used to force an immediate swap before a resize.
73 void DisplayScheduler::ForceImmediateSwapIfPossible() { 73 void DisplayScheduler::ForceImmediateSwapIfPossible() {
74 TRACE_EVENT0("cc", "DisplayScheduler::ForceImmediateSwapIfPossible"); 74 TRACE_EVENT0("cc", "DisplayScheduler::ForceImmediateSwapIfPossible");
75 bool in_begin = inside_begin_frame_deadline_interval_; 75 bool in_begin = inside_begin_frame_deadline_interval_;
76 AttemptDrawAndSwap(); 76 bool did_draw = AttemptDrawAndSwap();
77 if (in_begin) 77 if (in_begin)
78 begin_frame_source_->DidFinishFrame(this, 0); 78 DidFinishFrame(did_draw);
79 } 79 }
80 80
81 void DisplayScheduler::DisplayResized() { 81 void DisplayScheduler::DisplayResized() {
82 expecting_root_surface_damage_because_of_resize_ = true; 82 expecting_root_surface_damage_because_of_resize_ = true;
83 expect_damage_from_root_surface_ = true; 83 expect_damage_from_root_surface_ = true;
84 needs_draw_ = true; 84 needs_draw_ = true;
85 ScheduleBeginFrameDeadline(); 85 ScheduleBeginFrameDeadline();
86 } 86 }
87 87
88 // Notification that there was a resize or the root surface changed and 88 // Notification that there was a resize or the root surface changed and
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 StartObservingBeginFrames(); 121 StartObservingBeginFrames();
122 ScheduleBeginFrameDeadline(); 122 ScheduleBeginFrameDeadline();
123 } 123 }
124 124
125 void DisplayScheduler::OutputSurfaceLost() { 125 void DisplayScheduler::OutputSurfaceLost() {
126 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost"); 126 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost");
127 output_surface_lost_ = true; 127 output_surface_lost_ = true;
128 ScheduleBeginFrameDeadline(); 128 ScheduleBeginFrameDeadline();
129 } 129 }
130 130
131 void DisplayScheduler::DrawAndSwap() { 131 bool DisplayScheduler::DrawAndSwap() {
132 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap"); 132 TRACE_EVENT0("cc", "DisplayScheduler::DrawAndSwap");
133 DCHECK_LT(pending_swaps_, max_pending_swaps_); 133 DCHECK_LT(pending_swaps_, max_pending_swaps_);
134 DCHECK(!output_surface_lost_); 134 DCHECK(!output_surface_lost_);
135 135
136 bool success = client_->DrawAndSwap(); 136 bool success = client_->DrawAndSwap();
137 if (!success) 137 if (!success)
138 return; 138 return false;
139 139
140 child_surface_ids_to_expect_damage_from_ = 140 child_surface_ids_to_expect_damage_from_ =
141 base::STLSetIntersection<std::vector<SurfaceId>>( 141 base::STLSetIntersection<std::vector<SurfaceId>>(
142 child_surface_ids_damaged_, child_surface_ids_damaged_prev_); 142 child_surface_ids_damaged_, child_surface_ids_damaged_prev_);
143 143
144 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_); 144 child_surface_ids_damaged_prev_.swap(child_surface_ids_damaged_);
145 child_surface_ids_damaged_.clear(); 145 child_surface_ids_damaged_.clear();
146 146
147 needs_draw_ = false; 147 needs_draw_ = false;
148 all_active_child_surfaces_ready_to_draw_ = 148 all_active_child_surfaces_ready_to_draw_ =
149 child_surface_ids_to_expect_damage_from_.empty(); 149 child_surface_ids_to_expect_damage_from_.empty();
150 150
151 expect_damage_from_root_surface_ = root_surface_damaged_; 151 expect_damage_from_root_surface_ = root_surface_damaged_;
152 root_surface_damaged_ = false; 152 root_surface_damaged_ = false;
153 return true;
153 } 154 }
154 155
155 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) { 156 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) {
156 base::TimeTicks now = base::TimeTicks::Now(); 157 base::TimeTicks now = base::TimeTicks::Now();
157 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(), 158 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(),
158 "now", now); 159 "now", now);
159 160
160 if (inside_surface_damaged_) { 161 if (inside_surface_damaged_) {
161 // Repost this so that we don't run a missed BeginFrame on the same 162 // Repost this so that we don't run a missed BeginFrame on the same
162 // callstack. Otherwise we end up running unexpected scheduler actions 163 // callstack. Otherwise we end up running unexpected scheduler actions
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 begin_frame_deadline_task_.Reset(begin_frame_deadline_closure_); 326 begin_frame_deadline_task_.Reset(begin_frame_deadline_closure_);
326 327
327 base::TimeDelta delta = 328 base::TimeDelta delta =
328 std::max(base::TimeDelta(), desired_deadline - base::TimeTicks::Now()); 329 std::max(base::TimeDelta(), desired_deadline - base::TimeTicks::Now());
329 task_runner_->PostDelayedTask(FROM_HERE, 330 task_runner_->PostDelayedTask(FROM_HERE,
330 begin_frame_deadline_task_.callback(), delta); 331 begin_frame_deadline_task_.callback(), delta);
331 TRACE_EVENT2("cc", "Using new deadline", "delta", delta.ToInternalValue(), 332 TRACE_EVENT2("cc", "Using new deadline", "delta", delta.ToInternalValue(),
332 "desired_deadline", desired_deadline); 333 "desired_deadline", desired_deadline);
333 } 334 }
334 335
335 void DisplayScheduler::AttemptDrawAndSwap() { 336 bool DisplayScheduler::AttemptDrawAndSwap() {
336 inside_begin_frame_deadline_interval_ = false; 337 inside_begin_frame_deadline_interval_ = false;
337 begin_frame_deadline_task_.Cancel(); 338 begin_frame_deadline_task_.Cancel();
338 begin_frame_deadline_task_time_ = base::TimeTicks(); 339 begin_frame_deadline_task_time_ = base::TimeTicks();
339 340
340 if (ShouldDraw()) { 341 if (ShouldDraw()) {
341 if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_) 342 if (pending_swaps_ < max_pending_swaps_ && !root_surface_resources_locked_)
342 DrawAndSwap(); 343 return DrawAndSwap();
343 } else { 344 } else {
344 // We are going idle, so reset expectations. 345 // We are going idle, so reset expectations.
345 child_surface_ids_to_expect_damage_from_.clear(); 346 child_surface_ids_to_expect_damage_from_.clear();
346 child_surface_ids_damaged_prev_.clear(); 347 child_surface_ids_damaged_prev_.clear();
347 child_surface_ids_damaged_.clear(); 348 child_surface_ids_damaged_.clear();
348 all_active_child_surfaces_ready_to_draw_ = true; 349 all_active_child_surfaces_ready_to_draw_ = true;
349 expect_damage_from_root_surface_ = false; 350 expect_damage_from_root_surface_ = false;
350 351
351 StopObservingBeginFrames(); 352 StopObservingBeginFrames();
352 } 353 }
354 return false;
353 } 355 }
354 356
355 void DisplayScheduler::OnBeginFrameDeadline() { 357 void DisplayScheduler::OnBeginFrameDeadline() {
356 TRACE_EVENT0("cc", "DisplayScheduler::OnBeginFrameDeadline"); 358 TRACE_EVENT0("cc", "DisplayScheduler::OnBeginFrameDeadline");
359 DCHECK(inside_begin_frame_deadline_interval_);
357 360
358 AttemptDrawAndSwap(); 361 bool did_draw = AttemptDrawAndSwap();
359 begin_frame_source_->DidFinishFrame(this, 0); 362 DidFinishFrame(did_draw);
363 }
364
365 void DisplayScheduler::DidFinishFrame(bool did_draw) {
366 // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
367 BeginFrameAck ack(current_begin_frame_args_.source_id,
368 current_begin_frame_args_.sequence_number,
369 current_begin_frame_args_.sequence_number, 0, did_draw);
370 begin_frame_source_->DidFinishFrame(this, ack);
360 } 371 }
361 372
362 void DisplayScheduler::DidSwapBuffers() { 373 void DisplayScheduler::DidSwapBuffers() {
363 pending_swaps_++; 374 pending_swaps_++;
364 TRACE_EVENT_ASYNC_BEGIN1("cc", "DisplayScheduler:pending_swaps", this, 375 TRACE_EVENT_ASYNC_BEGIN1("cc", "DisplayScheduler:pending_swaps", this,
365 "pending_frames", pending_swaps_); 376 "pending_frames", pending_swaps_);
366 } 377 }
367 378
368 void DisplayScheduler::DidReceiveSwapBuffersAck() { 379 void DisplayScheduler::DidReceiveSwapBuffersAck() {
369 pending_swaps_--; 380 pending_swaps_--;
370 TRACE_EVENT_ASYNC_END1("cc", "DisplayScheduler:pending_swaps", this, 381 TRACE_EVENT_ASYNC_END1("cc", "DisplayScheduler:pending_swaps", this,
371 "pending_frames", pending_swaps_); 382 "pending_frames", pending_swaps_);
372 ScheduleBeginFrameDeadline(); 383 ScheduleBeginFrameDeadline();
373 } 384 }
374 385
375 } // namespace cc 386 } // namespace cc
OLDNEW
« 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