| 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_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <iterator> | 11 #include <iterator> |
| 12 #include <limits> | 12 #include <limits> |
| 13 #include <set> | 13 #include <set> |
| 14 | 14 |
| 15 #include "base/containers/adapters.h" | 15 #include "base/containers/adapters.h" |
| 16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/timer/elapsed_timer.h" | 17 #include "base/timer/elapsed_timer.h" |
| 18 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
| 19 #include "base/trace_event/trace_event_argument.h" | 19 #include "base/trace_event/trace_event_argument.h" |
| 20 #include "cc/base/devtools_instrumentation.h" | 20 #include "cc/base/devtools_instrumentation.h" |
| 21 #include "cc/base/histograms.h" | 21 #include "cc/base/histograms.h" |
| 22 #include "cc/base/math_util.h" | 22 #include "cc/base/math_util.h" |
| 23 #include "cc/base/synced_property.h" | 23 #include "cc/base/synced_property.h" |
| 24 #include "cc/debug/traced_value.h" | 24 #include "cc/debug/traced_value.h" |
| 25 #include "cc/input/page_scale_animation.h" | 25 #include "cc/input/page_scale_animation.h" |
| 26 #include "cc/input/scrollbar_animation_controller.h" | 26 #include "cc/input/scrollbar_animation_controller.h" |
| 27 #include "cc/layers/effect_tree_layer_list_iterator.h" |
| 27 #include "cc/layers/heads_up_display_layer_impl.h" | 28 #include "cc/layers/heads_up_display_layer_impl.h" |
| 28 #include "cc/layers/layer.h" | 29 #include "cc/layers/layer.h" |
| 29 #include "cc/layers/layer_iterator.h" | |
| 30 #include "cc/layers/layer_list_iterator.h" | 30 #include "cc/layers/layer_list_iterator.h" |
| 31 #include "cc/layers/render_surface_impl.h" | 31 #include "cc/layers/render_surface_impl.h" |
| 32 #include "cc/layers/scrollbar_layer_impl_base.h" | 32 #include "cc/layers/scrollbar_layer_impl_base.h" |
| 33 #include "cc/output/compositor_frame_sink.h" | 33 #include "cc/output/compositor_frame_sink.h" |
| 34 #include "cc/resources/ui_resource_request.h" | 34 #include "cc/resources/ui_resource_request.h" |
| 35 #include "cc/trees/clip_node.h" | 35 #include "cc/trees/clip_node.h" |
| 36 #include "cc/trees/draw_property_utils.h" | 36 #include "cc/trees/draw_property_utils.h" |
| 37 #include "cc/trees/effect_node.h" | 37 #include "cc/trees/effect_node.h" |
| 38 #include "cc/trees/layer_tree_host_common.h" | 38 #include "cc/trees/layer_tree_host_common.h" |
| 39 #include "cc/trees/layer_tree_host_impl.h" | 39 #include "cc/trees/layer_tree_host_impl.h" |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 | 1120 |
| 1121 { | 1121 { |
| 1122 TRACE_EVENT2("cc", "LayerTreeImpl::UpdateDrawProperties::Occlusion", | 1122 TRACE_EVENT2("cc", "LayerTreeImpl::UpdateDrawProperties::Occlusion", |
| 1123 "IsActive", IsActiveTree(), "SourceFrameNumber", | 1123 "IsActive", IsActiveTree(), "SourceFrameNumber", |
| 1124 source_frame_number_); | 1124 source_frame_number_); |
| 1125 OcclusionTracker occlusion_tracker( | 1125 OcclusionTracker occlusion_tracker( |
| 1126 layer_list_[0]->GetRenderSurface()->content_rect()); | 1126 layer_list_[0]->GetRenderSurface()->content_rect()); |
| 1127 occlusion_tracker.set_minimum_tracking_size( | 1127 occlusion_tracker.set_minimum_tracking_size( |
| 1128 settings().minimum_occlusion_tracking_size); | 1128 settings().minimum_occlusion_tracking_size); |
| 1129 | 1129 |
| 1130 // LayerIterator is used here instead of CallFunctionForEveryLayer to only | 1130 for (EffectTreeLayerListIterator it(this); |
| 1131 // UpdateTilePriorities on layers that will be visible (and thus have valid | 1131 it.state() != EffectTreeLayerListIterator::State::END; ++it) { |
| 1132 // draw properties) and not because any ordering is required. | |
| 1133 LayerIterator end = LayerIterator::End(&render_surface_layer_list_); | |
| 1134 for (LayerIterator it = LayerIterator::Begin(&render_surface_layer_list_); | |
| 1135 it != end; ++it) { | |
| 1136 occlusion_tracker.EnterLayer(it); | 1132 occlusion_tracker.EnterLayer(it); |
| 1137 | 1133 |
| 1138 if (it.represents_itself()) { | 1134 if (it.state() == EffectTreeLayerListIterator::State::LAYER) { |
| 1139 it->draw_properties().occlusion_in_content_space = | 1135 LayerImpl* layer = it.current_layer(); |
| 1140 occlusion_tracker.GetCurrentOcclusionForLayer(it->DrawTransform()); | 1136 layer->draw_properties().occlusion_in_content_space = |
| 1137 occlusion_tracker.GetCurrentOcclusionForLayer( |
| 1138 layer->DrawTransform()); |
| 1141 } | 1139 } |
| 1142 | 1140 |
| 1143 if (it.represents_contributing_render_surface()) { | 1141 if (it.state() == |
| 1142 EffectTreeLayerListIterator::State::CONTRIBUTING_SURFACE) { |
| 1144 const RenderSurfaceImpl* occlusion_surface = | 1143 const RenderSurfaceImpl* occlusion_surface = |
| 1145 occlusion_tracker.OcclusionSurfaceForContributingSurface(); | 1144 occlusion_tracker.OcclusionSurfaceForContributingSurface(); |
| 1146 gfx::Transform draw_transform; | 1145 gfx::Transform draw_transform; |
| 1147 RenderSurfaceImpl* render_surface = it->GetRenderSurface(); | 1146 RenderSurfaceImpl* render_surface = it.current_render_surface(); |
| 1148 if (occlusion_surface) { | 1147 if (occlusion_surface) { |
| 1149 // We are calculating transform between two render surfaces. So, we | 1148 // We are calculating transform between two render surfaces. So, we |
| 1150 // need to apply the surface contents scale at target and remove the | 1149 // need to apply the surface contents scale at target and remove the |
| 1151 // surface contents scale at source. | 1150 // surface contents scale at source. |
| 1152 property_trees()->GetToTarget(render_surface->TransformTreeIndex(), | 1151 property_trees()->GetToTarget(render_surface->TransformTreeIndex(), |
| 1153 occlusion_surface->EffectTreeIndex(), | 1152 occlusion_surface->EffectTreeIndex(), |
| 1154 &draw_transform); | 1153 &draw_transform); |
| 1155 const EffectNode* effect_node = property_trees()->effect_tree.Node( | 1154 const EffectNode* effect_node = property_trees()->effect_tree.Node( |
| 1156 render_surface->EffectTreeIndex()); | 1155 render_surface->EffectTreeIndex()); |
| 1157 draw_property_utils::ConcatInverseSurfaceContentsScale( | 1156 draw_property_utils::ConcatInverseSurfaceContentsScale( |
| 1158 effect_node, &draw_transform); | 1157 effect_node, &draw_transform); |
| 1159 } | 1158 } |
| 1160 | 1159 |
| 1161 Occlusion occlusion = | 1160 Occlusion occlusion = |
| 1162 occlusion_tracker.GetCurrentOcclusionForContributingSurface( | 1161 occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
| 1163 draw_transform); | 1162 draw_transform); |
| 1164 render_surface->set_occlusion_in_content_space(occlusion); | 1163 render_surface->set_occlusion_in_content_space(occlusion); |
| 1165 // Masks are used to draw the contributing surface, so should have | 1164 // Masks are used to draw the contributing surface, so should have |
| 1166 // the same occlusion as the surface (nothing inside the surface | 1165 // the same occlusion as the surface (nothing inside the surface |
| 1167 // occludes them). | 1166 // occludes them). |
| 1168 if (LayerImpl* mask = render_surface->MaskLayer()) { | 1167 if (LayerImpl* mask = render_surface->MaskLayer()) { |
| 1169 mask->draw_properties().occlusion_in_content_space = | 1168 mask->draw_properties().occlusion_in_content_space = |
| 1170 occlusion_tracker.GetCurrentOcclusionForContributingSurface( | 1169 occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
| 1171 draw_transform * it->DrawTransform()); | 1170 draw_transform * render_surface->SurfaceScale()); |
| 1172 } | 1171 } |
| 1173 } | 1172 } |
| 1174 | 1173 |
| 1175 occlusion_tracker.LeaveLayer(it); | 1174 occlusion_tracker.LeaveLayer(it); |
| 1176 } | 1175 } |
| 1177 | 1176 |
| 1178 unoccluded_screen_space_region_ = | 1177 unoccluded_screen_space_region_ = |
| 1179 occlusion_tracker.ComputeVisibleRegionInScreen(this); | 1178 occlusion_tracker.ComputeVisibleRegionInScreen(this); |
| 1180 } | 1179 } |
| 1181 | 1180 |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 bool LayerTreeImpl::create_low_res_tiling() const { | 1520 bool LayerTreeImpl::create_low_res_tiling() const { |
| 1522 return layer_tree_host_impl_->create_low_res_tiling(); | 1521 return layer_tree_host_impl_->create_low_res_tiling(); |
| 1523 } | 1522 } |
| 1524 | 1523 |
| 1525 void LayerTreeImpl::SetNeedsRedraw() { | 1524 void LayerTreeImpl::SetNeedsRedraw() { |
| 1526 layer_tree_host_impl_->SetNeedsRedraw(); | 1525 layer_tree_host_impl_->SetNeedsRedraw(); |
| 1527 } | 1526 } |
| 1528 | 1527 |
| 1529 void LayerTreeImpl::GetAllPrioritizedTilesForTracing( | 1528 void LayerTreeImpl::GetAllPrioritizedTilesForTracing( |
| 1530 std::vector<PrioritizedTile>* prioritized_tiles) const { | 1529 std::vector<PrioritizedTile>* prioritized_tiles) const { |
| 1531 LayerIterator end = LayerIterator::End(&render_surface_layer_list_); | 1530 for (auto it = layer_list_.rbegin(); it != layer_list_.rend(); ++it) { |
| 1532 for (LayerIterator it = LayerIterator::Begin(&render_surface_layer_list_); | 1531 LayerImpl* layer_impl = *it; |
| 1533 it != end; ++it) { | 1532 if (!layer_impl->is_drawn_render_surface_layer_list_member()) |
| 1534 if (!it.represents_itself()) | |
| 1535 continue; | 1533 continue; |
| 1536 LayerImpl* layer_impl = *it; | |
| 1537 layer_impl->GetAllPrioritizedTilesForTracing(prioritized_tiles); | 1534 layer_impl->GetAllPrioritizedTilesForTracing(prioritized_tiles); |
| 1538 } | 1535 } |
| 1539 } | 1536 } |
| 1540 | 1537 |
| 1541 void LayerTreeImpl::AsValueInto(base::trace_event::TracedValue* state) const { | 1538 void LayerTreeImpl::AsValueInto(base::trace_event::TracedValue* state) const { |
| 1542 TracedValue::MakeDictIntoImplicitSnapshot(state, "cc::LayerTreeImpl", this); | 1539 TracedValue::MakeDictIntoImplicitSnapshot(state, "cc::LayerTreeImpl", this); |
| 1543 state->SetInteger("source_frame_number", source_frame_number_); | 1540 state->SetInteger("source_frame_number", source_frame_number_); |
| 1544 | 1541 |
| 1545 state->BeginArray("render_surface_layer_list"); | 1542 state->BeginArray("render_surface_layer_list"); |
| 1546 LayerIterator end = LayerIterator::End(&render_surface_layer_list_); | 1543 for (auto it = layer_list_.rbegin(); it != layer_list_.rend(); ++it) { |
| 1547 for (LayerIterator it = LayerIterator::Begin(&render_surface_layer_list_); | 1544 if (!(*it)->is_drawn_render_surface_layer_list_member()) |
| 1548 it != end; ++it) { | |
| 1549 if (!it.represents_itself()) | |
| 1550 continue; | 1545 continue; |
| 1551 TracedValue::AppendIDRef(*it, state); | 1546 TracedValue::AppendIDRef(*it, state); |
| 1552 } | 1547 } |
| 1553 state->EndArray(); | 1548 state->EndArray(); |
| 1554 | 1549 |
| 1555 state->BeginArray("swap_promise_trace_ids"); | 1550 state->BeginArray("swap_promise_trace_ids"); |
| 1556 for (const auto& swap_promise : swap_promise_list_) | 1551 for (const auto& swap_promise : swap_promise_list_) |
| 1557 state->AppendDouble(swap_promise->TraceId()); | 1552 state->AppendDouble(swap_promise->TraceId()); |
| 1558 state->EndArray(); | 1553 state->EndArray(); |
| 1559 | 1554 |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 | 2189 |
| 2195 void LayerTreeImpl::ResetAllChangeTracking() { | 2190 void LayerTreeImpl::ResetAllChangeTracking() { |
| 2196 layers_that_should_push_properties_.clear(); | 2191 layers_that_should_push_properties_.clear(); |
| 2197 // Iterate over all layers, including masks. | 2192 // Iterate over all layers, including masks. |
| 2198 for (auto& layer : *layers_) | 2193 for (auto& layer : *layers_) |
| 2199 layer->ResetChangeTracking(); | 2194 layer->ResetChangeTracking(); |
| 2200 property_trees_.ResetAllChangeTracking(); | 2195 property_trees_.ResetAllChangeTracking(); |
| 2201 } | 2196 } |
| 2202 | 2197 |
| 2203 } // namespace cc | 2198 } // namespace cc |
| OLD | NEW |