| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |