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

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

Issue 1419283002: cc: Split Proxy and TaskRunnerProvider for the LayerTreeHost (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments. Created 5 years, 1 month 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
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 } 130 }
131 131
132 rendering_stats_instrumentation_->set_record_rendering_stats( 132 rendering_stats_instrumentation_->set_record_rendering_stats(
133 debug_state_.RecordRenderingStats()); 133 debug_state_.RecordRenderingStats());
134 } 134 }
135 135
136 void LayerTreeHost::InitializeThreaded( 136 void LayerTreeHost::InitializeThreaded(
137 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 137 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
138 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, 138 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
139 scoped_ptr<BeginFrameSource> external_begin_frame_source) { 139 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
140 InitializeProxy(ThreadProxy::Create(this, 140 task_runner_provider_ =
141 main_task_runner, 141 TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
142 impl_task_runner, 142 InitializeProxy(ThreadProxy::Create(this, task_runner_provider_.get(),
143 external_begin_frame_source.Pass())); 143 external_begin_frame_source.Pass()));
144 } 144 }
145 145
146 void LayerTreeHost::InitializeSingleThreaded( 146 void LayerTreeHost::InitializeSingleThreaded(
147 LayerTreeHostSingleThreadClient* single_thread_client, 147 LayerTreeHostSingleThreadClient* single_thread_client,
148 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 148 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
149 scoped_ptr<BeginFrameSource> external_begin_frame_source) { 149 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
150 InitializeProxy( 150 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr);
151 SingleThreadProxy::Create(this, 151 InitializeProxy(SingleThreadProxy::Create(
152 single_thread_client, 152 this, single_thread_client, task_runner_provider_.get(),
153 main_task_runner, 153 external_begin_frame_source.Pass()));
154 external_begin_frame_source.Pass()));
155 } 154 }
156 155
157 void LayerTreeHost::InitializeForTesting(scoped_ptr<Proxy> proxy_for_testing) { 156 void LayerTreeHost::InitializeForTesting(
157 scoped_ptr<TaskRunnerProvider> task_runner_provider,
158 scoped_ptr<Proxy> proxy_for_testing) {
159 task_runner_provider_ = task_runner_provider.Pass();
158 InitializeProxy(proxy_for_testing.Pass()); 160 InitializeProxy(proxy_for_testing.Pass());
159 } 161 }
160 162
161 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { 163 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) {
162 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); 164 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal");
163 165
164 proxy_ = proxy.Pass(); 166 proxy_ = proxy.Pass();
165 proxy_->Start(); 167 proxy_->Start();
166 if (settings_.accelerated_animation_enabled) { 168 if (settings_.accelerated_animation_enabled) {
167 if (animation_host_) 169 if (animation_host_)
(...skipping 12 matching lines...) Expand all
180 animation_host_->SetMutatorHostClient(nullptr); 182 animation_host_->SetMutatorHostClient(nullptr);
181 183
182 if (root_layer_.get()) 184 if (root_layer_.get())
183 root_layer_->SetLayerTreeHost(NULL); 185 root_layer_->SetLayerTreeHost(NULL);
184 186
185 DCHECK(swap_promise_monitor_.empty()); 187 DCHECK(swap_promise_monitor_.empty());
186 188
187 BreakSwapPromises(SwapPromise::COMMIT_FAILS); 189 BreakSwapPromises(SwapPromise::COMMIT_FAILS);
188 190
189 if (proxy_) { 191 if (proxy_) {
190 DCHECK(proxy_->IsMainThread()); 192 DCHECK(task_runner_provider_->IsMainThread());
191 proxy_->Stop(); 193 proxy_->Stop();
194
195 // Proxy must be destroyed before the Task Runner Provider.
196 proxy_ = nullptr;
192 } 197 }
193 198
194 // We must clear any pointers into the layer tree prior to destroying it. 199 // We must clear any pointers into the layer tree prior to destroying it.
195 RegisterViewportLayers(NULL, NULL, NULL, NULL); 200 RegisterViewportLayers(NULL, NULL, NULL, NULL);
196 201
197 if (root_layer_.get()) { 202 if (root_layer_.get()) {
198 // The layer tree must be destroyed before the layer tree host. We've 203 // The layer tree must be destroyed before the layer tree host. We've
199 // made a contract with our animation controllers that the registrar 204 // made a contract with our animation controllers that the registrar
200 // will outlive them, and we must make good. 205 // will outlive them, and we must make good.
201 root_layer_ = NULL; 206 root_layer_ = NULL;
(...skipping 25 matching lines...) Expand all
227 void LayerTreeHost::RequestMainFrameUpdate() { 232 void LayerTreeHost::RequestMainFrameUpdate() {
228 client_->UpdateLayerTreeHost(); 233 client_->UpdateLayerTreeHost();
229 } 234 }
230 235
231 // This function commits the LayerTreeHost to an impl tree. When modifying 236 // This function commits the LayerTreeHost to an impl tree. When modifying
232 // this function, keep in mind that the function *runs* on the impl thread! Any 237 // this function, keep in mind that the function *runs* on the impl thread! Any
233 // code that is logically a main thread operation, e.g. deletion of a Layer, 238 // code that is logically a main thread operation, e.g. deletion of a Layer,
234 // should be delayed until the LayerTreeHost::CommitComplete, which will run 239 // should be delayed until the LayerTreeHost::CommitComplete, which will run
235 // after the commit, but on the main thread. 240 // after the commit, but on the main thread.
236 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { 241 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
237 DCHECK(proxy_->IsImplThread()); 242 DCHECK(task_runner_provider_->IsImplThread());
238 243
239 bool is_new_trace; 244 bool is_new_trace;
240 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); 245 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
241 if (is_new_trace && 246 if (is_new_trace &&
242 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && 247 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() &&
243 root_layer()) { 248 root_layer()) {
244 LayerTreeHostCommon::CallFunctionForSubtree( 249 LayerTreeHostCommon::CallFunctionForSubtree(
245 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); }); 250 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); });
246 } 251 }
247 252
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 // Note: It is safe to drop all output surface references here as 417 // Note: It is safe to drop all output surface references here as
413 // LayerTreeHostImpl will not keep a pointer to either the old or 418 // LayerTreeHostImpl will not keep a pointer to either the old or
414 // new output surface after failing to initialize the new one. 419 // new output surface after failing to initialize the new one.
415 current_output_surface_ = nullptr; 420 current_output_surface_ = nullptr;
416 new_output_surface_ = nullptr; 421 new_output_surface_ = nullptr;
417 client_->DidFailToInitializeOutputSurface(); 422 client_->DidFailToInitializeOutputSurface();
418 } 423 }
419 424
420 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( 425 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl(
421 LayerTreeHostImplClient* client) { 426 LayerTreeHostImplClient* client) {
422 DCHECK(proxy_->IsImplThread()); 427 DCHECK(task_runner_provider_->IsImplThread());
423 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 428 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
424 settings_, client, proxy_.get(), rendering_stats_instrumentation_.get(), 429 settings_, client, task_runner_provider_.get(),
425 shared_bitmap_manager_, gpu_memory_buffer_manager_, task_graph_runner_, 430 rendering_stats_instrumentation_.get(), shared_bitmap_manager_,
426 id_); 431 gpu_memory_buffer_manager_, task_graph_runner_, id_);
427 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); 432 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
428 host_impl->SetContentIsSuitableForGpuRasterization( 433 host_impl->SetContentIsSuitableForGpuRasterization(
429 content_is_suitable_for_gpu_rasterization_); 434 content_is_suitable_for_gpu_rasterization_);
430 shared_bitmap_manager_ = NULL; 435 shared_bitmap_manager_ = NULL;
431 gpu_memory_buffer_manager_ = NULL; 436 gpu_memory_buffer_manager_ = NULL;
432 task_graph_runner_ = NULL; 437 task_graph_runner_ = NULL;
433 input_handler_weak_ptr_ = host_impl->AsWeakPtr(); 438 input_handler_weak_ptr_ = host_impl->AsWeakPtr();
434 return host_impl.Pass(); 439 return host_impl.Pass();
435 } 440 }
436 441
437 void LayerTreeHost::DidLoseOutputSurface() { 442 void LayerTreeHost::DidLoseOutputSurface() {
438 TRACE_EVENT0("cc", "LayerTreeHost::DidLoseOutputSurface"); 443 TRACE_EVENT0("cc", "LayerTreeHost::DidLoseOutputSurface");
439 DCHECK(proxy_->IsMainThread()); 444 DCHECK(task_runner_provider_->IsMainThread());
440 445
441 if (output_surface_lost_) 446 if (output_surface_lost_)
442 return; 447 return;
443 448
444 output_surface_lost_ = true; 449 output_surface_lost_ = true;
445 SetNeedsCommit(); 450 SetNeedsCommit();
446 } 451 }
447 452
448 void LayerTreeHost::FinishAllRendering() { 453 void LayerTreeHost::FinishAllRendering() {
449 proxy_->FinishAllRendering(); 454 proxy_->FinishAllRendering();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 proxy_->SetNextCommitWaitsForActivation(); 528 proxy_->SetNextCommitWaitsForActivation();
524 } 529 }
525 530
526 void LayerTreeHost::SetNextCommitForcesRedraw() { 531 void LayerTreeHost::SetNextCommitForcesRedraw() {
527 next_commit_forces_redraw_ = true; 532 next_commit_forces_redraw_ = true;
528 proxy_->SetNeedsUpdateLayers(); 533 proxy_->SetNeedsUpdateLayers();
529 } 534 }
530 535
531 void LayerTreeHost::SetAnimationEvents( 536 void LayerTreeHost::SetAnimationEvents(
532 scoped_ptr<AnimationEventsVector> events) { 537 scoped_ptr<AnimationEventsVector> events) {
533 DCHECK(proxy_->IsMainThread()); 538 DCHECK(task_runner_provider_->IsMainThread());
534 if (animation_host_) 539 if (animation_host_)
535 animation_host_->SetAnimationEvents(events.Pass()); 540 animation_host_->SetAnimationEvents(events.Pass());
536 else 541 else
537 animation_registrar_->SetAnimationEvents(events.Pass()); 542 animation_registrar_->SetAnimationEvents(events.Pass());
538 } 543 }
539 544
540 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { 545 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) {
541 if (root_layer_.get() == root_layer.get()) 546 if (root_layer_.get() == root_layer.get())
542 return; 547 return;
543 548
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 duration)); 666 duration));
662 667
663 SetNeedsCommit(); 668 SetNeedsCommit();
664 } 669 }
665 670
666 void LayerTreeHost::NotifyInputThrottledUntilCommit() { 671 void LayerTreeHost::NotifyInputThrottledUntilCommit() {
667 proxy_->NotifyInputThrottledUntilCommit(); 672 proxy_->NotifyInputThrottledUntilCommit();
668 } 673 }
669 674
670 void LayerTreeHost::LayoutAndUpdateLayers() { 675 void LayerTreeHost::LayoutAndUpdateLayers() {
671 DCHECK(!proxy_->HasImplThread()); 676 DCHECK(!task_runner_provider_->HasImplThread());
672 // This function is only valid when not using the scheduler. 677 // This function is only valid when not using the scheduler.
673 DCHECK(!settings_.single_thread_proxy_scheduler); 678 DCHECK(!settings_.single_thread_proxy_scheduler);
674 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); 679 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get());
675 680
676 if (output_surface_lost()) { 681 if (output_surface_lost()) {
677 proxy->RequestNewOutputSurface(); 682 proxy->RequestNewOutputSurface();
678 // RequestNewOutputSurface could have synchronously created an output 683 // RequestNewOutputSurface could have synchronously created an output
679 // surface, so check again before returning. 684 // surface, so check again before returning.
680 if (output_surface_lost()) 685 if (output_surface_lost())
681 return; 686 return;
682 } 687 }
683 688
684 RequestMainFrameUpdate(); 689 RequestMainFrameUpdate();
685 UpdateLayers(); 690 UpdateLayers();
686 } 691 }
687 692
688 void LayerTreeHost::Composite(base::TimeTicks frame_begin_time) { 693 void LayerTreeHost::Composite(base::TimeTicks frame_begin_time) {
689 DCHECK(!proxy_->HasImplThread()); 694 DCHECK(!task_runner_provider_->HasImplThread());
690 // This function is only valid when not using the scheduler. 695 // This function is only valid when not using the scheduler.
691 DCHECK(!settings_.single_thread_proxy_scheduler); 696 DCHECK(!settings_.single_thread_proxy_scheduler);
692 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get()); 697 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get());
693 698
694 proxy->CompositeImmediately(frame_begin_time); 699 proxy->CompositeImmediately(frame_begin_time);
695 } 700 }
696 701
697 bool LayerTreeHost::UpdateLayers() { 702 bool LayerTreeHost::UpdateLayers() {
698 DCHECK(!output_surface_lost_); 703 DCHECK(!output_surface_lost_);
699 if (!root_layer()) 704 if (!root_layer())
(...skipping 20 matching lines...) Expand all
720 if (found) 725 if (found)
721 return found; 726 return found;
722 } 727 }
723 728
724 return NULL; 729 return NULL;
725 } 730 }
726 731
727 void LayerTreeHost::RecordGpuRasterizationHistogram() { 732 void LayerTreeHost::RecordGpuRasterizationHistogram() {
728 // Gpu rasterization is only supported for Renderer compositors. 733 // Gpu rasterization is only supported for Renderer compositors.
729 // Checking for proxy_->HasImplThread() to exclude Browser compositors. 734 // Checking for proxy_->HasImplThread() to exclude Browser compositors.
730 if (gpu_rasterization_histogram_recorded_ || !proxy_->HasImplThread()) 735 if (gpu_rasterization_histogram_recorded_ ||
736 !task_runner_provider_->HasImplThread())
731 return; 737 return;
732 738
733 // Record how widely gpu rasterization is enabled. 739 // Record how widely gpu rasterization is enabled.
734 // This number takes device/gpu whitelisting/backlisting into account. 740 // This number takes device/gpu whitelisting/backlisting into account.
735 // Note that we do not consider the forced gpu rasterization mode, which is 741 // Note that we do not consider the forced gpu rasterization mode, which is
736 // mostly used for debugging purposes. 742 // mostly used for debugging purposes.
737 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled", 743 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled",
738 settings_.gpu_rasterization_enabled); 744 settings_.gpu_rasterization_enabled);
739 if (settings_.gpu_rasterization_enabled) { 745 if (settings_.gpu_rasterization_enabled) {
740 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered", 746 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered",
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
888 return; 894 return;
889 painted_device_scale_factor_ = painted_device_scale_factor; 895 painted_device_scale_factor_ = painted_device_scale_factor;
890 896
891 SetNeedsCommit(); 897 SetNeedsCommit();
892 } 898 }
893 899
894 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, 900 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
895 TopControlsState current, 901 TopControlsState current,
896 bool animate) { 902 bool animate) {
897 // Top controls are only used in threaded mode. 903 // Top controls are only used in threaded mode.
898 DCHECK(proxy_->HasImplThread()); 904 DCHECK(task_runner_provider_->HasImplThread());
899 proxy_->UpdateTopControlsState(constraints, current, animate); 905 proxy_->UpdateTopControlsState(constraints, current, animate);
900 } 906 }
901 907
902 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { 908 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) {
903 if (!settings_.accelerated_animation_enabled) 909 if (!settings_.accelerated_animation_enabled)
904 return; 910 return;
905 911
906 AnimationEventsVector events; 912 AnimationEventsVector events;
907 if (animation_host_) { 913 if (animation_host_) {
908 if (animation_host_->AnimateLayers(monotonic_time)) 914 if (animation_host_->AnimateLayers(monotonic_time))
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 return animation_host_ ? animation_host_->HasAnyAnimation(layer->id()) 1246 return animation_host_ ? animation_host_->HasAnyAnimation(layer->id())
1241 : false; 1247 : false;
1242 } 1248 }
1243 1249
1244 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const { 1250 bool LayerTreeHost::HasActiveAnimation(const Layer* layer) const {
1245 return animation_host_ ? animation_host_->HasActiveAnimation(layer->id()) 1251 return animation_host_ ? animation_host_->HasActiveAnimation(layer->id())
1246 : false; 1252 : false;
1247 } 1253 }
1248 1254
1249 } // namespace cc 1255 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698