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/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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |