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 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
631 value->BeginDictionary(); | 631 value->BeginDictionary(); |
632 render_passes[i]->AsValueInto(value); | 632 render_passes[i]->AsValueInto(value); |
633 value->EndDictionary(); | 633 value->EndDictionary(); |
634 } | 634 } |
635 value->EndArray(); | 635 value->EndArray(); |
636 } | 636 } |
637 } | 637 } |
638 | 638 |
639 void LayerTreeHostImpl::FrameData::AppendRenderPass( | 639 void LayerTreeHostImpl::FrameData::AppendRenderPass( |
640 scoped_ptr<RenderPass> render_pass) { | 640 scoped_ptr<RenderPass> render_pass) { |
641 render_passes_by_id[render_pass->id] = render_pass.get(); | |
642 render_passes.push_back(render_pass.Pass()); | 641 render_passes.push_back(render_pass.Pass()); |
643 } | 642 } |
644 | 643 |
645 DrawMode LayerTreeHostImpl::GetDrawMode() const { | 644 DrawMode LayerTreeHostImpl::GetDrawMode() const { |
646 if (resourceless_software_draw_) { | 645 if (resourceless_software_draw_) { |
647 return DRAW_MODE_RESOURCELESS_SOFTWARE; | 646 return DRAW_MODE_RESOURCELESS_SOFTWARE; |
648 } else if (output_surface_->context_provider()) { | 647 } else if (output_surface_->context_provider()) { |
649 return DRAW_MODE_HARDWARE; | 648 return DRAW_MODE_HARDWARE; |
650 } else { | 649 } else { |
651 return DRAW_MODE_SOFTWARE; | 650 return DRAW_MODE_SOFTWARE; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
731 SolidColorDrawQuad* quad = | 730 SolidColorDrawQuad* quad = |
732 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 731 target_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
733 quad->SetNew(shared_quad_state, | 732 quad->SetNew(shared_quad_state, |
734 screen_space_rect, | 733 screen_space_rect, |
735 visible_screen_space_rect, | 734 visible_screen_space_rect, |
736 screen_background_color, | 735 screen_background_color, |
737 false); | 736 false); |
738 } | 737 } |
739 } | 738 } |
740 | 739 |
740 static RenderPass* FindRenderPassById(const RenderPassList& list, | |
741 RenderPassId id) { | |
742 auto it = std::find_if(list.begin(), list.end(), | |
743 [id](const RenderPass* p) { return p->id == id; }); | |
744 return it == list.end() ? nullptr : *it; | |
745 } | |
746 | |
741 DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 747 DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
742 FrameData* frame) { | 748 FrameData* frame) { |
743 DCHECK(frame->render_passes.empty()); | 749 DCHECK(frame->render_passes.empty()); |
744 DCHECK(CanDraw()); | 750 DCHECK(CanDraw()); |
745 DCHECK(active_tree_->root_layer()); | 751 DCHECK(active_tree_->root_layer()); |
746 | 752 |
747 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 753 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
748 *frame->render_surface_layer_list); | 754 *frame->render_surface_layer_list); |
749 | 755 |
750 // If the root render surface has no visible damage, then don't generate a | 756 // If the root render surface has no visible damage, then don't generate a |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
840 bool have_copy_request = false; | 846 bool have_copy_request = false; |
841 bool have_missing_animated_tiles = false; | 847 bool have_missing_animated_tiles = false; |
842 | 848 |
843 LayerIterator end = LayerIterator::End(frame->render_surface_layer_list); | 849 LayerIterator end = LayerIterator::End(frame->render_surface_layer_list); |
844 for (LayerIterator it = | 850 for (LayerIterator it = |
845 LayerIterator::Begin(frame->render_surface_layer_list); | 851 LayerIterator::Begin(frame->render_surface_layer_list); |
846 it != end; ++it) { | 852 it != end; ++it) { |
847 RenderPassId target_render_pass_id = | 853 RenderPassId target_render_pass_id = |
848 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); | 854 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
849 RenderPass* target_render_pass = | 855 RenderPass* target_render_pass = |
850 frame->render_passes_by_id[target_render_pass_id]; | 856 FindRenderPassById(frame->render_passes, target_render_pass_id); |
851 | 857 |
852 AppendQuadsData append_quads_data; | 858 AppendQuadsData append_quads_data; |
853 | 859 |
854 if (it.represents_target_render_surface()) { | 860 if (it.represents_target_render_surface()) { |
855 if (it->HasCopyRequest()) { | 861 if (it->HasCopyRequest()) { |
856 have_copy_request = true; | 862 have_copy_request = true; |
857 it->TakeCopyRequestsAndTransformToTarget( | 863 it->TakeCopyRequestsAndTransformToTarget( |
858 &target_render_pass->copy_requests); | 864 &target_render_pass->copy_requests); |
859 } | 865 } |
860 } else if (it.represents_contributing_render_surface() && | 866 } else if (it.represents_contributing_render_surface() && |
861 it->render_surface()->contributes_to_drawn_surface()) { | 867 it->render_surface()->contributes_to_drawn_surface()) { |
862 RenderPassId contributing_render_pass_id = | 868 RenderPassId contributing_render_pass_id = |
863 it->render_surface()->GetRenderPassId(); | 869 it->render_surface()->GetRenderPassId(); |
864 RenderPass* contributing_render_pass = | 870 RenderPass* contributing_render_pass = |
865 frame->render_passes_by_id[contributing_render_pass_id]; | 871 FindRenderPassById(frame->render_passes, contributing_render_pass_id); |
866 AppendQuadsForRenderSurfaceLayer(target_render_pass, | 872 AppendQuadsForRenderSurfaceLayer(target_render_pass, |
867 *it, | 873 *it, |
868 contributing_render_pass, | 874 contributing_render_pass, |
869 &append_quads_data); | 875 &append_quads_data); |
870 } else if (it.represents_itself() && !it->visible_layer_rect().IsEmpty()) { | 876 } else if (it.represents_itself() && !it->visible_layer_rect().IsEmpty()) { |
871 bool occluded = | 877 bool occluded = |
872 it->draw_properties().occlusion_in_content_space.IsOccluded( | 878 it->draw_properties().occlusion_in_content_space.IsOccluded( |
873 it->visible_layer_rect()); | 879 it->visible_layer_rect()); |
874 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { | 880 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
875 DCHECK_EQ(active_tree_, it->layer_tree_impl()); | 881 DCHECK_EQ(active_tree_, it->layer_tree_impl()); |
876 | 882 |
877 frame->will_draw_layers.push_back(*it); | 883 frame->will_draw_layers.push_back(*it); |
878 | 884 |
879 if (it->HasContributingDelegatedRenderPasses()) { | 885 if (it->HasContributingDelegatedRenderPasses()) { |
880 RenderPassId contributing_render_pass_id = | 886 RenderPassId contributing_render_pass_id = |
881 it->FirstContributingRenderPassId(); | 887 it->FirstContributingRenderPassId(); |
882 while (frame->render_passes_by_id.find(contributing_render_pass_id) != | 888 RenderPass* pass; |
883 frame->render_passes_by_id.end()) { | 889 while ((pass = FindRenderPassById(frame->render_passes, |
danakj
2015/10/29 22:33:33
Windows doesn't like doing assignment inside a whi
vmpstr
2015/10/29 22:36:33
Or
for (auto* pass = FindRenderPassById(frame->r
| |
884 RenderPass* render_pass = | 890 contributing_render_pass_id))) { |
885 frame->render_passes_by_id[contributing_render_pass_id]; | 891 it->AppendQuads(pass, &append_quads_data); |
886 | |
887 it->AppendQuads(render_pass, &append_quads_data); | |
888 | |
889 contributing_render_pass_id = | 892 contributing_render_pass_id = |
890 it->NextContributingRenderPassId(contributing_render_pass_id); | 893 it->NextContributingRenderPassId(contributing_render_pass_id); |
891 } | 894 } |
892 } | 895 } |
893 | 896 |
894 it->AppendQuads(target_render_pass, &append_quads_data); | 897 it->AppendQuads(target_render_pass, &append_quads_data); |
895 | 898 |
896 // For layers that represent themselves, add composite frame timing | 899 // For layers that represent themselves, add composite frame timing |
897 // requests if the visible rect intersects the requested rect. | 900 // requests if the visible rect intersects the requested rect. |
898 for (const auto& request : it->frame_timing_requests()) { | 901 for (const auto& request : it->frame_timing_requests()) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 // surface the compositor draws to, so even though the frame may not be | 952 // surface the compositor draws to, so even though the frame may not be |
950 // complete, the previous frame has already been potentially lost, so an | 953 // complete, the previous frame has already been potentially lost, so an |
951 // incomplete frame is better than nothing, so this takes highest precidence. | 954 // incomplete frame is better than nothing, so this takes highest precidence. |
952 if (resourceless_software_draw_) | 955 if (resourceless_software_draw_) |
953 draw_result = DRAW_SUCCESS; | 956 draw_result = DRAW_SUCCESS; |
954 | 957 |
955 #if DCHECK_IS_ON() | 958 #if DCHECK_IS_ON() |
956 for (const auto& render_pass : frame->render_passes) { | 959 for (const auto& render_pass : frame->render_passes) { |
957 for (const auto& quad : render_pass->quad_list) | 960 for (const auto& quad : render_pass->quad_list) |
958 DCHECK(quad->shared_quad_state); | 961 DCHECK(quad->shared_quad_state); |
959 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | |
960 frame->render_passes_by_id.end()); | |
961 } | 962 } |
963 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | |
962 #endif | 964 #endif |
963 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | |
964 | 965 |
965 if (!active_tree_->has_transparent_background()) { | 966 if (!active_tree_->has_transparent_background()) { |
966 frame->render_passes.back()->has_transparent_background = false; | 967 frame->render_passes.back()->has_transparent_background = false; |
967 AppendQuadsToFillScreen( | 968 AppendQuadsToFillScreen( |
968 active_tree_->RootScrollLayerDeviceViewportBounds(), | 969 active_tree_->RootScrollLayerDeviceViewportBounds(), |
969 frame->render_passes.back(), active_tree_->root_layer(), | 970 frame->render_passes.back(), active_tree_->root_layer(), |
970 active_tree_->background_color(), unoccluded_screen_space_region); | 971 active_tree_->background_color(), unoccluded_screen_space_region); |
971 } | 972 } |
972 | 973 |
973 RemoveRenderPasses(frame); | 974 RemoveRenderPasses(frame); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1069 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); | 1070 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); |
1070 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1071 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1071 | 1072 |
1072 // This will cause NotifyTileStateChanged() to be called for any tiles that | 1073 // This will cause NotifyTileStateChanged() to be called for any tiles that |
1073 // completed, which will add damage for visible tiles to the frame for them so | 1074 // completed, which will add damage for visible tiles to the frame for them so |
1074 // they appear as part of the current frame being drawn. | 1075 // they appear as part of the current frame being drawn. |
1075 tile_manager_->Flush(); | 1076 tile_manager_->Flush(); |
1076 | 1077 |
1077 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1078 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1078 frame->render_passes.clear(); | 1079 frame->render_passes.clear(); |
1079 frame->render_passes_by_id.clear(); | |
1080 frame->will_draw_layers.clear(); | 1080 frame->will_draw_layers.clear(); |
1081 frame->has_no_damage = false; | 1081 frame->has_no_damage = false; |
1082 | 1082 |
1083 if (active_tree_->root_layer()) { | 1083 if (active_tree_->root_layer()) { |
1084 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1084 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1085 viewport_damage_rect_ = gfx::Rect(); | 1085 viewport_damage_rect_ = gfx::Rect(); |
1086 | 1086 |
1087 active_tree_->root_layer()->render_surface()->damage_tracker()-> | 1087 active_tree_->root_layer()->render_surface()->damage_tracker()-> |
1088 AddDamageNextUpdate(device_viewport_damage_rect); | 1088 AddDamageNextUpdate(device_viewport_damage_rect); |
1089 } | 1089 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1133 } | 1133 } |
1134 | 1134 |
1135 if (i == frame->render_passes.size() - 1) { | 1135 if (i == frame->render_passes.size() - 1) { |
1136 // Don't remove the root RenderPass. | 1136 // Don't remove the root RenderPass. |
1137 break; | 1137 break; |
1138 } | 1138 } |
1139 | 1139 |
1140 if (pass->quad_list.empty() && pass->copy_requests.empty()) { | 1140 if (pass->quad_list.empty() && pass->copy_requests.empty()) { |
1141 // Remove the pass and decrement |i| to counter the for loop's increment, | 1141 // Remove the pass and decrement |i| to counter the for loop's increment, |
1142 // so we don't skip the next pass in the loop. | 1142 // so we don't skip the next pass in the loop. |
1143 frame->render_passes_by_id.erase(pass->id); | |
1144 frame->render_passes.erase(frame->render_passes.begin() + i); | 1143 frame->render_passes.erase(frame->render_passes.begin() + i); |
1145 --i; | 1144 --i; |
1146 continue; | 1145 continue; |
1147 } | 1146 } |
1148 | 1147 |
1149 pass_exists.insert(pass->id); | 1148 pass_exists.insert(pass->id); |
1150 } | 1149 } |
1151 | 1150 |
1152 // Remove RenderPasses that are not referenced by any draw quads or copy | 1151 // Remove RenderPasses that are not referenced by any draw quads or copy |
1153 // requests (except the root RenderPass). | 1152 // requests (except the root RenderPass). |
1154 for (size_t i = 0; i < frame->render_passes.size() - 1; ++i) { | 1153 for (size_t i = 0; i < frame->render_passes.size() - 1; ++i) { |
1155 // Iterating from the back of the list to the front, skipping over the | 1154 // Iterating from the back of the list to the front, skipping over the |
1156 // back-most (root) pass, in order to remove each qualified RenderPass, and | 1155 // back-most (root) pass, in order to remove each qualified RenderPass, and |
1157 // drop references to earlier RenderPasses allowing them to be removed to. | 1156 // drop references to earlier RenderPasses allowing them to be removed to. |
1158 RenderPass* pass = | 1157 RenderPass* pass = |
1159 frame->render_passes[frame->render_passes.size() - 2 - i]; | 1158 frame->render_passes[frame->render_passes.size() - 2 - i]; |
1160 if (!pass->copy_requests.empty()) | 1159 if (!pass->copy_requests.empty()) |
1161 continue; | 1160 continue; |
1162 if (pass_references[pass->id]) | 1161 if (pass_references[pass->id]) |
1163 continue; | 1162 continue; |
1164 | 1163 |
1165 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) { | 1164 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) { |
1166 if (it->material != DrawQuad::RENDER_PASS) | 1165 if (it->material != DrawQuad::RENDER_PASS) |
1167 continue; | 1166 continue; |
1168 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); | 1167 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); |
1169 pass_references[quad->render_pass_id]--; | 1168 pass_references[quad->render_pass_id]--; |
1170 } | 1169 } |
1171 | 1170 |
1172 frame->render_passes_by_id.erase(pass->id); | |
1173 frame->render_passes.erase(frame->render_passes.end() - 2 - i); | 1171 frame->render_passes.erase(frame->render_passes.end() - 2 - i); |
1174 --i; | 1172 --i; |
1175 } | 1173 } |
1176 } | 1174 } |
1177 | 1175 |
1178 void LayerTreeHostImpl::EvictTexturesForTesting() { | 1176 void LayerTreeHostImpl::EvictTexturesForTesting() { |
1179 UpdateTileManagerMemoryPolicy(ManagedMemoryPolicy(0)); | 1177 UpdateTileManagerMemoryPolicy(ManagedMemoryPolicy(0)); |
1180 } | 1178 } |
1181 | 1179 |
1182 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { | 1180 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1623 temp_software_renderer->DrawFrame( | 1621 temp_software_renderer->DrawFrame( |
1624 &frame->render_passes, active_tree_->device_scale_factor(), | 1622 &frame->render_passes, active_tree_->device_scale_factor(), |
1625 DeviceViewport(), DeviceClip(), disable_picture_quad_image_filtering); | 1623 DeviceViewport(), DeviceClip(), disable_picture_quad_image_filtering); |
1626 } else { | 1624 } else { |
1627 renderer_->DrawFrame(&frame->render_passes, | 1625 renderer_->DrawFrame(&frame->render_passes, |
1628 active_tree_->device_scale_factor(), DeviceViewport(), | 1626 active_tree_->device_scale_factor(), DeviceViewport(), |
1629 DeviceClip(), false); | 1627 DeviceClip(), false); |
1630 } | 1628 } |
1631 // The render passes should be consumed by the renderer. | 1629 // The render passes should be consumed by the renderer. |
1632 DCHECK(frame->render_passes.empty()); | 1630 DCHECK(frame->render_passes.empty()); |
1633 frame->render_passes_by_id.clear(); | |
1634 | 1631 |
1635 // The next frame should start by assuming nothing has changed, and changes | 1632 // The next frame should start by assuming nothing has changed, and changes |
1636 // are noted as they occur. | 1633 // are noted as they occur. |
1637 // TODO(boliu): If we did a temporary software renderer frame, propogate the | 1634 // TODO(boliu): If we did a temporary software renderer frame, propogate the |
1638 // damage forward to the next frame. | 1635 // damage forward to the next frame. |
1639 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { | 1636 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { |
1640 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> | 1637 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> |
1641 DidDrawDamagedArea(); | 1638 DidDrawDamagedArea(); |
1642 } | 1639 } |
1643 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); | 1640 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); |
(...skipping 2013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3657 return task_runner_provider_->HasImplThread(); | 3654 return task_runner_provider_->HasImplThread(); |
3658 } | 3655 } |
3659 | 3656 |
3660 bool LayerTreeHostImpl::CommitToActiveTree() const { | 3657 bool LayerTreeHostImpl::CommitToActiveTree() const { |
3661 // In single threaded mode we skip the pending tree and commit directly to the | 3658 // In single threaded mode we skip the pending tree and commit directly to the |
3662 // active tree. | 3659 // active tree. |
3663 return !task_runner_provider_->HasImplThread(); | 3660 return !task_runner_provider_->HasImplThread(); |
3664 } | 3661 } |
3665 | 3662 |
3666 } // namespace cc | 3663 } // namespace cc |
OLD | NEW |