Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4240)

Unified Diff: cc/trees/property_tree.cc

Issue 2245463002: cc : Cache trasnforms to target even when target is a descendant (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/property_tree.cc
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 0d1adb0857ba7ecd8d4fa470085a2fe6f287ee69..2bb9047dfde7a9b9b9b194d4357e43305ea54548 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -1949,38 +1949,69 @@ const DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id,
gfx::Transform from_target;
const TransformNode* transform_node = transform_tree.Node(transform_id);
const EffectNode* effect_node = effect_tree.Node(effect_id);
+ const TransformNode* dest_node =
+ transform_tree.Node(effect_node->transform_id);
DCHECK(effect_id == effect_tree.kRootNodeId ||
effect_node->has_render_surface);
+ bool already_computed_inverse = false;
if (transform_id == effect_node->transform_id) {
target_space_transform.Scale(effect_node->surface_contents_scale.x(),
effect_node->surface_contents_scale.y());
- } else {
- // Compute transform from transform_id to effect_node->transform.
- DCHECK_GT(transform_id, effect_node->transform_id);
- const TransformNode* dest_node =
- transform_tree.Node(effect_node->transform_id);
- if (!dest_node || (dest_node->ancestors_are_invertible &&
- dest_node->node_and_ancestors_are_flat)) {
+ } else if (!dest_node || (dest_node->ancestors_are_invertible &&
+ dest_node->node_and_ancestors_are_flat)) {
+ // Compute transform from transform_id to effect_node->transform using
+ // screen space transforms.
+ target_space_transform.ConcatTransform(
+ transform_tree.ToScreen(transform_id));
+ if (dest_node)
target_space_transform.ConcatTransform(
- transform_tree.ToScreen(transform_id));
- if (dest_node)
- target_space_transform.ConcatTransform(
- transform_tree.FromScreen(dest_node->id));
- if (dest_node->needs_surface_contents_scale)
- target_space_transform.matrix().postScale(
- dest_node->surface_contents_scale.x(),
- dest_node->surface_contents_scale.y(), 1.f);
- } else {
- target_space_transform =
- GetDrawTransforms(transform_node->parent_id, effect_id).to_target;
- if (transform_node->flattens_inherited_transform)
- target_space_transform.FlattenTo2d();
- target_space_transform.PreconcatTransform(transform_node->to_parent);
+ transform_tree.FromScreen(dest_node->id));
+ if (dest_node->needs_surface_contents_scale)
+ target_space_transform.matrix().postScale(
+ dest_node->surface_contents_scale.x(),
+ dest_node->surface_contents_scale.y(), 1.f);
+ } else if (transform_node->id > dest_node->id) {
+ target_space_transform =
+ GetDrawTransforms(transform_node->parent_id, effect_id).to_target;
+ if (transform_node->flattens_inherited_transform)
+ target_space_transform.FlattenTo2d();
+ target_space_transform.PreconcatTransform(transform_node->to_parent);
+ } else {
+ const TransformNode* current = dest_node;
+ std::vector<int> source_to_destination;
+ source_to_destination.push_back(current->id);
+ current = transform_tree.parent(current);
+ for (; current && current->id > transform_node->id;
+ current = transform_tree.parent(current)) {
+ source_to_destination.push_back(current->id);
}
+ DCHECK_EQ(current, transform_node);
+ gfx::Transform combined_transform;
+ size_t source_to_destination_size = source_to_destination.size();
+ for (size_t i = 0; i < source_to_destination_size; ++i) {
+ size_t index = source_to_destination_size - 1 - i;
+ const TransformNode* node =
+ transform_tree.Node(source_to_destination[index]);
+ if (node->flattens_inherited_transform)
+ combined_transform.FlattenTo2d();
+ combined_transform.PreconcatTransform(node->to_parent);
+ }
+ if (effect_node->surface_contents_scale.x() != 0.f &&
+ effect_node->surface_contents_scale.y() != 0.f)
+ combined_transform.Scale(
+ 1.0f / effect_node->surface_contents_scale.x(),
+ 1.0f / effect_node->surface_contents_scale.y());
+ cached_data_.draw_transforms[effect_id][transform_id]
+ .transforms.invertible =
+ combined_transform.GetInverse(&target_space_transform);
+ from_target = combined_transform;
+ already_computed_inverse = true;
+ }
+ if (!already_computed_inverse) {
+ cached_data_.draw_transforms[effect_id][transform_id]
+ .transforms.invertible =
+ target_space_transform.GetInverse(&from_target);
}
- cached_data_.draw_transforms[effect_id][transform_id]
- .transforms.invertible =
- target_space_transform.GetInverse(&from_target);
cached_data_.draw_transforms[effect_id][transform_id].update_number =
cached_data_.property_tree_update_number;
cached_data_.draw_transforms[effect_id][transform_id]
@@ -2027,6 +2058,9 @@ bool PropertyTrees::ComputeTransformToTarget(int transform_id,
gfx::Transform* transform) const {
transform->MakeIdentity();
+ if (transform_id == TransformTree::kInvalidNodeId)
+ return true;
+
int target_transform_id;
const EffectNode* effect_node = effect_tree.Node(effect_id);
if (effect_id == EffectTree::kInvalidNodeId) {
@@ -2042,8 +2076,7 @@ bool PropertyTrees::ComputeTransformToTarget(int transform_id,
bool success = transform_tree.ComputeTransform(
transform_id, target_transform_id, transform);
- if (verify_transform_tree_calculations &&
- transform_id > target_transform_id) {
+ if (verify_transform_tree_calculations) {
gfx::Transform to_target;
to_target.ConcatTransform(
GetDrawTransforms(transform_id, effect_id).to_target);
@@ -2063,6 +2096,9 @@ bool PropertyTrees::ComputeTransformFromTarget(
gfx::Transform* transform) const {
transform->MakeIdentity();
+ if (transform_id == TransformTree::kInvalidNodeId)
+ return true;
+
int target_transform_id;
const EffectNode* effect_node = effect_tree.Node(effect_id);
if (effect_id == EffectTree::kInvalidNodeId) {
@@ -2078,8 +2114,7 @@ bool PropertyTrees::ComputeTransformFromTarget(
bool success = transform_tree.ComputeTransform(target_transform_id,
transform_id, transform);
- if (verify_transform_tree_calculations &&
- transform_id < target_transform_id) {
+ if (verify_transform_tree_calculations) {
auto draw_transforms = GetDrawTransforms(transform_id, effect_id);
gfx::Transform from_target;
from_target.ConcatTransform(draw_transforms.from_target);
« no previous file with comments | « cc/trees/layer_tree_host_common_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698