diff options
Diffstat (limited to 'chromium/cc/layers/layer_impl.cc')
-rw-r--r-- | chromium/cc/layers/layer_impl.cc | 171 |
1 files changed, 68 insertions, 103 deletions
diff --git a/chromium/cc/layers/layer_impl.cc b/chromium/cc/layers/layer_impl.cc index fe128b9ef69..6653d2cfc24 100644 --- a/chromium/cc/layers/layer_impl.cc +++ b/chromium/cc/layers/layer_impl.cc @@ -26,7 +26,6 @@ #include "cc/trees/clip_node.h" #include "cc/trees/draw_property_utils.h" #include "cc/trees/effect_node.h" -#include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_impl.h" #include "cc/trees/layer_tree_settings.h" #include "cc/trees/mutator_host.h" @@ -51,9 +50,7 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, : layer_id_(id), layer_tree_impl_(tree_impl), will_always_push_properties_(will_always_push_properties), - test_properties_(nullptr), scrollable_(false), - should_flatten_screen_space_transform_from_property_tree_(false), layer_property_changed_not_from_property_trees_(false), layer_property_changed_from_property_trees_(false), may_contain_video_(false), @@ -64,8 +61,7 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, draws_content_(false), contributes_to_drawn_render_surface_(false), hit_testable_(false), - is_resized_by_browser_controls_(false), - viewport_layer_type_(NOT_VIEWPORT_LAYER), + is_inner_viewport_scroll_layer_(false), background_color_(0), safe_opaque_background_color_(0), transform_tree_index_(TransformTree::kInvalidNodeId), @@ -356,8 +352,6 @@ void LayerImpl::PushPropertiesTo(LayerImpl* layer) { layer->has_transform_node_ = has_transform_node_; layer->offset_to_transform_parent_ = offset_to_transform_parent_; - layer->should_flatten_screen_space_transform_from_property_tree_ = - should_flatten_screen_space_transform_from_property_tree_; layer->masks_to_bounds_ = masks_to_bounds_; layer->contents_opaque_ = contents_opaque_; layer->may_contain_video_ = may_contain_video_; @@ -422,14 +416,6 @@ bool LayerImpl::IsAffectedByPageScale() const { ->in_subtree_of_page_scale_layer; } -bool LayerImpl::IsResizedByBrowserControls() const { - return is_resized_by_browser_controls_; -} - -void LayerImpl::SetIsResizedByBrowserControls(bool resized) { - is_resized_by_browser_controls_ = resized; -} - std::unique_ptr<base::DictionaryValue> LayerImpl::LayerAsJson() const { std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue); result->SetInteger("LayerId", id()); @@ -447,15 +433,6 @@ std::unique_ptr<base::DictionaryValue> LayerImpl::LayerAsJson() const { list->AppendInteger(offset_to_transform_parent().y()); result->Set("OffsetToTransformParent", std::move(list)); - const gfx::Transform& gfx_transform = - const_cast<LayerImpl*>(this)->test_properties()->transform; - double transform[16]; - gfx_transform.matrix().asColMajord(transform); - list = std::make_unique<base::ListValue>(); - for (int i = 0; i < 16; ++i) - list->AppendDouble(transform[i]); - result->Set("Transform", std::move(list)); - result->SetBoolean("DrawsContent", draws_content_); result->SetBoolean("HitTestable", hit_testable_); result->SetBoolean("Is3dSorted", Is3dSorted()); @@ -488,17 +465,6 @@ std::unique_ptr<base::DictionaryValue> LayerImpl::LayerAsJson() const { return result; } -std::unique_ptr<base::DictionaryValue> LayerImpl::LayerTreeAsJson() { - std::unique_ptr<base::DictionaryValue> result = LayerAsJson(); - - auto list = std::make_unique<base::ListValue>(); - for (size_t i = 0; i < test_properties()->children.size(); ++i) - list->Append(test_properties()->children[i]->LayerTreeAsJson()); - result->Set("Children", std::move(list)); - - return result; -} - bool LayerImpl::LayerPropertyChanged() const { return layer_property_changed_not_from_property_trees_ || LayerPropertyChangedFromPropertyTrees(); @@ -562,23 +528,15 @@ bool LayerImpl::IsActive() const { } gfx::Size LayerImpl::bounds() const { - // As an optimization, we do not need to include the viewport bounds delta if - // the layer is not a viewport layer. - if (viewport_layer_type_ == NOT_VIEWPORT_LAYER) { - DCHECK(ViewportBoundsDelta().IsZero()); + if (!is_inner_viewport_scroll_layer_) return bounds_; - } - auto viewport_bounds_delta = gfx::ToCeiledVector2d(ViewportBoundsDelta()); + + auto viewport_bounds_delta = gfx::ToCeiledVector2d( + GetPropertyTrees()->inner_viewport_scroll_bounds_delta()); return gfx::Size(bounds_.width() + viewport_bounds_delta.x(), bounds_.height() + viewport_bounds_delta.y()); } -gfx::SizeF LayerImpl::BoundsForScrolling() const { - auto viewport_bounds_delta = ViewportBoundsDelta(); - return gfx::SizeF(bounds_.width() + viewport_bounds_delta.x(), - bounds_.height() + viewport_bounds_delta.y()); -} - void LayerImpl::SetBounds(const gfx::Size& bounds) { if (bounds_ == bounds) return; @@ -592,61 +550,6 @@ void LayerImpl::SetBounds(const gfx::Size& bounds) { NoteLayerPropertyChanged(); } -void LayerImpl::SetViewportBoundsDelta(const gfx::Vector2dF& bounds_delta) { - DCHECK(IsActive()); - - if (bounds_delta == ViewportBoundsDelta()) - return; - - PropertyTrees* property_trees = GetPropertyTrees(); - switch (viewport_layer_type_) { - case (INNER_VIEWPORT_CONTAINER): - property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta); - break; - case (OUTER_VIEWPORT_CONTAINER): - property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta); - break; - case (INNER_VIEWPORT_SCROLL): - property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta); - break; - case (OUTER_VIEWPORT_SCROLL): - // OUTER_VIEWPORT_SCROLL should not have viewport bounds deltas. - NOTREACHED(); - } - - // Viewport scrollbar positions are determined using the viewport bounds - // delta. - layer_tree_impl()->SetScrollbarGeometriesNeedUpdate(); - - if (masks_to_bounds()) { - // If layer is clipping, then update the clip node using the new bounds. - ClipNode* clip_node = property_trees->clip_tree.Node(clip_tree_index()); - CHECK(clip_node); - DCHECK_EQ(clip_node->id, clip_tree_index()); - clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(), - gfx::SizeF(bounds())); - property_trees->clip_tree.set_needs_update(true); - - property_trees->full_tree_damaged = true; - layer_tree_impl()->set_needs_update_draw_properties(); - } else { - NoteLayerPropertyChanged(); - } -} - -gfx::Vector2dF LayerImpl::ViewportBoundsDelta() const { - switch (viewport_layer_type_) { - case (INNER_VIEWPORT_CONTAINER): - return GetPropertyTrees()->inner_viewport_container_bounds_delta(); - case (OUTER_VIEWPORT_CONTAINER): - return GetPropertyTrees()->outer_viewport_container_bounds_delta(); - case (INNER_VIEWPORT_SCROLL): - return GetPropertyTrees()->inner_viewport_scroll_bounds_delta(); - default: - return gfx::Vector2dF(); - } -} - ScrollbarLayerImplBase* LayerImpl::ToScrollbarLayer() { return nullptr; } @@ -1001,7 +904,11 @@ float LayerImpl::GetIdealContentsScale() const { gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents(transform, default_scale); - return std::max(transform_scales.x(), transform_scales.y()); + + constexpr float kMaxScaleRatio = 5.f; + float lower_scale = std::min(transform_scales.x(), transform_scales.y()); + float higher_scale = std::max(transform_scales.x(), transform_scales.y()); + return std::min(kMaxScaleRatio * lower_scale, higher_scale); } PropertyTrees* LayerImpl::GetPropertyTrees() const { @@ -1035,4 +942,62 @@ bool LayerImpl::is_surface_layer() const { return false; } +static float TranslationFromActiveTreeLayerScreenSpaceTransform( + LayerImpl* pending_tree_layer) { + LayerTreeImpl* layer_tree_impl = pending_tree_layer->layer_tree_impl(); + if (layer_tree_impl) { + LayerImpl* active_tree_layer = + layer_tree_impl->FindActiveTreeLayerById(pending_tree_layer->id()); + if (active_tree_layer) { + gfx::Transform active_tree_screen_space_transform = + active_tree_layer->draw_properties().screen_space_transform; + if (active_tree_screen_space_transform.IsIdentity()) + return 0.f; + if (active_tree_screen_space_transform.ApproximatelyEqual( + pending_tree_layer->draw_properties().screen_space_transform)) + return 0.f; + return (active_tree_layer->draw_properties() + .screen_space_transform.To2dTranslation() - + pending_tree_layer->draw_properties() + .screen_space_transform.To2dTranslation()) + .Length(); + } + } + return 0.f; +} + +// A layer jitters if its screen space transform is same on two successive +// commits, but has changed in between the commits. CalculateLayerJitter +// computes the jitter for the layer. +int LayerImpl::CalculateJitter() { + float jitter = 0.f; + performance_properties().translation_from_last_frame = 0.f; + performance_properties().last_commit_screen_space_transform = + draw_properties().screen_space_transform; + + if (!visible_layer_rect().IsEmpty()) { + if (draw_properties().screen_space_transform.ApproximatelyEqual( + performance_properties().last_commit_screen_space_transform)) { + float translation_from_last_commit = + TranslationFromActiveTreeLayerScreenSpaceTransform(this); + if (translation_from_last_commit > 0.f) { + performance_properties().num_fixed_point_hits++; + performance_properties().translation_from_last_frame = + translation_from_last_commit; + if (performance_properties().num_fixed_point_hits > + LayerTreeImpl::kFixedPointHitsThreshold) { + // Jitter = Translation from fixed point * sqrt(Area of the layer). + // The square root of the area is used instead of the area to match + // the dimensions of both terms on the rhs. + jitter += translation_from_last_commit * + sqrt(visible_layer_rect().size().GetArea()); + } + } else { + performance_properties().num_fixed_point_hits = 0; + } + } + } + return jitter; +} + } // namespace cc |