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 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 screen_space_rect.right() / overhang_resource_scaled_size.width(), | 688 screen_space_rect.right() / overhang_resource_scaled_size.width(), |
689 screen_space_rect.bottom() / | 689 screen_space_rect.bottom() / |
690 overhang_resource_scaled_size.height()), | 690 overhang_resource_scaled_size.height()), |
691 screen_background_color, | 691 screen_background_color, |
692 vertex_opacity, | 692 vertex_opacity, |
693 false); | 693 false); |
694 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); | 694 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); |
695 } | 695 } |
696 } | 696 } |
697 | 697 |
698 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 698 DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
699 FrameData* frame) { | 699 FrameData* frame) { |
700 DCHECK(frame->render_passes.empty()); | 700 DCHECK(frame->render_passes.empty()); |
701 DCHECK(CanDraw()); | 701 DCHECK(CanDraw()); |
702 DCHECK(active_tree_->root_layer()); | 702 DCHECK(active_tree_->root_layer()); |
703 | 703 |
704 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 704 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
705 *frame->render_surface_layer_list); | 705 *frame->render_surface_layer_list); |
706 | 706 |
707 // If the root render surface has no visible damage, then don't generate a | 707 // If the root render surface has no visible damage, then don't generate a |
708 // frame at all. | 708 // frame at all. |
709 RenderSurfaceImpl* root_surface = | 709 RenderSurfaceImpl* root_surface = |
710 active_tree_->root_layer()->render_surface(); | 710 active_tree_->root_layer()->render_surface(); |
711 bool root_surface_has_no_visible_damage = | 711 bool root_surface_has_no_visible_damage = |
712 !root_surface->damage_tracker()->current_damage_rect().Intersects( | 712 !root_surface->damage_tracker()->current_damage_rect().Intersects( |
713 root_surface->content_rect()); | 713 root_surface->content_rect()); |
714 bool root_surface_has_contributing_layers = | 714 bool root_surface_has_contributing_layers = |
715 !root_surface->layer_list().empty(); | 715 !root_surface->layer_list().empty(); |
716 bool hud_wants_to_draw_ = active_tree_->hud_layer() && | 716 bool hud_wants_to_draw_ = active_tree_->hud_layer() && |
717 active_tree_->hud_layer()->IsAnimatingHUDContents(); | 717 active_tree_->hud_layer()->IsAnimatingHUDContents(); |
718 if (root_surface_has_contributing_layers && | 718 if (root_surface_has_contributing_layers && |
719 root_surface_has_no_visible_damage && | 719 root_surface_has_no_visible_damage && |
720 active_tree_->LayersWithCopyOutputRequest().empty() && | 720 active_tree_->LayersWithCopyOutputRequest().empty() && |
721 !hud_wants_to_draw_) { | 721 !hud_wants_to_draw_) { |
722 TRACE_EVENT0("cc", | 722 TRACE_EVENT0("cc", |
723 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 723 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
724 frame->has_no_damage = true; | 724 frame->has_no_damage = true; |
725 DCHECK(!output_surface_->capabilities() | 725 DCHECK(!output_surface_->capabilities() |
726 .draw_and_swap_full_viewport_every_frame); | 726 .draw_and_swap_full_viewport_every_frame); |
727 return DrawSwapReadbackResult::DRAW_SUCCESS; | 727 return DRAW_SUCCESS; |
728 } | 728 } |
729 | 729 |
730 TRACE_EVENT1("cc", | 730 TRACE_EVENT1("cc", |
731 "LayerTreeHostImpl::CalculateRenderPasses", | 731 "LayerTreeHostImpl::CalculateRenderPasses", |
732 "render_surface_layer_list.size()", | 732 "render_surface_layer_list.size()", |
733 static_cast<uint64>(frame->render_surface_layer_list->size())); | 733 static_cast<uint64>(frame->render_surface_layer_list->size())); |
734 | 734 |
735 // Create the render passes in dependency order. | 735 // Create the render passes in dependency order. |
736 for (int surface_index = frame->render_surface_layer_list->size() - 1; | 736 for (int surface_index = frame->render_surface_layer_list->size() - 1; |
737 surface_index >= 0; | 737 surface_index >= 0; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 } | 774 } |
775 | 775 |
776 // Add quads to the Render passes in front-to-back order to allow for testing | 776 // Add quads to the Render passes in front-to-back order to allow for testing |
777 // occlusion and performing culling during the tree walk. | 777 // occlusion and performing culling during the tree walk. |
778 typedef LayerIterator<LayerImpl> LayerIteratorType; | 778 typedef LayerIterator<LayerImpl> LayerIteratorType; |
779 | 779 |
780 // Typically when we are missing a texture and use a checkerboard quad, we | 780 // Typically when we are missing a texture and use a checkerboard quad, we |
781 // still draw the frame. However when the layer being checkerboarded is moving | 781 // still draw the frame. However when the layer being checkerboarded is moving |
782 // due to an impl-animation, we drop the frame to avoid flashing due to the | 782 // due to an impl-animation, we drop the frame to avoid flashing due to the |
783 // texture suddenly appearing in the future. | 783 // texture suddenly appearing in the future. |
784 DrawSwapReadbackResult::DrawResult draw_result = | 784 DrawResult draw_result = DRAW_SUCCESS; |
785 DrawSwapReadbackResult::DRAW_SUCCESS; | |
786 // When we have a copy request for a layer, we need to draw no matter | 785 // When we have a copy request for a layer, we need to draw no matter |
787 // what, as the layer may disappear after this frame. | 786 // what, as the layer may disappear after this frame. |
788 bool have_copy_request = false; | 787 bool have_copy_request = false; |
789 | 788 |
790 int layers_drawn = 0; | 789 int layers_drawn = 0; |
791 | 790 |
792 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); | 791 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); |
793 | 792 |
794 LayerIteratorType end = | 793 LayerIteratorType end = |
795 LayerIteratorType::End(frame->render_surface_layer_list); | 794 LayerIteratorType::End(frame->render_surface_layer_list); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 &append_quads_data); | 857 &append_quads_data); |
859 } | 858 } |
860 | 859 |
861 ++layers_drawn; | 860 ++layers_drawn; |
862 } | 861 } |
863 | 862 |
864 if (append_quads_data.num_missing_tiles) { | 863 if (append_quads_data.num_missing_tiles) { |
865 bool layer_has_animating_transform = | 864 bool layer_has_animating_transform = |
866 it->screen_space_transform_is_animating() || | 865 it->screen_space_transform_is_animating() || |
867 it->draw_transform_is_animating(); | 866 it->draw_transform_is_animating(); |
868 if (layer_has_animating_transform) { | 867 if (layer_has_animating_transform) |
869 draw_result = | 868 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
870 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | |
871 } | |
872 } | 869 } |
873 | 870 |
874 if (append_quads_data.had_incomplete_tile) { | 871 if (append_quads_data.had_incomplete_tile) { |
875 frame->contains_incomplete_tile = true; | 872 frame->contains_incomplete_tile = true; |
876 if (active_tree()->RequiresHighResToDraw()) | 873 if (active_tree()->RequiresHighResToDraw()) |
877 draw_result = | 874 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
878 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | |
879 } | 875 } |
880 | 876 |
881 occlusion_tracker.LeaveLayer(it); | 877 occlusion_tracker.LeaveLayer(it); |
882 } | 878 } |
883 | 879 |
884 if (have_copy_request || | 880 if (have_copy_request || |
885 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 881 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
886 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; | 882 draw_result = DRAW_SUCCESS; |
887 | 883 |
888 #if DCHECK_IS_ON | 884 #if DCHECK_IS_ON |
889 for (size_t i = 0; i < frame->render_passes.size(); ++i) { | 885 for (size_t i = 0; i < frame->render_passes.size(); ++i) { |
890 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 886 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
891 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 887 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
892 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 888 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
893 != frame->render_passes_by_id.end()); | 889 != frame->render_passes_by_id.end()); |
894 } | 890 } |
895 #endif | 891 #endif |
896 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 892 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 // change. So, capture the iterator position from the end of the | 1067 // change. So, capture the iterator position from the end of the |
1072 // list, and restore it after the change. | 1068 // list, and restore it after the change. |
1073 size_t position_from_end = frame->render_passes.size() - it; | 1069 size_t position_from_end = frame->render_passes.size() - it; |
1074 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); | 1070 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); |
1075 it = frame->render_passes.size() - position_from_end; | 1071 it = frame->render_passes.size() - position_from_end; |
1076 DCHECK_GE(frame->render_passes.size(), position_from_end); | 1072 DCHECK_GE(frame->render_passes.size(), position_from_end); |
1077 } | 1073 } |
1078 } | 1074 } |
1079 } | 1075 } |
1080 | 1076 |
1081 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( | 1077 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame, |
1082 FrameData* frame, | 1078 const gfx::Rect& damage_rect) { |
1083 const gfx::Rect& damage_rect) { | |
1084 TRACE_EVENT1("cc", | 1079 TRACE_EVENT1("cc", |
1085 "LayerTreeHostImpl::PrepareToDraw", | 1080 "LayerTreeHostImpl::PrepareToDraw", |
1086 "SourceFrameNumber", | 1081 "SourceFrameNumber", |
1087 active_tree_->source_frame_number()); | 1082 active_tree_->source_frame_number()); |
1088 | 1083 |
1089 if (need_to_update_visible_tiles_before_draw_ && | 1084 if (need_to_update_visible_tiles_before_draw_ && |
1090 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { | 1085 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { |
1091 DidInitializeVisibleTile(); | 1086 DidInitializeVisibleTile(); |
1092 } | 1087 } |
1093 need_to_update_visible_tiles_before_draw_ = true; | 1088 need_to_update_visible_tiles_before_draw_ = true; |
1094 | 1089 |
1095 active_tree_->UpdateDrawProperties(); | 1090 active_tree_->UpdateDrawProperties(); |
1096 | 1091 |
1097 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1092 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1098 frame->render_passes.clear(); | 1093 frame->render_passes.clear(); |
1099 frame->render_passes_by_id.clear(); | 1094 frame->render_passes_by_id.clear(); |
1100 frame->will_draw_layers.clear(); | 1095 frame->will_draw_layers.clear(); |
1101 frame->contains_incomplete_tile = false; | 1096 frame->contains_incomplete_tile = false; |
1102 frame->has_no_damage = false; | 1097 frame->has_no_damage = false; |
1103 | 1098 |
1104 gfx::Rect device_viewport_damage_rect(damage_rect); | 1099 gfx::Rect device_viewport_damage_rect(damage_rect); |
1105 if (active_tree_->root_layer()) { | 1100 if (active_tree_->root_layer()) { |
1106 device_viewport_damage_rect.Union(viewport_damage_rect_); | 1101 device_viewport_damage_rect.Union(viewport_damage_rect_); |
1107 viewport_damage_rect_ = gfx::Rect(); | 1102 viewport_damage_rect_ = gfx::Rect(); |
1108 | 1103 |
1109 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1104 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
1110 AddDamageNextUpdate(device_viewport_damage_rect); | 1105 AddDamageNextUpdate(device_viewport_damage_rect); |
1111 } | 1106 } |
1112 | 1107 |
1113 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); | 1108 DrawResult draw_result = CalculateRenderPasses(frame); |
1114 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { | 1109 if (draw_result != DRAW_SUCCESS) { |
1115 DCHECK(!output_surface_->capabilities() | 1110 DCHECK(!output_surface_->capabilities() |
1116 .draw_and_swap_full_viewport_every_frame); | 1111 .draw_and_swap_full_viewport_every_frame); |
1117 return draw_result; | 1112 return draw_result; |
1118 } | 1113 } |
1119 | 1114 |
1120 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before | 1115 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before |
1121 // this function is called again. | 1116 // this function is called again. |
1122 return draw_result; | 1117 return draw_result; |
1123 } | 1118 } |
1124 | 1119 |
(...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3056 swap_promise_monitor_.erase(monitor); | 3051 swap_promise_monitor_.erase(monitor); |
3057 } | 3052 } |
3058 | 3053 |
3059 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 3054 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
3060 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3055 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
3061 for (; it != swap_promise_monitor_.end(); it++) | 3056 for (; it != swap_promise_monitor_.end(); it++) |
3062 (*it)->OnSetNeedsRedrawOnImpl(); | 3057 (*it)->OnSetNeedsRedrawOnImpl(); |
3063 } | 3058 } |
3064 | 3059 |
3065 } // namespace cc | 3060 } // namespace cc |
OLD | NEW |