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/trees/single_thread_proxy.h" | 5 #include "cc/trees/single_thread_proxy.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/profiler/scoped_tracker.h" | 8 #include "base/profiler/scoped_tracker.h" |
9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
10 #include "cc/animation/animation_events.h" | 10 #include "cc/animation/animation_events.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 weak_factory_(this) { | 50 weak_factory_(this) { |
51 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); | 51 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
52 DCHECK(task_runner_provider_); | 52 DCHECK(task_runner_provider_); |
53 DCHECK(task_runner_provider_->IsMainThread()); | 53 DCHECK(task_runner_provider_->IsMainThread()); |
54 DCHECK(layer_tree_host); | 54 DCHECK(layer_tree_host); |
55 } | 55 } |
56 | 56 |
57 void SingleThreadProxy::Start( | 57 void SingleThreadProxy::Start( |
58 scoped_ptr<BeginFrameSource> external_begin_frame_source) { | 58 scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
59 DebugScopedSetImplThread impl(task_runner_provider_); | 59 DebugScopedSetImplThread impl(task_runner_provider_); |
60 external_begin_frame_source_ = std::move(external_begin_frame_source); | 60 begin_frame_source_ = std::move(external_begin_frame_source); |
61 | 61 |
62 if (layer_tree_host_->settings().single_thread_proxy_scheduler && | 62 if (layer_tree_host_->settings().single_thread_proxy_scheduler && |
63 !scheduler_on_impl_thread_) { | 63 !scheduler_on_impl_thread_) { |
64 SchedulerSettings scheduler_settings( | 64 SchedulerSettings scheduler_settings( |
65 layer_tree_host_->settings().ToSchedulerSettings()); | 65 layer_tree_host_->settings().ToSchedulerSettings()); |
66 scheduler_settings.commit_to_active_tree = CommitToActiveTree(); | 66 scheduler_settings.commit_to_active_tree = CommitToActiveTree(); |
67 | 67 |
68 scoped_ptr<CompositorTimingHistory> compositor_timing_history( | 68 scoped_ptr<CompositorTimingHistory> compositor_timing_history( |
69 new CompositorTimingHistory( | 69 new CompositorTimingHistory( |
70 scheduler_settings.using_synchronous_renderer_compositor, | 70 scheduler_settings.using_synchronous_renderer_compositor, |
71 CompositorTimingHistory::BROWSER_UMA, | 71 CompositorTimingHistory::BROWSER_UMA, |
72 layer_tree_host_->rendering_stats_instrumentation())); | 72 layer_tree_host_->rendering_stats_instrumentation())); |
73 | 73 |
| 74 if (!scheduler_settings.throttle_frame_production) { |
| 75 // Unthrottled source takes precedence over external sources. |
| 76 begin_frame_source_ = BackToBackBeginFrameSource::Create( |
| 77 task_runner_provider_->MainThreadTaskRunner()); |
| 78 } |
| 79 BeginFrameSource* frame_source = begin_frame_source_.get(); |
| 80 if (!frame_source) { |
| 81 synthetic_frame_source_ = SyntheticBeginFrameSource::Create( |
| 82 task_runner_provider_->MainThreadTaskRunner(), |
| 83 BeginFrameArgs::DefaultInterval()); |
| 84 frame_source = synthetic_frame_source_.get(); |
| 85 } |
| 86 |
74 scheduler_on_impl_thread_ = | 87 scheduler_on_impl_thread_ = |
75 Scheduler::Create(this, scheduler_settings, layer_tree_host_->id(), | 88 Scheduler::Create(this, scheduler_settings, layer_tree_host_->id(), |
76 task_runner_provider_->MainThreadTaskRunner(), | 89 task_runner_provider_->MainThreadTaskRunner(), |
77 external_begin_frame_source_.get(), | 90 frame_source, std::move(compositor_timing_history)); |
78 std::move(compositor_timing_history)); | |
79 } | 91 } |
80 | 92 |
81 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); | 93 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); |
82 } | 94 } |
83 | 95 |
84 SingleThreadProxy::~SingleThreadProxy() { | 96 SingleThreadProxy::~SingleThreadProxy() { |
85 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); | 97 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); |
86 DCHECK(task_runner_provider_->IsMainThread()); | 98 DCHECK(task_runner_provider_->IsMainThread()); |
87 // Make sure Stop() got called or never Started. | 99 // Make sure Stop() got called or never Started. |
88 DCHECK(!layer_tree_host_impl_); | 100 DCHECK(!layer_tree_host_impl_); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 // the output surface if already in BEGIN_IMPL_FRAME_STATE_IDLE. | 468 // the output surface if already in BEGIN_IMPL_FRAME_STATE_IDLE. |
457 layer_tree_host_->DidLoseOutputSurface(); | 469 layer_tree_host_->DidLoseOutputSurface(); |
458 } | 470 } |
459 client_->DidAbortSwapBuffers(); | 471 client_->DidAbortSwapBuffers(); |
460 if (scheduler_on_impl_thread_) | 472 if (scheduler_on_impl_thread_) |
461 scheduler_on_impl_thread_->DidLoseOutputSurface(); | 473 scheduler_on_impl_thread_->DidLoseOutputSurface(); |
462 } | 474 } |
463 | 475 |
464 void SingleThreadProxy::CommitVSyncParameters(base::TimeTicks timebase, | 476 void SingleThreadProxy::CommitVSyncParameters(base::TimeTicks timebase, |
465 base::TimeDelta interval) { | 477 base::TimeDelta interval) { |
466 if (scheduler_on_impl_thread_) | 478 if (authoritative_vsync_interval_ != base::TimeDelta()) { |
467 scheduler_on_impl_thread_->CommitVSyncParameters(timebase, interval); | 479 interval = authoritative_vsync_interval_; |
| 480 } else if (interval == base::TimeDelta()) { |
| 481 // TODO(brianderson): We should not be receiving 0 intervals. |
| 482 interval = BeginFrameArgs::DefaultInterval(); |
| 483 } |
| 484 |
| 485 last_vsync_timebase_ = timebase; |
| 486 |
| 487 if (synthetic_frame_source_) |
| 488 synthetic_frame_source_->OnUpdateVSyncParameters(timebase, interval); |
468 } | 489 } |
469 | 490 |
470 void SingleThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | 491 void SingleThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
471 if (scheduler_on_impl_thread_) | 492 if (scheduler_on_impl_thread_) |
472 scheduler_on_impl_thread_->SetEstimatedParentDrawTime(draw_time); | 493 scheduler_on_impl_thread_->SetEstimatedParentDrawTime(draw_time); |
473 } | 494 } |
474 | 495 |
475 void SingleThreadProxy::DidSwapBuffersOnImplThread() { | 496 void SingleThreadProxy::DidSwapBuffersOnImplThread() { |
476 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersOnImplThread"); | 497 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersOnImplThread"); |
477 if (scheduler_on_impl_thread_) | 498 if (scheduler_on_impl_thread_) |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 } | 713 } |
693 | 714 |
694 void SingleThreadProxy::SetChildrenNeedBeginFrames( | 715 void SingleThreadProxy::SetChildrenNeedBeginFrames( |
695 bool children_need_begin_frames) { | 716 bool children_need_begin_frames) { |
696 scheduler_on_impl_thread_->SetChildrenNeedBeginFrames( | 717 scheduler_on_impl_thread_->SetChildrenNeedBeginFrames( |
697 children_need_begin_frames); | 718 children_need_begin_frames); |
698 } | 719 } |
699 | 720 |
700 void SingleThreadProxy::SetAuthoritativeVSyncInterval( | 721 void SingleThreadProxy::SetAuthoritativeVSyncInterval( |
701 const base::TimeDelta& interval) { | 722 const base::TimeDelta& interval) { |
702 scheduler_on_impl_thread_->SetAuthoritativeVSyncInterval(interval); | 723 authoritative_vsync_interval_ = interval; |
| 724 if (synthetic_frame_source_) { |
| 725 synthetic_frame_source_->OnUpdateVSyncParameters(last_vsync_timebase_, |
| 726 interval); |
| 727 } |
703 } | 728 } |
704 | 729 |
705 void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { | 730 void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { |
706 DebugScopedSetImplThread impl(task_runner_provider_); | 731 DebugScopedSetImplThread impl(task_runner_provider_); |
707 #if DCHECK_IS_ON() | 732 #if DCHECK_IS_ON() |
708 DCHECK(!inside_impl_frame_) | 733 DCHECK(!inside_impl_frame_) |
709 << "WillBeginImplFrame called while already inside an impl frame!"; | 734 << "WillBeginImplFrame called while already inside an impl frame!"; |
710 inside_impl_frame_ = true; | 735 inside_impl_frame_ = true; |
711 #endif | 736 #endif |
712 layer_tree_host_impl_->WillBeginImplFrame(args); | 737 layer_tree_host_impl_->WillBeginImplFrame(args); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 << "DidFinishImplFrame called while not inside an impl frame!"; | 892 << "DidFinishImplFrame called while not inside an impl frame!"; |
868 inside_impl_frame_ = false; | 893 inside_impl_frame_ = false; |
869 #endif | 894 #endif |
870 } | 895 } |
871 | 896 |
872 void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) { | 897 void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) { |
873 layer_tree_host_->SendBeginFramesToChildren(args); | 898 layer_tree_host_->SendBeginFramesToChildren(args); |
874 } | 899 } |
875 | 900 |
876 } // namespace cc | 901 } // namespace cc |
OLD | NEW |