diff options
author | jaydasika <jaydasika@chromium.org> | 2016-02-16 18:46:11 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-17 02:47:02 +0000 |
commit | adfec8e15d041e310fd741e34db1589777236112 (patch) | |
tree | 9e288ba628d9ecaa06dabca5fd0fbde3e00da333 /cc | |
parent | 8e8218c21ca38286e6b2a0b1c18399267e94ec16 (diff) | |
download | chromium_src-adfec8e15d041e310fd741e34db1589777236112.zip chromium_src-adfec8e15d041e310fd741e34db1589777236112.tar.gz chromium_src-adfec8e15d041e310fd741e34db1589777236112.tar.bz2 |
cc :: Move tracking of layer_property_changed to main thread (2)
This is a follow up to http://crrev.com/1688563002.
Properties moved in this CL are :
bounds, position, transform_origin
BUG=584512
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1697613002
Cr-Commit-Position: refs/heads/master@{#375768}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/layer.cc | 6 | ||||
-rw-r--r-- | cc/layers/layer_impl.cc | 22 | ||||
-rw-r--r-- | cc/layers/layer_impl.h | 2 | ||||
-rw-r--r-- | cc/layers/layer_impl_unittest.cc | 12 | ||||
-rw-r--r-- | cc/layers/layer_unittest.cc | 79 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 2 | ||||
-rw-r--r-- | cc/proto/property_tree.proto | 5 | ||||
-rw-r--r-- | cc/trees/damage_tracker_unittest.cc | 8 | ||||
-rw-r--r-- | cc/trees/layer_tree_host.cc | 1 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 10 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 5 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl_unittest.cc | 1 | ||||
-rw-r--r-- | cc/trees/property_tree.cc | 26 | ||||
-rw-r--r-- | cc/trees/property_tree.h | 7 |
14 files changed, 169 insertions, 17 deletions
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 50c138f..24eed8d 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc @@ -366,6 +366,8 @@ void Layer::SetBounds(const gfx::Size& size) { if (!layer_tree_host_) return; + if (masks_to_bounds()) + SetSubtreePropertyChanged(); SetNeedsCommit(); } @@ -636,6 +638,7 @@ void Layer::SetPosition(const gfx::PointF& position) { if (!layer_tree_host_) return; + SetSubtreePropertyChanged(); if (TransformNode* transform_node = layer_tree_host_->property_trees()->transform_tree.Node( transform_tree_index())) { @@ -643,6 +646,7 @@ void Layer::SetPosition(const gfx::PointF& position) { transform_node->data.update_post_local_transform(position, transform_origin()); transform_node->data.needs_local_transform_update = true; + transform_node->data.transform_changed = true; layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); SetNeedsCommitNoRebuild(); return; @@ -721,6 +725,7 @@ void Layer::SetTransformOrigin(const gfx::Point3F& transform_origin) { if (!layer_tree_host_) return; + SetSubtreePropertyChanged(); if (TransformNode* transform_node = layer_tree_host_->property_trees()->transform_tree.Node( transform_tree_index())) { @@ -729,6 +734,7 @@ void Layer::SetTransformOrigin(const gfx::Point3F& transform_origin) { transform_node->data.update_post_local_transform(position(), transform_origin); transform_node->data.needs_local_transform_update = true; + transform_node->data.transform_changed = true; layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); SetNeedsCommitNoRebuild(); return; diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 0e4d326..a938515 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc @@ -693,6 +693,17 @@ void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { } } +bool LayerImpl::LayerPropertyChanged() const { + if (layer_property_changed_) + return true; + TransformNode* node = + layer_tree_impl()->property_trees()->transform_tree.Node( + transform_tree_index()); + if (node && node->data.transform_changed) + return true; + return false; +} + void LayerImpl::NoteLayerPropertyChanged() { layer_property_changed_ = true; layer_tree_impl()->set_needs_update_draw_properties(); @@ -735,6 +746,11 @@ const char* LayerImpl::LayerTypeAsString() const { void LayerImpl::ResetAllChangeTrackingForSubtree() { layer_property_changed_ = false; + if (TransformNode* transform_node = + layer_tree_impl_->property_trees()->transform_tree.Node( + transform_tree_index())) { + transform_node->data.transform_changed = false; + } update_rect_.SetRect(0, 0, 0, 0); damage_rect_.SetRect(0, 0, 0, 0); @@ -930,9 +946,7 @@ void LayerImpl::SetBounds(const gfx::Size& bounds) { layer_tree_impl()->DidUpdateScrollState(id()); - if (masks_to_bounds()) - NoteLayerPropertyChangedForSubtree(); - else + if (!masks_to_bounds()) NoteLayerPropertyChanged(); } @@ -1034,7 +1048,6 @@ void LayerImpl::SetTransformOrigin(const gfx::Point3F& transform_origin) { if (transform_origin_ == transform_origin) return; transform_origin_ = transform_origin; - NoteLayerPropertyChangedForSubtree(); } void LayerImpl::SetBackgroundColor(SkColor background_color) { @@ -1211,7 +1224,6 @@ void LayerImpl::SetPosition(const gfx::PointF& position) { return; position_ = position; - NoteLayerPropertyChangedForSubtree(); } void LayerImpl::SetShouldFlattenTransform(bool flatten) { diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index fb9195f..93dff96 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h @@ -573,7 +573,7 @@ class CC_EXPORT LayerImpl : public LayerAnimationValueObserver, void SetStackingOrderChanged(bool stacking_order_changed); - bool LayerPropertyChanged() const { return layer_property_changed_; } + bool LayerPropertyChanged() const; void ResetAllChangeTrackingForSubtree(); diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc index 5bde4a3..6813aea 100644 --- a/cc/layers/layer_impl_unittest.cc +++ b/cc/layers/layer_impl_unittest.cc @@ -161,11 +161,8 @@ TEST(LayerImplTest, VerifyLayerChangesAreTrackedProperly) { host_impl.active_tree()->BuildPropertyTreesForTesting(); // Changing these properties affects the entire subtree of layers. - EXECUTE_AND_VERIFY_SUBTREE_CHANGED( - root->SetTransformOrigin(arbitrary_point_3f)); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(arbitrary_filters)); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(FilterOperations())); - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetPosition(arbitrary_point_f)); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->ScrollBy(arbitrary_vector2d)); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollDelta(gfx::Vector2d())); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->PushScrollOffsetFromMainThread( @@ -188,9 +185,6 @@ TEST(LayerImplTest, VerifyLayerChangesAreTrackedProperly) { host_impl.active_tree()->BuildPropertyTreesForTesting(); root->SetMasksToBounds(true); - // Should be a different size than previous call, to ensure it marks tree - // changed. - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBounds(arbitrary_size)); host_impl.active_tree()->property_trees()->needs_rebuild = true; host_impl.active_tree()->BuildPropertyTreesForTesting(); @@ -342,7 +336,8 @@ TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( layer->SetReplicaLayer(LayerImpl::Create(host_impl.active_tree(), 5)); layer->NoteLayerPropertyChanged()); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer2->SetPosition(arbitrary_point_f)); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer2->SetPosition(arbitrary_point_f); + layer->NoteLayerPropertyChanged()); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetShouldFlattenTransform(false); layer->NoteLayerPropertyChanged()); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->Set3dSortingContextId(1); @@ -358,7 +353,8 @@ TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBlendMode(arbitrary_blend_mode); layer->NoteLayerPropertyChanged()); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetTransform(arbitrary_transform)); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size)); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size); + layer->NoteLayerPropertyChanged()); // Unrelated functions, set to the same values, no needs update. VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc index f9904c0..1d76738 100644 --- a/cc/layers/layer_unittest.cc +++ b/cc/layers/layer_unittest.cc @@ -893,30 +893,39 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AtLeast(1)); scoped_refptr<Layer> root = Layer::Create(layer_settings_); scoped_refptr<Layer> child = Layer::Create(layer_settings_); + scoped_refptr<Layer> child2 = Layer::Create(layer_settings_); scoped_refptr<Layer> grand_child = Layer::Create(layer_settings_); scoped_refptr<Layer> dummy_layer1 = Layer::Create(layer_settings_); scoped_refptr<Layer> dummy_layer2 = Layer::Create(layer_settings_); layer_tree_host_->SetRootLayer(root); root->AddChild(child); + root->AddChild(child2); child->AddChild(grand_child); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + child->SetForceRenderSurface(true); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + child2->SetScrollParent(grand_child.get()); SkXfermode::Mode arbitrary_blend_mode = SkXfermode::kMultiply_Mode; scoped_ptr<LayerImpl> root_impl = LayerImpl::Create(host_impl_.active_tree(), 1); scoped_ptr<LayerImpl> child_impl = LayerImpl::Create(host_impl_.active_tree(), 2); - scoped_ptr<LayerImpl> grand_child_impl = + scoped_ptr<LayerImpl> child2_impl = LayerImpl::Create(host_impl_.active_tree(), 3); - scoped_ptr<LayerImpl> dummy_layer1_impl = + scoped_ptr<LayerImpl> grand_child_impl = LayerImpl::Create(host_impl_.active_tree(), 4); - scoped_ptr<LayerImpl> dummy_layer2_impl = + scoped_ptr<LayerImpl> dummy_layer1_impl = LayerImpl::Create(host_impl_.active_tree(), 5); + scoped_ptr<LayerImpl> dummy_layer2_impl = + LayerImpl::Create(host_impl_.active_tree(), 6); EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetMaskLayer(dummy_layer1.get())); EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get()); dummy_layer1->PushPropertiesTo(dummy_layer1_impl.get())); @@ -925,6 +934,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); @@ -932,6 +942,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1); @@ -939,6 +950,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get()); dummy_layer2->PushPropertiesTo(dummy_layer2_impl.get())); @@ -947,6 +959,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); @@ -954,6 +967,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get()); dummy_layer2->PushPropertiesTo(dummy_layer2_impl.get())); @@ -962,6 +976,7 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); @@ -969,10 +984,68 @@ TEST_F(LayerTest, LayerPropertyChangedForSubtree) { EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get()); child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBlendMode(arbitrary_blend_mode)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + root->PushPropertiesTo(root_impl.get()); + child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get())); + + // Should be a different size than previous call, to ensure it marks tree + // changed. + gfx::Size arbitrary_size = gfx::Size(111, 222); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBounds(arbitrary_size)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + root->PushPropertiesTo(root_impl.get()); + child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get())); + + gfx::PointF arbitrary_point_f = gfx::PointF(0.125f, 0.25f); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + root->SetPosition(arbitrary_point_f); + TransformNode* node = layer_tree_host_->property_trees()->transform_tree.Node( + root->transform_tree_index()); + EXPECT_TRUE(node->data.transform_changed); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + root->PushPropertiesTo(root_impl.get()); + child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get()); + layer_tree_host_->property_trees()->transform_tree.ResetChangeTracking()); + EXPECT_FALSE(node->data.transform_changed); + + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + child->SetPosition(arbitrary_point_f); + node = layer_tree_host_->property_trees()->transform_tree.Node( + child->transform_tree_index()); + EXPECT_TRUE(node->data.transform_changed); + // child2 is not in the subtree of child, but its scroll parent is. So, its + // to_screen will be effected by change in position of child2. + layer_tree_host_->property_trees()->transform_tree.UpdateTransforms( + child2->transform_tree_index()); + node = layer_tree_host_->property_trees()->transform_tree.Node( + child2->transform_tree_index()); + EXPECT_TRUE(node->data.transform_changed); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + child->PushPropertiesTo(child_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get()); + layer_tree_host_->property_trees()->transform_tree.ResetChangeTracking()); + node = layer_tree_host_->property_trees()->transform_tree.Node( + child->transform_tree_index()); + EXPECT_FALSE(node->data.transform_changed); + + gfx::Point3F arbitrary_point_3f = gfx::Point3F(0.125f, 0.25f, 0.f); + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + root->SetTransformOrigin(arbitrary_point_3f); + node = layer_tree_host_->property_trees()->transform_tree.Node( + root->transform_tree_index()); + EXPECT_TRUE(node->data.transform_changed); } TEST_F(LayerTest, AddAndRemoveChild) { diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 9d1bbc9..1447442 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -3961,6 +3961,7 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, // Full occlusion. layer1->SetPosition(gfx::PointF()); + layer1->NoteLayerPropertyChanged(); RebuildPropertyTreesOnPendingTree(); host_impl_.AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200)); @@ -4068,6 +4069,7 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, // Full occlusion. layer1->SetPosition(gfx::PointF()); + layer1->NoteLayerPropertyChanged(); RebuildPropertyTreesOnPendingTree(); host_impl_.AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200)); diff --git a/cc/proto/property_tree.proto b/cc/proto/property_tree.proto index 0f02d7e..7622d68 100644 --- a/cc/proto/property_tree.proto +++ b/cc/proto/property_tree.proto @@ -18,6 +18,7 @@ package cc.proto; // cc/trees/property_tree.h // Proto for struct TransformNodeData. +// NEXT ID: 41 message TranformNodeData { optional Transform pre_local = 1; optional Transform local = 2; @@ -48,6 +49,7 @@ message TranformNodeData { optional bool affected_by_outer_viewport_bounds_delta_x = 26; optional bool affected_by_outer_viewport_bounds_delta_y = 27; optional bool in_subtree_of_page_scale_layer = 28; + optional bool transform_changed = 40; optional float post_local_scale_factor = 29; optional float local_maximum_animation_target_scale = 30; optional float local_starting_animation_scale = 31; @@ -63,6 +65,7 @@ message TranformNodeData { } // Proto for struct ClipNodeData. +// NEXT ID: 12 message ClipNodeData { optional RectF clip = 1; optional RectF combined_clip_in_target_space = 2; @@ -79,6 +82,7 @@ message ClipNodeData { } // Proto for struct EffectNodeData. +// NEXT ID: 11 message EffectNodeData { optional float opacity = 1; optional float screen_space_opacity = 2; @@ -93,6 +97,7 @@ message EffectNodeData { } // Proto for struct ScrollNodeData +// NEXT ID: 9 message ScrollNodeData { optional bool scrollable = 1; optional int32 main_thread_scrolling_reasons = 2; diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc index 5c86483a..d62b6cc 100644 --- a/cc/trees/damage_tracker_unittest.cc +++ b/cc/trees/damage_tracker_unittest.cc @@ -394,6 +394,7 @@ TEST_F(DamageTrackerTest, VerifyDamageForPropertyChanges) { // Then, test the actual layer movement. ClearDamageForAllSurfaces(root.get()); child->SetPosition(gfx::PointF(200.f, 230.f)); + child->NoteLayerPropertyChanged(); EmulateDrawingOneFrame(root.get()); // Expect damage to be the combination of the previous one and the new one. @@ -417,6 +418,7 @@ TEST_F(DamageTrackerTest, VerifyDamageForTransformedLayer) { child->SetTransformOrigin(gfx::Point3F( child->bounds().width() * 0.5f, child->bounds().height() * 0.5f, 0.f)); child->SetPosition(gfx::PointF(85.f, 85.f)); + child->NoteLayerPropertyChanged(); EmulateDrawingOneFrame(root.get()); // Sanity check that the layer actually moved to (85, 85), damaging its old @@ -905,11 +907,16 @@ TEST_F(DamageTrackerTest, VerifyDamageForSurfaceChangeFromAncestorLayer) { scoped_ptr<LayerImpl> root = CreateAndSetUpTestTreeWithTwoSurfaces(); LayerImpl* child1 = root->children()[0].get(); + LayerImpl* grand_child1 = child1->children()[0].get(); + LayerImpl* grand_child2 = child1->children()[1].get(); gfx::Rect child_damage_rect; gfx::Rect root_damage_rect; ClearDamageForAllSurfaces(root.get()); child1->SetPosition(gfx::PointF(50.f, 50.f)); + child1->NoteLayerPropertyChanged(); + grand_child1->NoteLayerPropertyChanged(); + grand_child2->NoteLayerPropertyChanged(); EmulateDrawingOneFrame(root.get()); child_damage_rect = child1->render_surface()->damage_tracker()->current_damage_rect(); @@ -1088,6 +1095,7 @@ TEST_F(DamageTrackerTest, VerifyDamageForReplica) { ClearDamageForAllSurfaces(root.get()); gfx::Rect old_content_rect = child1->render_surface()->content_rect(); grand_child1->SetPosition(gfx::PointF(195.f, 205.f)); + grand_child1->NoteLayerPropertyChanged(); EmulateDrawingOneFrame(root.get()); ASSERT_EQ(old_content_rect.width(), child1->render_surface()->content_rect().width()); diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index ce09a69..42a97ea 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc @@ -484,6 +484,7 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread(); micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); + property_trees_.transform_tree.ResetChangeTracking(); } void LayerTreeHost::WillCommit() { diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 99f7781..1bcd37d 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -1705,6 +1705,10 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame) { DidDrawDamagedArea(); } active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); + active_tree_->root_layer() + ->layer_tree_impl() + ->property_trees() + ->transform_tree.ResetChangeTracking(); active_tree_->set_has_ever_been_drawn(true); devtools_instrumentation::DidDrawFrame(id_); @@ -1992,6 +1996,12 @@ void LayerTreeHostImpl::ActivateSyncTree() { TreeSynchronizer::PushProperties(pending_tree_->root_layer(), active_tree_->root_layer()); pending_tree_->PushPropertiesTo(active_tree_.get()); + if (pending_tree_->root_layer()) { + pending_tree_->root_layer() + ->layer_tree_impl() + ->property_trees() + ->transform_tree.ResetChangeTracking(); + } // Now that we've synced everything from the pending tree to the active // tree, rename the pending tree the recycle tree so we can reuse it on the diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index bb65c02..756ad9a 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -3273,6 +3273,7 @@ TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) { // Ensure visible_layer_rect for layer is not empty layer->SetPosition(gfx::PointF()); + layer->NoteLayerPropertyChanged(); EXPECT_FALSE(layer->will_draw_called()); EXPECT_FALSE(layer->did_draw_called()); @@ -6599,6 +6600,10 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { // expected swap rect: vertically flipped, with origin at bottom left corner. layer_tree_host_impl->active_tree()->root_layer()->children()[0]->SetPosition( gfx::PointF()); + layer_tree_host_impl->active_tree() + ->root_layer() + ->children()[0] + ->NoteLayerPropertyChanged(); layer_tree_host_impl->active_tree()->property_trees()->needs_rebuild = true; layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting(); EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame)); diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc index 32cfe45..bd8a810 100644 --- a/cc/trees/layer_tree_impl_unittest.cc +++ b/cc/trees/layer_tree_impl_unittest.cc @@ -2017,6 +2017,7 @@ TEST_F(LayerTreeImplTest, HitTestingTouchHandlerRegionsForLayerThatIsNotDrawn) { // inside the test_layer. test_layer = host_impl().active_tree()->root_layer()->children()[0].get(); test_layer->SetPosition(gfx::PointF(10.f, 10.f)); + test_layer->NoteLayerPropertyChanged(); expected_screen_space_transform.MakeIdentity(); expected_screen_space_transform.Translate(10.f, 10.f); diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index a22961c..579c4ee 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc @@ -145,6 +145,7 @@ TransformNodeData::TransformNodeData() affected_by_outer_viewport_bounds_delta_x(false), affected_by_outer_viewport_bounds_delta_y(false), in_subtree_of_page_scale_layer(false), + transform_changed(false), post_local_scale_factor(1.0f), local_maximum_animation_target_scale(0.f), local_starting_animation_scale(0.f), @@ -187,6 +188,7 @@ bool TransformNodeData::operator==(const TransformNodeData& other) const { other.affected_by_outer_viewport_bounds_delta_y && in_subtree_of_page_scale_layer == other.in_subtree_of_page_scale_layer && + transform_changed == other.transform_changed && post_local_scale_factor == other.post_local_scale_factor && local_maximum_animation_target_scale == other.local_maximum_animation_target_scale && @@ -270,6 +272,7 @@ void TransformNodeData::ToProtobuf(proto::TreeNode* proto) const { affected_by_outer_viewport_bounds_delta_y); data->set_in_subtree_of_page_scale_layer(in_subtree_of_page_scale_layer); + data->set_transform_changed(transform_changed); data->set_post_local_scale_factor(post_local_scale_factor); data->set_local_maximum_animation_target_scale( local_maximum_animation_target_scale); @@ -335,6 +338,7 @@ void TransformNodeData::FromProtobuf(const proto::TreeNode& proto) { data.affected_by_outer_viewport_bounds_delta_y(); in_subtree_of_page_scale_layer = data.in_subtree_of_page_scale_layer(); + transform_changed = data.transform_changed(); post_local_scale_factor = data.post_local_scale_factor(); local_maximum_animation_target_scale = data.local_maximum_animation_target_scale(); @@ -608,10 +612,18 @@ bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { node->parent_id != node->data.source_node_id); } +void TransformTree::ResetChangeTracking() { + for (int id = 1; id < static_cast<int>(size()); ++id) { + TransformNode* node = Node(id); + node->data.transform_changed = false; + } +} + void TransformTree::UpdateTransforms(int id) { TransformNode* node = Node(id); TransformNode* parent_node = parent(node); TransformNode* target_node = Node(node->data.target_id); + TransformNode* source_node = Node(node->data.source_node_id); if (node->data.needs_local_transform_update || NeedsSourceToParentUpdate(node)) UpdateLocalTransform(node); @@ -623,6 +635,7 @@ void TransformTree::UpdateTransforms(int id) { UpdateAnimationProperties(node, parent_node); UpdateSnapping(node); UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node); + UpdateTransformChanged(node, parent_node, source_node); } bool TransformTree::IsDescendant(int desc_id, int source_id) const { @@ -982,6 +995,19 @@ void TransformTree::UpdateSnapping(TransformNode* node) { node->data.scroll_snap = translation; } +void TransformTree::UpdateTransformChanged(TransformNode* node, + TransformNode* parent_node, + TransformNode* source_node) { + if (parent_node && parent_node->data.transform_changed) { + node->data.transform_changed = true; + return; + } + + if (source_node && source_node->id != parent_node->id && + source_to_parent_updates_allowed_ && source_node->data.transform_changed) + node->data.transform_changed = true; +} + void TransformTree::SetDeviceTransform(const gfx::Transform& transform, gfx::PointF root_position) { gfx::Transform root_post_local = transform; diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h index 5265bc6..26182d7 100644 --- a/cc/trees/property_tree.h +++ b/cc/trees/property_tree.h @@ -135,6 +135,9 @@ struct CC_EXPORT TransformNodeData { // layer scale factor should include the page scale factor. bool in_subtree_of_page_scale_layer : 1; + // We need to track changes to to_screen transform to compute the damage rect. + bool transform_changed : 1; + // TODO(vollick): will be moved when accelerated effects are implemented. float post_local_scale_factor; @@ -388,6 +391,7 @@ class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> { // aligned with respect to one another. bool Are2DAxisAligned(int source_id, int dest_id) const; + void ResetChangeTracking(); // Updates the parent, target, and screen space transforms and snapping. void UpdateTransforms(int id); @@ -477,6 +481,9 @@ class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> { TransformNode* parent_node); void UndoSnapping(TransformNode* node); void UpdateSnapping(TransformNode* node); + void UpdateTransformChanged(TransformNode* node, + TransformNode* parent_node, + TransformNode* source_node); void UpdateNodeAndAncestorsHaveIntegerTranslations( TransformNode* node, TransformNode* parent_node); |