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

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: renderpasshashmap: windows 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 while (true) {
883 frame->render_passes_by_id.end()) { 889 RenderPass* pass = FindRenderPassById(frame->render_passes,
884 RenderPass* render_pass = 890 contributing_render_pass_id);
885 frame->render_passes_by_id[contributing_render_pass_id]; 891 if (!pass)
886 892 break;
887 it->AppendQuads(render_pass, &append_quads_data); 893 it->AppendQuads(pass, &append_quads_data);
888
889 contributing_render_pass_id = 894 contributing_render_pass_id =
890 it->NextContributingRenderPassId(contributing_render_pass_id); 895 it->NextContributingRenderPassId(contributing_render_pass_id);
891 } 896 }
892 } 897 }
893 898
894 it->AppendQuads(target_render_pass, &append_quads_data); 899 it->AppendQuads(target_render_pass, &append_quads_data);
895 900
896 // For layers that represent themselves, add composite frame timing 901 // For layers that represent themselves, add composite frame timing
897 // requests if the visible rect intersects the requested rect. 902 // requests if the visible rect intersects the requested rect.
898 for (const auto& request : it->frame_timing_requests()) { 903 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 954 // 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 955 // complete, the previous frame has already been potentially lost, so an
951 // incomplete frame is better than nothing, so this takes highest precidence. 956 // incomplete frame is better than nothing, so this takes highest precidence.
952 if (resourceless_software_draw_) 957 if (resourceless_software_draw_)
953 draw_result = DRAW_SUCCESS; 958 draw_result = DRAW_SUCCESS;
954 959
955 #if DCHECK_IS_ON() 960 #if DCHECK_IS_ON()
956 for (const auto& render_pass : frame->render_passes) { 961 for (const auto& render_pass : frame->render_passes) {
957 for (const auto& quad : render_pass->quad_list) 962 for (const auto& quad : render_pass->quad_list)
958 DCHECK(quad->shared_quad_state); 963 DCHECK(quad->shared_quad_state);
959 DCHECK(frame->render_passes_by_id.find(render_pass->id) !=
960 frame->render_passes_by_id.end());
961 } 964 }
965 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
962 #endif 966 #endif
963 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin());
964 967
965 if (!active_tree_->has_transparent_background()) { 968 if (!active_tree_->has_transparent_background()) {
966 frame->render_passes.back()->has_transparent_background = false; 969 frame->render_passes.back()->has_transparent_background = false;
967 AppendQuadsToFillScreen( 970 AppendQuadsToFillScreen(
968 active_tree_->RootScrollLayerDeviceViewportBounds(), 971 active_tree_->RootScrollLayerDeviceViewportBounds(),
969 frame->render_passes.back(), active_tree_->root_layer(), 972 frame->render_passes.back(), active_tree_->root_layer(),
970 active_tree_->background_color(), unoccluded_screen_space_region); 973 active_tree_->background_color(), unoccluded_screen_space_region);
971 } 974 }
972 975
973 RemoveRenderPasses(frame); 976 RemoveRenderPasses(frame);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); 1072 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text);
1070 DCHECK(ok) << "UpdateDrawProperties failed during draw"; 1073 DCHECK(ok) << "UpdateDrawProperties failed during draw";
1071 1074
1072 // This will cause NotifyTileStateChanged() to be called for any tiles that 1075 // 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 1076 // 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. 1077 // they appear as part of the current frame being drawn.
1075 tile_manager_->Flush(); 1078 tile_manager_->Flush();
1076 1079
1077 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1080 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1078 frame->render_passes.clear(); 1081 frame->render_passes.clear();
1079 frame->render_passes_by_id.clear();
1080 frame->will_draw_layers.clear(); 1082 frame->will_draw_layers.clear();
1081 frame->has_no_damage = false; 1083 frame->has_no_damage = false;
1082 1084
1083 if (active_tree_->root_layer()) { 1085 if (active_tree_->root_layer()) {
1084 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; 1086 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1085 viewport_damage_rect_ = gfx::Rect(); 1087 viewport_damage_rect_ = gfx::Rect();
1086 1088
1087 active_tree_->root_layer()->render_surface()->damage_tracker()-> 1089 active_tree_->root_layer()->render_surface()->damage_tracker()->
1088 AddDamageNextUpdate(device_viewport_damage_rect); 1090 AddDamageNextUpdate(device_viewport_damage_rect);
1089 } 1091 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 } 1135 }
1134 1136
1135 if (i == frame->render_passes.size() - 1) { 1137 if (i == frame->render_passes.size() - 1) {
1136 // Don't remove the root RenderPass. 1138 // Don't remove the root RenderPass.
1137 break; 1139 break;
1138 } 1140 }
1139 1141
1140 if (pass->quad_list.empty() && pass->copy_requests.empty()) { 1142 if (pass->quad_list.empty() && pass->copy_requests.empty()) {
1141 // Remove the pass and decrement |i| to counter the for loop's increment, 1143 // 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. 1144 // 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); 1145 frame->render_passes.erase(frame->render_passes.begin() + i);
1145 --i; 1146 --i;
1146 continue; 1147 continue;
1147 } 1148 }
1148 1149
1149 pass_exists.insert(pass->id); 1150 pass_exists.insert(pass->id);
1150 } 1151 }
1151 1152
1152 // Remove RenderPasses that are not referenced by any draw quads or copy 1153 // Remove RenderPasses that are not referenced by any draw quads or copy
1153 // requests (except the root RenderPass). 1154 // requests (except the root RenderPass).
1154 for (size_t i = 0; i < frame->render_passes.size() - 1; ++i) { 1155 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 1156 // 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 1157 // back-most (root) pass, in order to remove each qualified RenderPass, and
1157 // drop references to earlier RenderPasses allowing them to be removed to. 1158 // drop references to earlier RenderPasses allowing them to be removed to.
1158 RenderPass* pass = 1159 RenderPass* pass =
1159 frame->render_passes[frame->render_passes.size() - 2 - i]; 1160 frame->render_passes[frame->render_passes.size() - 2 - i];
1160 if (!pass->copy_requests.empty()) 1161 if (!pass->copy_requests.empty())
1161 continue; 1162 continue;
1162 if (pass_references[pass->id]) 1163 if (pass_references[pass->id])
1163 continue; 1164 continue;
1164 1165
1165 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) { 1166 for (auto it = pass->quad_list.begin(); it != pass->quad_list.end(); ++it) {
1166 if (it->material != DrawQuad::RENDER_PASS) 1167 if (it->material != DrawQuad::RENDER_PASS)
1167 continue; 1168 continue;
1168 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it); 1169 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(*it);
1169 pass_references[quad->render_pass_id]--; 1170 pass_references[quad->render_pass_id]--;
1170 } 1171 }
1171 1172
1172 frame->render_passes_by_id.erase(pass->id);
1173 frame->render_passes.erase(frame->render_passes.end() - 2 - i); 1173 frame->render_passes.erase(frame->render_passes.end() - 2 - i);
1174 --i; 1174 --i;
1175 } 1175 }
1176 } 1176 }
1177 1177
1178 void LayerTreeHostImpl::EvictTexturesForTesting() { 1178 void LayerTreeHostImpl::EvictTexturesForTesting() {
1179 UpdateTileManagerMemoryPolicy(ManagedMemoryPolicy(0)); 1179 UpdateTileManagerMemoryPolicy(ManagedMemoryPolicy(0));
1180 } 1180 }
1181 1181
1182 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { 1182 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 temp_software_renderer->DrawFrame( 1623 temp_software_renderer->DrawFrame(
1624 &frame->render_passes, active_tree_->device_scale_factor(), 1624 &frame->render_passes, active_tree_->device_scale_factor(),
1625 DeviceViewport(), DeviceClip(), disable_picture_quad_image_filtering); 1625 DeviceViewport(), DeviceClip(), disable_picture_quad_image_filtering);
1626 } else { 1626 } else {
1627 renderer_->DrawFrame(&frame->render_passes, 1627 renderer_->DrawFrame(&frame->render_passes,
1628 active_tree_->device_scale_factor(), DeviceViewport(), 1628 active_tree_->device_scale_factor(), DeviceViewport(),
1629 DeviceClip(), false); 1629 DeviceClip(), false);
1630 } 1630 }
1631 // The render passes should be consumed by the renderer. 1631 // The render passes should be consumed by the renderer.
1632 DCHECK(frame->render_passes.empty()); 1632 DCHECK(frame->render_passes.empty());
1633 frame->render_passes_by_id.clear();
1634 1633
1635 // The next frame should start by assuming nothing has changed, and changes 1634 // The next frame should start by assuming nothing has changed, and changes
1636 // are noted as they occur. 1635 // are noted as they occur.
1637 // TODO(boliu): If we did a temporary software renderer frame, propogate the 1636 // TODO(boliu): If we did a temporary software renderer frame, propogate the
1638 // damage forward to the next frame. 1637 // damage forward to the next frame.
1639 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { 1638 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) {
1640 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> 1639 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()->
1641 DidDrawDamagedArea(); 1640 DidDrawDamagedArea();
1642 } 1641 }
1643 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); 1642 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree();
(...skipping 2013 matching lines...) Expand 10 before | Expand all | Expand 10 after
3657 return task_runner_provider_->HasImplThread(); 3656 return task_runner_provider_->HasImplThread();
3658 } 3657 }
3659 3658
3660 bool LayerTreeHostImpl::CommitToActiveTree() const { 3659 bool LayerTreeHostImpl::CommitToActiveTree() const {
3661 // In single threaded mode we skip the pending tree and commit directly to the 3660 // In single threaded mode we skip the pending tree and commit directly to the
3662 // active tree. 3661 // active tree.
3663 return !task_runner_provider_->HasImplThread(); 3662 return !task_runner_provider_->HasImplThread();
3664 } 3663 }
3665 3664
3666 } // namespace cc 3665 } // 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