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

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: Use did_swap_request 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 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 screen_space_rect.right() / overhang_resource_scaled_size.width(), 708 screen_space_rect.right() / overhang_resource_scaled_size.width(),
709 screen_space_rect.bottom() / 709 screen_space_rect.bottom() /
710 overhang_resource_scaled_size.height()), 710 overhang_resource_scaled_size.height()),
711 screen_background_color, 711 screen_background_color,
712 vertex_opacity, 712 vertex_opacity,
713 false); 713 false);
714 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); 714 quad_culler.Append(tex_quad.PassAs<DrawQuad>());
715 } 715 }
716 } 716 }
717 717
718 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( 718 DrawResult LayerTreeHostImpl::CalculateRenderPasses(
719 FrameData* frame) { 719 FrameData* frame) {
720 DCHECK(frame->render_passes.empty()); 720 DCHECK(frame->render_passes.empty());
721 DCHECK(CanDraw()); 721 DCHECK(CanDraw());
722 DCHECK(active_tree_->root_layer()); 722 DCHECK(active_tree_->root_layer());
723 723
724 TrackDamageForAllSurfaces(active_tree_->root_layer(), 724 TrackDamageForAllSurfaces(active_tree_->root_layer(),
725 *frame->render_surface_layer_list); 725 *frame->render_surface_layer_list);
726 726
727 // If the root render surface has no visible damage, then don't generate a 727 // If the root render surface has no visible damage, then don't generate a
728 // frame at all. 728 // frame at all.
729 RenderSurfaceImpl* root_surface = 729 RenderSurfaceImpl* root_surface =
730 active_tree_->root_layer()->render_surface(); 730 active_tree_->root_layer()->render_surface();
731 bool root_surface_has_no_visible_damage = 731 bool root_surface_has_no_visible_damage =
732 !root_surface->damage_tracker()->current_damage_rect().Intersects( 732 !root_surface->damage_tracker()->current_damage_rect().Intersects(
733 root_surface->content_rect()); 733 root_surface->content_rect());
734 bool root_surface_has_contributing_layers = 734 bool root_surface_has_contributing_layers =
735 !root_surface->layer_list().empty(); 735 !root_surface->layer_list().empty();
736 bool hud_wants_to_draw_ = active_tree_->hud_layer() && 736 bool hud_wants_to_draw_ = active_tree_->hud_layer() &&
737 active_tree_->hud_layer()->IsAnimatingHUDContents(); 737 active_tree_->hud_layer()->IsAnimatingHUDContents();
738 if (root_surface_has_contributing_layers && 738 if (root_surface_has_contributing_layers &&
739 root_surface_has_no_visible_damage && 739 root_surface_has_no_visible_damage &&
740 active_tree_->LayersWithCopyOutputRequest().empty() && 740 active_tree_->LayersWithCopyOutputRequest().empty() &&
741 !hud_wants_to_draw_) { 741 !hud_wants_to_draw_) {
742 TRACE_EVENT0("cc", 742 TRACE_EVENT0("cc",
743 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 743 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
744 frame->has_no_damage = true; 744 frame->has_no_damage = true;
745 DCHECK(!output_surface_->capabilities() 745 DCHECK(!output_surface_->capabilities()
746 .draw_and_swap_full_viewport_every_frame); 746 .draw_and_swap_full_viewport_every_frame);
747 return DrawSwapReadbackResult::DRAW_SUCCESS; 747 return DRAW_SUCCESS;
748 } 748 }
749 749
750 TRACE_EVENT1("cc", 750 TRACE_EVENT1("cc",
751 "LayerTreeHostImpl::CalculateRenderPasses", 751 "LayerTreeHostImpl::CalculateRenderPasses",
752 "render_surface_layer_list.size()", 752 "render_surface_layer_list.size()",
753 static_cast<uint64>(frame->render_surface_layer_list->size())); 753 static_cast<uint64>(frame->render_surface_layer_list->size()));
754 754
755 // Create the render passes in dependency order. 755 // Create the render passes in dependency order.
756 for (int surface_index = frame->render_surface_layer_list->size() - 1; 756 for (int surface_index = frame->render_surface_layer_list->size() - 1;
757 surface_index >= 0; 757 surface_index >= 0;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 } 794 }
795 795
796 // Add quads to the Render passes in front-to-back order to allow for testing 796 // Add quads to the Render passes in front-to-back order to allow for testing
797 // occlusion and performing culling during the tree walk. 797 // occlusion and performing culling during the tree walk.
798 typedef LayerIterator<LayerImpl> LayerIteratorType; 798 typedef LayerIterator<LayerImpl> LayerIteratorType;
799 799
800 // Typically when we are missing a texture and use a checkerboard quad, we 800 // Typically when we are missing a texture and use a checkerboard quad, we
801 // still draw the frame. However when the layer being checkerboarded is moving 801 // still draw the frame. However when the layer being checkerboarded is moving
802 // due to an impl-animation, we drop the frame to avoid flashing due to the 802 // due to an impl-animation, we drop the frame to avoid flashing due to the
803 // texture suddenly appearing in the future. 803 // texture suddenly appearing in the future.
804 DrawSwapReadbackResult::DrawResult draw_result = 804 DrawResult draw_result = DRAW_SUCCESS;
805 DrawSwapReadbackResult::DRAW_SUCCESS;
806 // When we have a copy request for a layer, we need to draw no matter 805 // When we have a copy request for a layer, we need to draw no matter
807 // what, as the layer may disappear after this frame. 806 // what, as the layer may disappear after this frame.
808 bool have_copy_request = false; 807 bool have_copy_request = false;
809 808
810 int layers_drawn = 0; 809 int layers_drawn = 0;
811 810
812 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 811 const DrawMode draw_mode = GetDrawMode(output_surface_.get());
813 812
814 LayerIteratorType end = 813 LayerIteratorType end =
815 LayerIteratorType::End(frame->render_surface_layer_list); 814 LayerIteratorType::End(frame->render_surface_layer_list);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 882
884 rendering_stats_instrumentation_->AddVisibleContentArea( 883 rendering_stats_instrumentation_->AddVisibleContentArea(
885 append_quads_data.visible_content_area); 884 append_quads_data.visible_content_area);
886 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( 885 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea(
887 append_quads_data.approximated_visible_content_area); 886 append_quads_data.approximated_visible_content_area);
888 887
889 if (append_quads_data.num_missing_tiles) { 888 if (append_quads_data.num_missing_tiles) {
890 bool layer_has_animating_transform = 889 bool layer_has_animating_transform =
891 it->screen_space_transform_is_animating() || 890 it->screen_space_transform_is_animating() ||
892 it->draw_transform_is_animating(); 891 it->draw_transform_is_animating();
893 if (layer_has_animating_transform) { 892 if (layer_has_animating_transform)
894 draw_result = 893 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
895 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
896 }
897 } 894 }
898 895
899 if (append_quads_data.had_incomplete_tile) { 896 if (append_quads_data.had_incomplete_tile) {
900 frame->contains_incomplete_tile = true; 897 frame->contains_incomplete_tile = true;
901 if (active_tree()->RequiresHighResToDraw()) 898 if (active_tree()->RequiresHighResToDraw())
902 draw_result = 899 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
903 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
904 } 900 }
905 901
906 occlusion_tracker.LeaveLayer(it); 902 occlusion_tracker.LeaveLayer(it);
907 } 903 }
908 904
909 if (have_copy_request || 905 if (have_copy_request ||
910 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 906 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
911 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; 907 draw_result = DRAW_SUCCESS;
912 908
913 #if DCHECK_IS_ON 909 #if DCHECK_IS_ON
914 for (size_t i = 0; i < frame->render_passes.size(); ++i) { 910 for (size_t i = 0; i < frame->render_passes.size(); ++i) {
915 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) 911 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j)
916 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); 912 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state);
917 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) 913 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id)
918 != frame->render_passes_by_id.end()); 914 != frame->render_passes_by_id.end());
919 } 915 }
920 #endif 916 #endif
921 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 917 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 // change. So, capture the iterator position from the end of the 1092 // change. So, capture the iterator position from the end of the
1097 // list, and restore it after the change. 1093 // list, and restore it after the change.
1098 size_t position_from_end = frame->render_passes.size() - it; 1094 size_t position_from_end = frame->render_passes.size() - it;
1099 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); 1095 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame);
1100 it = frame->render_passes.size() - position_from_end; 1096 it = frame->render_passes.size() - position_from_end;
1101 DCHECK_GE(frame->render_passes.size(), position_from_end); 1097 DCHECK_GE(frame->render_passes.size(), position_from_end);
1102 } 1098 }
1103 } 1099 }
1104 } 1100 }
1105 1101
1106 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( 1102 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame,
1107 FrameData* frame, 1103 const gfx::Rect& damage_rect) {
1108 const gfx::Rect& damage_rect) {
1109 TRACE_EVENT1("cc", 1104 TRACE_EVENT1("cc",
1110 "LayerTreeHostImpl::PrepareToDraw", 1105 "LayerTreeHostImpl::PrepareToDraw",
1111 "SourceFrameNumber", 1106 "SourceFrameNumber",
1112 active_tree_->source_frame_number()); 1107 active_tree_->source_frame_number());
1113 1108
1114 if (need_to_update_visible_tiles_before_draw_ && 1109 if (need_to_update_visible_tiles_before_draw_ &&
1115 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { 1110 tile_manager_ && tile_manager_->UpdateVisibleTiles()) {
1116 DidInitializeVisibleTile(); 1111 DidInitializeVisibleTile();
1117 } 1112 }
1118 need_to_update_visible_tiles_before_draw_ = true; 1113 need_to_update_visible_tiles_before_draw_ = true;
1119 1114
1120 active_tree_->UpdateDrawProperties(); 1115 active_tree_->UpdateDrawProperties();
1121 1116
1122 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1117 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1123 frame->render_passes.clear(); 1118 frame->render_passes.clear();
1124 frame->render_passes_by_id.clear(); 1119 frame->render_passes_by_id.clear();
1125 frame->will_draw_layers.clear(); 1120 frame->will_draw_layers.clear();
1126 frame->contains_incomplete_tile = false; 1121 frame->contains_incomplete_tile = false;
1127 frame->has_no_damage = false; 1122 frame->has_no_damage = false;
1128 1123
1129 gfx::Rect device_viewport_damage_rect(damage_rect); 1124 gfx::Rect device_viewport_damage_rect(damage_rect);
1130 if (active_tree_->root_layer()) { 1125 if (active_tree_->root_layer()) {
1131 device_viewport_damage_rect.Union(viewport_damage_rect_); 1126 device_viewport_damage_rect.Union(viewport_damage_rect_);
1132 viewport_damage_rect_ = gfx::Rect(); 1127 viewport_damage_rect_ = gfx::Rect();
1133 1128
1134 active_tree_->root_layer()->render_surface()->damage_tracker()-> 1129 active_tree_->root_layer()->render_surface()->damage_tracker()->
1135 AddDamageNextUpdate(device_viewport_damage_rect); 1130 AddDamageNextUpdate(device_viewport_damage_rect);
1136 } 1131 }
1137 1132
1138 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); 1133 DrawResult draw_result = CalculateRenderPasses(frame);
1139 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { 1134 if (draw_result != DRAW_SUCCESS) {
1140 DCHECK(!output_surface_->capabilities() 1135 DCHECK(!output_surface_->capabilities()
1141 .draw_and_swap_full_viewport_every_frame); 1136 .draw_and_swap_full_viewport_every_frame);
1142 return draw_result; 1137 return draw_result;
1143 } 1138 }
1144 1139
1145 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before 1140 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before
1146 // this function is called again. 1141 // this function is called again.
1147 return draw_result; 1142 return draw_result;
1148 } 1143 }
1149 1144
(...skipping 2001 matching lines...) Expand 10 before | Expand all | Expand 10 after
3151 swap_promise_monitor_.erase(monitor); 3146 swap_promise_monitor_.erase(monitor);
3152 } 3147 }
3153 3148
3154 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3149 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3155 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3150 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3156 for (; it != swap_promise_monitor_.end(); it++) 3151 for (; it != swap_promise_monitor_.end(); it++)
3157 (*it)->OnSetNeedsRedrawOnImpl(); 3152 (*it)->OnSetNeedsRedrawOnImpl();
3158 } 3153 }
3159 3154
3160 } // namespace cc 3155 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698