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 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
690 overhang_resource_scaled_size.width(), | 690 overhang_resource_scaled_size.width(), |
691 layer_rect.bottom() / | 691 layer_rect.bottom() / |
692 overhang_resource_scaled_size.height()), | 692 overhang_resource_scaled_size.height()), |
693 screen_background_color, | 693 screen_background_color, |
694 vertex_opacity, | 694 vertex_opacity, |
695 false); | 695 false); |
696 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); | 696 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); |
697 } | 697 } |
698 } | 698 } |
699 | 699 |
700 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 700 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
701 FrameData* frame) { | |
701 DCHECK(frame->render_passes.empty()); | 702 DCHECK(frame->render_passes.empty()); |
702 | 703 DCHECK(CanDraw()); |
danakj
2014/01/29 21:56:29
yay
| |
703 if (!CanDraw() || !active_tree_->root_layer()) | 704 DCHECK(active_tree_->root_layer()); |
704 return false; | |
705 | 705 |
706 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 706 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
707 *frame->render_surface_layer_list); | 707 *frame->render_surface_layer_list); |
708 | 708 |
709 // If the root render surface has no visible damage, then don't generate a | 709 // If the root render surface has no visible damage, then don't generate a |
710 // frame at all. | 710 // frame at all. |
711 RenderSurfaceImpl* root_surface = | 711 RenderSurfaceImpl* root_surface = |
712 active_tree_->root_layer()->render_surface(); | 712 active_tree_->root_layer()->render_surface(); |
713 bool root_surface_has_no_visible_damage = | 713 bool root_surface_has_no_visible_damage = |
714 !root_surface->damage_tracker()->current_damage_rect().Intersects( | 714 !root_surface->damage_tracker()->current_damage_rect().Intersects( |
715 root_surface->content_rect()); | 715 root_surface->content_rect()); |
716 bool root_surface_has_contributing_layers = | 716 bool root_surface_has_contributing_layers = |
717 !root_surface->layer_list().empty(); | 717 !root_surface->layer_list().empty(); |
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 TRACE_EVENT0("cc", | 720 TRACE_EVENT0("cc", |
721 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 721 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
722 frame->has_no_damage = true; | 722 frame->has_no_damage = true; |
723 // A copy request should cause damage, so we should not have any copy | 723 // A copy request should cause damage, so we should not have any copy |
724 // requests in this case. | 724 // requests in this case. |
725 DCHECK_EQ(0u, active_tree_->LayersWithCopyOutputRequest().size()); | 725 DCHECK_EQ(0u, active_tree_->LayersWithCopyOutputRequest().size()); |
726 DCHECK(!output_surface_->capabilities() | 726 DCHECK(!output_surface_->capabilities() |
727 .draw_and_swap_full_viewport_every_frame); | 727 .draw_and_swap_full_viewport_every_frame); |
728 return true; | 728 return DrawSwapReadbackResult::DRAW_SUCCESS; |
729 } | 729 } |
730 | 730 |
731 TRACE_EVENT1("cc", | 731 TRACE_EVENT1("cc", |
732 "LayerTreeHostImpl::CalculateRenderPasses", | 732 "LayerTreeHostImpl::CalculateRenderPasses", |
733 "render_surface_layer_list.size()", | 733 "render_surface_layer_list.size()", |
734 static_cast<uint64>(frame->render_surface_layer_list->size())); | 734 static_cast<uint64>(frame->render_surface_layer_list->size())); |
735 | 735 |
736 // Create the render passes in dependency order. | 736 // Create the render passes in dependency order. |
737 for (int surface_index = frame->render_surface_layer_list->size() - 1; | 737 for (int surface_index = frame->render_surface_layer_list->size() - 1; |
738 surface_index >= 0; | 738 surface_index >= 0; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
772 // occlusion and performing culling during the tree walk. | 772 // occlusion and performing culling during the tree walk. |
773 typedef LayerIterator<LayerImpl, | 773 typedef LayerIterator<LayerImpl, |
774 LayerImplList, | 774 LayerImplList, |
775 RenderSurfaceImpl, | 775 RenderSurfaceImpl, |
776 LayerIteratorActions::FrontToBack> LayerIteratorType; | 776 LayerIteratorActions::FrontToBack> LayerIteratorType; |
777 | 777 |
778 // Typically when we are missing a texture and use a checkerboard quad, we | 778 // Typically when we are missing a texture and use a checkerboard quad, we |
779 // still draw the frame. However when the layer being checkerboarded is moving | 779 // still draw the frame. However when the layer being checkerboarded is moving |
780 // due to an impl-animation, we drop the frame to avoid flashing due to the | 780 // due to an impl-animation, we drop the frame to avoid flashing due to the |
781 // texture suddenly appearing in the future. | 781 // texture suddenly appearing in the future. |
782 bool draw_frame = true; | 782 DrawSwapReadbackResult::DrawResult draw_result = |
783 DrawSwapReadbackResult::DRAW_SUCCESS; | |
783 // When we have a copy request for a layer, we need to draw no matter | 784 // When we have a copy request for a layer, we need to draw no matter |
784 // what, as the layer may disappear after this frame. | 785 // what, as the layer may disappear after this frame. |
785 bool have_copy_request = false; | 786 bool have_copy_request = false; |
786 | 787 |
787 int layers_drawn = 0; | 788 int layers_drawn = 0; |
788 | 789 |
789 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); | 790 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); |
790 | 791 |
791 LayerIteratorType end = | 792 LayerIteratorType end = |
792 LayerIteratorType::End(frame->render_surface_layer_list); | 793 LayerIteratorType::End(frame->render_surface_layer_list); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
858 &append_quads_data); | 859 &append_quads_data); |
859 } | 860 } |
860 | 861 |
861 ++layers_drawn; | 862 ++layers_drawn; |
862 } | 863 } |
863 | 864 |
864 if (append_quads_data.num_missing_tiles) { | 865 if (append_quads_data.num_missing_tiles) { |
865 bool layer_has_animating_transform = | 866 bool layer_has_animating_transform = |
866 it->screen_space_transform_is_animating() || | 867 it->screen_space_transform_is_animating() || |
867 it->draw_transform_is_animating(); | 868 it->draw_transform_is_animating(); |
868 if (layer_has_animating_transform) | 869 if (layer_has_animating_transform) { |
869 draw_frame = false; | 870 draw_result = |
871 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | |
872 } | |
870 } | 873 } |
871 | 874 |
872 if (append_quads_data.had_incomplete_tile) | 875 if (append_quads_data.had_incomplete_tile) |
873 frame->contains_incomplete_tile = true; | 876 frame->contains_incomplete_tile = true; |
874 | 877 |
875 occlusion_tracker.LeaveLayer(it); | 878 occlusion_tracker.LeaveLayer(it); |
876 } | 879 } |
877 | 880 |
878 if (have_copy_request || | 881 if (have_copy_request || |
879 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 882 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
880 draw_frame = true; | 883 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; |
881 | 884 |
882 #ifndef NDEBUG | 885 #ifndef NDEBUG |
883 for (size_t i = 0; i < frame->render_passes.size(); ++i) { | 886 for (size_t i = 0; i < frame->render_passes.size(); ++i) { |
884 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 887 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
885 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 888 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
886 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 889 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
887 != frame->render_passes_by_id.end()); | 890 != frame->render_passes_by_id.end()); |
888 } | 891 } |
889 #endif | 892 #endif |
890 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 893 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
891 | 894 |
892 if (!active_tree_->has_transparent_background()) { | 895 if (!active_tree_->has_transparent_background()) { |
893 frame->render_passes.back()->has_transparent_background = false; | 896 frame->render_passes.back()->has_transparent_background = false; |
894 AppendQuadsToFillScreen( | 897 AppendQuadsToFillScreen( |
895 ResourceIdForUIResource(overhang_ui_resource_id_), | 898 ResourceIdForUIResource(overhang_ui_resource_id_), |
896 gfx::ScaleSize(overhang_ui_resource_size_, device_scale_factor_), | 899 gfx::ScaleSize(overhang_ui_resource_size_, device_scale_factor_), |
897 active_tree_->RootScrollLayerDeviceViewportBounds(), | 900 active_tree_->RootScrollLayerDeviceViewportBounds(), |
898 frame->render_passes.back(), | 901 frame->render_passes.back(), |
899 active_tree_->root_layer(), | 902 active_tree_->root_layer(), |
900 active_tree_->background_color(), | 903 active_tree_->background_color(), |
901 occlusion_tracker); | 904 occlusion_tracker); |
902 } | 905 } |
903 | 906 |
904 if (draw_frame) | 907 if (draw_result == DrawSwapReadbackResult::DRAW_SUCCESS) |
905 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 908 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
906 else | 909 else |
907 DCHECK(!have_copy_request); | 910 DCHECK(!have_copy_request); |
908 | 911 |
909 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); | 912 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
910 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 913 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
911 | 914 |
912 // Any copy requests left in the tree are not going to get serviced, and | 915 // Any copy requests left in the tree are not going to get serviced, and |
913 // should be aborted. | 916 // should be aborted. |
914 ScopedPtrVector<CopyOutputRequest> requests_to_abort; | 917 ScopedPtrVector<CopyOutputRequest> requests_to_abort; |
915 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { | 918 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { |
916 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); | 919 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); |
917 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); | 920 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); |
918 } | 921 } |
919 for (size_t i = 0; i < requests_to_abort.size(); ++i) | 922 for (size_t i = 0; i < requests_to_abort.size(); ++i) |
920 requests_to_abort[i]->SendEmptyResult(); | 923 requests_to_abort[i]->SendEmptyResult(); |
921 | 924 |
922 // If we're making a frame to draw, it better have at least one render pass. | 925 // If we're making a frame to draw, it better have at least one render pass. |
923 DCHECK(!frame->render_passes.empty()); | 926 DCHECK(!frame->render_passes.empty()); |
924 | 927 |
925 // Should only have one render pass in resourceless software mode. | 928 // Should only have one render pass in resourceless software mode. |
926 if (output_surface_->ForcedDrawToSoftwareDevice()) | 929 if (output_surface_->ForcedDrawToSoftwareDevice()) |
927 DCHECK_EQ(1u, frame->render_passes.size()); | 930 DCHECK_EQ(1u, frame->render_passes.size()); |
928 | 931 |
929 return draw_frame; | 932 return draw_result; |
930 } | 933 } |
931 | 934 |
932 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { | 935 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { |
933 if (input_handler_client_) | 936 if (input_handler_client_) |
934 input_handler_client_->MainThreadHasStoppedFlinging(); | 937 input_handler_client_->MainThreadHasStoppedFlinging(); |
935 } | 938 } |
936 | 939 |
937 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( | 940 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( |
938 bool should_background_tick) { | 941 bool should_background_tick) { |
939 DCHECK(proxy_->IsImplThread()); | 942 DCHECK(proxy_->IsImplThread()); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1071 // change. So, capture the iterator position from the end of the | 1074 // change. So, capture the iterator position from the end of the |
1072 // list, and restore it after the change. | 1075 // list, and restore it after the change. |
1073 size_t position_from_end = frame->render_passes.size() - it; | 1076 size_t position_from_end = frame->render_passes.size() - it; |
1074 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); | 1077 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); |
1075 it = frame->render_passes.size() - position_from_end; | 1078 it = frame->render_passes.size() - position_from_end; |
1076 DCHECK_GE(frame->render_passes.size(), position_from_end); | 1079 DCHECK_GE(frame->render_passes.size(), position_from_end); |
1077 } | 1080 } |
1078 } | 1081 } |
1079 } | 1082 } |
1080 | 1083 |
1081 bool LayerTreeHostImpl::PrepareToDraw(FrameData* frame, | 1084 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( |
1082 const gfx::Rect& damage_rect) { | 1085 FrameData* frame, |
1086 const gfx::Rect& damage_rect) { | |
1083 TRACE_EVENT1("cc", | 1087 TRACE_EVENT1("cc", |
1084 "LayerTreeHostImpl::PrepareToDraw", | 1088 "LayerTreeHostImpl::PrepareToDraw", |
1085 "SourceFrameNumber", | 1089 "SourceFrameNumber", |
1086 active_tree_->source_frame_number()); | 1090 active_tree_->source_frame_number()); |
1087 | 1091 |
1088 if (need_to_update_visible_tiles_before_draw_ && | 1092 if (need_to_update_visible_tiles_before_draw_ && |
1089 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { | 1093 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { |
1090 DidInitializeVisibleTile(); | 1094 DidInitializeVisibleTile(); |
1091 } | 1095 } |
1092 need_to_update_visible_tiles_before_draw_ = true; | 1096 need_to_update_visible_tiles_before_draw_ = true; |
1093 | 1097 |
1094 active_tree_->UpdateDrawProperties(); | 1098 active_tree_->UpdateDrawProperties(); |
1095 | 1099 |
1096 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1100 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1097 frame->render_passes.clear(); | 1101 frame->render_passes.clear(); |
1098 frame->render_passes_by_id.clear(); | 1102 frame->render_passes_by_id.clear(); |
1099 frame->will_draw_layers.clear(); | 1103 frame->will_draw_layers.clear(); |
1100 frame->contains_incomplete_tile = false; | 1104 frame->contains_incomplete_tile = false; |
1101 frame->has_no_damage = false; | 1105 frame->has_no_damage = false; |
1102 | 1106 |
1103 gfx::Rect device_viewport_damage_rect(damage_rect); | 1107 gfx::Rect device_viewport_damage_rect(damage_rect); |
1104 if (active_tree_->root_layer()) { | 1108 if (active_tree_->root_layer()) { |
1105 device_viewport_damage_rect.Union(viewport_damage_rect_); | 1109 device_viewport_damage_rect.Union(viewport_damage_rect_); |
1106 viewport_damage_rect_ = gfx::Rect(); | 1110 viewport_damage_rect_ = gfx::Rect(); |
1107 | 1111 |
1108 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1112 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
1109 AddDamageNextUpdate(device_viewport_damage_rect); | 1113 AddDamageNextUpdate(device_viewport_damage_rect); |
1110 } | 1114 } |
1111 | 1115 |
1112 if (!CalculateRenderPasses(frame)) { | 1116 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); |
1117 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { | |
1113 DCHECK(!output_surface_->capabilities() | 1118 DCHECK(!output_surface_->capabilities() |
1114 .draw_and_swap_full_viewport_every_frame); | 1119 .draw_and_swap_full_viewport_every_frame); |
1115 return false; | 1120 return draw_result; |
1116 } | 1121 } |
1117 | 1122 |
1118 // If we return true, then we expect DrawLayers() to be called before this | 1123 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before |
1124 // this | |
danakj
2014/01/29 21:56:29
wrapping
enne (OOO)
2014/01/29 23:09:23
80col
danakj
2014/01/29 23:10:48
i meant the next line could join this one tho? "th
enne (OOO)
2014/01/29 23:11:28
<_<
| |
1119 // function is called again. | 1125 // function is called again. |
1120 return true; | 1126 return draw_result; |
1121 } | 1127 } |
1122 | 1128 |
1123 void LayerTreeHostImpl::EvictTexturesForTesting() { | 1129 void LayerTreeHostImpl::EvictTexturesForTesting() { |
1124 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); | 1130 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); |
1125 } | 1131 } |
1126 | 1132 |
1127 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { | 1133 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { |
1128 NOTREACHED(); | 1134 NOTREACHED(); |
1129 } | 1135 } |
1130 | 1136 |
(...skipping 1791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2922 swap_promise_monitor_.erase(monitor); | 2928 swap_promise_monitor_.erase(monitor); |
2923 } | 2929 } |
2924 | 2930 |
2925 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 2931 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
2926 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 2932 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
2927 for (; it != swap_promise_monitor_.end(); it++) | 2933 for (; it != swap_promise_monitor_.end(); it++) |
2928 (*it)->OnSetNeedsRedrawOnImpl(); | 2934 (*it)->OnSetNeedsRedrawOnImpl(); |
2929 } | 2935 } |
2930 | 2936 |
2931 } // namespace cc | 2937 } // namespace cc |
OLD | NEW |