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