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

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: DRAW_SUCCESS; assert CanDraw 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 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698