Chromium Code Reviews| Index: cc/trees/property_tree.cc |
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
| index 912226b25e525f0e9045e26070783bbe0cb7c5eb..25764dd7db51bb5c197d0354406f20bbc940f278 100644 |
| --- a/cc/trees/property_tree.cc |
| +++ b/cc/trees/property_tree.cc |
| @@ -258,7 +258,8 @@ void TransformTree::UpdateTransforms(int id) { |
| UpdateSurfaceContentsScale(node); |
| UpdateAnimationProperties(node, parent_node); |
| UpdateSnapping(node); |
| - UpdateTargetSpaceTransform(node, target_node); |
| + if (!property_trees()->verify_transform_tree_calculations) |
| + UpdateTargetSpaceTransform(node, target_node); |
| UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node); |
| UpdateTransformChanged(node, parent_node, source_node); |
| UpdateNodeAndAncestorsAreAnimatedOrInvertible(node, parent_node); |
| @@ -315,19 +316,11 @@ void TransformTree::CombineTransformsBetween(int source_id, |
| dest->surface_contents_scale.y() != 0.f; |
| DCHECK(destination_has_non_zero_surface_contents_scale || |
| !dest->ancestors_are_invertible); |
| - for (; current && current->id > dest_id; current = parent(current)) { |
| - if (destination_has_non_zero_surface_contents_scale && |
| - TargetId(current->id) == dest_id && |
| - ContentTargetId(current->id) == dest_id) |
| - break; |
| + for (; current && current->id > dest_id; current = parent(current)) |
| source_to_destination.push_back(current->id); |
| - } |
| gfx::Transform combined_transform; |
| if (current->id > dest_id) { |
| - // TODO(sunxd): Instead of using target space transform, only use to_parent |
| - // here when we fully implement computing draw transforms on demand. |
| - combined_transform = ToTarget(current->id, kInvalidNodeId); |
|
jaydasika
2016/09/02 18:10:01
This is not behind a flag. Is it fine to remove it
sunxd
2016/09/02 18:13:10
Removing it does make performance suffer. I can ma
|
| // The stored target space transform has surface contents scale baked in, |
| // but we need the unscaled transform. |
| combined_transform.matrix().postScale( |
| @@ -670,9 +663,7 @@ const gfx::Transform& TransformTree::FromTarget(int node_id, |
| DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| if (effect_id != kInvalidNodeId && |
| property_trees()->verify_transform_tree_calculations) { |
| - const gfx::Transform& transform = |
| - property_trees()->GetDrawTransforms(node_id, effect_id).from_target; |
| - CHECK(transform.ApproximatelyEqual(cached_data_[node_id].from_target)); |
| + return property_trees()->GetDrawTransforms(node_id, effect_id).from_target; |
| } |
| return cached_data_[node_id].from_target; |
| } |
| @@ -688,12 +679,7 @@ const gfx::Transform& TransformTree::ToTarget(int node_id, |
| DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| if (effect_id != kInvalidNodeId && |
| property_trees()->verify_transform_tree_calculations) { |
| - const gfx::Transform& transform = |
| - property_trees()->GetDrawTransforms(node_id, effect_id).to_target; |
| - if (property_trees()->non_root_surfaces_enabled) |
| - CHECK(transform.ApproximatelyEqual(cached_data_[node_id].to_target)); |
| - else |
| - CHECK(transform.ApproximatelyEqual(cached_data_[node_id].to_screen)); |
| + return property_trees()->GetDrawTransforms(node_id, effect_id).to_target; |
| } |
| return cached_data_[node_id].to_target; |
| } |
| @@ -1946,8 +1932,7 @@ CombinedAnimationScale PropertyTrees::GetAnimationScales( |
| // Computing maximum animated scale in the presence of non-scale/translation |
| // transforms isn't supported. |
| bool failed_for_non_scale_or_translation = |
| - !transform_tree.Node(transform_node_id) |
| - ->to_parent.IsScaleOrTranslation(); |
| + !node->to_parent.IsScaleOrTranslation(); |
| // We don't attempt to accumulate animation scale from multiple nodes with |
| // scale animations, because of the risk of significant overestimation. For |
| @@ -2137,10 +2122,8 @@ void PropertyTrees::ResetCachedData() { |
| cached_data_.property_tree_update_number = 0; |
| cached_data_.animation_scales = std::vector<AnimationScaleData>( |
| transform_tree.nodes().size(), AnimationScaleData()); |
| - cached_data_.draw_transforms = |
| - std::vector<std::unordered_map<int, DrawTransformData>>( |
| - effect_tree.nodes().size(), |
| - std::unordered_map<int, DrawTransformData>()); |
| + cached_data_.draw_transforms = std::vector<std::map<int, DrawTransformData>>( |
| + effect_tree.nodes().size(), std::map<int, DrawTransformData>()); |
| } |
| void PropertyTrees::UpdateCachedNumber() { |
| @@ -2185,18 +2168,19 @@ bool PropertyTrees::ComputeTransformToTarget(int transform_id, |
| target_transform_id = effect_node->transform_id; |
| } |
| - bool success = transform_tree.ComputeTransform( |
| - transform_id, target_transform_id, transform); |
| + bool success = true; |
| if (verify_transform_tree_calculations) { |
| - gfx::Transform to_target; |
| - to_target.ConcatTransform( |
| - GetDrawTransforms(transform_id, effect_id).to_target); |
| + auto draw_transforms = GetDrawTransforms(transform_id, effect_id); |
| + success = draw_transforms.invertible; |
| + transform->ConcatTransform(draw_transforms.to_target); |
| if (effect_node->surface_contents_scale.x() != 0.f && |
| effect_node->surface_contents_scale.y() != 0.f) |
| - to_target.matrix().postScale( |
| + transform->matrix().postScale( |
| 1.0f / effect_node->surface_contents_scale.x(), |
| 1.0f / effect_node->surface_contents_scale.y(), 1.0f); |
| - DCHECK(to_target.ApproximatelyEqual(*transform)); |
| + } else { |
| + success = transform_tree.ComputeTransform(transform_id, target_transform_id, |
| + transform); |
| } |
| return success; |
| } |
| @@ -2223,16 +2207,16 @@ bool PropertyTrees::ComputeTransformFromTarget( |
| target_transform_id = effect_node->transform_id; |
| } |
| - bool success = transform_tree.ComputeTransform(target_transform_id, |
| - transform_id, transform); |
| + bool success = true; |
| if (verify_transform_tree_calculations) { |
| auto draw_transforms = GetDrawTransforms(transform_id, effect_id); |
| - gfx::Transform from_target; |
| - from_target.ConcatTransform(draw_transforms.from_target); |
| - from_target.Scale(effect_node->surface_contents_scale.x(), |
| - effect_node->surface_contents_scale.y()); |
| - DCHECK(from_target.ApproximatelyEqual(*transform) || |
| - !draw_transforms.invertible); |
| + success = draw_transforms.invertible; |
| + transform->ConcatTransform(draw_transforms.from_target); |
| + transform->Scale(effect_node->surface_contents_scale.x(), |
| + effect_node->surface_contents_scale.y()); |
| + } else { |
| + success = transform_tree.ComputeTransform(target_transform_id, transform_id, |
| + transform); |
| } |
| return success; |
| } |