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