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/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
59 | 59 |
60 LayerTreeHost::InitParams::~InitParams() { | 60 LayerTreeHost::InitParams::~InitParams() { |
61 } | 61 } |
62 | 62 |
63 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded( | 63 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded( |
64 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | 64 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
65 InitParams* params) { | 65 InitParams* params) { |
66 DCHECK(params->main_task_runner.get()); | 66 DCHECK(params->main_task_runner.get()); |
67 DCHECK(impl_task_runner.get()); | 67 DCHECK(impl_task_runner.get()); |
68 DCHECK(params->settings); | 68 DCHECK(params->settings); |
69 scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(params)); | 69 scoped_ptr<LayerTreeHost> layer_tree_host( |
70 new LayerTreeHost(params, CompositorMode::Threaded)); | |
70 layer_tree_host->InitializeThreaded( | 71 layer_tree_host->InitializeThreaded( |
71 params->main_task_runner, impl_task_runner, | 72 params->main_task_runner, impl_task_runner, |
72 std::move(params->external_begin_frame_source)); | 73 std::move(params->external_begin_frame_source)); |
73 return layer_tree_host; | 74 return layer_tree_host; |
74 } | 75 } |
75 | 76 |
76 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateSingleThreaded( | 77 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateSingleThreaded( |
77 LayerTreeHostSingleThreadClient* single_thread_client, | 78 LayerTreeHostSingleThreadClient* single_thread_client, |
78 InitParams* params) { | 79 InitParams* params) { |
79 DCHECK(params->settings); | 80 DCHECK(params->settings); |
80 scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(params)); | 81 scoped_ptr<LayerTreeHost> layer_tree_host( |
82 new LayerTreeHost(params, CompositorMode::SingleThreaded)); | |
81 layer_tree_host->InitializeSingleThreaded( | 83 layer_tree_host->InitializeSingleThreaded( |
82 single_thread_client, params->main_task_runner, | 84 single_thread_client, params->main_task_runner, |
83 std::move(params->external_begin_frame_source)); | 85 std::move(params->external_begin_frame_source)); |
84 return layer_tree_host; | 86 return layer_tree_host; |
85 } | 87 } |
86 | 88 |
87 LayerTreeHost::LayerTreeHost(InitParams* params) | 89 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) |
88 : micro_benchmark_controller_(this), | 90 : micro_benchmark_controller_(this), |
89 next_ui_resource_id_(1), | 91 next_ui_resource_id_(1), |
92 compositor_mode_(mode), | |
90 needs_full_tree_sync_(true), | 93 needs_full_tree_sync_(true), |
91 needs_meta_info_recomputation_(true), | 94 needs_meta_info_recomputation_(true), |
92 client_(params->client), | 95 client_(params->client), |
93 source_frame_number_(0), | 96 source_frame_number_(0), |
94 meta_information_sequence_number_(1), | 97 meta_information_sequence_number_(1), |
95 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), | 98 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), |
96 output_surface_lost_(true), | 99 output_surface_lost_(true), |
97 settings_(*params->settings), | 100 settings_(*params->settings), |
98 debug_state_(settings_.initial_debug_state), | 101 debug_state_(settings_.initial_debug_state), |
99 top_controls_shrink_blink_size_(false), | 102 top_controls_shrink_blink_size_(false), |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
667 duration)); | 670 duration)); |
668 | 671 |
669 SetNeedsCommit(); | 672 SetNeedsCommit(); |
670 } | 673 } |
671 | 674 |
672 void LayerTreeHost::NotifyInputThrottledUntilCommit() { | 675 void LayerTreeHost::NotifyInputThrottledUntilCommit() { |
673 proxy_->NotifyInputThrottledUntilCommit(); | 676 proxy_->NotifyInputThrottledUntilCommit(); |
674 } | 677 } |
675 | 678 |
676 void LayerTreeHost::LayoutAndUpdateLayers() { | 679 void LayerTreeHost::LayoutAndUpdateLayers() { |
677 DCHECK(!task_runner_provider_->HasImplThread()); | 680 DCHECK(IsSingleThreaded()); |
678 // This function is only valid when not using the scheduler. | 681 // This function is only valid when not using the scheduler. |
679 DCHECK(!settings_.single_thread_proxy_scheduler); | 682 DCHECK(!settings_.single_thread_proxy_scheduler); |
680 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); | 683 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); |
681 | 684 |
682 if (output_surface_lost()) { | 685 if (output_surface_lost()) { |
683 proxy->RequestNewOutputSurface(); | 686 proxy->RequestNewOutputSurface(); |
684 // RequestNewOutputSurface could have synchronously created an output | 687 // RequestNewOutputSurface could have synchronously created an output |
685 // surface, so check again before returning. | 688 // surface, so check again before returning. |
686 if (output_surface_lost()) | 689 if (output_surface_lost()) |
687 return; | 690 return; |
688 } | 691 } |
689 | 692 |
690 RequestMainFrameUpdate(); | 693 RequestMainFrameUpdate(); |
691 UpdateLayers(); | 694 UpdateLayers(); |
692 } | 695 } |
693 | 696 |
694 void LayerTreeHost::Composite(base::TimeTicks frame_begin_time) { | 697 void LayerTreeHost::Composite(base::TimeTicks frame_begin_time) { |
695 DCHECK(!task_runner_provider_->HasImplThread()); | 698 DCHECK(IsSingleThreaded()); |
696 // This function is only valid when not using the scheduler. | 699 // This function is only valid when not using the scheduler. |
697 DCHECK(!settings_.single_thread_proxy_scheduler); | 700 DCHECK(!settings_.single_thread_proxy_scheduler); |
698 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); | 701 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); |
699 | 702 |
700 proxy->CompositeImmediately(frame_begin_time); | 703 proxy->CompositeImmediately(frame_begin_time); |
701 } | 704 } |
702 | 705 |
703 bool LayerTreeHost::UpdateLayers() { | 706 bool LayerTreeHost::UpdateLayers() { |
704 DCHECK(!output_surface_lost_); | 707 DCHECK(!output_surface_lost_); |
705 if (!root_layer()) | 708 if (!root_layer()) |
(...skipping 19 matching lines...) Expand all Loading... | |
725 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); | 728 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); |
726 if (found) | 729 if (found) |
727 return found; | 730 return found; |
728 } | 731 } |
729 | 732 |
730 return NULL; | 733 return NULL; |
731 } | 734 } |
732 | 735 |
733 void LayerTreeHost::RecordGpuRasterizationHistogram() { | 736 void LayerTreeHost::RecordGpuRasterizationHistogram() { |
734 // Gpu rasterization is only supported for Renderer compositors. | 737 // Gpu rasterization is only supported for Renderer compositors. |
735 // Checking for proxy_->HasImplThread() to exclude Browser compositors. | 738 // Checking for IsThreaded() to exclude Browser compositors. |
736 if (gpu_rasterization_histogram_recorded_ || | 739 if (gpu_rasterization_histogram_recorded_ || IsThreaded()) |
737 !task_runner_provider_->HasImplThread()) | |
738 return; | 740 return; |
739 | 741 |
740 // Record how widely gpu rasterization is enabled. | 742 // Record how widely gpu rasterization is enabled. |
741 // This number takes device/gpu whitelisting/backlisting into account. | 743 // This number takes device/gpu whitelisting/backlisting into account. |
742 // Note that we do not consider the forced gpu rasterization mode, which is | 744 // Note that we do not consider the forced gpu rasterization mode, which is |
743 // mostly used for debugging purposes. | 745 // mostly used for debugging purposes. |
744 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled", | 746 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled", |
745 settings_.gpu_rasterization_enabled); | 747 settings_.gpu_rasterization_enabled); |
746 if (settings_.gpu_rasterization_enabled) { | 748 if (settings_.gpu_rasterization_enabled) { |
747 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered", | 749 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered", |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
893 return; | 895 return; |
894 painted_device_scale_factor_ = painted_device_scale_factor; | 896 painted_device_scale_factor_ = painted_device_scale_factor; |
895 | 897 |
896 SetNeedsCommit(); | 898 SetNeedsCommit(); |
897 } | 899 } |
898 | 900 |
899 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, | 901 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, |
900 TopControlsState current, | 902 TopControlsState current, |
901 bool animate) { | 903 bool animate) { |
902 // Top controls are only used in threaded mode. | 904 // Top controls are only used in threaded mode. |
903 DCHECK(task_runner_provider_->HasImplThread()); | 905 DCHECK(IsThreaded()); |
904 proxy_->UpdateTopControlsState(constraints, current, animate); | 906 proxy_->UpdateTopControlsState(constraints, current, animate); |
905 } | 907 } |
906 | 908 |
907 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { | 909 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { |
908 if (!settings_.accelerated_animation_enabled) | 910 if (!settings_.accelerated_animation_enabled) |
909 return; | 911 return; |
910 | 912 |
911 AnimationEventsVector events; | 913 AnimationEventsVector events; |
912 if (animation_host_) { | 914 if (animation_host_) { |
913 if (animation_host_->AnimateLayers(monotonic_time)) | 915 if (animation_host_->AnimateLayers(monotonic_time)) |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1244 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { | 1246 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { |
1245 return animation_host_ ? animation_host_->HasAnyAnimation(layer->id()) | 1247 return animation_host_ ? animation_host_->HasAnyAnimation(layer->id()) |
1246 : false; | 1248 : false; |
1247 } | 1249 } |
1248 | 1250 |
1249 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const { | 1251 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const { |
1250 return animation_host_ ? animation_host_->HasActiveAnimation(layer->id()) | 1252 return animation_host_ ? animation_host_->HasActiveAnimation(layer->id()) |
1251 : false; | 1253 : false; |
1252 } | 1254 } |
1253 | 1255 |
1256 bool LayerTreeHost::IsSingleThreaded() const { | |
1257 return compositor_mode_ == CompositorMode::SingleThreaded; | |
1258 } | |
1259 | |
1260 bool LayerTreeHost::IsThreaded() const { | |
1261 if (compositor_mode_ == CompositorMode::Threaded) { | |
1262 // We should have an impl task runner if we are running in threaded mode. | |
1263 DCHECK(task_runner_provider_->HasImplThread()); | |
vmpstr
2015/12/07 18:50:09
Can you change this function to:
{
DCHECK(compo
Khushal
2015/12/07 21:49:26
Done.
| |
1264 return true; | |
1265 } | |
1266 return false; | |
1267 } | |
1268 | |
1254 } // namespace cc | 1269 } // namespace cc |
OLD | NEW |