diff options
Diffstat (limited to 'chromium/cc/trees/layer_tree_impl.cc')
-rw-r--r-- | chromium/cc/trees/layer_tree_impl.cc | 475 |
1 files changed, 160 insertions, 315 deletions
diff --git a/chromium/cc/trees/layer_tree_impl.cc b/chromium/cc/trees/layer_tree_impl.cc index 1bb42de1429..27812c1d31e 100644 --- a/chromium/cc/trees/layer_tree_impl.cc +++ b/chromium/cc/trees/layer_tree_impl.cc @@ -31,7 +31,6 @@ #include "cc/layers/effect_tree_layer_list_iterator.h" #include "cc/layers/heads_up_display_layer_impl.h" #include "cc/layers/layer.h" -#include "cc/layers/layer_list_iterator.h" #include "cc/layers/render_surface_impl.h" #include "cc/layers/scrollbar_layer_impl_base.h" #include "cc/resources/ui_resource_request.h" @@ -39,12 +38,10 @@ #include "cc/trees/draw_property_utils.h" #include "cc/trees/effect_node.h" #include "cc/trees/layer_tree_frame_sink.h" -#include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_host_impl.h" #include "cc/trees/mutator_host.h" #include "cc/trees/occlusion_tracker.h" #include "cc/trees/property_tree.h" -#include "cc/trees/property_tree_builder.h" #include "cc/trees/scroll_node.h" #include "cc/trees/transform_node.h" #include "components/viz/common/traced_value.h" @@ -61,31 +58,33 @@ namespace { class ViewportAnchor { public: ViewportAnchor(ScrollNode* inner_scroll, - LayerImpl* outer_scroll, + ScrollNode* outer_scroll, LayerTreeImpl* tree_impl) : inner_(inner_scroll), outer_(outer_scroll), tree_impl_(tree_impl) { viewport_in_content_coordinates_ = scroll_tree().current_scroll_offset(inner_->element_id); - if (outer_) - viewport_in_content_coordinates_ += outer_->CurrentScrollOffset(); + if (outer_) { + viewport_in_content_coordinates_ += + scroll_tree().current_scroll_offset(outer_->element_id); + } } void ResetViewportToAnchoredPosition() { DCHECK(outer_); scroll_tree().ClampScrollToMaxScrollOffset(inner_, tree_impl_); - outer_->ClampScrollToMaxScrollOffset(); + scroll_tree().ClampScrollToMaxScrollOffset(outer_, tree_impl_); gfx::ScrollOffset viewport_location = scroll_tree().current_scroll_offset(inner_->element_id) + - outer_->CurrentScrollOffset(); + scroll_tree().current_scroll_offset(outer_->element_id); gfx::Vector2dF delta = viewport_in_content_coordinates_.DeltaFrom(viewport_location); delta = scroll_tree().ScrollBy(inner_, delta, tree_impl_); - outer_->ScrollBy(delta); + scroll_tree().ScrollBy(outer_, delta, tree_impl_); } private: @@ -94,7 +93,7 @@ class ViewportAnchor { } ScrollNode* inner_; - LayerImpl* outer_; + ScrollNode* outer_; LayerTreeImpl* tree_impl_; gfx::ScrollOffset viewport_in_content_coordinates_; }; @@ -123,7 +122,6 @@ LayerTreeImpl::LayerTreeImpl( : host_impl_(host_impl), source_frame_number_(-1), is_first_frame_after_commit_tracker_(-1), - root_layer_for_testing_(nullptr), hud_layer_(nullptr), background_color_(0), last_scrolled_scroll_node_index_(ScrollTree::kInvalidNodeId), @@ -134,7 +132,6 @@ LayerTreeImpl::LayerTreeImpl( device_scale_factor_(1.f), painted_device_scale_factor_(1.f), elastic_overscroll_(elastic_overscroll), - layers_(new OwnedLayerImplList), needs_update_draw_properties_(true), scrollbar_geometries_need_update_(false), needs_full_tree_sync_(true), @@ -155,7 +152,6 @@ LayerTreeImpl::~LayerTreeImpl() { // Need to explicitly clear the tree prior to destroying this so that // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. DCHECK(LayerListIsEmpty()); - DCHECK(layers_->empty()); } void LayerTreeImpl::Shutdown() { @@ -166,42 +162,23 @@ void LayerTreeImpl::Shutdown() { } void LayerTreeImpl::ReleaseResources() { -#if DCHECK_IS_ON() - // These DCHECKs catch tests that add layers to the tree but fail to build the - // layer list afterward. - LayerListIterator<LayerImpl> it(root_layer_for_testing_); - size_t i = 0; - for (; it != LayerListIterator<LayerImpl>(nullptr); ++it, ++i) { - DCHECK_LT(i, layer_list_.size()); - DCHECK_EQ(layer_list_[i], *it); - } -#endif - - if (!LayerListIsEmpty()) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - this, [](LayerImpl* layer) { layer->ReleaseResources(); }); - } + for (auto* layer : *this) + layer->ReleaseResources(); } void LayerTreeImpl::OnPurgeMemory() { - if (!LayerListIsEmpty()) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - this, [](LayerImpl* layer) { layer->OnPurgeMemory(); }); - } + for (auto* layer : *this) + layer->OnPurgeMemory(); } void LayerTreeImpl::ReleaseTileResources() { - if (!LayerListIsEmpty()) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - this, [](LayerImpl* layer) { layer->ReleaseTileResources(); }); - } + for (auto* layer : *this) + layer->ReleaseTileResources(); } void LayerTreeImpl::RecreateTileResources() { - if (!LayerListIsEmpty()) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - this, [](LayerImpl* layer) { layer->RecreateTileResources(); }); - } + for (auto* layer : *this) + layer->RecreateTileResources(); } void LayerTreeImpl::DidUpdateScrollOffset(ElementId id) { @@ -269,23 +246,27 @@ void LayerTreeImpl::UpdateScrollbarGeometries() { scroll_node->scrolls_outer_viewport; if (is_viewport_scrollbar) { gfx::SizeF viewport_bounds(bounds_size); - if (scroll_node->scrolls_inner_viewport && OuterViewportScrollLayer()) { - // Add offset and bounds contribution of outer viewport. - current_offset += OuterViewportScrollLayer()->CurrentScrollOffset(); - gfx::SizeF outer_viewport_bounds(scroll_tree.container_bounds( - OuterViewportScrollLayer()->scroll_tree_index())); - viewport_bounds.SetToMin(outer_viewport_bounds); - - // The scrolling size is only determined by the outer viewport. - scroll_node = scroll_tree.FindNodeFromElementId( - OuterViewportScrollLayer()->element_id()); - scrolling_size = gfx::SizeF(scroll_node->bounds); + if (scroll_node->scrolls_inner_viewport) { + DCHECK_EQ(scroll_node, InnerViewportScrollNode()); + if (auto* outer_scroll_node = OuterViewportScrollNode()) { + // Add offset and bounds contribution of outer viewport. + current_offset += + scroll_tree.current_scroll_offset(outer_scroll_node->element_id); + gfx::SizeF outer_viewport_bounds( + scroll_tree.container_bounds(outer_scroll_node->id)); + viewport_bounds.SetToMin(outer_viewport_bounds); + // The scrolling size is only determined by the outer viewport. + scrolling_size = gfx::SizeF(outer_scroll_node->bounds); + } } else { + DCHECK_EQ(scroll_node, OuterViewportScrollNode()); + auto* inner_scroll_node = InnerViewportScrollNode(); + DCHECK(inner_scroll_node); // Add offset and bounds contribution of inner viewport. - current_offset += scroll_tree.current_scroll_offset( - InnerViewportScrollNode()->element_id); + current_offset += + scroll_tree.current_scroll_offset(inner_scroll_node->element_id); gfx::SizeF inner_viewport_bounds( - scroll_tree.container_bounds(InnerViewportScrollNode()->id)); + scroll_tree.container_bounds(inner_scroll_node->id)); viewport_bounds.SetToMin(inner_viewport_bounds); } viewport_bounds.Scale(1 / current_page_scale_factor()); @@ -322,14 +303,9 @@ bool LayerTreeImpl::LayerListIsEmpty() const { } void LayerTreeImpl::SetRootLayerForTesting(std::unique_ptr<LayerImpl> layer) { - if (root_layer_for_testing_ && layer.get() != root_layer_for_testing_) - RemoveLayer(root_layer_for_testing_->id()); - root_layer_for_testing_ = layer.get(); - ClearLayerList(); - if (layer) { + DetachLayers(); + if (layer) AddLayer(std::move(layer)); - BuildLayerListForTesting(); - } host_impl_->OnCanDrawStateChangedForTree(); } @@ -337,22 +313,6 @@ void LayerTreeImpl::OnCanDrawStateChangedForTree() { host_impl_->OnCanDrawStateChangedForTree(); } -void LayerTreeImpl::AddToLayerList(LayerImpl* layer) { - layer_list_.push_back(layer); -} - -void LayerTreeImpl::ClearLayerList() { - layer_list_.clear(); -} - -void LayerTreeImpl::BuildLayerListForTesting() { - ClearLayerList(); - LayerListIterator<LayerImpl> it(root_layer_for_testing_); - for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { - AddToLayerList(*it); - } -} - void LayerTreeImpl::InvalidateRegionForImages( const PaintImageIdFlatSet& images_to_invalidate) { TRACE_EVENT_BEGIN1("cc", "LayerTreeImpl::InvalidateRegionForImages", @@ -392,7 +352,7 @@ void LayerTreeImpl::UpdateViewportContainerSizes() { if (!InnerViewportScrollNode()) return; - ViewportAnchor anchor(InnerViewportScrollNode(), OuterViewportScrollLayer(), + ViewportAnchor anchor(InnerViewportScrollNode(), OuterViewportScrollNode(), this); // Top/bottom controls always share the same shown ratio. @@ -424,34 +384,23 @@ void LayerTreeImpl::UpdateViewportContainerSizes() { property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta); - ClipNode* inner_clip_node = property_trees->clip_tree.Node( - InnerViewportScrollLayer()->clip_tree_index()); - inner_clip_node->clip.set_height( - InnerViewportScrollNode()->container_bounds.height() + bounds_delta.y()); - // Adjust the outer viewport container as well, since adjusting only the // inner may cause its bounds to exceed those of the outer, causing scroll // clamping. - if (OuterViewportScrollNode()) { + if (auto* outer_scroll = OuterViewportScrollNode()) { gfx::Vector2dF scaled_bounds_delta = gfx::ScaleVector2d(bounds_delta, 1.f / min_page_scale_factor()); property_trees->SetOuterViewportContainerBoundsDelta(scaled_bounds_delta); - property_trees->SetInnerViewportScrollBoundsDelta(scaled_bounds_delta); - - ClipNode* outer_clip_node = property_trees->clip_tree.Node( - OuterViewportScrollLayer()->clip_tree_index()); - - float adjusted_container_height = - OuterViewportScrollNode()->container_bounds.height() + - scaled_bounds_delta.y(); - outer_clip_node->clip.set_height(adjusted_container_height); - - // Expand all clips between the outer viewport and the inner viewport. - auto* outer_ancestor = property_trees->clip_tree.parent(outer_clip_node); - while (outer_ancestor && outer_ancestor != inner_clip_node) { - outer_ancestor->clip.Union(outer_clip_node->clip); - outer_ancestor = property_trees->clip_tree.parent(outer_ancestor); + // outer_viewport_container_bounds_delta and + // inner_viewport_scroll_bounds_delta are the same thing. + DCHECK_EQ(scaled_bounds_delta, + property_trees->inner_viewport_scroll_bounds_delta()); + + if (auto* outer_clip_node = OuterViewportClipNode()) { + float adjusted_container_height = + outer_scroll->container_bounds.height() + scaled_bounds_delta.y(); + outer_clip_node->clip.set_height(adjusted_container_height); } anchor.ResetViewportToAnchoredPosition(); @@ -465,59 +414,48 @@ void LayerTreeImpl::UpdateViewportContainerSizes() { // delta. SetScrollbarGeometriesNeedUpdate(); set_needs_update_draw_properties(); - - // For pre-BlinkGenPropertyTrees mode, we need to ensure the layers are - // appropriately updated. - if (!settings().use_layer_lists) { - if (OuterViewportContainerLayer()) - OuterViewportContainerLayer()->NoteLayerPropertyChanged(); - if (InnerViewportScrollLayer()) - InnerViewportScrollLayer()->NoteLayerPropertyChanged(); - if (OuterViewportScrollLayer()) - OuterViewportScrollLayer()->NoteLayerPropertyChanged(); - } } bool LayerTreeImpl::IsRootLayer(const LayerImpl* layer) const { - return layer_list_.empty() ? false : layer_list_[0] == layer; + return !layer_list_.empty() && layer_list_[0].get() == layer; } gfx::ScrollOffset LayerTreeImpl::TotalScrollOffset() const { gfx::ScrollOffset offset; - auto& scroll_tree = property_trees()->scroll_tree; + const auto& scroll_tree = property_trees()->scroll_tree; - if (InnerViewportScrollNode()) { - offset += scroll_tree.current_scroll_offset( - InnerViewportScrollNode()->element_id); - } + if (auto* inner_scroll = InnerViewportScrollNode()) + offset += scroll_tree.current_scroll_offset(inner_scroll->element_id); - if (OuterViewportScrollLayer()) - offset += OuterViewportScrollLayer()->CurrentScrollOffset(); + if (auto* outer_scroll = OuterViewportScrollNode()) + offset += scroll_tree.current_scroll_offset(outer_scroll->element_id); return offset; } gfx::ScrollOffset LayerTreeImpl::TotalMaxScrollOffset() const { gfx::ScrollOffset offset; - const ScrollTree& scroll_tree = property_trees()->scroll_tree; + const auto& scroll_tree = property_trees()->scroll_tree; - if (auto* inner_node = InnerViewportScrollNode()) - offset += scroll_tree.MaxScrollOffset(inner_node->id); + if (viewport_property_ids_.inner_scroll != ScrollTree::kInvalidNodeId) + offset += scroll_tree.MaxScrollOffset(viewport_property_ids_.inner_scroll); - if (auto* outer_node = OuterViewportScrollNode()) - offset += scroll_tree.MaxScrollOffset(outer_node->id); + if (viewport_property_ids_.outer_scroll != ScrollTree::kInvalidNodeId) + offset += scroll_tree.MaxScrollOffset(viewport_property_ids_.outer_scroll); return offset; } -std::unique_ptr<OwnedLayerImplList> LayerTreeImpl::DetachLayers() { - root_layer_for_testing_ = nullptr; - layer_list_.clear(); +OwnedLayerImplList LayerTreeImpl::DetachLayers() { render_surface_list_.clear(); set_needs_update_draw_properties(); - std::unique_ptr<OwnedLayerImplList> ret = std::move(layers_); - layers_.reset(new OwnedLayerImplList); - return ret; + return std::move(layer_list_); +} + +OwnedLayerImplList LayerTreeImpl::DetachLayersKeepingRootLayerForTesting() { + auto layers = DetachLayers(); + SetRootLayerForTesting(std::move(layers[0])); + return layers; } void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { @@ -594,18 +532,10 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { target_tree->PassSwapPromises(std::move(swap_promise_list_)); swap_promise_list_.clear(); - target_tree->set_browser_controls_shrink_blink_size( - browser_controls_shrink_blink_size_); - target_tree->SetTopControlsHeight(top_controls_height_); - target_tree->SetBottomControlsHeight(bottom_controls_height_); - target_tree->PushBrowserControls(nullptr); - - target_tree->set_overscroll_behavior(overscroll_behavior_); - // The page scale factor update can affect scrolling which requires that // these ids are set, so this must be before PushPageScaleFactorAndLimits. - target_tree->SetViewportLayersFromIds(viewport_layer_ids_); - target_tree->set_viewport_property_ids(viewport_property_ids_); + // Setting browser controls below also needs viewport scroll properties. + target_tree->SetViewportPropertyIds(viewport_property_ids_); // Active tree already shares the page_scale_factor object with pending // tree so only the limits need to be provided. @@ -613,6 +543,14 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { max_page_scale_factor()); target_tree->SetExternalPageScaleFactor(external_page_scale_factor_); + target_tree->set_browser_controls_shrink_blink_size( + browser_controls_shrink_blink_size_); + target_tree->SetTopControlsHeight(top_controls_height_); + target_tree->SetBottomControlsHeight(bottom_controls_height_); + target_tree->PushBrowserControls(nullptr); + + target_tree->set_overscroll_behavior(overscroll_behavior_); + target_tree->SetRasterColorSpace(raster_color_space_id_, raster_color_space_); target_tree->elastic_overscroll()->PushPendingToActive(); @@ -664,12 +602,12 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { } void LayerTreeImpl::HandleTickmarksVisibilityChange() { - if (!host_impl_->ViewportMainScrollLayer()) + if (!host_impl_->ViewportMainScrollNode()) return; ScrollbarAnimationController* controller = host_impl_->ScrollbarAnimationControllerForElementId( - OuterViewportScrollLayer()->element_id()); + host_impl_->ViewportMainScrollNode()->element_id); if (!controller) return; @@ -687,10 +625,9 @@ void LayerTreeImpl::HandleTickmarksVisibilityChange() { } void LayerTreeImpl::HandleScrollbarShowRequestsFromMain() { - LayerTreeHostCommon::CallFunctionForEveryLayer(this, [this]( - LayerImpl* layer) { + for (auto* layer : *this) { if (!layer->needs_show_scrollbars()) - return; + continue; ScrollbarAnimationController* controller = host_impl_->ScrollbarAnimationControllerForElementId( layer->element_id()); @@ -698,7 +635,7 @@ void LayerTreeImpl::HandleScrollbarShowRequestsFromMain() { controller->DidRequestShowFromMainThread(); layer->set_needs_show_scrollbars(false); } - }); + } } void LayerTreeImpl::MoveChangeTrackingToLayers() { @@ -723,30 +660,6 @@ void LayerTreeImpl::ForceRecalculateRasterScales() { layer->ResetRasterScale(); } -LayerImplList::const_iterator LayerTreeImpl::begin() const { - return layer_list_.cbegin(); -} - -LayerImplList::const_iterator LayerTreeImpl::end() const { - return layer_list_.cend(); -} - -LayerImplList::const_reverse_iterator LayerTreeImpl::rbegin() const { - return layer_list_.crbegin(); -} - -LayerImplList::const_reverse_iterator LayerTreeImpl::rend() const { - return layer_list_.crend(); -} - -LayerImplList::reverse_iterator LayerTreeImpl::rbegin() { - return layer_list_.rbegin(); -} - -LayerImplList::reverse_iterator LayerTreeImpl::rend() { - return layer_list_.rend(); -} - bool LayerTreeImpl::IsElementInPropertyTree(ElementId element_id) const { return property_trees()->HasElement(element_id); } @@ -857,6 +770,18 @@ LayerTreeImpl::TakePresentationCallbacks() { return callbacks; } +LayerImpl* LayerTreeImpl::InnerViewportScrollLayerForTesting() const { + if (auto* scroll_node = InnerViewportScrollNode()) + return LayerByElementId(scroll_node->element_id); + return nullptr; +} + +LayerImpl* LayerTreeImpl::OuterViewportScrollLayerForTesting() const { + if (auto* scroll_node = OuterViewportScrollNode()) + return LayerByElementId(scroll_node->element_id); + return nullptr; +} + ScrollNode* LayerTreeImpl::CurrentlyScrollingNode() { DCHECK(IsActiveTree()); return property_trees_.scroll_tree.CurrentlyScrollingNode(); @@ -1005,26 +930,11 @@ void LayerTreeImpl::UpdateTransformAnimation(ElementId element_id, } } -TransformNode* LayerTreeImpl::PageScaleTransformNode() { - auto* page_scale = PageScaleLayer(); - if (!page_scale) { - // TODO(crbug.com/909750): Check all other callers of PageScaleLayer() and - // switch to viewport_property_ids_.page_scale_transform if needed. - return property_trees()->transform_tree.Node( - viewport_property_ids_.page_scale_transform); - } - - return property_trees()->transform_tree.Node( - page_scale->transform_tree_index()); -} - void LayerTreeImpl::UpdatePageScaleNode() { if (!PageScaleTransformNode()) { DCHECK(layer_list_.empty() || current_page_scale_factor() == 1); return; } - - DCHECK(!IsRootLayer(PageScaleLayer())); draw_property_utils::UpdatePageScaleFactor( property_trees(), PageScaleTransformNode(), current_page_scale_factor()); } @@ -1178,10 +1088,10 @@ void LayerTreeImpl::DidUpdatePageScale() { host_impl_->FlashAllScrollbars(true); return; } - if (host_impl_->ViewportMainScrollLayer()) { + if (auto* scroll_node = host_impl_->ViewportMainScrollNode()) { if (ScrollbarAnimationController* controller = host_impl_->ScrollbarAnimationControllerForElementId( - OuterViewportScrollLayer()->element_id())) + scroll_node->element_id)) controller->DidScrollUpdate(); } } @@ -1275,14 +1185,14 @@ gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { } gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const { - LayerImpl* root_scroll_layer = OuterViewportScrollLayer() - ? OuterViewportScrollLayer() - : InnerViewportScrollLayer(); - if (!root_scroll_layer) + const ScrollNode* root_scroll_node = OuterViewportScrollNode(); + if (!root_scroll_node) + root_scroll_node = InnerViewportScrollNode(); + if (!root_scroll_node) return gfx::Rect(); return MathUtil::MapEnclosingClippedRect( - root_scroll_layer->ScreenSpaceTransform(), - gfx::Rect(root_scroll_layer->bounds())); + property_trees()->transform_tree.ToScreen(root_scroll_node->transform_id), + gfx::Rect(root_scroll_node->bounds)); } void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { @@ -1298,61 +1208,54 @@ void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { property_trees()->scroll_tree.ApplySentScrollDeltasFromAbortedCommit(); } -void LayerTreeImpl::SetViewportLayersFromIds(const ViewportLayerIds& ids) { - if (viewport_layer_ids_ == ids) - return; +void LayerTreeImpl::SetViewportPropertyIds(const ViewportPropertyIds& ids) { + viewport_property_ids_ = ids; + // Outer viewport properties exist only if inner viewport property exists. + DCHECK(ids.inner_scroll != ScrollTree::kInvalidNodeId || + (ids.outer_scroll == ScrollTree::kInvalidNodeId && + ids.outer_clip == ClipTree::kInvalidNodeId)); - viewport_layer_ids_ = ids; + if (auto* inner_scroll = InnerViewportScrollNode()) { + if (auto* inner_scroll_layer = LayerByElementId(inner_scroll->element_id)) + inner_scroll_layer->set_is_inner_viewport_scroll_layer(); + } +} - // Set the viewport layer types. - if (auto* inner_container = InnerViewportContainerLayer()) - inner_container->SetViewportLayerType(INNER_VIEWPORT_CONTAINER); - if (auto* inner_scroll = InnerViewportScrollLayer()) - inner_scroll->SetViewportLayerType(INNER_VIEWPORT_SCROLL); - if (auto* outer_container = OuterViewportContainerLayer()) - outer_container->SetViewportLayerType(OUTER_VIEWPORT_CONTAINER); - if (auto* outer_scroll = OuterViewportScrollLayer()) - outer_scroll->SetViewportLayerType(OUTER_VIEWPORT_SCROLL); +const TransformNode* LayerTreeImpl::OverscrollElasticityTransformNode() const { + return property_trees()->transform_tree.Node( + viewport_property_ids_.overscroll_elasticity_transform); } -void LayerTreeImpl::ClearViewportLayers() { - SetViewportLayersFromIds(ViewportLayerIds()); +const TransformNode* LayerTreeImpl::PageScaleTransformNode() const { + return property_trees()->transform_tree.Node( + viewport_property_ids_.page_scale_transform); } const ScrollNode* LayerTreeImpl::InnerViewportScrollNode() const { - auto* inner_scroll = InnerViewportScrollLayer(); - if (!inner_scroll) { - // TODO(crbug.com/909750): Check all other callers of - // InnerViewportScrollLayer() and switch to - // viewport_property_ids_.inner_scroll if needed. - return property_trees()->scroll_tree.Node( - viewport_property_ids_.inner_scroll); - } - return property_trees()->scroll_tree.Node(inner_scroll->scroll_tree_index()); + return property_trees()->scroll_tree.Node( + viewport_property_ids_.inner_scroll); +} + +const ClipNode* LayerTreeImpl::OuterViewportClipNode() const { + return property_trees()->clip_tree.Node(viewport_property_ids_.outer_clip); } const ScrollNode* LayerTreeImpl::OuterViewportScrollNode() const { - if (!OuterViewportScrollLayer()) - return nullptr; return property_trees()->scroll_tree.Node( - OuterViewportScrollLayer()->scroll_tree_index()); + viewport_property_ids_.outer_scroll); } // For unit tests, we use the layer's id as its element id. -static void SetElementIdForTesting(LayerImpl* layer) { - layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); -} - void LayerTreeImpl::SetElementIdsForTesting() { - LayerListIterator<LayerImpl> it(root_layer_for_testing_); - for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { - if (!it->element_id()) - SetElementIdForTesting(*it); + for (auto* layer : *this) { + if (!layer->element_id()) + layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); } } bool LayerTreeImpl::UpdateDrawProperties( - bool update_image_animation_controller) { + bool update_image_animation_controller, + LayerImplList* output_update_layer_list_for_testing) { if (!needs_update_draw_properties_) return true; @@ -1388,14 +1291,9 @@ bool LayerTreeImpl::UpdateDrawProperties( // We verify visible rect calculations whenever we verify clip tree // calculations except when this function is explicitly passed a flag asking // us to skip it. - LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( - layer_list_[0], GetDeviceViewport(), host_impl_->DrawTransform(), - device_scale_factor(), current_page_scale_factor(), PageScaleLayer(), - InnerViewportScrollLayer(), OuterViewportScrollLayer(), - elastic_overscroll()->Current(IsActiveTree()), - OverscrollElasticityElementId(), max_texture_size(), - &render_surface_list_, &property_trees_, PageScaleTransformNode()); - LayerTreeHostCommon::CalculateDrawProperties(&inputs); + draw_property_utils::CalculateDrawProperties( + this, &render_surface_list_, output_update_layer_list_for_testing); + if (const char* client_name = GetClientNameForMetrics()) { UMA_HISTOGRAM_COUNTS_1M( base::StringPrintf( @@ -1450,14 +1348,6 @@ bool LayerTreeImpl::UpdateDrawProperties( occlusion_tracker.GetCurrentOcclusionForContributingSurface( draw_transform); render_surface->set_occlusion_in_content_space(occlusion); - // Masks are used to draw the contributing surface, so should have - // the same occlusion as the surface (nothing inside the surface - // occludes them). - if (LayerImpl* mask = render_surface->MaskLayer()) { - mask->draw_properties().occlusion_in_content_space = - occlusion_tracker.GetCurrentOcclusionForContributingSurface( - draw_transform * render_surface->SurfaceScale()); - } } occlusion_tracker.LeaveLayer(it); @@ -1514,24 +1404,6 @@ void LayerTreeImpl::UpdateCanUseLCDText() { DidModifyTilePriorities(); } -void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() { - BuildLayerListForTesting(); - BuildPropertyTreesForTesting(); -} - -void LayerTreeImpl::BuildPropertyTreesForTesting() { - SetElementIdsForTesting(); - property_trees_.needs_rebuild = true; - PropertyTreeBuilder::BuildPropertyTrees( - layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(), - OuterViewportScrollLayer(), OverscrollElasticityElementId(), - elastic_overscroll()->Current(IsActiveTree()), - current_page_scale_factor(), device_scale_factor(), - gfx::Rect(GetDeviceViewport().size()), host_impl_->DrawTransform(), - &property_trees_); - host_impl_->UpdateElements(GetElementTypeForAnimation()); -} - const RenderSurfaceList& LayerTreeImpl::GetRenderSurfaceList() const { // If this assert triggers, then the list is dirty. DCHECK(!needs_update_draw_properties_); @@ -1546,8 +1418,9 @@ const Region& LayerTreeImpl::UnoccludedScreenSpaceRegion() const { } gfx::SizeF LayerTreeImpl::ScrollableSize() const { - auto* scroll_node = OuterViewportScrollNode() ? OuterViewportScrollNode() - : InnerViewportScrollNode(); + auto* scroll_node = OuterViewportScrollNode(); + if (!scroll_node) + scroll_node = InnerViewportScrollNode(); if (!scroll_node) return gfx::SizeF(); const auto& scroll_tree = property_trees()->scroll_tree; @@ -1564,11 +1437,11 @@ LayerImpl* LayerTreeImpl::LayerById(int id) const { // TODO(masonfreed): If this shows up on profiles, this could use // a layer_element_map_ approach similar to LayerById(). LayerImpl* LayerTreeImpl::LayerByElementId(ElementId element_id) const { - auto it = std::find_if(layer_list_.rbegin(), layer_list_.rend(), - [&element_id](LayerImpl* layer_impl) { - return layer_impl->element_id() == element_id; - }); - if (it == layer_list_.rend()) + auto it = + std::find_if(rbegin(), rend(), [&element_id](LayerImpl* layer_impl) { + return layer_impl->element_id() == element_id; + }); + if (it == rend()) return nullptr; return *it; } @@ -1618,26 +1491,13 @@ void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { layer_id_map_.erase(layer->id()); } -// These manage ownership of the LayerImpl. void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { - DCHECK(!base::Contains(*layers_, layer)); DCHECK(layer); - layers_->push_back(std::move(layer)); + DCHECK(!base::Contains(layer_list_, layer)); + layer_list_.push_back(std::move(layer)); set_needs_update_draw_properties(); } -std::unique_ptr<LayerImpl> LayerTreeImpl::RemoveLayer(int id) { - for (auto it = layers_->begin(); it != layers_->end(); ++it) { - if ((*it) && (*it)->id() != id) - continue; - std::unique_ptr<LayerImpl> ret = std::move(*it); - set_needs_update_draw_properties(); - layers_->erase(it); - return ret; - } - return nullptr; -} - size_t LayerTreeImpl::NumLayers() { return layer_id_map_.size(); } @@ -1652,10 +1512,8 @@ void LayerTreeImpl::DidBecomeActive() { // if we were in a good state. host_impl_->ResetRequiresHighResToDraw(); - if (!layer_list_.empty()) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - this, [](LayerImpl* layer) { layer->DidBecomeActive(); }); - } + for (auto* layer : *this) + layer->DidBecomeActive(); for (const auto& swap_promise : swap_promise_list_) swap_promise->DidActivate(); @@ -1820,11 +1678,10 @@ void LayerTreeImpl::SetNeedsRedraw() { void LayerTreeImpl::GetAllPrioritizedTilesForTracing( std::vector<PrioritizedTile>* prioritized_tiles) const { - for (auto it = layer_list_.rbegin(); it != layer_list_.rend(); ++it) { - LayerImpl* layer_impl = *it; - if (!layer_impl->contributes_to_drawn_render_surface()) + for (auto* layer : base::Reversed(*this)) { + if (!layer->contributes_to_drawn_render_surface()) continue; - layer_impl->GetAllPrioritizedTilesForTracing(prioritized_tiles); + layer->GetAllPrioritizedTilesForTracing(prioritized_tiles); } } @@ -1834,10 +1691,10 @@ void LayerTreeImpl::AsValueInto(base::trace_event::TracedValue* state) const { state->SetInteger("source_frame_number", source_frame_number_); state->BeginArray("render_surface_layer_list"); - for (auto it = layer_list_.rbegin(); it != layer_list_.rend(); ++it) { - if (!(*it)->contributes_to_drawn_render_surface()) + for (auto* layer : base::Reversed(*this)) { + if (layer->contributes_to_drawn_render_surface()) continue; - viz::TracedValue::AppendIDRef(*it, state); + viz::TracedValue::AppendIDRef(layer, state); } state->EndArray(); @@ -2245,11 +2102,12 @@ static void FindClosestMatchingLayer(const gfx::PointF& screen_space_point, float distance_to_intersection = 0.f; bool hit = false; - if (layer->Is3dSorted()) + if (layer->Is3dSorted()) { hit = PointHitsLayer(layer, screen_space_point, &distance_to_intersection); - else + } else { hit = PointHitsLayer(layer, screen_space_point, nullptr); + } if (!hit) continue; @@ -2287,7 +2145,7 @@ LayerImpl* LayerTreeImpl::FindFirstScrollingLayerOrScrollbarThatIsHitByPoint( return nullptr; FindClosestMatchingLayerState state; - LayerImpl* root_layer = layer_list_[0]; + LayerImpl* root_layer = layer_list_[0].get(); FindClosestMatchingLayer(screen_space_point, root_layer, HitTestScrollingLayerOrScrollbarFunctor(), &state); return state.closest_match; @@ -2304,7 +2162,7 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPoint( if (!UpdateDrawProperties()) return nullptr; FindClosestMatchingLayerState state; - FindClosestMatchingLayer(screen_space_point, layer_list_[0], + FindClosestMatchingLayer(screen_space_point, layer_list_[0].get(), HitTestVisibleScrollableOrTouchableFunctor(), &state); return state.closest_match; @@ -2337,7 +2195,8 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInEventHandlerRegion( if (!UpdateDrawProperties()) return nullptr; FindClosestMatchingLayerState state; - FindClosestMatchingLayer(screen_space_point, layer_list_[0], func, &state); + FindClosestMatchingLayer(screen_space_point, layer_list_[0].get(), func, + &state); return state.closest_match; } @@ -2506,7 +2365,7 @@ bool LayerTreeImpl::TakeForceSendMetadataRequest() { void LayerTreeImpl::ResetAllChangeTracking() { layers_that_should_push_properties_.clear(); // Iterate over all layers, including masks. - for (auto& layer : *layers_) + for (auto* layer : *this) layer->ResetChangeTracking(); property_trees_.ResetAllChangeTracking(); } @@ -2524,18 +2383,4 @@ std::string LayerTreeImpl::LayerListAsJson() const { return str; } -std::string LayerTreeImpl::LayerTreeAsJson() const { - std::string str; - if (root_layer_for_testing_) { - std::unique_ptr<base::Value> json( - root_layer_for_testing_->LayerTreeAsJson()); - base::JSONWriter::WriteWithOptions( - *json, - base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | - base::JSONWriter::OPTIONS_PRETTY_PRINT, - &str); - } - return str; -} - } // namespace cc |