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 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/atomic_sequence_num.h" | 11 #include "base/atomic_sequence_num.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/debug/trace_event.h" | 14 #include "base/debug/trace_event.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
19 #include "cc/animation/animation_registrar.h" | 19 #include "cc/animation/animation_registrar.h" |
20 #include "cc/animation/layer_animation_controller.h" | 20 #include "cc/animation/layer_animation_controller.h" |
21 #include "cc/base/math_util.h" | 21 #include "cc/base/math_util.h" |
22 #include "cc/debug/devtools_instrumentation.h" | 22 #include "cc/debug/devtools_instrumentation.h" |
23 #include "cc/debug/overdraw_metrics.h" | |
24 #include "cc/debug/rendering_stats_instrumentation.h" | 23 #include "cc/debug/rendering_stats_instrumentation.h" |
25 #include "cc/input/top_controls_manager.h" | 24 #include "cc/input/top_controls_manager.h" |
26 #include "cc/layers/heads_up_display_layer.h" | 25 #include "cc/layers/heads_up_display_layer.h" |
27 #include "cc/layers/heads_up_display_layer_impl.h" | 26 #include "cc/layers/heads_up_display_layer_impl.h" |
28 #include "cc/layers/layer.h" | 27 #include "cc/layers/layer.h" |
29 #include "cc/layers/layer_iterator.h" | 28 #include "cc/layers/layer_iterator.h" |
30 #include "cc/layers/painted_scrollbar_layer.h" | 29 #include "cc/layers/painted_scrollbar_layer.h" |
31 #include "cc/layers/render_surface.h" | 30 #include "cc/layers/render_surface.h" |
32 #include "cc/resources/prioritized_resource_manager.h" | 31 #include "cc/resources/prioritized_resource_manager.h" |
33 #include "cc/resources/ui_resource_request.h" | 32 #include "cc/resources/ui_resource_request.h" |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 } else if (it.represents_target_render_surface()) { | 895 } else if (it.represents_target_render_surface()) { |
897 if (it->mask_layer()) | 896 if (it->mask_layer()) |
898 it->mask_layer()->SetTexturePriorities(calculator); | 897 it->mask_layer()->SetTexturePriorities(calculator); |
899 if (it->replica_layer() && it->replica_layer()->mask_layer()) | 898 if (it->replica_layer() && it->replica_layer()->mask_layer()) |
900 it->replica_layer()->mask_layer()->SetTexturePriorities(calculator); | 899 it->replica_layer()->mask_layer()->SetTexturePriorities(calculator); |
901 } | 900 } |
902 } | 901 } |
903 } | 902 } |
904 | 903 |
905 void LayerTreeHost::PrioritizeTextures( | 904 void LayerTreeHost::PrioritizeTextures( |
906 const RenderSurfaceLayerList& render_surface_layer_list, | 905 const RenderSurfaceLayerList& render_surface_layer_list) { |
907 OverdrawMetrics* metrics) { | |
908 if (!contents_texture_manager_) | 906 if (!contents_texture_manager_) |
909 return; | 907 return; |
910 | 908 |
911 contents_texture_manager_->ClearPriorities(); | 909 contents_texture_manager_->ClearPriorities(); |
912 | 910 |
913 size_t memory_for_render_surfaces_metric = | 911 size_t memory_for_render_surfaces_metric = |
914 CalculateMemoryForRenderSurfaces(render_surface_layer_list); | 912 CalculateMemoryForRenderSurfaces(render_surface_layer_list); |
915 | 913 |
916 SetPrioritiesForLayers(render_surface_layer_list); | 914 SetPrioritiesForLayers(render_surface_layer_list); |
917 SetPrioritiesForSurfaces(memory_for_render_surfaces_metric); | 915 SetPrioritiesForSurfaces(memory_for_render_surfaces_metric); |
918 | 916 |
919 metrics->DidUseContentsTextureMemoryBytes( | |
920 contents_texture_manager_->MemoryAboveCutoffBytes()); | |
921 metrics->DidUseRenderSurfaceTextureMemoryBytes( | |
922 memory_for_render_surfaces_metric); | |
923 | |
924 contents_texture_manager_->PrioritizeTextures(); | 917 contents_texture_manager_->PrioritizeTextures(); |
925 } | 918 } |
926 | 919 |
927 size_t LayerTreeHost::CalculateMemoryForRenderSurfaces( | 920 size_t LayerTreeHost::CalculateMemoryForRenderSurfaces( |
928 const RenderSurfaceLayerList& update_list) { | 921 const RenderSurfaceLayerList& update_list) { |
929 size_t readback_bytes = 0; | 922 size_t readback_bytes = 0; |
930 size_t max_background_texture_bytes = 0; | 923 size_t max_background_texture_bytes = 0; |
931 size_t contents_texture_bytes = 0; | 924 size_t contents_texture_bytes = 0; |
932 | 925 |
933 // Start iteration at 1 to skip the root surface as it does not have a texture | 926 // Start iteration at 1 to skip the root surface as it does not have a texture |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 *did_paint_content |= replica_mask_layer->Update(queue, NULL); | 969 *did_paint_content |= replica_mask_layer->Update(queue, NULL); |
977 *need_more_updates |= replica_mask_layer->NeedMoreUpdates(); | 970 *need_more_updates |= replica_mask_layer->NeedMoreUpdates(); |
978 } | 971 } |
979 } | 972 } |
980 | 973 |
981 void LayerTreeHost::PaintLayerContents( | 974 void LayerTreeHost::PaintLayerContents( |
982 const RenderSurfaceLayerList& render_surface_layer_list, | 975 const RenderSurfaceLayerList& render_surface_layer_list, |
983 ResourceUpdateQueue* queue, | 976 ResourceUpdateQueue* queue, |
984 bool* did_paint_content, | 977 bool* did_paint_content, |
985 bool* need_more_updates) { | 978 bool* need_more_updates) { |
986 bool record_metrics_for_frame = | |
987 settings_.show_overdraw_in_tracing && | |
988 base::debug::TraceLog::GetInstance() && | |
989 base::debug::TraceLog::GetInstance()->IsEnabled(); | |
990 OcclusionTracker<Layer> occlusion_tracker( | 979 OcclusionTracker<Layer> occlusion_tracker( |
991 root_layer_->render_surface()->content_rect(), record_metrics_for_frame); | 980 root_layer_->render_surface()->content_rect()); |
992 occlusion_tracker.set_minimum_tracking_size( | 981 occlusion_tracker.set_minimum_tracking_size( |
993 settings_.minimum_occlusion_tracking_size); | 982 settings_.minimum_occlusion_tracking_size); |
994 | 983 |
995 PrioritizeTextures(render_surface_layer_list, | 984 PrioritizeTextures(render_surface_layer_list); |
996 occlusion_tracker.overdraw_metrics()); | |
997 | 985 |
998 in_paint_layer_contents_ = true; | 986 in_paint_layer_contents_ = true; |
999 | 987 |
1000 // Iterates front-to-back to allow for testing occlusion and performing | 988 // Iterates front-to-back to allow for testing occlusion and performing |
1001 // culling during the tree walk. | 989 // culling during the tree walk. |
1002 typedef LayerIterator<Layer> LayerIteratorType; | 990 typedef LayerIterator<Layer> LayerIteratorType; |
1003 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list); | 991 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list); |
1004 for (LayerIteratorType it = | 992 for (LayerIteratorType it = |
1005 LayerIteratorType::Begin(&render_surface_layer_list); | 993 LayerIteratorType::Begin(&render_surface_layer_list); |
1006 it != end; | 994 it != end; |
1007 ++it) { | 995 ++it) { |
1008 occlusion_tracker.EnterLayer(it); | 996 occlusion_tracker.EnterLayer(it); |
1009 | 997 |
1010 if (it.represents_target_render_surface()) { | 998 if (it.represents_target_render_surface()) { |
1011 PaintMasksForRenderSurface( | 999 PaintMasksForRenderSurface( |
1012 *it, queue, did_paint_content, need_more_updates); | 1000 *it, queue, did_paint_content, need_more_updates); |
1013 } else if (it.represents_itself() && it->DrawsContent()) { | 1001 } else if (it.represents_itself() && it->DrawsContent()) { |
1014 DCHECK(!it->paint_properties().bounds.IsEmpty()); | 1002 DCHECK(!it->paint_properties().bounds.IsEmpty()); |
1015 *did_paint_content |= it->Update(queue, &occlusion_tracker); | 1003 *did_paint_content |= it->Update(queue, &occlusion_tracker); |
1016 *need_more_updates |= it->NeedMoreUpdates(); | 1004 *need_more_updates |= it->NeedMoreUpdates(); |
1017 } | 1005 } |
1018 | 1006 |
1019 occlusion_tracker.LeaveLayer(it); | 1007 occlusion_tracker.LeaveLayer(it); |
1020 } | 1008 } |
1021 | 1009 |
1022 in_paint_layer_contents_ = false; | 1010 in_paint_layer_contents_ = false; |
1023 | |
1024 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | |
1025 } | 1011 } |
1026 | 1012 |
1027 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { | 1013 void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
1028 if (!root_layer_.get()) | 1014 if (!root_layer_.get()) |
1029 return; | 1015 return; |
1030 | 1016 |
1031 gfx::Vector2d inner_viewport_scroll_delta; | 1017 gfx::Vector2d inner_viewport_scroll_delta; |
1032 gfx::Vector2d outer_viewport_scroll_delta; | 1018 gfx::Vector2d outer_viewport_scroll_delta; |
1033 | 1019 |
1034 for (size_t i = 0; i < info.scrolls.size(); ++i) { | 1020 for (size_t i = 0; i < info.scrolls.size(); ++i) { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 swap_promise_list_.push_back(swap_promise.Pass()); | 1296 swap_promise_list_.push_back(swap_promise.Pass()); |
1311 } | 1297 } |
1312 | 1298 |
1313 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { | 1299 void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { |
1314 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 1300 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
1315 swap_promise_list_[i]->DidNotSwap(reason); | 1301 swap_promise_list_[i]->DidNotSwap(reason); |
1316 swap_promise_list_.clear(); | 1302 swap_promise_list_.clear(); |
1317 } | 1303 } |
1318 | 1304 |
1319 } // namespace cc | 1305 } // namespace cc |
OLD | NEW |