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