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