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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 1413053004: cc: Remove LayerTreeHostImpl::FrameData::render_passes_by_id. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698