Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: cc/trees/layer_tree_host.cc

Issue 1513643010: cc:: Add remote mode to the compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 InitParams* params) { 79 InitParams* params) {
80 DCHECK(params->settings); 80 DCHECK(params->settings);
81 scoped_ptr<LayerTreeHost> layer_tree_host( 81 scoped_ptr<LayerTreeHost> layer_tree_host(
82 new LayerTreeHost(params, CompositorMode::SingleThreaded)); 82 new LayerTreeHost(params, CompositorMode::SingleThreaded));
83 layer_tree_host->InitializeSingleThreaded( 83 layer_tree_host->InitializeSingleThreaded(
84 single_thread_client, params->main_task_runner, 84 single_thread_client, params->main_task_runner,
85 std::move(params->external_begin_frame_source)); 85 std::move(params->external_begin_frame_source));
86 return layer_tree_host; 86 return layer_tree_host;
87 } 87 }
88 88
89 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemote(
90 RemoteProtoChannel* remote_proto_channel,
91 InitParams* params) {
92 DCHECK(params->main_task_runner.get());
93 DCHECK(params->settings);
94 DCHECK(remote_proto_channel);
95
96 // Using an external begin frame source is not supported in remote mode.
97 DCHECK(!params->settings->use_external_begin_frame_source);
98 DCHECK(!params->external_begin_frame_source);
99
100 scoped_ptr<LayerTreeHost> layer_tree_host(
101 new LayerTreeHost(params, CompositorMode::Remote));
102 layer_tree_host->InitializeRemote(remote_proto_channel,
103 params->main_task_runner);
104 return layer_tree_host;
105 }
106
107 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateDeserializable(
108 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
109 InitParams* params) {
110 DCHECK(params->settings);
111
112 scoped_ptr<LayerTreeHost> layer_tree_host(
113 new LayerTreeHost(params, CompositorMode::Deserializable));
114 layer_tree_host->InitializeDeserializable(params->main_task_runner,
115 impl_task_runner);
116 return layer_tree_host;
117 }
118
89 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) 119 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode)
90 : micro_benchmark_controller_(this), 120 : micro_benchmark_controller_(this),
91 next_ui_resource_id_(1), 121 next_ui_resource_id_(1),
92 compositor_mode_(mode), 122 compositor_mode_(mode),
93 needs_full_tree_sync_(true), 123 needs_full_tree_sync_(true),
94 needs_meta_info_recomputation_(true), 124 needs_meta_info_recomputation_(true),
95 client_(params->client), 125 client_(params->client),
96 source_frame_number_(0), 126 source_frame_number_(0),
97 meta_information_sequence_number_(1), 127 meta_information_sequence_number_(1),
98 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), 128 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
(...skipping 16 matching lines...) Expand all
115 has_transparent_background_(false), 145 has_transparent_background_(false),
116 did_complete_scale_animation_(false), 146 did_complete_scale_animation_(false),
117 in_paint_layer_contents_(false), 147 in_paint_layer_contents_(false),
118 id_(s_layer_tree_host_sequence_number.GetNext() + 1), 148 id_(s_layer_tree_host_sequence_number.GetNext() + 1),
119 next_commit_forces_redraw_(false), 149 next_commit_forces_redraw_(false),
120 shared_bitmap_manager_(params->shared_bitmap_manager), 150 shared_bitmap_manager_(params->shared_bitmap_manager),
121 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), 151 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager),
122 task_graph_runner_(params->task_graph_runner), 152 task_graph_runner_(params->task_graph_runner),
123 surface_id_namespace_(0u), 153 surface_id_namespace_(0u),
124 next_surface_sequence_(1u) { 154 next_surface_sequence_(1u) {
125 DCHECK(task_graph_runner_); 155 if (compositor_mode_ != CompositorMode::Remote)
156 DCHECK(task_graph_runner_);
126 157
127 if (settings_.accelerated_animation_enabled) { 158 if (settings_.accelerated_animation_enabled) {
128 if (settings_.use_compositor_animation_timelines) { 159 if (settings_.use_compositor_animation_timelines) {
129 animation_host_ = AnimationHost::Create(ThreadInstance::MAIN); 160 animation_host_ = AnimationHost::Create(ThreadInstance::MAIN);
130 animation_host_->SetMutatorHostClient(this); 161 animation_host_->SetMutatorHostClient(this);
131 } else { 162 } else {
132 animation_registrar_ = AnimationRegistrar::Create(); 163 animation_registrar_ = AnimationRegistrar::Create();
133 } 164 }
134 } 165 }
135 166
136 rendering_stats_instrumentation_->set_record_rendering_stats( 167 rendering_stats_instrumentation_->set_record_rendering_stats(
137 debug_state_.RecordRenderingStats()); 168 debug_state_.RecordRenderingStats());
138 } 169 }
139 170
140 void LayerTreeHost::InitializeThreaded( 171 void LayerTreeHost::InitializeThreaded(
141 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 172 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
142 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, 173 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
143 scoped_ptr<BeginFrameSource> external_begin_frame_source) { 174 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
144 task_runner_provider_ = 175 task_runner_provider_ =
145 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); 176 TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
146 scoped_ptr<ProxyMain> proxy_main = 177 InitializeProxy(
147 ProxyMain::CreateThreaded(this, task_runner_provider_.get(), 178 ProxyMain::CreateThreaded(this, task_runner_provider_.get(),
148 std::move(external_begin_frame_source)); 179 std::move(external_begin_frame_source)));
149 InitializeProxy(std::move(proxy_main));
150 } 180 }
151 181
152 void LayerTreeHost::InitializeSingleThreaded( 182 void LayerTreeHost::InitializeSingleThreaded(
153 LayerTreeHostSingleThreadClient* single_thread_client, 183 LayerTreeHostSingleThreadClient* single_thread_client,
154 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 184 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
155 scoped_ptr<BeginFrameSource> external_begin_frame_source) { 185 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
156 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr); 186 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr);
157 InitializeProxy(SingleThreadProxy::Create( 187 InitializeProxy(SingleThreadProxy::Create(
158 this, single_thread_client, task_runner_provider_.get(), 188 this, single_thread_client, task_runner_provider_.get(),
159 std::move(external_begin_frame_source))); 189 std::move(external_begin_frame_source)));
160 } 190 }
161 191
192 void LayerTreeHost::InitializeRemote(
193 RemoteProtoChannel* remote_proto_channel,
194 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) {
195 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr);
196 InitializeProxy(ProxyMain::CreateRemote(remote_proto_channel, this,
197 task_runner_provider_.get()));
198 }
199
200 void LayerTreeHost::InitializeDeserializable(
201 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
202 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
203 task_runner_provider_ =
204 TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
205 }
206
162 void LayerTreeHost::InitializeForTesting( 207 void LayerTreeHost::InitializeForTesting(
163 scoped_ptr<TaskRunnerProvider> task_runner_provider, 208 scoped_ptr<TaskRunnerProvider> task_runner_provider,
164 scoped_ptr<Proxy> proxy_for_testing) { 209 scoped_ptr<Proxy> proxy_for_testing) {
165 task_runner_provider_ = std::move(task_runner_provider); 210 task_runner_provider_ = std::move(task_runner_provider);
166 InitializeProxy(std::move(proxy_for_testing)); 211 InitializeProxy(std::move(proxy_for_testing));
167 } 212 }
168 213
169 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { 214 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) {
170 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); 215 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal");
216 DCHECK(task_runner_provider_);
171 217
172 proxy_ = std::move(proxy); 218 proxy_ = std::move(proxy);
173 proxy_->Start(); 219 proxy_->Start();
174 if (settings_.accelerated_animation_enabled) { 220 if (settings_.accelerated_animation_enabled) {
175 if (animation_host_) 221 if (animation_host_)
176 animation_host_->SetSupportsScrollAnimations( 222 animation_host_->SetSupportsScrollAnimations(
177 proxy_->SupportsImplScrolling()); 223 proxy_->SupportsImplScrolling());
178 else 224 else
179 animation_registrar_->set_supports_scroll_animations( 225 animation_registrar_->set_supports_scroll_animations(
180 proxy_->SupportsImplScrolling()); 226 proxy_->SupportsImplScrolling());
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 void LayerTreeHost::RequestMainFrameUpdate() { 284 void LayerTreeHost::RequestMainFrameUpdate() {
239 client_->UpdateLayerTreeHost(); 285 client_->UpdateLayerTreeHost();
240 } 286 }
241 287
242 // This function commits the LayerTreeHost to an impl tree. When modifying 288 // This function commits the LayerTreeHost to an impl tree. When modifying
243 // this function, keep in mind that the function *runs* on the impl thread! Any 289 // this function, keep in mind that the function *runs* on the impl thread! Any
244 // code that is logically a main thread operation, e.g. deletion of a Layer, 290 // code that is logically a main thread operation, e.g. deletion of a Layer,
245 // should be delayed until the LayerTreeHost::CommitComplete, which will run 291 // should be delayed until the LayerTreeHost::CommitComplete, which will run
246 // after the commit, but on the main thread. 292 // after the commit, but on the main thread.
247 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { 293 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
294 DCHECK(!IsRemote());
248 DCHECK(task_runner_provider_->IsImplThread()); 295 DCHECK(task_runner_provider_->IsImplThread());
249 296
250 bool is_new_trace; 297 bool is_new_trace;
251 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); 298 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
252 if (is_new_trace && 299 if (is_new_trace &&
253 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && 300 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() &&
254 root_layer()) { 301 root_layer()) {
255 LayerTreeHostCommon::CallFunctionForSubtree( 302 LayerTreeHostCommon::CallFunctionForSubtree(
256 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); }); 303 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); });
257 } 304 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 // Note: It is safe to drop all output surface references here as 470 // Note: It is safe to drop all output surface references here as
424 // LayerTreeHostImpl will not keep a pointer to either the old or 471 // LayerTreeHostImpl will not keep a pointer to either the old or
425 // new output surface after failing to initialize the new one. 472 // new output surface after failing to initialize the new one.
426 current_output_surface_ = nullptr; 473 current_output_surface_ = nullptr;
427 new_output_surface_ = nullptr; 474 new_output_surface_ = nullptr;
428 client_->DidFailToInitializeOutputSurface(); 475 client_->DidFailToInitializeOutputSurface();
429 } 476 }
430 477
431 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( 478 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl(
432 LayerTreeHostImplClient* client) { 479 LayerTreeHostImplClient* client) {
480 DCHECK(!IsRemote());
433 DCHECK(task_runner_provider_->IsImplThread()); 481 DCHECK(task_runner_provider_->IsImplThread());
434 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 482 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
435 settings_, client, task_runner_provider_.get(), 483 settings_, client, task_runner_provider_.get(),
436 rendering_stats_instrumentation_.get(), shared_bitmap_manager_, 484 rendering_stats_instrumentation_.get(), shared_bitmap_manager_,
437 gpu_memory_buffer_manager_, task_graph_runner_, id_); 485 gpu_memory_buffer_manager_, task_graph_runner_, id_);
438 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); 486 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
439 host_impl->SetContentIsSuitableForGpuRasterization( 487 host_impl->SetContentIsSuitableForGpuRasterization(
440 content_is_suitable_for_gpu_rasterization_); 488 content_is_suitable_for_gpu_rasterization_);
441 shared_bitmap_manager_ = NULL; 489 shared_bitmap_manager_ = NULL;
442 gpu_memory_buffer_manager_ = NULL; 490 gpu_memory_buffer_manager_ = NULL;
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); 778 Layer* found = FindFirstScrollableLayer(layer->children()[i].get());
731 if (found) 779 if (found)
732 return found; 780 return found;
733 } 781 }
734 782
735 return NULL; 783 return NULL;
736 } 784 }
737 785
738 void LayerTreeHost::RecordGpuRasterizationHistogram() { 786 void LayerTreeHost::RecordGpuRasterizationHistogram() {
739 // Gpu rasterization is only supported for Renderer compositors. 787 // Gpu rasterization is only supported for Renderer compositors.
740 // Checking for IsThreaded() to exclude Browser compositors. 788 // Checking for IsSingleThreaded() to exclude Browser compositors.
741 if (gpu_rasterization_histogram_recorded_ || IsThreaded()) 789 if (gpu_rasterization_histogram_recorded_ || IsSingleThreaded())
742 return; 790 return;
743 791
744 // Record how widely gpu rasterization is enabled. 792 // Record how widely gpu rasterization is enabled.
745 // This number takes device/gpu whitelisting/backlisting into account. 793 // This number takes device/gpu whitelisting/backlisting into account.
746 // Note that we do not consider the forced gpu rasterization mode, which is 794 // Note that we do not consider the forced gpu rasterization mode, which is
747 // mostly used for debugging purposes. 795 // mostly used for debugging purposes.
748 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled", 796 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled",
749 settings_.gpu_rasterization_enabled); 797 settings_.gpu_rasterization_enabled);
750 if (settings_.gpu_rasterization_enabled) { 798 if (settings_.gpu_rasterization_enabled) {
751 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered", 799 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered",
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 if (painted_device_scale_factor == painted_device_scale_factor_) 940 if (painted_device_scale_factor == painted_device_scale_factor_)
893 return; 941 return;
894 painted_device_scale_factor_ = painted_device_scale_factor; 942 painted_device_scale_factor_ = painted_device_scale_factor;
895 943
896 SetNeedsCommit(); 944 SetNeedsCommit();
897 } 945 }
898 946
899 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, 947 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
900 TopControlsState current, 948 TopControlsState current,
901 bool animate) { 949 bool animate) {
902 // Top controls are only used in threaded mode. 950 // Top controls are only used in threaded or remote mode.
903 DCHECK(IsThreaded()); 951 DCHECK(IsThreaded() || IsRemote());
904 proxy_->UpdateTopControlsState(constraints, current, animate); 952 proxy_->UpdateTopControlsState(constraints, current, animate);
905 } 953 }
906 954
907 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { 955 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) {
908 if (!settings_.accelerated_animation_enabled) 956 if (!settings_.accelerated_animation_enabled)
909 return; 957 return;
910 958
911 AnimationEventsVector events; 959 AnimationEventsVector events;
912 if (animation_host_) { 960 if (animation_host_) {
913 if (animation_host_->AnimateLayers(monotonic_time)) 961 if (animation_host_->AnimateLayers(monotonic_time))
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 !task_runner_provider_->HasImplThread()); 1304 !task_runner_provider_->HasImplThread());
1257 return compositor_mode_ == CompositorMode::SingleThreaded; 1305 return compositor_mode_ == CompositorMode::SingleThreaded;
1258 } 1306 }
1259 1307
1260 bool LayerTreeHost::IsThreaded() const { 1308 bool LayerTreeHost::IsThreaded() const {
1261 DCHECK(compositor_mode_ != CompositorMode::Threaded || 1309 DCHECK(compositor_mode_ != CompositorMode::Threaded ||
1262 task_runner_provider_->HasImplThread()); 1310 task_runner_provider_->HasImplThread());
1263 return compositor_mode_ == CompositorMode::Threaded; 1311 return compositor_mode_ == CompositorMode::Threaded;
1264 } 1312 }
1265 1313
1314 bool LayerTreeHost::IsRemote() const {
1315 DCHECK(compositor_mode_ != CompositorMode::Remote ||
1316 !task_runner_provider_->HasImplThread());
1317 return compositor_mode_ == CompositorMode::Remote;
1318 }
1319
1320 bool LayerTreeHost::IsDeserializable() const {
1321 DCHECK(compositor_mode_ != CompositorMode::Deserializable ||
1322 task_runner_provider_->HasImplThread());
1323 return compositor_mode_ == CompositorMode::Deserializable;
1324 }
1325
1266 } // namespace cc 1326 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698