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 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 DCHECK(!root_layer()->parent()); | 683 DCHECK(!root_layer()->parent()); |
684 | 684 |
685 if (contents_texture_manager_ && memory_allocation_limit_bytes) { | 685 if (contents_texture_manager_ && memory_allocation_limit_bytes) { |
686 contents_texture_manager_->SetMaxMemoryLimitBytes( | 686 contents_texture_manager_->SetMaxMemoryLimitBytes( |
687 memory_allocation_limit_bytes); | 687 memory_allocation_limit_bytes); |
688 } | 688 } |
689 | 689 |
690 return UpdateLayers(root_layer(), queue); | 690 return UpdateLayers(root_layer(), queue); |
691 } | 691 } |
692 | 692 |
693 static Layer* FindFirstScrollableLayer(Layer* layer) { | |
694 if (!layer) | |
695 return NULL; | |
696 | |
697 if (layer->scrollable()) | |
698 return layer; | |
699 | |
700 for (size_t i = 0; i < layer->children().size(); ++i) { | |
701 Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); | |
702 if (found) | |
703 return found; | |
704 } | |
705 | |
706 return NULL; | |
707 } | |
708 | |
709 void LayerTreeHost::CalculateLCDTextMetricsCallback(Layer* layer) { | 693 void LayerTreeHost::CalculateLCDTextMetricsCallback(Layer* layer) { |
710 if (!layer->SupportsLCDText()) | 694 if (!layer->SupportsLCDText()) |
711 return; | 695 return; |
712 | 696 |
713 lcd_text_metrics_.total_num_cc_layers++; | 697 lcd_text_metrics_.total_num_cc_layers++; |
714 if (layer->draw_properties().can_use_lcd_text) { | 698 if (layer->draw_properties().can_use_lcd_text) { |
715 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text++; | 699 lcd_text_metrics_.total_num_cc_layers_can_use_lcd_text++; |
716 if (layer->contents_opaque()) | 700 if (layer->contents_opaque()) |
717 lcd_text_metrics_.total_num_cc_layers_will_use_lcd_text++; | 701 lcd_text_metrics_.total_num_cc_layers_will_use_lcd_text++; |
718 } | 702 } |
719 } | 703 } |
720 | 704 |
721 bool LayerTreeHost::UsingSharedMemoryResources() { | 705 bool LayerTreeHost::UsingSharedMemoryResources() { |
722 return GetRendererCapabilities().using_shared_memory_resources; | 706 return GetRendererCapabilities().using_shared_memory_resources; |
723 } | 707 } |
724 | 708 |
725 bool LayerTreeHost::UpdateLayers(Layer* root_layer, | 709 bool LayerTreeHost::UpdateLayers(Layer* root_layer, |
726 ResourceUpdateQueue* queue) { | 710 ResourceUpdateQueue* queue) { |
727 TRACE_EVENT1(benchmark_instrumentation::kCategory, | 711 TRACE_EVENT1(benchmark_instrumentation::kCategory, |
728 benchmark_instrumentation::kLayerTreeHostUpdateLayers, | 712 benchmark_instrumentation::kLayerTreeHostUpdateLayers, |
729 benchmark_instrumentation::kSourceFrameNumber, | 713 benchmark_instrumentation::kSourceFrameNumber, |
730 source_frame_number()); | 714 source_frame_number()); |
731 | 715 |
732 RenderSurfaceLayerList update_list; | 716 RenderSurfaceLayerList update_list; |
733 { | 717 { |
734 UpdateHudLayer(); | 718 UpdateHudLayer(); |
735 | 719 |
736 Layer* root_scroll = FindFirstScrollableLayer(root_layer); | 720 Layer* root_scroll = |
| 721 LayerTreeHostCommon::FindFirstScrollableLayer(root_layer); |
737 | 722 |
738 if (hud_layer_) { | 723 if (hud_layer_) { |
739 hud_layer_->PrepareForCalculateDrawProperties( | 724 hud_layer_->PrepareForCalculateDrawProperties( |
740 device_viewport_size(), device_scale_factor_); | 725 device_viewport_size(), device_scale_factor_); |
741 } | 726 } |
742 | 727 |
743 TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::CalcDrawProps"); | 728 TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::CalcDrawProps"); |
744 LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( | 729 LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( |
745 root_layer, | 730 root_layer, |
746 device_viewport_size(), | 731 device_viewport_size(), |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 if (has_scrolls) { | 986 if (has_scrolls) { |
1002 // We use async events here because we want to conditionally trace. This | 987 // We use async events here because we want to conditionally trace. This |
1003 // is too spammy otherwise. | 988 // is too spammy otherwise. |
1004 TRACE_EVENT_ASYNC_BEGIN0( | 989 TRACE_EVENT_ASYNC_BEGIN0( |
1005 "impl-scroll", | 990 "impl-scroll", |
1006 "LayerTreeHost::ApplyScrollAndScale", | 991 "LayerTreeHost::ApplyScrollAndScale", |
1007 this); | 992 this); |
1008 } | 993 } |
1009 | 994 |
1010 gfx::Vector2d root_scroll_delta; | 995 gfx::Vector2d root_scroll_delta; |
1011 Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 996 Layer* root_scroll_layer = |
| 997 LayerTreeHostCommon::FindFirstScrollableLayer(root_layer_.get()); |
1012 | 998 |
1013 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 999 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
1014 Layer* layer = | 1000 Layer* layer = |
1015 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), | 1001 LayerTreeHostCommon::FindLayerInSubtree(root_layer_.get(), |
1016 info.scrolls[i].layer_id); | 1002 info.scrolls[i].layer_id); |
1017 if (!layer) | 1003 if (!layer) |
1018 continue; | 1004 continue; |
1019 if (layer == root_scroll_layer) { | 1005 if (layer == root_scroll_layer) { |
1020 root_scroll_delta += info.scrolls[i].scroll_delta; | 1006 root_scroll_delta += info.scrolls[i].scroll_delta; |
1021 } else { | 1007 } else { |
1022 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + | 1008 layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
1023 info.scrolls[i].scroll_delta); | 1009 info.scrolls[i].scroll_delta); |
1024 } | 1010 } |
1025 } | 1011 } |
1026 | 1012 |
1027 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { | 1013 if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
1028 // SetScrollOffsetFromImplSide above could have destroyed the tree, | 1014 // SetScrollOffsetFromImplSide above could have destroyed the tree, |
1029 // so re-get this layer before doing anything to it. | 1015 // so re-get this layer before doing anything to it. |
1030 root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); | 1016 root_scroll_layer = |
| 1017 LayerTreeHostCommon::FindFirstScrollableLayer(root_layer_.get()); |
1031 | 1018 |
1032 // Preemptively apply the scroll offset and scale delta here before sending | 1019 // Preemptively apply the scroll offset and scale delta here before sending |
1033 // it to the client. If the client comes back and sets it to the same | 1020 // it to the client. If the client comes back and sets it to the same |
1034 // value, then the layer can early out without needing a full commit. | 1021 // value, then the layer can early out without needing a full commit. |
1035 if (root_scroll_layer) { | 1022 if (root_scroll_layer) { |
1036 root_scroll_layer->SetScrollOffsetFromImplSide( | 1023 root_scroll_layer->SetScrollOffsetFromImplSide( |
1037 root_scroll_layer->scroll_offset() + root_scroll_delta); | 1024 root_scroll_layer->scroll_offset() + root_scroll_delta); |
1038 } | 1025 } |
1039 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); | 1026 ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
1040 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); | 1027 client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 void LayerTreeHost::DidLoseUIResources() { | 1178 void LayerTreeHost::DidLoseUIResources() { |
1192 // When output surface is lost, we need to recreate the resource. | 1179 // When output surface is lost, we need to recreate the resource. |
1193 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); | 1180 for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin(); |
1194 iter != ui_resource_client_map_.end(); | 1181 iter != ui_resource_client_map_.end(); |
1195 ++iter) { | 1182 ++iter) { |
1196 UIResourceLost(iter->first); | 1183 UIResourceLost(iter->first); |
1197 } | 1184 } |
1198 } | 1185 } |
1199 | 1186 |
1200 } // namespace cc | 1187 } // namespace cc |
OLD | NEW |