OLD | NEW |
---|---|
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
90 } else { | 90 } else { |
91 child_surface_ids_damaged_.insert(surface_id); | 91 child_surface_ids_damaged_.insert(surface_id); |
92 | 92 |
93 // TODO(mithro): Use hints from SetNeedsBeginFrames and SwapAborts. | 93 // TODO(mithro): Use hints from SetNeedsBeginFrames and SwapAborts. |
94 all_active_child_surfaces_ready_to_draw_ = base::STLIncludes( | 94 all_active_child_surfaces_ready_to_draw_ = base::STLIncludes( |
95 child_surface_ids_damaged_, child_surface_ids_to_expect_damage_from_); | 95 child_surface_ids_damaged_, child_surface_ids_to_expect_damage_from_); |
96 } | 96 } |
97 | 97 |
98 if (!output_surface_lost_ && !observing_begin_frame_source_) { | 98 if (!output_surface_lost_ && !observing_begin_frame_source_) { |
99 observing_begin_frame_source_ = true; | 99 observing_begin_frame_source_ = true; |
100 // When we call AddObserver() this will cause a missed BeginFrame to | |
101 // occur. We need to detect this and not process it immediately in the | |
102 // same call stack. | |
103 inside_add_observer_ = true; | |
sunnyps
2016/07/27 02:00:14
nit: base::AutoReset<bool> mark_inside(&inside_add
danakj
2016/07/27 02:19:04
Done.
| |
100 begin_frame_source_->AddObserver(this); | 104 begin_frame_source_->AddObserver(this); |
105 inside_add_observer_ = false; | |
101 } | 106 } |
102 | 107 |
103 ScheduleBeginFrameDeadline(); | 108 ScheduleBeginFrameDeadline(); |
104 } | 109 } |
105 | 110 |
106 void DisplayScheduler::OutputSurfaceLost() { | 111 void DisplayScheduler::OutputSurfaceLost() { |
107 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost"); | 112 TRACE_EVENT0("cc", "DisplayScheduler::OutputSurfaceLost"); |
108 output_surface_lost_ = true; | 113 output_surface_lost_ = true; |
109 ScheduleBeginFrameDeadline(); | 114 ScheduleBeginFrameDeadline(); |
110 } | 115 } |
(...skipping 20 matching lines...) Expand all Loading... | |
131 | 136 |
132 expect_damage_from_root_surface_ = root_surface_damaged_; | 137 expect_damage_from_root_surface_ = root_surface_damaged_; |
133 root_surface_damaged_ = false; | 138 root_surface_damaged_ = false; |
134 } | 139 } |
135 | 140 |
136 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) { | 141 bool DisplayScheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) { |
137 base::TimeTicks now = base::TimeTicks::Now(); | 142 base::TimeTicks now = base::TimeTicks::Now(); |
138 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(), | 143 TRACE_EVENT2("cc", "DisplayScheduler::BeginFrame", "args", args.AsValue(), |
139 "now", now); | 144 "now", now); |
140 | 145 |
146 if (inside_add_observer_) { | |
147 // Repost this so that we don't run a missed BeginFrame on the same | |
148 // callstack. Otherwise we end up running unexpected scheduler actions | |
149 // immediately while inside some other action (such as submitting a frame | |
150 // for a SurfaceFactory). | |
151 DCHECK_EQ(args.type, BeginFrameArgs::MISSED); | |
152 DCHECK(missed_begin_frame_task_.IsCancelled()); | |
153 missed_begin_frame_task_.Reset(base::Bind( | |
154 base::IgnoreResult(&DisplayScheduler::OnBeginFrameDerivedImpl), | |
155 weak_ptr_factory_.GetWeakPtr(), args)); | |
156 task_runner_->PostTask(FROM_HERE, missed_begin_frame_task_.callback()); | |
157 return true; | |
158 } else { | |
159 // If we get another BeginFrame before a posted missed frame, just drop the | |
160 // missed frame. | |
161 missed_begin_frame_task_.Cancel(); | |
162 } | |
163 | |
141 // If we get another BeginFrame before the previous deadline, | 164 // If we get another BeginFrame before the previous deadline, |
142 // synchronously trigger the previous deadline before progressing. | 165 // synchronously trigger the previous deadline before progressing. |
143 if (inside_begin_frame_deadline_interval_) { | 166 if (inside_begin_frame_deadline_interval_) { |
144 OnBeginFrameDeadline(); | 167 OnBeginFrameDeadline(); |
145 } | 168 } |
146 | 169 |
147 // Schedule the deadline. | 170 // Schedule the deadline. |
148 current_begin_frame_args_ = args; | 171 current_begin_frame_args_ = args; |
149 current_begin_frame_args_.deadline -= | 172 current_begin_frame_args_.deadline -= |
150 BeginFrameArgs::DefaultEstimatedParentDrawTime(); | 173 BeginFrameArgs::DefaultEstimatedParentDrawTime(); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 } | 324 } |
302 | 325 |
303 void DisplayScheduler::DidSwapBuffersComplete() { | 326 void DisplayScheduler::DidSwapBuffersComplete() { |
304 pending_swaps_--; | 327 pending_swaps_--; |
305 TRACE_EVENT_ASYNC_END1("cc", "DisplayScheduler:pending_swaps", this, | 328 TRACE_EVENT_ASYNC_END1("cc", "DisplayScheduler:pending_swaps", this, |
306 "pending_frames", pending_swaps_); | 329 "pending_frames", pending_swaps_); |
307 ScheduleBeginFrameDeadline(); | 330 ScheduleBeginFrameDeadline(); |
308 } | 331 } |
309 | 332 |
310 } // namespace cc | 333 } // namespace cc |
OLD | NEW |