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 <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 scroll_on_main_thread); | 156 scroll_on_main_thread); |
157 } | 157 } |
158 } | 158 } |
159 | 159 |
160 } // namespace | 160 } // namespace |
161 | 161 |
162 DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeDurationHistogramTimer, | 162 DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeDurationHistogramTimer, |
163 "Scheduling.%s.PendingTreeDuration"); | 163 "Scheduling.%s.PendingTreeDuration"); |
164 | 164 |
165 LayerTreeHostImpl::FrameData::FrameData() | 165 LayerTreeHostImpl::FrameData::FrameData() |
166 : render_surface_layer_list(nullptr), | 166 : render_surface_list(nullptr), |
167 has_no_damage(false), | 167 has_no_damage(false), |
168 may_contain_video(false) {} | 168 may_contain_video(false) {} |
169 | 169 |
170 LayerTreeHostImpl::FrameData::~FrameData() {} | 170 LayerTreeHostImpl::FrameData::~FrameData() {} |
171 | 171 |
172 std::unique_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( | 172 std::unique_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( |
173 const LayerTreeSettings& settings, | 173 const LayerTreeSettings& settings, |
174 LayerTreeHostImplClient* client, | 174 LayerTreeHostImplClient* client, |
175 TaskRunnerProvider* task_runner_provider, | 175 TaskRunnerProvider* task_runner_provider, |
176 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 176 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 DrawResult LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 773 DrawResult LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
774 DCHECK(frame->render_passes.empty()); | 774 DCHECK(frame->render_passes.empty()); |
775 DCHECK(CanDraw()); | 775 DCHECK(CanDraw()); |
776 DCHECK(!active_tree_->LayerListIsEmpty()); | 776 DCHECK(!active_tree_->LayerListIsEmpty()); |
777 | 777 |
778 // For now, we use damage tracking to compute a global scissor. To do this, we | 778 // For now, we use damage tracking to compute a global scissor. To do this, we |
779 // must compute all damage tracking before drawing anything, so that we know | 779 // must compute all damage tracking before drawing anything, so that we know |
780 // the root damage rect. The root damage rect is then used to scissor each | 780 // the root damage rect. The root damage rect is then used to scissor each |
781 // surface. | 781 // surface. |
782 DamageTracker::UpdateDamageTracking(active_tree_.get(), | 782 DamageTracker::UpdateDamageTracking(active_tree_.get(), |
783 active_tree_->RenderSurfaceLayerList()); | 783 active_tree_->GetRenderSurfaceList()); |
784 | 784 |
785 // If the root render surface has no visible damage, then don't generate a | 785 // If the root render surface has no visible damage, then don't generate a |
786 // frame at all. | 786 // frame at all. |
787 RenderSurfaceImpl* root_surface = active_tree_->RootRenderSurface(); | 787 RenderSurfaceImpl* root_surface = active_tree_->RootRenderSurface(); |
788 bool root_surface_has_no_visible_damage = | 788 bool root_surface_has_no_visible_damage = |
789 !root_surface->GetDamageRect().Intersects(root_surface->content_rect()); | 789 !root_surface->GetDamageRect().Intersects(root_surface->content_rect()); |
790 bool root_surface_has_contributing_layers = | 790 bool root_surface_has_contributing_layers = |
791 !root_surface->layer_list().empty(); | 791 !!root_surface->num_contributors(); |
792 bool hud_wants_to_draw_ = active_tree_->hud_layer() && | 792 bool hud_wants_to_draw_ = active_tree_->hud_layer() && |
793 active_tree_->hud_layer()->IsAnimatingHUDContents(); | 793 active_tree_->hud_layer()->IsAnimatingHUDContents(); |
794 bool must_always_swap = | 794 bool must_always_swap = |
795 compositor_frame_sink_->capabilities().must_always_swap; | 795 compositor_frame_sink_->capabilities().must_always_swap; |
796 // When touch handle visibility changes there is no visible damage | 796 // When touch handle visibility changes there is no visible damage |
797 // because touch handles are composited in the browser. However we | 797 // because touch handles are composited in the browser. However we |
798 // still want the browser to be notified that the handles changed | 798 // still want the browser to be notified that the handles changed |
799 // through the |ViewHostMsg_SwapCompositorFrame| IPC so we keep | 799 // through the |ViewHostMsg_SwapCompositorFrame| IPC so we keep |
800 // track of handle visibility changes through |handle_visibility_changed|. | 800 // track of handle visibility changes through |handle_visibility_changed|. |
801 bool handle_visibility_changed = | 801 bool handle_visibility_changed = |
802 active_tree_->GetAndResetHandleVisibilityChanged(); | 802 active_tree_->GetAndResetHandleVisibilityChanged(); |
803 if (root_surface_has_contributing_layers && | 803 if (root_surface_has_contributing_layers && |
804 root_surface_has_no_visible_damage && | 804 root_surface_has_no_visible_damage && |
805 !active_tree_->property_trees()->effect_tree.HasCopyRequests() && | 805 !active_tree_->property_trees()->effect_tree.HasCopyRequests() && |
806 !must_always_swap && !hud_wants_to_draw_ && !handle_visibility_changed) { | 806 !must_always_swap && !hud_wants_to_draw_ && !handle_visibility_changed) { |
807 TRACE_EVENT0("cc", | 807 TRACE_EVENT0("cc", |
808 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 808 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
809 frame->has_no_damage = true; | 809 frame->has_no_damage = true; |
810 DCHECK(!resourceless_software_draw_); | 810 DCHECK(!resourceless_software_draw_); |
811 return DRAW_SUCCESS; | 811 return DRAW_SUCCESS; |
812 } | 812 } |
813 | 813 |
814 TRACE_EVENT_BEGIN2( | 814 TRACE_EVENT_BEGIN2("cc", "LayerTreeHostImpl::CalculateRenderPasses", |
815 "cc", "LayerTreeHostImpl::CalculateRenderPasses", | 815 "render_surface_list.size()", |
816 "render_surface_layer_list.size()", | 816 static_cast<uint64_t>(frame->render_surface_list->size()), |
817 static_cast<uint64_t>(frame->render_surface_layer_list->size()), | 817 "RequiresHighResToDraw", RequiresHighResToDraw()); |
818 "RequiresHighResToDraw", RequiresHighResToDraw()); | |
819 | 818 |
820 // Create the render passes in dependency order. | 819 // Create the render passes in dependency order. |
821 size_t render_surface_layer_list_size = | 820 size_t render_surface_list_size = frame->render_surface_list->size(); |
822 frame->render_surface_layer_list->size(); | 821 for (size_t i = 0; i < render_surface_list_size; ++i) { |
823 for (size_t i = 0; i < render_surface_layer_list_size; ++i) { | 822 size_t surface_index = render_surface_list_size - 1 - i; |
824 size_t surface_index = render_surface_layer_list_size - 1 - i; | |
825 LayerImpl* render_surface_layer = | |
826 (*frame->render_surface_layer_list)[surface_index]; | |
827 RenderSurfaceImpl* render_surface = | 823 RenderSurfaceImpl* render_surface = |
828 render_surface_layer->GetRenderSurface(); | 824 (*frame->render_surface_list)[surface_index]; |
829 | 825 |
| 826 bool is_root_surface = |
| 827 render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId; |
830 bool should_draw_into_render_pass = | 828 bool should_draw_into_render_pass = |
831 active_tree_->IsRootLayer(render_surface_layer) || | 829 is_root_surface || render_surface->contributes_to_drawn_surface() || |
832 render_surface->contributes_to_drawn_surface() || | |
833 render_surface->HasCopyRequest(); | 830 render_surface->HasCopyRequest(); |
834 if (should_draw_into_render_pass) | 831 if (should_draw_into_render_pass) |
835 frame->render_passes.push_back(render_surface->CreateRenderPass()); | 832 frame->render_passes.push_back(render_surface->CreateRenderPass()); |
836 } | 833 } |
837 | 834 |
838 // Damage rects for non-root passes aren't meaningful, so set them to be | 835 // Damage rects for non-root passes aren't meaningful, so set them to be |
839 // equal to the output rect. | 836 // equal to the output rect. |
840 for (size_t i = 0; i + 1 < frame->render_passes.size(); ++i) { | 837 for (size_t i = 0; i + 1 < frame->render_passes.size(); ++i) { |
841 RenderPass* pass = frame->render_passes[i].get(); | 838 RenderPass* pass = frame->render_passes[i].get(); |
842 pass->damage_rect = pass->output_rect; | 839 pass->damage_rect = pass->output_rect; |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 | 1103 |
1107 bool update_lcd_text = false; | 1104 bool update_lcd_text = false; |
1108 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); | 1105 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); |
1109 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1106 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1110 | 1107 |
1111 // This will cause NotifyTileStateChanged() to be called for any tiles that | 1108 // This will cause NotifyTileStateChanged() to be called for any tiles that |
1112 // completed, which will add damage for visible tiles to the frame for them so | 1109 // completed, which will add damage for visible tiles to the frame for them so |
1113 // they appear as part of the current frame being drawn. | 1110 // they appear as part of the current frame being drawn. |
1114 tile_manager_.Flush(); | 1111 tile_manager_.Flush(); |
1115 | 1112 |
1116 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1113 frame->render_surface_list = &active_tree_->GetRenderSurfaceList(); |
1117 frame->render_passes.clear(); | 1114 frame->render_passes.clear(); |
1118 frame->will_draw_layers.clear(); | 1115 frame->will_draw_layers.clear(); |
1119 frame->has_no_damage = false; | 1116 frame->has_no_damage = false; |
1120 frame->may_contain_video = false; | 1117 frame->may_contain_video = false; |
1121 | 1118 |
1122 if (active_tree_->RootRenderSurface()) { | 1119 if (active_tree_->RootRenderSurface()) { |
1123 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1120 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1124 viewport_damage_rect_ = gfx::Rect(); | 1121 viewport_damage_rect_ = gfx::Rect(); |
1125 | 1122 |
1126 active_tree_->RootRenderSurface()->damage_tracker()->AddDamageNextUpdate( | 1123 active_tree_->RootRenderSurface()->damage_tracker()->AddDamageNextUpdate( |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1652 } | 1649 } |
1653 | 1650 |
1654 fps_counter_->SaveTimeStamp(CurrentBeginFrameArgs().frame_time, | 1651 fps_counter_->SaveTimeStamp(CurrentBeginFrameArgs().frame_time, |
1655 !compositor_frame_sink_->context_provider()); | 1652 !compositor_frame_sink_->context_provider()); |
1656 rendering_stats_instrumentation_->IncrementFrameCount(1); | 1653 rendering_stats_instrumentation_->IncrementFrameCount(1); |
1657 | 1654 |
1658 memory_history_->SaveEntry(tile_manager_.memory_stats_from_last_assign()); | 1655 memory_history_->SaveEntry(tile_manager_.memory_stats_from_last_assign()); |
1659 | 1656 |
1660 if (debug_state_.ShowHudRects()) { | 1657 if (debug_state_.ShowHudRects()) { |
1661 debug_rect_history_->SaveDebugRectsForCurrentFrame( | 1658 debug_rect_history_->SaveDebugRectsForCurrentFrame( |
1662 active_tree(), active_tree_->hud_layer(), | 1659 active_tree(), active_tree_->hud_layer(), *frame->render_surface_list, |
1663 *frame->render_surface_layer_list, debug_state_); | 1660 debug_state_); |
1664 } | 1661 } |
1665 | 1662 |
1666 bool is_new_trace; | 1663 bool is_new_trace; |
1667 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); | 1664 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); |
1668 if (is_new_trace) { | 1665 if (is_new_trace) { |
1669 if (pending_tree_) { | 1666 if (pending_tree_) { |
1670 LayerTreeHostCommon::CallFunctionForEveryLayer( | 1667 LayerTreeHostCommon::CallFunctionForEveryLayer( |
1671 pending_tree(), [](LayerImpl* layer) { layer->DidBeginTracing(); }); | 1668 pending_tree(), [](LayerImpl* layer) { layer->DidBeginTracing(); }); |
1672 } | 1669 } |
1673 LayerTreeHostCommon::CallFunctionForEveryLayer( | 1670 LayerTreeHostCommon::CallFunctionForEveryLayer( |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1737 compositor_frame_sink_->SubmitCompositorFrame(std::move(compositor_frame)); | 1734 compositor_frame_sink_->SubmitCompositorFrame(std::move(compositor_frame)); |
1738 | 1735 |
1739 // Clears the list of swap promises after calling DidSwap on each of them to | 1736 // Clears the list of swap promises after calling DidSwap on each of them to |
1740 // signal that the swap is over. | 1737 // signal that the swap is over. |
1741 active_tree()->ClearSwapPromises(); | 1738 active_tree()->ClearSwapPromises(); |
1742 | 1739 |
1743 // The next frame should start by assuming nothing has changed, and changes | 1740 // The next frame should start by assuming nothing has changed, and changes |
1744 // are noted as they occur. | 1741 // are noted as they occur. |
1745 // TODO(boliu): If we did a temporary software renderer frame, propogate the | 1742 // TODO(boliu): If we did a temporary software renderer frame, propogate the |
1746 // damage forward to the next frame. | 1743 // damage forward to the next frame. |
1747 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { | 1744 for (size_t i = 0; i < frame->render_surface_list->size(); i++) { |
1748 auto* surface = (*frame->render_surface_layer_list)[i]->GetRenderSurface(); | 1745 auto* surface = (*frame->render_surface_list)[i]; |
1749 surface->damage_tracker()->DidDrawDamagedArea(); | 1746 surface->damage_tracker()->DidDrawDamagedArea(); |
1750 } | 1747 } |
1751 active_tree_->ResetAllChangeTracking(); | 1748 active_tree_->ResetAllChangeTracking(); |
1752 | 1749 |
1753 active_tree_->set_has_ever_been_drawn(true); | 1750 active_tree_->set_has_ever_been_drawn(true); |
1754 devtools_instrumentation::DidDrawFrame(id_); | 1751 devtools_instrumentation::DidDrawFrame(id_); |
1755 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( | 1752 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( |
1756 rendering_stats_instrumentation_->impl_thread_rendering_stats()); | 1753 rendering_stats_instrumentation_->impl_thread_rendering_stats()); |
1757 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); | 1754 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
1758 return true; | 1755 return true; |
(...skipping 2540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4299 } | 4296 } |
4300 | 4297 |
4301 void LayerTreeHostImpl::UpdateScrollSourceInfo(bool is_wheel_scroll) { | 4298 void LayerTreeHostImpl::UpdateScrollSourceInfo(bool is_wheel_scroll) { |
4302 if (is_wheel_scroll) | 4299 if (is_wheel_scroll) |
4303 has_scrolled_by_wheel_ = true; | 4300 has_scrolled_by_wheel_ = true; |
4304 else | 4301 else |
4305 has_scrolled_by_touch_ = true; | 4302 has_scrolled_by_touch_ = true; |
4306 } | 4303 } |
4307 | 4304 |
4308 } // namespace cc | 4305 } // namespace cc |
OLD | NEW |