| 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 |