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 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 | 792 |
793 int num_missing_tiles = 0; | 793 int num_missing_tiles = 0; |
794 int num_incomplete_tiles = 0; | 794 int num_incomplete_tiles = 0; |
795 | 795 |
796 LayerIteratorType end = | 796 LayerIteratorType end = |
797 LayerIteratorType::End(frame->render_surface_layer_list); | 797 LayerIteratorType::End(frame->render_surface_layer_list); |
798 for (LayerIteratorType it = | 798 for (LayerIteratorType it = |
799 LayerIteratorType::Begin(frame->render_surface_layer_list); | 799 LayerIteratorType::Begin(frame->render_surface_layer_list); |
800 it != end; | 800 it != end; |
801 ++it) { | 801 ++it) { |
802 RenderPass::Id target_render_pass_id = | 802 RenderPassId target_render_pass_id = |
803 it.target_render_surface_layer()->render_surface()->RenderPassId(); | 803 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
804 RenderPass* target_render_pass = | 804 RenderPass* target_render_pass = |
805 frame->render_passes_by_id[target_render_pass_id]; | 805 frame->render_passes_by_id[target_render_pass_id]; |
806 | 806 |
807 occlusion_tracker.EnterLayer(it); | 807 occlusion_tracker.EnterLayer(it); |
808 | 808 |
809 AppendQuadsData append_quads_data(target_render_pass_id); | 809 AppendQuadsData append_quads_data(target_render_pass_id); |
810 | 810 |
811 if (it.represents_target_render_surface()) { | 811 if (it.represents_target_render_surface()) { |
812 if (it->HasCopyRequest()) { | 812 if (it->HasCopyRequest()) { |
813 have_copy_request = true; | 813 have_copy_request = true; |
814 it->TakeCopyRequestsAndTransformToTarget( | 814 it->TakeCopyRequestsAndTransformToTarget( |
815 &target_render_pass->copy_requests); | 815 &target_render_pass->copy_requests); |
816 } | 816 } |
817 } else if (it.represents_contributing_render_surface() && | 817 } else if (it.represents_contributing_render_surface() && |
818 it->render_surface()->contributes_to_drawn_surface()) { | 818 it->render_surface()->contributes_to_drawn_surface()) { |
819 RenderPass::Id contributing_render_pass_id = | 819 RenderPassId contributing_render_pass_id = |
820 it->render_surface()->RenderPassId(); | 820 it->render_surface()->GetRenderPassId(); |
821 RenderPass* contributing_render_pass = | 821 RenderPass* contributing_render_pass = |
822 frame->render_passes_by_id[contributing_render_pass_id]; | 822 frame->render_passes_by_id[contributing_render_pass_id]; |
823 AppendQuadsForRenderSurfaceLayer(target_render_pass, | 823 AppendQuadsForRenderSurfaceLayer(target_render_pass, |
824 *it, | 824 *it, |
825 contributing_render_pass, | 825 contributing_render_pass, |
826 occlusion_tracker, | 826 occlusion_tracker, |
827 &append_quads_data); | 827 &append_quads_data); |
828 } else if (it.represents_itself() && | 828 } else if (it.represents_itself() && |
829 !it->visible_content_rect().IsEmpty()) { | 829 !it->visible_content_rect().IsEmpty()) { |
830 bool occluded = occlusion_tracker.Occluded(it->render_target(), | 830 bool occluded = occlusion_tracker.Occluded(it->render_target(), |
831 it->visible_content_rect(), | 831 it->visible_content_rect(), |
832 it->draw_transform()); | 832 it->draw_transform()); |
833 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { | 833 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
834 DCHECK_EQ(active_tree_, it->layer_tree_impl()); | 834 DCHECK_EQ(active_tree_, it->layer_tree_impl()); |
835 | 835 |
836 frame->will_draw_layers.push_back(*it); | 836 frame->will_draw_layers.push_back(*it); |
837 | 837 |
838 if (it->HasContributingDelegatedRenderPasses()) { | 838 if (it->HasContributingDelegatedRenderPasses()) { |
839 RenderPass::Id contributing_render_pass_id = | 839 RenderPassId contributing_render_pass_id = |
840 it->FirstContributingRenderPassId(); | 840 it->FirstContributingRenderPassId(); |
841 while (frame->render_passes_by_id.find(contributing_render_pass_id) != | 841 while (frame->render_passes_by_id.find(contributing_render_pass_id) != |
842 frame->render_passes_by_id.end()) { | 842 frame->render_passes_by_id.end()) { |
843 RenderPass* render_pass = | 843 RenderPass* render_pass = |
844 frame->render_passes_by_id[contributing_render_pass_id]; | 844 frame->render_passes_by_id[contributing_render_pass_id]; |
845 | 845 |
846 AppendQuadsData append_quads_data(render_pass->id); | 846 AppendQuadsData append_quads_data(render_pass->id); |
847 AppendQuadsForLayer(render_pass, | 847 AppendQuadsForLayer(render_pass, |
848 *it, | 848 *it, |
849 occlusion_tracker, | 849 occlusion_tracker, |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 void LayerTreeHostImpl::DidAnimateScrollOffset() { | 978 void LayerTreeHostImpl::DidAnimateScrollOffset() { |
979 client_->SetNeedsCommitOnImplThread(); | 979 client_->SetNeedsCommitOnImplThread(); |
980 client_->RenewTreePriority(); | 980 client_->RenewTreePriority(); |
981 } | 981 } |
982 | 982 |
983 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) { | 983 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) { |
984 viewport_damage_rect_.Union(damage_rect); | 984 viewport_damage_rect_.Union(damage_rect); |
985 } | 985 } |
986 | 986 |
987 static inline RenderPass* FindRenderPassById( | 987 static inline RenderPass* FindRenderPassById( |
988 RenderPass::Id render_pass_id, | 988 RenderPassId render_pass_id, |
989 const LayerTreeHostImpl::FrameData& frame) { | 989 const LayerTreeHostImpl::FrameData& frame) { |
990 RenderPassIdHashMap::const_iterator it = | 990 RenderPassIdHashMap::const_iterator it = |
991 frame.render_passes_by_id.find(render_pass_id); | 991 frame.render_passes_by_id.find(render_pass_id); |
992 return it != frame.render_passes_by_id.end() ? it->second : NULL; | 992 return it != frame.render_passes_by_id.end() ? it->second : NULL; |
993 } | 993 } |
994 | 994 |
995 static void RemoveRenderPassesRecursive(RenderPass::Id remove_render_pass_id, | 995 static void RemoveRenderPassesRecursive(RenderPassId remove_render_pass_id, |
996 LayerTreeHostImpl::FrameData* frame) { | 996 LayerTreeHostImpl::FrameData* frame) { |
997 RenderPass* remove_render_pass = | 997 RenderPass* remove_render_pass = |
998 FindRenderPassById(remove_render_pass_id, *frame); | 998 FindRenderPassById(remove_render_pass_id, *frame); |
999 // The pass was already removed by another quad - probably the original, and | 999 // The pass was already removed by another quad - probably the original, and |
1000 // we are the replica. | 1000 // we are the replica. |
1001 if (!remove_render_pass) | 1001 if (!remove_render_pass) |
1002 return; | 1002 return; |
1003 RenderPassList& render_passes = frame->render_passes; | 1003 RenderPassList& render_passes = frame->render_passes; |
1004 RenderPassList::iterator to_remove = std::find(render_passes.begin(), | 1004 RenderPassList::iterator to_remove = std::find(render_passes.begin(), |
1005 render_passes.end(), | 1005 render_passes.end(), |
1006 remove_render_pass); | 1006 remove_render_pass); |
1007 | 1007 |
1008 DCHECK(to_remove != render_passes.end()); | 1008 DCHECK(to_remove != render_passes.end()); |
1009 | 1009 |
1010 scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); | 1010 scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); |
1011 frame->render_passes.erase(to_remove); | 1011 frame->render_passes.erase(to_remove); |
1012 frame->render_passes_by_id.erase(remove_render_pass_id); | 1012 frame->render_passes_by_id.erase(remove_render_pass_id); |
1013 | 1013 |
1014 // Now follow up for all RenderPass quads and remove their RenderPasses | 1014 // Now follow up for all RenderPass quads and remove their RenderPasses |
1015 // recursively. | 1015 // recursively. |
1016 const QuadList& quad_list = removed_pass->quad_list; | 1016 const QuadList& quad_list = removed_pass->quad_list; |
1017 QuadList::ConstBackToFrontIterator quad_list_iterator = | 1017 QuadList::ConstBackToFrontIterator quad_list_iterator = |
1018 quad_list.BackToFrontBegin(); | 1018 quad_list.BackToFrontBegin(); |
1019 for (; quad_list_iterator != quad_list.BackToFrontEnd(); | 1019 for (; quad_list_iterator != quad_list.BackToFrontEnd(); |
1020 ++quad_list_iterator) { | 1020 ++quad_list_iterator) { |
1021 DrawQuad* current_quad = (*quad_list_iterator); | 1021 DrawQuad* current_quad = (*quad_list_iterator); |
1022 if (current_quad->material != DrawQuad::RENDER_PASS) | 1022 if (current_quad->material != DrawQuad::RENDER_PASS) |
1023 continue; | 1023 continue; |
1024 | 1024 |
1025 RenderPass::Id next_remove_render_pass_id = | 1025 RenderPassId next_remove_render_pass_id = |
1026 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; | 1026 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; |
1027 RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); | 1027 RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); |
1028 } | 1028 } |
1029 } | 1029 } |
1030 | 1030 |
1031 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( | 1031 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( |
1032 const RenderPassDrawQuad& quad, const FrameData& frame) const { | 1032 const RenderPassDrawQuad& quad, const FrameData& frame) const { |
1033 const RenderPass* render_pass = | 1033 const RenderPass* render_pass = |
1034 FindRenderPassById(quad.render_pass_id, frame); | 1034 FindRenderPassById(quad.render_pass_id, frame); |
1035 if (!render_pass) | 1035 if (!render_pass) |
(...skipping 2376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3412 } | 3412 } |
3413 | 3413 |
3414 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3414 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3415 std::vector<PictureLayerImpl*>::iterator it = | 3415 std::vector<PictureLayerImpl*>::iterator it = |
3416 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3416 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3417 DCHECK(it != picture_layers_.end()); | 3417 DCHECK(it != picture_layers_.end()); |
3418 picture_layers_.erase(it); | 3418 picture_layers_.erase(it); |
3419 } | 3419 } |
3420 | 3420 |
3421 } // namespace cc | 3421 } // namespace cc |
OLD | NEW |