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

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

Issue 246753008: cc: Unify use of DidSwapBuffers() and did_request_swap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comment Created 6 years, 7 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 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 screen_space_rect.right() / overhang_resource_scaled_size.width(), 699 screen_space_rect.right() / overhang_resource_scaled_size.width(),
700 screen_space_rect.bottom() / 700 screen_space_rect.bottom() /
701 overhang_resource_scaled_size.height()), 701 overhang_resource_scaled_size.height()),
702 screen_background_color, 702 screen_background_color,
703 vertex_opacity, 703 vertex_opacity,
704 false); 704 false);
705 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); 705 quad_culler.Append(tex_quad.PassAs<DrawQuad>());
706 } 706 }
707 } 707 }
708 708
709 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( 709 DrawResult LayerTreeHostImpl::CalculateRenderPasses(
710 FrameData* frame) { 710 FrameData* frame) {
711 DCHECK(frame->render_passes.empty()); 711 DCHECK(frame->render_passes.empty());
712 DCHECK(CanDraw()); 712 DCHECK(CanDraw());
713 DCHECK(active_tree_->root_layer()); 713 DCHECK(active_tree_->root_layer());
714 714
715 TrackDamageForAllSurfaces(active_tree_->root_layer(), 715 TrackDamageForAllSurfaces(active_tree_->root_layer(),
716 *frame->render_surface_layer_list); 716 *frame->render_surface_layer_list);
717 717
718 // If the root render surface has no visible damage, then don't generate a 718 // If the root render surface has no visible damage, then don't generate a
719 // frame at all. 719 // frame at all.
720 RenderSurfaceImpl* root_surface = 720 RenderSurfaceImpl* root_surface =
721 active_tree_->root_layer()->render_surface(); 721 active_tree_->root_layer()->render_surface();
722 bool root_surface_has_no_visible_damage = 722 bool root_surface_has_no_visible_damage =
723 !root_surface->damage_tracker()->current_damage_rect().Intersects( 723 !root_surface->damage_tracker()->current_damage_rect().Intersects(
724 root_surface->content_rect()); 724 root_surface->content_rect());
725 bool root_surface_has_contributing_layers = 725 bool root_surface_has_contributing_layers =
726 !root_surface->layer_list().empty(); 726 !root_surface->layer_list().empty();
727 bool hud_wants_to_draw_ = active_tree_->hud_layer() && 727 bool hud_wants_to_draw_ = active_tree_->hud_layer() &&
728 active_tree_->hud_layer()->IsAnimatingHUDContents(); 728 active_tree_->hud_layer()->IsAnimatingHUDContents();
729 if (root_surface_has_contributing_layers && 729 if (root_surface_has_contributing_layers &&
730 root_surface_has_no_visible_damage && 730 root_surface_has_no_visible_damage &&
731 active_tree_->LayersWithCopyOutputRequest().empty() && 731 active_tree_->LayersWithCopyOutputRequest().empty() &&
732 !hud_wants_to_draw_) { 732 !hud_wants_to_draw_) {
733 TRACE_EVENT0("cc", 733 TRACE_EVENT0("cc",
734 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 734 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
735 frame->has_no_damage = true; 735 frame->has_no_damage = true;
736 DCHECK(!output_surface_->capabilities() 736 DCHECK(!output_surface_->capabilities()
737 .draw_and_swap_full_viewport_every_frame); 737 .draw_and_swap_full_viewport_every_frame);
738 return DrawSwapReadbackResult::DRAW_SUCCESS; 738 return DRAW_SUCCESS;
739 } 739 }
740 740
741 TRACE_EVENT1("cc", 741 TRACE_EVENT1("cc",
742 "LayerTreeHostImpl::CalculateRenderPasses", 742 "LayerTreeHostImpl::CalculateRenderPasses",
743 "render_surface_layer_list.size()", 743 "render_surface_layer_list.size()",
744 static_cast<uint64>(frame->render_surface_layer_list->size())); 744 static_cast<uint64>(frame->render_surface_layer_list->size()));
745 745
746 // Create the render passes in dependency order. 746 // Create the render passes in dependency order.
747 for (int surface_index = frame->render_surface_layer_list->size() - 1; 747 for (int surface_index = frame->render_surface_layer_list->size() - 1;
748 surface_index >= 0; 748 surface_index >= 0;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 } 785 }
786 786
787 // Add quads to the Render passes in front-to-back order to allow for testing 787 // Add quads to the Render passes in front-to-back order to allow for testing
788 // occlusion and performing culling during the tree walk. 788 // occlusion and performing culling during the tree walk.
789 typedef LayerIterator<LayerImpl> LayerIteratorType; 789 typedef LayerIterator<LayerImpl> LayerIteratorType;
790 790
791 // Typically when we are missing a texture and use a checkerboard quad, we 791 // Typically when we are missing a texture and use a checkerboard quad, we
792 // still draw the frame. However when the layer being checkerboarded is moving 792 // still draw the frame. However when the layer being checkerboarded is moving
793 // due to an impl-animation, we drop the frame to avoid flashing due to the 793 // due to an impl-animation, we drop the frame to avoid flashing due to the
794 // texture suddenly appearing in the future. 794 // texture suddenly appearing in the future.
795 DrawSwapReadbackResult::DrawResult draw_result = 795 DrawResult draw_result = DRAW_SUCCESS;
796 DrawSwapReadbackResult::DRAW_SUCCESS;
797 // When we have a copy request for a layer, we need to draw no matter 796 // When we have a copy request for a layer, we need to draw no matter
798 // what, as the layer may disappear after this frame. 797 // what, as the layer may disappear after this frame.
799 bool have_copy_request = false; 798 bool have_copy_request = false;
800 799
801 int layers_drawn = 0; 800 int layers_drawn = 0;
802 801
803 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 802 const DrawMode draw_mode = GetDrawMode(output_surface_.get());
804 803
805 LayerIteratorType end = 804 LayerIteratorType end =
806 LayerIteratorType::End(frame->render_surface_layer_list); 805 LayerIteratorType::End(frame->render_surface_layer_list);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 873
875 rendering_stats_instrumentation_->AddVisibleContentArea( 874 rendering_stats_instrumentation_->AddVisibleContentArea(
876 append_quads_data.visible_content_area); 875 append_quads_data.visible_content_area);
877 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( 876 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea(
878 append_quads_data.approximated_visible_content_area); 877 append_quads_data.approximated_visible_content_area);
879 878
880 if (append_quads_data.num_missing_tiles) { 879 if (append_quads_data.num_missing_tiles) {
881 bool layer_has_animating_transform = 880 bool layer_has_animating_transform =
882 it->screen_space_transform_is_animating() || 881 it->screen_space_transform_is_animating() ||
883 it->draw_transform_is_animating(); 882 it->draw_transform_is_animating();
884 if (layer_has_animating_transform) { 883 if (layer_has_animating_transform)
885 draw_result = 884 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
886 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
887 }
888 } 885 }
889 886
890 if (append_quads_data.had_incomplete_tile) { 887 if (append_quads_data.had_incomplete_tile) {
891 frame->contains_incomplete_tile = true; 888 frame->contains_incomplete_tile = true;
892 if (active_tree()->RequiresHighResToDraw()) 889 if (active_tree()->RequiresHighResToDraw())
893 draw_result = 890 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
894 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
895 } 891 }
896 892
897 occlusion_tracker.LeaveLayer(it); 893 occlusion_tracker.LeaveLayer(it);
898 } 894 }
899 895
900 if (have_copy_request || 896 if (have_copy_request ||
901 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 897 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
902 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; 898 draw_result = DRAW_SUCCESS;
903 899
904 #if DCHECK_IS_ON 900 #if DCHECK_IS_ON
905 for (size_t i = 0; i < frame->render_passes.size(); ++i) { 901 for (size_t i = 0; i < frame->render_passes.size(); ++i) {
906 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) 902 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j)
907 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); 903 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state);
908 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) 904 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id)
909 != frame->render_passes_by_id.end()); 905 != frame->render_passes_by_id.end());
910 } 906 }
911 #endif 907 #endif
912 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 908 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 // change. So, capture the iterator position from the end of the 1083 // change. So, capture the iterator position from the end of the
1088 // list, and restore it after the change. 1084 // list, and restore it after the change.
1089 size_t position_from_end = frame->render_passes.size() - it; 1085 size_t position_from_end = frame->render_passes.size() - it;
1090 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); 1086 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame);
1091 it = frame->render_passes.size() - position_from_end; 1087 it = frame->render_passes.size() - position_from_end;
1092 DCHECK_GE(frame->render_passes.size(), position_from_end); 1088 DCHECK_GE(frame->render_passes.size(), position_from_end);
1093 } 1089 }
1094 } 1090 }
1095 } 1091 }
1096 1092
1097 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( 1093 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame,
1098 FrameData* frame, 1094 const gfx::Rect& damage_rect) {
1099 const gfx::Rect& damage_rect) {
1100 TRACE_EVENT1("cc", 1095 TRACE_EVENT1("cc",
1101 "LayerTreeHostImpl::PrepareToDraw", 1096 "LayerTreeHostImpl::PrepareToDraw",
1102 "SourceFrameNumber", 1097 "SourceFrameNumber",
1103 active_tree_->source_frame_number()); 1098 active_tree_->source_frame_number());
1104 1099
1105 if (need_to_update_visible_tiles_before_draw_ && 1100 if (need_to_update_visible_tiles_before_draw_ &&
1106 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { 1101 tile_manager_ && tile_manager_->UpdateVisibleTiles()) {
1107 DidInitializeVisibleTile(); 1102 DidInitializeVisibleTile();
1108 } 1103 }
1109 need_to_update_visible_tiles_before_draw_ = true; 1104 need_to_update_visible_tiles_before_draw_ = true;
1110 1105
1111 active_tree_->UpdateDrawProperties(); 1106 active_tree_->UpdateDrawProperties();
1112 1107
1113 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1108 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1114 frame->render_passes.clear(); 1109 frame->render_passes.clear();
1115 frame->render_passes_by_id.clear(); 1110 frame->render_passes_by_id.clear();
1116 frame->will_draw_layers.clear(); 1111 frame->will_draw_layers.clear();
1117 frame->contains_incomplete_tile = false; 1112 frame->contains_incomplete_tile = false;
1118 frame->has_no_damage = false; 1113 frame->has_no_damage = false;
1119 1114
1120 gfx::Rect device_viewport_damage_rect(damage_rect); 1115 gfx::Rect device_viewport_damage_rect(damage_rect);
1121 if (active_tree_->root_layer()) { 1116 if (active_tree_->root_layer()) {
1122 device_viewport_damage_rect.Union(viewport_damage_rect_); 1117 device_viewport_damage_rect.Union(viewport_damage_rect_);
1123 viewport_damage_rect_ = gfx::Rect(); 1118 viewport_damage_rect_ = gfx::Rect();
1124 1119
1125 active_tree_->root_layer()->render_surface()->damage_tracker()-> 1120 active_tree_->root_layer()->render_surface()->damage_tracker()->
1126 AddDamageNextUpdate(device_viewport_damage_rect); 1121 AddDamageNextUpdate(device_viewport_damage_rect);
1127 } 1122 }
1128 1123
1129 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); 1124 DrawResult draw_result = CalculateRenderPasses(frame);
1130 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { 1125 if (draw_result != DRAW_SUCCESS) {
1131 DCHECK(!output_surface_->capabilities() 1126 DCHECK(!output_surface_->capabilities()
1132 .draw_and_swap_full_viewport_every_frame); 1127 .draw_and_swap_full_viewport_every_frame);
1133 return draw_result; 1128 return draw_result;
1134 } 1129 }
1135 1130
1136 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before 1131 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before
1137 // this function is called again. 1132 // this function is called again.
1138 return draw_result; 1133 return draw_result;
1139 } 1134 }
1140 1135
(...skipping 2005 matching lines...) Expand 10 before | Expand all | Expand 10 after
3146 swap_promise_monitor_.erase(monitor); 3141 swap_promise_monitor_.erase(monitor);
3147 } 3142 }
3148 3143
3149 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3144 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3150 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3145 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3151 for (; it != swap_promise_monitor_.end(); it++) 3146 for (; it != swap_promise_monitor_.end(); it++)
3152 (*it)->OnSetNeedsRedrawOnImpl(); 3147 (*it)->OnSetNeedsRedrawOnImpl();
3153 } 3148 }
3154 3149
3155 } // namespace cc 3150 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698