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 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 quad->SetNew(shared_quad_state, | 753 quad->SetNew(shared_quad_state, |
754 screen_space_rect, | 754 screen_space_rect, |
755 visible_screen_space_rect, | 755 visible_screen_space_rect, |
756 screen_background_color, | 756 screen_background_color, |
757 false); | 757 false); |
758 } | 758 } |
759 } | 759 } |
760 | 760 |
761 static RenderPass* FindRenderPassById(const RenderPassList& list, | 761 static RenderPass* FindRenderPassById(const RenderPassList& list, |
762 RenderPassId id) { | 762 RenderPassId id) { |
763 auto it = std::find_if(list.begin(), list.end(), | 763 auto it = std::find_if( |
764 [id](const RenderPass* p) { return p->id == id; }); | 764 list.begin(), list.end(), |
765 return it == list.end() ? nullptr : *it; | 765 [id](const scoped_ptr<RenderPass>& p) { return p->id == id; }); |
| 766 return it == list.end() ? nullptr : it->get(); |
766 } | 767 } |
767 | 768 |
768 DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 769 DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
769 FrameData* frame) { | 770 FrameData* frame) { |
770 DCHECK(frame->render_passes.empty()); | 771 DCHECK(frame->render_passes.empty()); |
771 DCHECK(CanDraw()); | 772 DCHECK(CanDraw()); |
772 DCHECK(active_tree_->root_layer()); | 773 DCHECK(active_tree_->root_layer()); |
773 | 774 |
774 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 775 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
775 *frame->render_surface_layer_list); | 776 *frame->render_surface_layer_list); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 render_surface->AppendRenderPasses(frame); | 821 render_surface->AppendRenderPasses(frame); |
821 } | 822 } |
822 | 823 |
823 // When we are displaying the HUD, change the root damage rect to cover the | 824 // When we are displaying the HUD, change the root damage rect to cover the |
824 // entire root surface. This will disable partial-swap/scissor optimizations | 825 // entire root surface. This will disable partial-swap/scissor optimizations |
825 // that would prevent the HUD from updating, since the HUD does not cause | 826 // that would prevent the HUD from updating, since the HUD does not cause |
826 // damage itself, to prevent it from messing with damage visualizations. Since | 827 // damage itself, to prevent it from messing with damage visualizations. Since |
827 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls, | 828 // damage visualizations are done off the LayerImpls and RenderSurfaceImpls, |
828 // changing the RenderPass does not affect them. | 829 // changing the RenderPass does not affect them. |
829 if (active_tree_->hud_layer()) { | 830 if (active_tree_->hud_layer()) { |
830 RenderPass* root_pass = frame->render_passes.back(); | 831 RenderPass* root_pass = frame->render_passes.back().get(); |
831 root_pass->damage_rect = root_pass->output_rect; | 832 root_pass->damage_rect = root_pass->output_rect; |
832 } | 833 } |
833 | 834 |
834 // Because the active tree could be drawn again if this fails for some reason, | 835 // Because the active tree could be drawn again if this fails for some reason, |
835 // clear all of the copy request flags so that sanity checks for the counts | 836 // clear all of the copy request flags so that sanity checks for the counts |
836 // succeed. | 837 // succeed. |
837 if (!active_tree_->LayersWithCopyOutputRequest().empty()) { | 838 if (!active_tree_->LayersWithCopyOutputRequest().empty()) { |
838 LayerTreeHostCommon::CallFunctionForSubtree( | 839 LayerTreeHostCommon::CallFunctionForSubtree( |
839 active_tree_->root_layer(), [](LayerImpl* layer) { | 840 active_tree_->root_layer(), [](LayerImpl* layer) { |
840 layer->set_num_layer_or_descendant_with_copy_request(0); | 841 layer->set_num_layer_or_descendant_with_copy_request(0); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 for (const auto& quad : render_pass->quad_list) | 988 for (const auto& quad : render_pass->quad_list) |
988 DCHECK(quad->shared_quad_state); | 989 DCHECK(quad->shared_quad_state); |
989 } | 990 } |
990 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 991 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
991 #endif | 992 #endif |
992 | 993 |
993 if (!active_tree_->has_transparent_background()) { | 994 if (!active_tree_->has_transparent_background()) { |
994 frame->render_passes.back()->has_transparent_background = false; | 995 frame->render_passes.back()->has_transparent_background = false; |
995 AppendQuadsToFillScreen( | 996 AppendQuadsToFillScreen( |
996 active_tree_->RootScrollLayerDeviceViewportBounds(), | 997 active_tree_->RootScrollLayerDeviceViewportBounds(), |
997 frame->render_passes.back(), active_tree_->root_layer(), | 998 frame->render_passes.back().get(), active_tree_->root_layer(), |
998 active_tree_->background_color(), unoccluded_screen_space_region); | 999 active_tree_->background_color(), unoccluded_screen_space_region); |
999 } | 1000 } |
1000 | 1001 |
1001 RemoveRenderPasses(frame); | 1002 RemoveRenderPasses(frame); |
1002 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 1003 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
1003 | 1004 |
1004 // Any copy requests left in the tree are not going to get serviced, and | 1005 // Any copy requests left in the tree are not going to get serviced, and |
1005 // should be aborted. | 1006 // should be aborted. |
1006 ScopedPtrVector<CopyOutputRequest> requests_to_abort; | 1007 std::vector<scoped_ptr<CopyOutputRequest>> requests_to_abort; |
1007 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { | 1008 while (!active_tree_->LayersWithCopyOutputRequest().empty()) { |
1008 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); | 1009 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); |
1009 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); | 1010 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); |
1010 } | 1011 } |
1011 for (size_t i = 0; i < requests_to_abort.size(); ++i) | 1012 for (size_t i = 0; i < requests_to_abort.size(); ++i) |
1012 requests_to_abort[i]->SendEmptyResult(); | 1013 requests_to_abort[i]->SendEmptyResult(); |
1013 | 1014 |
1014 // If we're making a frame to draw, it better have at least one render pass. | 1015 // If we're making a frame to draw, it better have at least one render pass. |
1015 DCHECK(!frame->render_passes.empty()); | 1016 DCHECK(!frame->render_passes.empty()); |
1016 | 1017 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 | 1133 |
1133 // A set of RenderPasses that we have seen. | 1134 // A set of RenderPasses that we have seen. |
1134 std::set<RenderPassId> pass_exists; | 1135 std::set<RenderPassId> pass_exists; |
1135 // A set of RenderPassDrawQuads that we have seen (stored by the RenderPasses | 1136 // A set of RenderPassDrawQuads that we have seen (stored by the RenderPasses |
1136 // they refer to). | 1137 // they refer to). |
1137 base::SmallMap<base::hash_map<RenderPassId, int>> pass_references; | 1138 base::SmallMap<base::hash_map<RenderPassId, int>> pass_references; |
1138 | 1139 |
1139 // Iterate RenderPasses in draw order, removing empty render passes (except | 1140 // Iterate RenderPasses in draw order, removing empty render passes (except |
1140 // the root RenderPass). | 1141 // the root RenderPass). |
1141 for (size_t i = 0; i < frame->render_passes.size(); ++i) { | 1142 for (size_t i = 0; i < frame->render_passes.size(); ++i) { |
1142 RenderPass* pass = frame->render_passes[i]; | 1143 RenderPass* pass = frame->render_passes[i].get(); |
1143 | 1144 |
1144 // Remove orphan RenderPassDrawQuads. | 1145 // Remove orphan RenderPassDrawQuads. |
1145 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end();) { | 1146 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end();) { |
1146 if (it->material != DrawQuad::RENDER_PASS) { | 1147 if (it->material != DrawQuad::RENDER_PASS) { |
1147 ++it; | 1148 ++it; |
1148 continue; | 1149 continue; |
1149 } | 1150 } |
1150 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); | 1151 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); |
1151 // If the RenderPass doesn't exist, we can remove the quad. | 1152 // If the RenderPass doesn't exist, we can remove the quad. |
1152 if (pass_exists.count(quad->render_pass_id)) { | 1153 if (pass_exists.count(quad->render_pass_id)) { |
(...skipping 22 matching lines...) Expand all Loading... |
1175 pass_exists.insert(pass->id); | 1176 pass_exists.insert(pass->id); |
1176 } | 1177 } |
1177 | 1178 |
1178 // Remove RenderPasses that are not referenced by any draw quads or copy | 1179 // Remove RenderPasses that are not referenced by any draw quads or copy |
1179 // requests (except the root RenderPass). | 1180 // requests (except the root RenderPass). |
1180 for (size_t i = 0; i < frame->render_passes.size() - 1; ++i) { | 1181 for (size_t i = 0; i < frame->render_passes.size() - 1; ++i) { |
1181 // Iterating from the back of the list to the front, skipping over the | 1182 // Iterating from the back of the list to the front, skipping over the |
1182 // back-most (root) pass, in order to remove each qualified RenderPass, and | 1183 // back-most (root) pass, in order to remove each qualified RenderPass, and |
1183 // drop references to earlier RenderPasses allowing them to be removed to. | 1184 // drop references to earlier RenderPasses allowing them to be removed to. |
1184 RenderPass* pass = | 1185 RenderPass* pass = |
1185 frame->render_passes[frame->render_passes.size() - 2 - i]; | 1186 frame->render_passes[frame->render_passes.size() - 2 - i].get(); |
1186 if (!pass->copy_requests.empty()) | 1187 if (!pass->copy_requests.empty()) |
1187 continue; | 1188 continue; |
1188 if (pass_references[pass->id]) | 1189 if (pass_references[pass->id]) |
1189 continue; | 1190 continue; |
1190 | 1191 |
1191 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) { | 1192 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) { |
1192 if (it->material != DrawQuad::RENDER_PASS) | 1193 if (it->material != DrawQuad::RENDER_PASS) |
1193 continue; | 1194 continue; |
1194 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); | 1195 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); |
1195 pass_references[quad->render_pass_id]--; | 1196 pass_references[quad->render_pass_id]--; |
(...skipping 1811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3007 gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread(); | 3008 gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread(); |
3008 | 3009 |
3009 if (!scroll_delta.IsZero()) { | 3010 if (!scroll_delta.IsZero()) { |
3010 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 3011 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
3011 scroll.layer_id = layer_impl->id(); | 3012 scroll.layer_id = layer_impl->id(); |
3012 scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y()); | 3013 scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y()); |
3013 scroll_info->scrolls.push_back(scroll); | 3014 scroll_info->scrolls.push_back(scroll); |
3014 } | 3015 } |
3015 | 3016 |
3016 for (size_t i = 0; i < layer_impl->children().size(); ++i) | 3017 for (size_t i = 0; i < layer_impl->children().size(); ++i) |
3017 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); | 3018 CollectScrollDeltas(scroll_info, layer_impl->children()[i].get()); |
3018 } | 3019 } |
3019 | 3020 |
3020 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { | 3021 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { |
3021 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 3022 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
3022 | 3023 |
3023 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 3024 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
3024 scroll_info->page_scale_delta = | 3025 scroll_info->page_scale_delta = |
3025 active_tree_->page_scale_factor()->PullDeltaForMainThread(); | 3026 active_tree_->page_scale_factor()->PullDeltaForMainThread(); |
3026 scroll_info->top_controls_delta = | 3027 scroll_info->top_controls_delta = |
3027 active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread(); | 3028 active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread(); |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3694 return task_runner_provider_->HasImplThread(); | 3695 return task_runner_provider_->HasImplThread(); |
3695 } | 3696 } |
3696 | 3697 |
3697 bool LayerTreeHostImpl::CommitToActiveTree() const { | 3698 bool LayerTreeHostImpl::CommitToActiveTree() const { |
3698 // In single threaded mode we skip the pending tree and commit directly to the | 3699 // In single threaded mode we skip the pending tree and commit directly to the |
3699 // active tree. | 3700 // active tree. |
3700 return !task_runner_provider_->HasImplThread(); | 3701 return !task_runner_provider_->HasImplThread(); |
3701 } | 3702 } |
3702 | 3703 |
3703 } // namespace cc | 3704 } // namespace cc |
OLD | NEW |