| 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 |