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