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

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: Introduce HasSentDrawRequestThisFrame() 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 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 screen_space_rect.right() / overhang_resource_scaled_size.width(), 688 screen_space_rect.right() / overhang_resource_scaled_size.width(),
689 screen_space_rect.bottom() / 689 screen_space_rect.bottom() /
690 overhang_resource_scaled_size.height()), 690 overhang_resource_scaled_size.height()),
691 screen_background_color, 691 screen_background_color,
692 vertex_opacity, 692 vertex_opacity,
693 false); 693 false);
694 quad_culler.Append(tex_quad.PassAs<DrawQuad>()); 694 quad_culler.Append(tex_quad.PassAs<DrawQuad>());
695 } 695 }
696 } 696 }
697 697
698 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::CalculateRenderPasses( 698 DrawResult LayerTreeHostImpl::CalculateRenderPasses(
699 FrameData* frame) { 699 FrameData* frame) {
700 DCHECK(frame->render_passes.empty()); 700 DCHECK(frame->render_passes.empty());
701 DCHECK(CanDraw()); 701 DCHECK(CanDraw());
702 DCHECK(active_tree_->root_layer()); 702 DCHECK(active_tree_->root_layer());
703 703
704 TrackDamageForAllSurfaces(active_tree_->root_layer(), 704 TrackDamageForAllSurfaces(active_tree_->root_layer(),
705 *frame->render_surface_layer_list); 705 *frame->render_surface_layer_list);
706 706
707 // If the root render surface has no visible damage, then don't generate a 707 // If the root render surface has no visible damage, then don't generate a
708 // frame at all. 708 // frame at all.
709 RenderSurfaceImpl* root_surface = 709 RenderSurfaceImpl* root_surface =
710 active_tree_->root_layer()->render_surface(); 710 active_tree_->root_layer()->render_surface();
711 bool root_surface_has_no_visible_damage = 711 bool root_surface_has_no_visible_damage =
712 !root_surface->damage_tracker()->current_damage_rect().Intersects( 712 !root_surface->damage_tracker()->current_damage_rect().Intersects(
713 root_surface->content_rect()); 713 root_surface->content_rect());
714 bool root_surface_has_contributing_layers = 714 bool root_surface_has_contributing_layers =
715 !root_surface->layer_list().empty(); 715 !root_surface->layer_list().empty();
716 bool hud_wants_to_draw_ = active_tree_->hud_layer() && 716 bool hud_wants_to_draw_ = active_tree_->hud_layer() &&
717 active_tree_->hud_layer()->IsAnimatingHUDContents(); 717 active_tree_->hud_layer()->IsAnimatingHUDContents();
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 active_tree_->LayersWithCopyOutputRequest().empty() && 720 active_tree_->LayersWithCopyOutputRequest().empty() &&
721 !hud_wants_to_draw_) { 721 !hud_wants_to_draw_) {
722 TRACE_EVENT0("cc", 722 TRACE_EVENT0("cc",
723 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 723 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
724 frame->has_no_damage = true; 724 frame->has_no_damage = true;
725 DCHECK(!output_surface_->capabilities() 725 DCHECK(!output_surface_->capabilities()
726 .draw_and_swap_full_viewport_every_frame); 726 .draw_and_swap_full_viewport_every_frame);
727 return DrawSwapReadbackResult::DRAW_SUCCESS; 727 return DRAW_SUCCESS;
728 } 728 }
729 729
730 TRACE_EVENT1("cc", 730 TRACE_EVENT1("cc",
731 "LayerTreeHostImpl::CalculateRenderPasses", 731 "LayerTreeHostImpl::CalculateRenderPasses",
732 "render_surface_layer_list.size()", 732 "render_surface_layer_list.size()",
733 static_cast<uint64>(frame->render_surface_layer_list->size())); 733 static_cast<uint64>(frame->render_surface_layer_list->size()));
734 734
735 // Create the render passes in dependency order. 735 // Create the render passes in dependency order.
736 for (int surface_index = frame->render_surface_layer_list->size() - 1; 736 for (int surface_index = frame->render_surface_layer_list->size() - 1;
737 surface_index >= 0; 737 surface_index >= 0;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 } 774 }
775 775
776 // Add quads to the Render passes in front-to-back order to allow for testing 776 // Add quads to the Render passes in front-to-back order to allow for testing
777 // occlusion and performing culling during the tree walk. 777 // occlusion and performing culling during the tree walk.
778 typedef LayerIterator<LayerImpl> LayerIteratorType; 778 typedef LayerIterator<LayerImpl> LayerIteratorType;
779 779
780 // Typically when we are missing a texture and use a checkerboard quad, we 780 // Typically when we are missing a texture and use a checkerboard quad, we
781 // still draw the frame. However when the layer being checkerboarded is moving 781 // still draw the frame. However when the layer being checkerboarded is moving
782 // due to an impl-animation, we drop the frame to avoid flashing due to the 782 // due to an impl-animation, we drop the frame to avoid flashing due to the
783 // texture suddenly appearing in the future. 783 // texture suddenly appearing in the future.
784 DrawSwapReadbackResult::DrawResult draw_result = 784 DrawResult draw_result = DRAW_SUCCESS;
785 DrawSwapReadbackResult::DRAW_SUCCESS;
786 // When we have a copy request for a layer, we need to draw no matter 785 // When we have a copy request for a layer, we need to draw no matter
787 // what, as the layer may disappear after this frame. 786 // what, as the layer may disappear after this frame.
788 bool have_copy_request = false; 787 bool have_copy_request = false;
789 788
790 int layers_drawn = 0; 789 int layers_drawn = 0;
791 790
792 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 791 const DrawMode draw_mode = GetDrawMode(output_surface_.get());
793 792
794 LayerIteratorType end = 793 LayerIteratorType end =
795 LayerIteratorType::End(frame->render_surface_layer_list); 794 LayerIteratorType::End(frame->render_surface_layer_list);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 &append_quads_data); 857 &append_quads_data);
859 } 858 }
860 859
861 ++layers_drawn; 860 ++layers_drawn;
862 } 861 }
863 862
864 if (append_quads_data.num_missing_tiles) { 863 if (append_quads_data.num_missing_tiles) {
865 bool layer_has_animating_transform = 864 bool layer_has_animating_transform =
866 it->screen_space_transform_is_animating() || 865 it->screen_space_transform_is_animating() ||
867 it->draw_transform_is_animating(); 866 it->draw_transform_is_animating();
868 if (layer_has_animating_transform) { 867 if (layer_has_animating_transform)
869 draw_result = 868 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
870 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
871 }
872 } 869 }
873 870
874 if (append_quads_data.had_incomplete_tile) { 871 if (append_quads_data.had_incomplete_tile) {
875 frame->contains_incomplete_tile = true; 872 frame->contains_incomplete_tile = true;
876 if (active_tree()->RequiresHighResToDraw()) 873 if (active_tree()->RequiresHighResToDraw())
877 draw_result = 874 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
878 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
879 } 875 }
880 876
881 occlusion_tracker.LeaveLayer(it); 877 occlusion_tracker.LeaveLayer(it);
882 } 878 }
883 879
884 if (have_copy_request || 880 if (have_copy_request ||
885 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 881 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
886 draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; 882 draw_result = DRAW_SUCCESS;
887 883
888 #if DCHECK_IS_ON 884 #if DCHECK_IS_ON
889 for (size_t i = 0; i < frame->render_passes.size(); ++i) { 885 for (size_t i = 0; i < frame->render_passes.size(); ++i) {
890 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) 886 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j)
891 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); 887 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state);
892 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) 888 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id)
893 != frame->render_passes_by_id.end()); 889 != frame->render_passes_by_id.end());
894 } 890 }
895 #endif 891 #endif
896 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); 892 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 // change. So, capture the iterator position from the end of the 1067 // change. So, capture the iterator position from the end of the
1072 // list, and restore it after the change. 1068 // list, and restore it after the change.
1073 size_t position_from_end = frame->render_passes.size() - it; 1069 size_t position_from_end = frame->render_passes.size() - it;
1074 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame); 1070 RemoveRenderPassesRecursive(render_pass_quad->render_pass_id, frame);
1075 it = frame->render_passes.size() - position_from_end; 1071 it = frame->render_passes.size() - position_from_end;
1076 DCHECK_GE(frame->render_passes.size(), position_from_end); 1072 DCHECK_GE(frame->render_passes.size(), position_from_end);
1077 } 1073 }
1078 } 1074 }
1079 } 1075 }
1080 1076
1081 DrawSwapReadbackResult::DrawResult LayerTreeHostImpl::PrepareToDraw( 1077 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame,
1082 FrameData* frame, 1078 const gfx::Rect& damage_rect) {
1083 const gfx::Rect& damage_rect) {
1084 TRACE_EVENT1("cc", 1079 TRACE_EVENT1("cc",
1085 "LayerTreeHostImpl::PrepareToDraw", 1080 "LayerTreeHostImpl::PrepareToDraw",
1086 "SourceFrameNumber", 1081 "SourceFrameNumber",
1087 active_tree_->source_frame_number()); 1082 active_tree_->source_frame_number());
1088 1083
1089 if (need_to_update_visible_tiles_before_draw_ && 1084 if (need_to_update_visible_tiles_before_draw_ &&
1090 tile_manager_ && tile_manager_->UpdateVisibleTiles()) { 1085 tile_manager_ && tile_manager_->UpdateVisibleTiles()) {
1091 DidInitializeVisibleTile(); 1086 DidInitializeVisibleTile();
1092 } 1087 }
1093 need_to_update_visible_tiles_before_draw_ = true; 1088 need_to_update_visible_tiles_before_draw_ = true;
1094 1089
1095 active_tree_->UpdateDrawProperties(); 1090 active_tree_->UpdateDrawProperties();
1096 1091
1097 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1092 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1098 frame->render_passes.clear(); 1093 frame->render_passes.clear();
1099 frame->render_passes_by_id.clear(); 1094 frame->render_passes_by_id.clear();
1100 frame->will_draw_layers.clear(); 1095 frame->will_draw_layers.clear();
1101 frame->contains_incomplete_tile = false; 1096 frame->contains_incomplete_tile = false;
1102 frame->has_no_damage = false; 1097 frame->has_no_damage = false;
1103 1098
1104 gfx::Rect device_viewport_damage_rect(damage_rect); 1099 gfx::Rect device_viewport_damage_rect(damage_rect);
1105 if (active_tree_->root_layer()) { 1100 if (active_tree_->root_layer()) {
1106 device_viewport_damage_rect.Union(viewport_damage_rect_); 1101 device_viewport_damage_rect.Union(viewport_damage_rect_);
1107 viewport_damage_rect_ = gfx::Rect(); 1102 viewport_damage_rect_ = gfx::Rect();
1108 1103
1109 active_tree_->root_layer()->render_surface()->damage_tracker()-> 1104 active_tree_->root_layer()->render_surface()->damage_tracker()->
1110 AddDamageNextUpdate(device_viewport_damage_rect); 1105 AddDamageNextUpdate(device_viewport_damage_rect);
1111 } 1106 }
1112 1107
1113 DrawSwapReadbackResult::DrawResult draw_result = CalculateRenderPasses(frame); 1108 DrawResult draw_result = CalculateRenderPasses(frame);
1114 if (draw_result != DrawSwapReadbackResult::DRAW_SUCCESS) { 1109 if (draw_result != DRAW_SUCCESS) {
1115 DCHECK(!output_surface_->capabilities() 1110 DCHECK(!output_surface_->capabilities()
1116 .draw_and_swap_full_viewport_every_frame); 1111 .draw_and_swap_full_viewport_every_frame);
1117 return draw_result; 1112 return draw_result;
1118 } 1113 }
1119 1114
1120 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before 1115 // If we return DRAW_SUCCESS, then we expect DrawLayers() to be called before
1121 // this function is called again. 1116 // this function is called again.
1122 return draw_result; 1117 return draw_result;
1123 } 1118 }
1124 1119
(...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after
3056 swap_promise_monitor_.erase(monitor); 3051 swap_promise_monitor_.erase(monitor);
3057 } 3052 }
3058 3053
3059 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3054 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3060 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3055 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3061 for (; it != swap_promise_monitor_.end(); it++) 3056 for (; it != swap_promise_monitor_.end(); it++)
3062 (*it)->OnSetNeedsRedrawOnImpl(); 3057 (*it)->OnSetNeedsRedrawOnImpl();
3063 } 3058 }
3064 3059
3065 } // namespace cc 3060 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698