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_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 time_source_->SetClient(this); | 132 time_source_->SetClient(this); |
133 } | 133 } |
134 | 134 |
135 LayerTreeHostImpl* layer_tree_host_impl_; | 135 LayerTreeHostImpl* layer_tree_host_impl_; |
136 scoped_refptr<DelayBasedTimeSource> time_source_; | 136 scoped_refptr<DelayBasedTimeSource> time_source_; |
137 | 137 |
138 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter); | 138 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter); |
139 }; | 139 }; |
140 | 140 |
141 LayerTreeHostImpl::FrameData::FrameData() | 141 LayerTreeHostImpl::FrameData::FrameData() |
142 : contains_incomplete_tile(false) {} | 142 : contains_incomplete_tile(false), has_no_damage(false) {} |
143 | 143 |
144 LayerTreeHostImpl::FrameData::~FrameData() {} | 144 LayerTreeHostImpl::FrameData::~FrameData() {} |
145 | 145 |
146 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( | 146 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( |
147 const LayerTreeSettings& settings, | 147 const LayerTreeSettings& settings, |
148 LayerTreeHostImplClient* client, | 148 LayerTreeHostImplClient* client, |
149 Proxy* proxy, | 149 Proxy* proxy, |
150 RenderingStatsInstrumentation* rendering_stats_instrumentation) { | 150 RenderingStatsInstrumentation* rendering_stats_instrumentation) { |
151 return make_scoped_ptr( | 151 return make_scoped_ptr( |
152 new LayerTreeHostImpl(settings, | 152 new LayerTreeHostImpl(settings, |
(...skipping 23 matching lines...) Expand all Loading... |
176 ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING), | 176 ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING), |
177 pinch_gesture_active_(false), | 177 pinch_gesture_active_(false), |
178 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), | 178 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), |
179 paint_time_counter_(PaintTimeCounter::Create()), | 179 paint_time_counter_(PaintTimeCounter::Create()), |
180 memory_history_(MemoryHistory::Create()), | 180 memory_history_(MemoryHistory::Create()), |
181 debug_rect_history_(DebugRectHistory::Create()), | 181 debug_rect_history_(DebugRectHistory::Create()), |
182 max_memory_needed_bytes_(0), | 182 max_memory_needed_bytes_(0), |
183 last_sent_memory_visible_bytes_(0), | 183 last_sent_memory_visible_bytes_(0), |
184 last_sent_memory_visible_and_nearby_bytes_(0), | 184 last_sent_memory_visible_and_nearby_bytes_(0), |
185 last_sent_memory_use_bytes_(0), | 185 last_sent_memory_use_bytes_(0), |
| 186 next_frame_damages_full_device_viewport_(false), |
186 animation_registrar_(AnimationRegistrar::Create()), | 187 animation_registrar_(AnimationRegistrar::Create()), |
187 rendering_stats_instrumentation_(rendering_stats_instrumentation) { | 188 rendering_stats_instrumentation_(rendering_stats_instrumentation) { |
188 DCHECK(proxy_->IsImplThread()); | 189 DCHECK(proxy_->IsImplThread()); |
189 DidVisibilityChange(this, visible_); | 190 DidVisibilityChange(this, visible_); |
190 | 191 |
191 SetDebugState(settings.initial_debug_state); | 192 SetDebugState(settings.initial_debug_state); |
192 | 193 |
193 if (settings.calculate_top_controls_position) { | 194 if (settings.calculate_top_controls_position) { |
194 top_controls_manager_ = | 195 top_controls_manager_ = |
195 TopControlsManager::Create(this, | 196 TopControlsManager::Create(this, |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 | 502 |
502 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 503 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
503 DCHECK(frame->render_passes.empty()); | 504 DCHECK(frame->render_passes.empty()); |
504 | 505 |
505 if (!CanDraw() || !active_tree_->root_layer()) | 506 if (!CanDraw() || !active_tree_->root_layer()) |
506 return false; | 507 return false; |
507 | 508 |
508 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 509 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
509 *frame->render_surface_layer_list); | 510 *frame->render_surface_layer_list); |
510 | 511 |
| 512 // If the root render surface has no visible damage, then don't generate a |
| 513 // frame at all. |
| 514 RenderSurfaceImpl* root_surface = |
| 515 active_tree_->root_layer()->render_surface(); |
| 516 bool root_surface_has_no_visible_damage = |
| 517 !root_surface->damage_tracker()->current_damage_rect().Intersects( |
| 518 root_surface->content_rect()); |
| 519 bool root_surface_has_contributing_layers = |
| 520 !root_surface->layer_list().empty(); |
| 521 if (root_surface_has_contributing_layers && |
| 522 root_surface_has_no_visible_damage) { |
| 523 TRACE_EVENT0("cc", |
| 524 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
| 525 frame->has_no_damage = true; |
| 526 return true; |
| 527 } |
| 528 |
511 TRACE_EVENT1("cc", | 529 TRACE_EVENT1("cc", |
512 "LayerTreeHostImpl::CalculateRenderPasses", | 530 "LayerTreeHostImpl::CalculateRenderPasses", |
513 "render_surface_layer_list.size()", | 531 "render_surface_layer_list.size()", |
514 static_cast<uint64>(frame->render_surface_layer_list->size())); | 532 static_cast<uint64>(frame->render_surface_layer_list->size())); |
515 | 533 |
516 // Create the render passes in dependency order. | 534 // Create the render passes in dependency order. |
517 for (int surface_index = frame->render_surface_layer_list->size() - 1; | 535 for (int surface_index = frame->render_surface_layer_list->size() - 1; |
518 surface_index >= 0; | 536 surface_index >= 0; |
519 --surface_index) { | 537 --surface_index) { |
520 LayerImpl* render_surface_layer = | 538 LayerImpl* render_surface_layer = |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 } | 686 } |
669 | 687 |
670 if (draw_frame) | 688 if (draw_frame) |
671 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 689 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
672 | 690 |
673 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); | 691 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
674 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 692 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
675 RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), | 693 RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), |
676 frame); | 694 frame); |
677 | 695 |
| 696 // If we're making a frame to draw, it better have at least one render pass. |
| 697 DCHECK(!frame->render_passes.empty()); |
678 return draw_frame; | 698 return draw_frame; |
679 } | 699 } |
680 | 700 |
681 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( | 701 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( |
682 bool should_background_tick) { | 702 bool should_background_tick) { |
683 bool enabled = should_background_tick && | 703 bool enabled = should_background_tick && |
684 !animation_registrar_->active_animation_controllers().empty(); | 704 !animation_registrar_->active_animation_controllers().empty(); |
685 | 705 |
686 // Lazily create the time_source adapter so that we can vary the interval for | 706 // Lazily create the time_source adapter so that we can vary the interval for |
687 // testing. | 707 // testing. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 // change. So, capture the iterator position from the end of the | 840 // change. So, capture the iterator position from the end of the |
821 // list, and restore it after the change. | 841 // list, and restore it after the change. |
822 size_t position_from_end = frame->render_passes.size() - it; | 842 size_t position_from_end = frame->render_passes.size() - it; |
823 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); | 843 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); |
824 it = frame->render_passes.size() - position_from_end; | 844 it = frame->render_passes.size() - position_from_end; |
825 DCHECK_GE(frame->render_passes.size(), position_from_end); | 845 DCHECK_GE(frame->render_passes.size(), position_from_end); |
826 } | 846 } |
827 } | 847 } |
828 } | 848 } |
829 | 849 |
830 bool LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { | 850 bool LayerTreeHostImpl::PrepareToDraw(FrameData* frame, |
| 851 gfx::Rect device_viewport_damage_rect) { |
831 TRACE_EVENT0("cc", "LayerTreeHostImpl::PrepareToDraw"); | 852 TRACE_EVENT0("cc", "LayerTreeHostImpl::PrepareToDraw"); |
832 | 853 |
833 active_tree_->UpdateDrawProperties( | 854 active_tree_->UpdateDrawProperties( |
834 LayerTreeImpl::UPDATE_ACTIVE_TREE_FOR_DRAW); | 855 LayerTreeImpl::UPDATE_ACTIVE_TREE_FOR_DRAW); |
835 | 856 |
836 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 857 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
837 frame->render_passes.clear(); | 858 frame->render_passes.clear(); |
838 frame->render_passes_by_id.clear(); | 859 frame->render_passes_by_id.clear(); |
839 frame->will_draw_layers.clear(); | 860 frame->will_draw_layers.clear(); |
| 861 frame->contains_incomplete_tile = false; |
| 862 frame->has_no_damage = false; |
| 863 |
| 864 if (active_tree_->root_layer()) { |
| 865 if (next_frame_damages_full_device_viewport_) |
| 866 device_viewport_damage_rect.Union(gfx::Rect(device_viewport_size_)); |
| 867 |
| 868 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
| 869 AddDamageNextUpdate(device_viewport_damage_rect); |
| 870 } |
| 871 next_frame_damages_full_device_viewport_ = false; |
840 | 872 |
841 if (!CalculateRenderPasses(frame)) | 873 if (!CalculateRenderPasses(frame)) |
842 return false; | 874 return false; |
843 | 875 |
844 // If we return true, then we expect DrawLayers() to be called before this | 876 // If we return true, then we expect DrawLayers() to be called before this |
845 // function is called again. | 877 // function is called again. |
846 return true; | 878 return true; |
847 } | 879 } |
848 | 880 |
849 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( | 881 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
990 // We don't track damage on the HUD layer (it interacts with damage tracking | 1022 // We don't track damage on the HUD layer (it interacts with damage tracking |
991 // visualizations), so disable partial swaps to make the HUD layer display | 1023 // visualizations), so disable partial swaps to make the HUD layer display |
992 // properly. | 1024 // properly. |
993 return !debug_state_.ShowHudRects(); | 1025 return !debug_state_.ShowHudRects(); |
994 } | 1026 } |
995 | 1027 |
996 void LayerTreeHostImpl::DrawLayers(FrameData* frame, | 1028 void LayerTreeHostImpl::DrawLayers(FrameData* frame, |
997 base::TimeTicks frame_begin_time) { | 1029 base::TimeTicks frame_begin_time) { |
998 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); | 1030 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); |
999 DCHECK(CanDraw()); | 1031 DCHECK(CanDraw()); |
| 1032 |
| 1033 if (frame->has_no_damage) |
| 1034 return; |
| 1035 |
1000 DCHECK(!frame->render_passes.empty()); | 1036 DCHECK(!frame->render_passes.empty()); |
1001 | 1037 |
1002 fps_counter_->SaveTimeStamp(frame_begin_time); | 1038 fps_counter_->SaveTimeStamp(frame_begin_time); |
1003 | 1039 |
1004 rendering_stats_instrumentation_->SetScreenFrameCount( | 1040 rendering_stats_instrumentation_->SetScreenFrameCount( |
1005 fps_counter_->current_frame_number()); | 1041 fps_counter_->current_frame_number()); |
1006 rendering_stats_instrumentation_->SetDroppedFrameCount( | 1042 rendering_stats_instrumentation_->SetDroppedFrameCount( |
1007 fps_counter_->dropped_frame_count()); | 1043 fps_counter_->dropped_frame_count()); |
1008 | 1044 |
1009 if (tile_manager_) { | 1045 if (tile_manager_) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 | 1103 |
1068 bool LayerTreeHostImpl::IsContextLost() { | 1104 bool LayerTreeHostImpl::IsContextLost() { |
1069 DCHECK(proxy_->IsImplThread()); | 1105 DCHECK(proxy_->IsImplThread()); |
1070 return renderer_ && renderer_->IsContextLost(); | 1106 return renderer_ && renderer_->IsContextLost(); |
1071 } | 1107 } |
1072 | 1108 |
1073 const RendererCapabilities& LayerTreeHostImpl::GetRendererCapabilities() const { | 1109 const RendererCapabilities& LayerTreeHostImpl::GetRendererCapabilities() const { |
1074 return renderer_->Capabilities(); | 1110 return renderer_->Capabilities(); |
1075 } | 1111 } |
1076 | 1112 |
1077 bool LayerTreeHostImpl::SwapBuffers() { | 1113 bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { |
| 1114 if (frame.has_no_damage) |
| 1115 return false; |
1078 return renderer_->SwapBuffers(); | 1116 return renderer_->SwapBuffers(); |
1079 } | 1117 } |
1080 | 1118 |
1081 void LayerTreeHostImpl::EnableVSyncNotification(bool enable) { | 1119 void LayerTreeHostImpl::EnableVSyncNotification(bool enable) { |
1082 if (output_surface_) | 1120 if (output_surface_) |
1083 output_surface_->EnableVSyncNotification(enable); | 1121 output_surface_->EnableVSyncNotification(enable); |
1084 } | 1122 } |
1085 | 1123 |
1086 gfx::Size LayerTreeHostImpl::DeviceViewportSize() const { | 1124 gfx::Size LayerTreeHostImpl::DeviceViewportSize() const { |
1087 return device_viewport_size(); | 1125 return device_viewport_size(); |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 1794 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
1757 | 1795 |
1758 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 1796 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
1759 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); | 1797 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); |
1760 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); | 1798 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); |
1761 | 1799 |
1762 return scroll_info.Pass(); | 1800 return scroll_info.Pass(); |
1763 } | 1801 } |
1764 | 1802 |
1765 void LayerTreeHostImpl::SetFullRootLayerDamage() { | 1803 void LayerTreeHostImpl::SetFullRootLayerDamage() { |
1766 if (active_tree_->root_layer()) { | 1804 next_frame_damages_full_device_viewport_ = true; |
1767 RenderSurfaceImpl* render_surface = | |
1768 active_tree_->root_layer()->render_surface(); | |
1769 if (render_surface) | |
1770 render_surface->damage_tracker()->ForceFullDamageNextUpdate(); | |
1771 } | |
1772 } | 1805 } |
1773 | 1806 |
1774 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { | 1807 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { |
1775 if (!page_scale_animation_ || !RootScrollLayer()) | 1808 if (!page_scale_animation_ || !RootScrollLayer()) |
1776 return; | 1809 return; |
1777 | 1810 |
1778 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); | 1811 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); |
1779 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + | 1812 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + |
1780 RootScrollLayer()->scroll_delta(); | 1813 RootScrollLayer()->scroll_delta(); |
1781 | 1814 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2054 } | 2087 } |
2055 | 2088 |
2056 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { | 2089 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { |
2057 if (debug_state_.continuous_painting != debug_state.continuous_painting) | 2090 if (debug_state_.continuous_painting != debug_state.continuous_painting) |
2058 paint_time_counter_->ClearHistory(); | 2091 paint_time_counter_->ClearHistory(); |
2059 | 2092 |
2060 debug_state_ = debug_state; | 2093 debug_state_ = debug_state; |
2061 } | 2094 } |
2062 | 2095 |
2063 } // namespace cc | 2096 } // namespace cc |
OLD | NEW |