Commit 038bf1d0 authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Ensure transform nodes do not need a local update if the tree is clean

There are two dirty bits for whether TransformTree::UpdateLocalTransform
needs to be called: TransformNode::needs_local_transform_update, and
TransformTree::needs_update. If the transform tree does not need an
update, we skip calling TransformTree::UpdateLocalTransform.

This patch DCHECKS that no transform node needs an update if we are
skipping TransformTree::UpdateLocalTransform due to the tree not needing
an update.

Bug: 864567
Change-Id: Ib43ce23d8715c1cf802aaefb8e4068ce24fd07b7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1650120
Auto-Submit: Philip Rogers <pdr@chromium.org>
Commit-Queue: enne <enne@chromium.org>
Reviewed-by: default avatarenne <enne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#667326}
parent 6d85cbd5
......@@ -284,8 +284,11 @@ void LayerTreePixelTest::InitializeForLayerListMode(
ScrollNode scroll_node;
property_trees->scroll_tree.Insert(scroll_node, 0);
TransformNode transform_node;
property_trees->transform_tree.Insert(transform_node, 0);
TransformTree& transform_tree = property_trees->transform_tree;
auto& transform_node =
*transform_tree.Node(transform_tree.Insert(TransformNode(), 0));
transform_node.source_node_id = transform_node.parent_id;
transform_tree.set_needs_update(true);
*root_layer = Layer::Create();
(*root_layer)->SetBounds(gfx::Size(100, 100));
......
......@@ -838,8 +838,17 @@ void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
}
void ComputeTransforms(TransformTree* transform_tree) {
if (!transform_tree->needs_update())
if (!transform_tree->needs_update()) {
#if DCHECK_IS_ON()
// If the transform tree does not need an update, no TransformNode should
// need a local transform update.
for (int i = TransformTree::kContentsRootNodeId;
i < static_cast<int>(transform_tree->size()); ++i) {
DCHECK(!transform_tree->Node(i)->needs_local_transform_update);
}
#endif
return;
}
for (int i = TransformTree::kContentsRootNodeId;
i < static_cast<int>(transform_tree->size()); ++i)
transform_tree->UpdateTransforms(i);
......
......@@ -450,10 +450,12 @@ TEST_P(LayerTreeHostLayerListPixelTestNonSkia, ScaledMaskWithEffect) {
// Scale the mask with a non-integral transform. This will trigger the
// AA path in the renderer.
TransformNode transform;
transform.local = gfx::Transform();
transform.local.Scale(1.5, 1.5);
property_trees.transform_tree.Insert(transform, 1);
TransformTree& transform_tree = property_trees.transform_tree;
auto& transform_node =
*transform_tree.Node(transform_tree.Insert(TransformNode(), 1));
transform_node.source_node_id = transform_node.parent_id;
transform_node.local = gfx::Transform();
transform_node.local.Scale(1.5, 1.5);
scoped_refptr<SolidColorLayer> background =
CreateSolidColorLayer(gfx::Rect(100, 100), SK_ColorWHITE);
......
......@@ -233,6 +233,8 @@ void TransformTree::UpdateTransforms(int id) {
UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node);
UpdateTransformChanged(node, parent_node, source_node);
UpdateNodeAndAncestorsAreAnimatedOrInvertible(node, parent_node);
DCHECK(!node->needs_local_transform_update);
}
bool TransformTree::IsDescendant(int desc_id, int source_id) const {
......
......@@ -67,7 +67,8 @@ struct CC_EXPORT TransformNode {
// context.
int sorting_context_id;
// TODO(vollick): will be moved when accelerated effects are implemented.
// True if |TransformTree::UpdateLocalTransform| needs to be called which
// will update |to_parent| and |source_to_parent| (if possible).
bool needs_local_transform_update : 1;
// Whether this node or any ancestor has a potentially running
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment