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> | |
9 | 8 |
10 #include "base/bind.h" | 9 #include "base/bind.h" |
11 #include "base/command_line.h" | 10 #include "base/command_line.h" |
12 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
13 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
14 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
15 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
16 #include "base/string_number_conversions.h" | 15 #include "base/string_number_conversions.h" |
17 #include "cc/animation/animation_registrar.h" | 16 #include "cc/animation/animation_registrar.h" |
18 #include "cc/animation/layer_animation_controller.h" | 17 #include "cc/animation/layer_animation_controller.h" |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 void LayerTreeHost::FinishAllRendering() { | 430 void LayerTreeHost::FinishAllRendering() { |
432 proxy_->FinishAllRendering(); | 431 proxy_->FinishAllRendering(); |
433 } | 432 } |
434 | 433 |
435 void LayerTreeHost::SetDeferCommits(bool defer_commits) { | 434 void LayerTreeHost::SetDeferCommits(bool defer_commits) { |
436 proxy_->SetDeferCommits(defer_commits); | 435 proxy_->SetDeferCommits(defer_commits); |
437 } | 436 } |
438 | 437 |
439 void LayerTreeHost::DidDeferCommit() {} | 438 void LayerTreeHost::DidDeferCommit() {} |
440 | 439 |
| 440 static void SetNeedsDisplay(Layer* layer) { |
| 441 layer->SetNeedsDisplay(); |
| 442 } |
| 443 |
441 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { | 444 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { |
442 std::stack<Layer*> layer_stack; | 445 if (root_layer()) |
443 layer_stack.push(root_layer()); | 446 LayerTreeHostCommon::CallFunctionForSubtree(SetNeedsDisplay, root_layer()); |
444 while (!layer_stack.empty()) { | |
445 Layer* current_layer = layer_stack.top(); | |
446 layer_stack.pop(); | |
447 current_layer->SetNeedsDisplay(); | |
448 for (unsigned int i = 0; i < current_layer->children().size(); i++) { | |
449 layer_stack.push(current_layer->child_at(i)); | |
450 } | |
451 } | |
452 } | 447 } |
453 | 448 |
454 void LayerTreeHost::CollectRenderingStats(RenderingStats* stats) const { | 449 void LayerTreeHost::CollectRenderingStats(RenderingStats* stats) const { |
455 CHECK(debug_state_.RecordRenderingStats()); | 450 CHECK(debug_state_.RecordRenderingStats()); |
456 *stats = rendering_stats_instrumentation_->GetRenderingStats(); | 451 *stats = rendering_stats_instrumentation_->GetRenderingStats(); |
457 } | 452 } |
458 | 453 |
459 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { | 454 const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const { |
460 return proxy_->GetRendererCapabilities(); | 455 return proxy_->GetRendererCapabilities(); |
461 } | 456 } |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 | 660 |
666 for (size_t i = 0; i < layer->children().size(); ++i) { | 661 for (size_t i = 0; i < layer->children().size(); ++i) { |
667 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); | 662 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); |
668 if (found) | 663 if (found) |
669 return found; | 664 return found; |
670 } | 665 } |
671 | 666 |
672 return NULL; | 667 return NULL; |
673 } | 668 } |
674 | 669 |
675 class CalculateLCDTextMetricsFunctor { | 670 static void CalculateLCDTextMetrics(Layer* layer) { |
676 public: | 671 LayerTreeHost* layer_tree_host = layer->layer_tree_host(); |
677 void operator()(Layer* layer) { | 672 if (!layer_tree_host) |
678 LayerTreeHost* layer_tree_host = layer->layer_tree_host(); | 673 return; |
679 if (!layer_tree_host) | |
680 return; | |
681 | 674 |
682 if (!layer->SupportsLCDText()) | 675 if (!layer->SupportsLCDText()) |
683 return; | 676 return; |
684 | 677 |
685 bool update_total_num_cc_layers_can_use_lcd_text = false; | 678 bool update_total_num_cc_layers_can_use_lcd_text = false; |
686 bool update_total_num_cc_layers_will_use_lcd_text = false; | 679 bool update_total_num_cc_layers_will_use_lcd_text = false; |
687 if (layer->draw_properties().can_use_lcd_text) { | 680 if (layer->draw_properties().can_use_lcd_text) { |
688 update_total_num_cc_layers_can_use_lcd_text = true; | 681 update_total_num_cc_layers_can_use_lcd_text = true; |
689 if (layer->contents_opaque()) | 682 if (layer->contents_opaque()) |
690 update_total_num_cc_layers_will_use_lcd_text = true; | 683 update_total_num_cc_layers_will_use_lcd_text = true; |
691 } | 684 } |
692 | 685 |
693 layer_tree_host->IncrementLCDTextMetrics( | 686 layer_tree_host->IncrementLCDTextMetrics( |
694 update_total_num_cc_layers_can_use_lcd_text, | 687 update_total_num_cc_layers_can_use_lcd_text, |
695 update_total_num_cc_layers_will_use_lcd_text); | 688 update_total_num_cc_layers_will_use_lcd_text); |
696 } | 689 } |
697 }; | |
698 | 690 |
699 void LayerTreeHost::IncrementLCDTextMetrics( | 691 void LayerTreeHost::IncrementLCDTextMetrics( |
700 bool update_total_num_cc_layers_can_use_lcd_text, | 692 bool update_total_num_cc_layers_can_use_lcd_text, |
701 bool update_total_num_cc_layers_will_use_lcd_text) { | 693 bool update_total_num_cc_layers_will_use_lcd_text) { |
702 lcd_text_metrics_.total_num_cc_layers++; | 694 lcd_text_metrics_.total_num_cc_layers++; |
703 if (update_total_num_cc_layers_can_use_lcd_text) | 695 if (update_total_num_cc_layers_can_use_lcd_text) |
704 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text++; | 696 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text++; |
705 if (update_total_num_cc_layers_will_use_lcd_text) { | 697 if (update_total_num_cc_layers_will_use_lcd_text) { |
706 DCHECK(update_total_num_cc_layers_can_use_lcd_text); | 698 DCHECK(update_total_num_cc_layers_can_use_lcd_text); |
707 lcd_text_metrics_.total_num_cc_layers_will_use_lcd_text++; | 699 lcd_text_metrics_.total_num_cc_layers_will_use_lcd_text++; |
(...skipping 18 matching lines...) Expand all Loading... |
726 device_scale_factor_, | 718 device_scale_factor_, |
727 page_scale_factor_, | 719 page_scale_factor_, |
728 root_scroll, | 720 root_scroll, |
729 GetRendererCapabilities().max_texture_size, | 721 GetRendererCapabilities().max_texture_size, |
730 settings_.can_use_lcd_text, | 722 settings_.can_use_lcd_text, |
731 settings_.layer_transforms_should_scale_layer_contents, | 723 settings_.layer_transforms_should_scale_layer_contents, |
732 &update_list); | 724 &update_list); |
733 | 725 |
734 if (total_frames_used_for_lcd_text_metrics_ <= | 726 if (total_frames_used_for_lcd_text_metrics_ <= |
735 kTotalFramesToUseForLCDTextMetrics) { | 727 kTotalFramesToUseForLCDTextMetrics) { |
736 LayerTreeHostCommon::CallFunctionForSubtree< | 728 LayerTreeHostCommon::CallFunctionForSubtree(CalculateLCDTextMetrics, |
737 CalculateLCDTextMetricsFunctor, Layer>(root_layer); | 729 root_layer); |
738 total_frames_used_for_lcd_text_metrics_++; | 730 total_frames_used_for_lcd_text_metrics_++; |
739 } | 731 } |
740 | 732 |
741 if (total_frames_used_for_lcd_text_metrics_ == | 733 if (total_frames_used_for_lcd_text_metrics_ == |
742 kTotalFramesToUseForLCDTextMetrics) { | 734 kTotalFramesToUseForLCDTextMetrics) { |
743 total_frames_used_for_lcd_text_metrics_++; | 735 total_frames_used_for_lcd_text_metrics_++; |
744 | 736 |
745 UMA_HISTOGRAM_PERCENTAGE( | 737 UMA_HISTOGRAM_PERCENTAGE( |
746 "Renderer4.LCDText.PercentageOfCandidateLayers", | 738 "Renderer4.LCDText.PercentageOfCandidateLayers", |
747 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text * 100.0 / | 739 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text * 100.0 / |
(...skipping 22 matching lines...) Expand all Loading... |
770 for (size_t i = 0; i < update_list.size(); ++i) | 762 for (size_t i = 0; i < update_list.size(); ++i) |
771 update_list[i]->ClearRenderSurface(); | 763 update_list[i]->ClearRenderSurface(); |
772 } | 764 } |
773 | 765 |
774 void LayerTreeHost::TriggerPrepaint() { | 766 void LayerTreeHost::TriggerPrepaint() { |
775 prepaint_callback_.Cancel(); | 767 prepaint_callback_.Cancel(); |
776 TRACE_EVENT0("cc", "LayerTreeHost::TriggerPrepaint"); | 768 TRACE_EVENT0("cc", "LayerTreeHost::TriggerPrepaint"); |
777 SetNeedsCommit(); | 769 SetNeedsCommit(); |
778 } | 770 } |
779 | 771 |
780 class LayerTreeHostReduceMemoryFunctor { | 772 static void ReduceMemoryUsageForLayer(Layer* layer) { |
781 public: | 773 layer->ReduceMemoryUsage(); |
782 void operator()(Layer* layer) { | 774 } |
783 layer->ReduceMemoryUsage(); | |
784 } | |
785 }; | |
786 | 775 |
787 void LayerTreeHost::ReduceMemoryUsage() { | 776 void LayerTreeHost::ReduceMemoryUsage() { |
788 if (!root_layer()) | 777 if (root_layer()) |
789 return; | 778 LayerTreeHostCommon::CallFunctionForSubtree(ReduceMemoryUsageForLayer, |
790 | 779 root_layer()); |
791 LayerTreeHostCommon::CallFunctionForSubtree< | |
792 LayerTreeHostReduceMemoryFunctor, Layer>(root_layer()); | |
793 } | 780 } |
794 | 781 |
795 void LayerTreeHost::SetPrioritiesForSurfaces(size_t surface_memory_bytes) { | 782 void LayerTreeHost::SetPrioritiesForSurfaces(size_t surface_memory_bytes) { |
796 DCHECK(surface_memory_placeholder_); | 783 DCHECK(surface_memory_placeholder_); |
797 | 784 |
798 // Surfaces have a place holder for their memory since they are managed | 785 // Surfaces have a place holder for their memory since they are managed |
799 // independantly but should still be tracked and reduce other memory usage. | 786 // independantly but should still be tracked and reduce other memory usage. |
800 surface_memory_placeholder_->SetTextureManager( | 787 surface_memory_placeholder_->SetTextureManager( |
801 contents_texture_manager_.get()); | 788 contents_texture_manager_.get()); |
802 surface_memory_placeholder_->set_request_priority( | 789 surface_memory_placeholder_->set_request_priority( |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 bool start_ready_animations = true; | 1066 bool start_ready_animations = true; |
1080 (*iter).second->UpdateState(start_ready_animations, NULL); | 1067 (*iter).second->UpdateState(start_ready_animations, NULL); |
1081 } | 1068 } |
1082 } | 1069 } |
1083 | 1070 |
1084 skia::RefPtr<SkPicture> LayerTreeHost::CapturePicture() { | 1071 skia::RefPtr<SkPicture> LayerTreeHost::CapturePicture() { |
1085 return proxy_->CapturePicture(); | 1072 return proxy_->CapturePicture(); |
1086 } | 1073 } |
1087 | 1074 |
1088 } // namespace cc | 1075 } // namespace cc |
OLD | NEW |