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 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 screen_space_rect.right() / overhang_resource_scaled_size.width(), | 708 screen_space_rect.right() / overhang_resource_scaled_size.width(), |
709 screen_space_rect.bottom() / | 709 screen_space_rect.bottom() / |
710 overhang_resource_scaled_size.height()), | 710 overhang_resource_scaled_size.height()), |
711 screen_background_color, | 711 screen_background_color, |
712 vertex_opacity, | 712 vertex_opacity, |
713 false); | 713 false); |
714 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); | 714 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); |
715 } | 715 } |
716 } | 716 } |
717 | 717 |
718 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 718 DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
719 FrameData* frame) { | 719 FrameData* frame) { |
720 DCHECK(frame->render_passes.empty()); | 720 DCHECK(frame->render_passes.empty()); |
721 DCHECK(CanDraw()); | 721 DCHECK(CanDraw()); |
722 DCHECK(active_tree_->root_layer()); | 722 DCHECK(active_tree_->root_layer()); |
723 | 723 |
724 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 724 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
725 *frame->render_surface_layer_list); | 725 *frame->render_surface_layer_list); |
726 | 726 |
727 // If the root render surface has no visible damage, then don't generate a | 727 // If the root render surface has no visible damage, then don't generate a |
728 // frame at all. | 728 // frame at all. |
729 RenderSurfaceImpl* root_surface = | 729 RenderSurfaceImpl* root_surface = |
730 active_tree_->root_layer()->render_surface(); | 730 active_tree_->root_layer()->render_surface(); |
731 bool root_surface_has_no_visible_damage = | 731 bool root_surface_has_no_visible_damage = |
732 !root_surface->damage_tracker()->current_damage_rect().Intersects( | 732 !root_surface->damage_tracker()->current_damage_rect().Intersects( |
733 root_surface->content_rect()); | 733 root_surface->content_rect()); |
734 bool root_surface_has_contributing_layers = | 734 bool root_surface_has_contributing_layers = |
735 !root_surface->layer_list().empty(); | 735 !root_surface->layer_list().empty(); |
736 bool hud_wants_to_draw_ = active_tree_->hud_layer() && | 736 bool hud_wants_to_draw_ = active_tree_->hud_layer() && |
737 active_tree_->hud_layer()->IsAnimatingHUDContents(); | 737 active_tree_->hud_layer()->IsAnimatingHUDContents(); |
738 if (root_surface_has_contributing_layers && | 738 if (root_surface_has_contributing_layers && |
739 root_surface_has_no_visible_damage && | 739 root_surface_has_no_visible_damage && |
740 active_tree_->LayersWithCopyOutputRequest().empty() && | 740 active_tree_->LayersWithCopyOutputRequest().empty() && |
741 !hud_wants_to_draw_) { | 741 !hud_wants_to_draw_) { |
742 TRACE_EVENT0("cc", | 742 TRACE_EVENT0("cc", |
743 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 743 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
744 frame->has_no_damage = true; | 744 frame->has_no_damage = true; |
745 DCHECK(!output_surface_->capabilities() | 745 DCHECK(!output_surface_->capabilities() |
746 .draw_and_swap_full_viewport_every_frame); | 746 .draw_and_swap_full_viewport_every_frame); |
747 return DrawSwapReadbackResult::DRAW_SUCCESS; | 747 return DRAW_SUCCESS; |
748 } | 748 } |
749 | 749 |
750 TRACE_EVENT1("cc", | 750 TRACE_EVENT1("cc", |
751 "LayerTreeHostImpl::CalculateRenderPasses", | 751 "LayerTreeHostImpl::CalculateRenderPasses", |
752 "render_surface_layer_list.size()", | 752 "render_surface_layer_list.size()", |
753 static_cast<uint64>(frame->render_surface_layer_list->size())); | 753 static_cast<uint64>(frame->render_surface_layer_list->size())); |
754 | 754 |
755 // Create the render passes in dependency order. | 755 // Create the render passes in dependency order. |
756 for (int surface_index = frame->render_surface_layer_list->size() - 1; | 756 for (int surface_index = frame->render_surface_layer_list->size() - 1; |
757 surface_index >= 0; | 757 surface_index >= 0; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 } | 794 } |
795 | 795 |
796 // Add quads to the Render passes in front-to-back order to allow for testing | 796 // Add quads to the Render passes in front-to-back order to allow for testing |
797 // occlusion and performing culling during the tree walk. | 797 // occlusion and performing culling during the tree walk. |
798 typedef LayerIterator<LayerImpl> LayerIteratorType; | 798 typedef LayerIterator<LayerImpl> LayerIteratorType; |
799 | 799 |
800 // Typically when we are missing a texture and use a checkerboard quad, we | 800 // Typically when we are missing a texture and use a checkerboard quad, we |
801 // still draw the frame. However when the layer being checkerboarded is moving | 801 // still draw the frame. However when the layer being checkerboarded is moving |
802 // due to an impl-animation, we drop the frame to avoid flashing due to the | 802 // due to an impl-animation, we drop the frame to avoid flashing due to the |
803 // texture suddenly appearing in the future. | 803 // texture suddenly appearing in the future. |
804 DrawSwapReadbackResult::DrawResult draw_result = | 804 DrawResult draw_result = DRAW_SUCCESS; |
805 DrawSwapReadbackResult::DRAW_SUCCESS; | |
806 // When we have a copy request for a layer, we need to draw no matter | 805 // When we have a copy request for a layer, we need to draw no matter |
807 // what, as the layer may disappear after this frame. | 806 // what, as the layer may disappear after this frame. |
808 bool have_copy_request = false; | 807 bool have_copy_request = false; |
809 | 808 |
810 int layers_drawn = 0; | 809 int layers_drawn = 0; |
811 | 810 |
812 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); | 811 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); |
813 | 812 |
814 LayerIteratorType end = | 813 LayerIteratorType end = |
815 LayerIteratorType::End(frame->render_surface_layer_list); | 814 LayerIteratorType::End(frame->render_surface_layer_list); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 | 882 |
884 rendering_stats_instrumentation_->AddVisibleContentArea( | 883 rendering_stats_instrumentation_->AddVisibleContentArea( |
885 append_quads_data.visible_content_area); | 884 append_quads_data.visible_content_area); |
886 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( | 885 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( |
887 append_quads_data.approximated_visible_content_area); | 886 append_quads_data.approximated_visible_content_area); |
888 | 887 |
889 if (append_quads_data.num_missing_tiles) { | 888 if (append_quads_data.num_missing_tiles) { |
890 bool layer_has_animating_transform = | 889 bool layer_has_animating_transform = |
891 it->screen_space_transform_is_animating() || | 890 it->screen_space_transform_is_animating() || |
892 it->draw_transform_is_animating(); | 891 it->draw_transform_is_animating(); |
893 if (layer_has_animating_transform) { | 892 if (layer_has_animating_transform) |
894 draw_result = | 893 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
895 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | |
896 } | |
897 } | 894 } |
898 | 895 |
899 if (append_quads_data.had_incomplete_tile) { | 896 if (append_quads_data.had_incomplete_tile) { |
900 frame->contains_incomplete_tile = true; | 897 frame->contains_incomplete_tile = true; |
901 if (active_tree()->RequiresHighResToDraw()) | 898 if (active_tree()->RequiresHighResToDraw()) |
902 draw_result = | 899 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
903 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | |
904 } | 900 } |
905 | 901 |
906 occlusion_tracker.LeaveLayer(it); | 902 occlusion_tracker.LeaveLayer(it); |
907 } | 903 } |
908 | 904 |
909 if (have_copy_request || | 905 if (have_copy_request || |
910 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 906 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
911 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; | 907 draw_result = DRAW_SUCCESS; |
912 | 908 |
913 #if DCHECK_IS_ON | 909 #if DCHECK_IS_ON |
914 for (size_t i = 0; i < frame->render_passes.size(); ++i) { | 910 for (size_t i = 0; i < frame->render_passes.size(); ++i) { |
915 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 911 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
916 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 912 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
917 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 913 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
918 != frame->render_passes_by_id.end()); | 914 != frame->render_passes_by_id.end()); |
919 } | 915 } |
920 #endif | 916 #endif |
921 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 917 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 // change. So, capture the iterator position from the end of the | 1092 // change. So, capture the iterator position from the end of the |
1097 // list, and restore it after the change. | 1093 // list, and restore it after the change. |
1098 size_t position_from_end = frame->render_passes.size() - it; | 1094 size_t position_from_end = frame->render_passes.size() - it; |
1099 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); | 1095 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); |
1100 it = frame->render_passes.size() - position_from_end; | 1096 it = frame->render_passes.size() - position_from_end; |
1101 DCHECK_GE(frame->render_passes.size(), position_from_end); | 1097 DCHECK_GE(frame->render_passes.size(), position_from_end); |
1102 } | 1098 } |
1103 } | 1099 } |
1104 } | 1100 } |
1105 | 1101 |
1106 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( | 1102 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame, |
1107 FrameData* frame, | 1103 const gfx::Rect& damage_rect) { |
1108 const gfx::Rect& damage_rect) { | |
1109 TRACE_EVENT1("cc", | 1104 TRACE_EVENT1("cc", |
1110 "LayerTreeHostImpl::PrepareToDraw", | 1105 "LayerTreeHostImpl::PrepareToDraw", |
1111 "SourceFrameNumber", | 1106 "SourceFrameNumber", |
1112 active_tree_->source_frame_number()); | 1107 active_tree_->source_frame_number()); |
1113 | 1108 |
1114 if (need_to_update_visible_tiles_before_draw_ && | 1109 if (need_to_update_visible_tiles_before_draw_ && |
1115 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { | 1110 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { |
1116 DidInitializeVisibleTile(); | 1111 DidInitializeVisibleTile(); |
1117 } | 1112 } |
1118 need_to_update_visible_tiles_before_draw_ = true; | 1113 need_to_update_visible_tiles_before_draw_ = true; |
1119 | 1114 |
1120 active_tree_->UpdateDrawProperties(); | 1115 active_tree_->UpdateDrawProperties(); |
1121 | 1116 |
1122 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1117 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1123 frame->render_passes.clear(); | 1118 frame->render_passes.clear(); |
1124 frame->render_passes_by_id.clear(); | 1119 frame->render_passes_by_id.clear(); |
1125 frame->will_draw_layers.clear(); | 1120 frame->will_draw_layers.clear(); |
1126 frame->contains_incomplete_tile = false; | 1121 frame->contains_incomplete_tile = false; |
1127 frame->has_no_damage = false; | 1122 frame->has_no_damage = false; |
1128 | 1123 |
1129 gfx::Rect device_viewport_damage_rect(damage_rect); | 1124 gfx::Rect device_viewport_damage_rect(damage_rect); |
1130 if (active_tree_->root_layer()) { | 1125 if (active_tree_->root_layer()) { |
1131 device_viewport_damage_rect.Union(viewport_damage_rect_); | 1126 device_viewport_damage_rect.Union(viewport_damage_rect_); |
1132 viewport_damage_rect_ = gfx::Rect(); | 1127 viewport_damage_rect_ = gfx::Rect(); |
1133 | 1128 |
1134 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1129 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
1135 AddDamageNextUpdate(device_viewport_damage_rect); | 1130 AddDamageNextUpdate(device_viewport_damage_rect); |
1136 } | 1131 } |
1137 | 1132 |
1138 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); | 1133 DrawResult draw_result = CalculateRenderPasses(frame); |
1139 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { | 1134 if (draw_result != DRAW_SUCCESS) { |
1140 DCHECK(!output_surface_->capabilities() | 1135 DCHECK(!output_surface_->capabilities() |
1141 .draw_and_swap_full_viewport_every_frame); | 1136 .draw_and_swap_full_viewport_every_frame); |
1142 return draw_result; | 1137 return draw_result; |
1143 } | 1138 } |
1144 | 1139 |
1145 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before | 1140 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before |
1146 // this function is called again. | 1141 // this function is called again. |
1147 return draw_result; | 1142 return draw_result; |
1148 } | 1143 } |
1149 | 1144 |
(...skipping 2001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3151 swap_promise_monitor_.erase(monitor); | 3146 swap_promise_monitor_.erase(monitor); |
3152 } | 3147 } |
3153 | 3148 |
3154 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 3149 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
3155 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3150 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
3156 for (; it != swap_promise_monitor_.end(); it++) | 3151 for (; it != swap_promise_monitor_.end(); it++) |
3157 (*it)->OnSetNeedsRedrawOnImpl(); | 3152 (*it)->OnSetNeedsRedrawOnImpl(); |
3158 } | 3153 } |
3159 | 3154 |
3160 } // namespace cc | 3155 } // namespace cc |
OLD | NEW |