Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 131683005: cc: Make PrepareToDraw return an enum for why it aborts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698