Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/scheduler/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 | 57 |
| 58 void Scheduler::SyntheticBeginFrameSource::OnTimerTick() { | 58 void Scheduler::SyntheticBeginFrameSource::OnTimerTick() { |
| 59 BeginFrameArgs begin_frame_args( | 59 BeginFrameArgs begin_frame_args( |
| 60 CreateSyntheticBeginFrameArgs(time_source_->LastTickTime())); | 60 CreateSyntheticBeginFrameArgs(time_source_->LastTickTime())); |
| 61 scheduler_->BeginFrame(begin_frame_args); | 61 scheduler_->BeginFrame(begin_frame_args); |
| 62 } | 62 } |
| 63 | 63 |
| 64 BeginFrameArgs | 64 BeginFrameArgs |
| 65 Scheduler::SyntheticBeginFrameSource::CreateSyntheticBeginFrameArgs( | 65 Scheduler::SyntheticBeginFrameSource::CreateSyntheticBeginFrameArgs( |
| 66 base::TimeTicks frame_time) { | 66 base::TimeTicks frame_time) { |
| 67 base::TimeTicks deadline = | 67 base::TimeTicks deadline = time_source_->NextTickTime(); |
| 68 time_source_->NextTickTime() - scheduler_->EstimatedParentDrawTime(); | |
| 69 return BeginFrameArgs::Create( | 68 return BeginFrameArgs::Create( |
| 70 frame_time, deadline, scheduler_->VSyncInterval()); | 69 frame_time, deadline, scheduler_->VSyncInterval()); |
| 71 } | 70 } |
| 72 | 71 |
| 73 Scheduler::Scheduler( | 72 Scheduler::Scheduler( |
| 74 SchedulerClient* client, | 73 SchedulerClient* client, |
| 75 const SchedulerSettings& scheduler_settings, | 74 const SchedulerSettings& scheduler_settings, |
| 76 int layer_tree_host_id, | 75 int layer_tree_host_id, |
| 77 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) | 76 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) |
| 78 : settings_(scheduler_settings), | 77 : settings_(scheduler_settings), |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 391 } | 390 } |
| 392 | 391 |
| 393 // BeginFrame is the mechanism that tells us that now is a good time to start | 392 // BeginFrame is the mechanism that tells us that now is a good time to start |
| 394 // making a frame. Usually this means that user input for the frame is complete. | 393 // making a frame. Usually this means that user input for the frame is complete. |
| 395 // If the scheduler is busy, we queue the BeginFrame to be handled later as | 394 // If the scheduler is busy, we queue the BeginFrame to be handled later as |
| 396 // a BeginRetroFrame. | 395 // a BeginRetroFrame. |
| 397 void Scheduler::BeginFrame(const BeginFrameArgs& args) { | 396 void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
| 398 TRACE_EVENT1("cc", "Scheduler::BeginFrame", "args", ToTrace(args)); | 397 TRACE_EVENT1("cc", "Scheduler::BeginFrame", "args", ToTrace(args)); |
| 399 DCHECK(settings_.throttle_frame_production); | 398 DCHECK(settings_.throttle_frame_production); |
| 400 | 399 |
| 400 BeginFrameArgs adjusted_args(args); | |
| 401 adjusted_args.deadline -= EstimatedParentDrawTime(); | |
|
brianderson
2014/06/10 18:24:23
I had some reservations about putting the adjustme
| |
| 402 | |
| 401 bool should_defer_begin_frame; | 403 bool should_defer_begin_frame; |
| 402 if (settings_.using_synchronous_renderer_compositor) { | 404 if (settings_.using_synchronous_renderer_compositor) { |
| 403 should_defer_begin_frame = false; | 405 should_defer_begin_frame = false; |
| 404 } else { | 406 } else { |
| 405 should_defer_begin_frame = | 407 should_defer_begin_frame = |
| 406 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || | 408 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || |
| 407 !last_set_needs_begin_frame_ || | 409 !last_set_needs_begin_frame_ || |
| 408 (state_machine_.begin_impl_frame_state() != | 410 (state_machine_.begin_impl_frame_state() != |
| 409 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 411 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 410 } | 412 } |
| 411 | 413 |
| 412 if (should_defer_begin_frame) { | 414 if (should_defer_begin_frame) { |
| 413 begin_retro_frame_args_.push_back(args); | 415 begin_retro_frame_args_.push_back(adjusted_args); |
| 414 TRACE_EVENT_INSTANT0( | 416 TRACE_EVENT_INSTANT0( |
| 415 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); | 417 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); |
| 416 return; | 418 return; |
| 417 } | 419 } |
| 418 | 420 |
| 419 BeginImplFrame(args); | 421 BeginImplFrame(adjusted_args); |
| 420 } | 422 } |
| 421 | 423 |
| 422 // BeginRetroFrame is called for BeginFrames that we've deferred because | 424 // BeginRetroFrame is called for BeginFrames that we've deferred because |
| 423 // the scheduler was in the middle of processing a previous BeginFrame. | 425 // the scheduler was in the middle of processing a previous BeginFrame. |
| 424 void Scheduler::BeginRetroFrame() { | 426 void Scheduler::BeginRetroFrame() { |
| 425 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); | 427 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); |
| 426 DCHECK(!settings_.using_synchronous_renderer_compositor); | 428 DCHECK(!settings_.using_synchronous_renderer_compositor); |
| 427 DCHECK(begin_retro_frame_posted_); | 429 DCHECK(begin_retro_frame_posted_); |
| 428 begin_retro_frame_posted_ = false; | 430 begin_retro_frame_posted_ = false; |
| 429 | 431 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 737 } | 739 } |
| 738 | 740 |
| 739 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 741 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
| 740 return (state_machine_.commit_state() == | 742 return (state_machine_.commit_state() == |
| 741 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 743 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
| 742 state_machine_.commit_state() == | 744 state_machine_.commit_state() == |
| 743 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 745 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
| 744 } | 746 } |
| 745 | 747 |
| 746 } // namespace cc | 748 } // namespace cc |
| OLD | NEW |