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

Side by Side 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: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after
1942 } 1942 }
1943 1943
1944 const DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, 1944 const DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id,
1945 int effect_id) const { 1945 int effect_id) const {
1946 if (cached_data_.draw_transforms[effect_id][transform_id].update_number != 1946 if (cached_data_.draw_transforms[effect_id][transform_id].update_number !=
1947 cached_data_.property_tree_update_number) { 1947 cached_data_.property_tree_update_number) {
1948 gfx::Transform target_space_transform; 1948 gfx::Transform target_space_transform;
1949 gfx::Transform from_target; 1949 gfx::Transform from_target;
1950 const TransformNode* transform_node = transform_tree.Node(transform_id); 1950 const TransformNode* transform_node = transform_tree.Node(transform_id);
1951 const EffectNode* effect_node = effect_tree.Node(effect_id); 1951 const EffectNode* effect_node = effect_tree.Node(effect_id);
1952 const TransformNode* dest_node =
1953 transform_tree.Node(effect_node->transform_id);
1952 DCHECK(effect_id == effect_tree.kRootNodeId || 1954 DCHECK(effect_id == effect_tree.kRootNodeId ||
1953 effect_node->has_render_surface); 1955 effect_node->has_render_surface);
1956 bool already_computed_inverse = false;
1954 if (transform_id == effect_node->transform_id) { 1957 if (transform_id == effect_node->transform_id) {
1955 target_space_transform.Scale(effect_node->surface_contents_scale.x(), 1958 target_space_transform.Scale(effect_node->surface_contents_scale.x(),
1956 effect_node->surface_contents_scale.y()); 1959 effect_node->surface_contents_scale.y());
1960 } else if (!dest_node || (dest_node->ancestors_are_invertible &&
1961 dest_node->node_and_ancestors_are_flat)) {
1962 // Compute transform from transform_id to effect_node->transform.
1963 target_space_transform.ConcatTransform(
1964 transform_tree.ToScreen(transform_id));
1965 if (dest_node)
1966 target_space_transform.ConcatTransform(
1967 transform_tree.FromScreen(dest_node->id));
1968 if (dest_node->needs_surface_contents_scale)
1969 target_space_transform.matrix().postScale(
1970 dest_node->surface_contents_scale.x(),
1971 dest_node->surface_contents_scale.y(), 1.f);
1972 } else if (transform_node->id > dest_node->id) {
1973 target_space_transform =
1974 GetDrawTransforms(transform_node->parent_id, effect_id).to_target;
1975 if (transform_node->flattens_inherited_transform)
1976 target_space_transform.FlattenTo2d();
1977 target_space_transform.PreconcatTransform(transform_node->to_parent);
1957 } else { 1978 } else {
1958 // Compute transform from transform_id to effect_node->transform. 1979 const TransformNode* current = dest_node;
1959 DCHECK_GT(transform_id, effect_node->transform_id); 1980 std::vector<int> source_to_destination;
1960 const TransformNode* dest_node = 1981 source_to_destination.push_back(current->id);
1961 transform_tree.Node(effect_node->transform_id); 1982 current = transform_tree.parent(current);
1962 if (!dest_node || (dest_node->ancestors_are_invertible && 1983 for (; current && current->id > transform_node->id;
1963 dest_node->node_and_ancestors_are_flat)) { 1984 current = transform_tree.parent(current)) {
1964 target_space_transform.ConcatTransform( 1985 source_to_destination.push_back(current->id);
1965 transform_tree.ToScreen(transform_id));
1966 if (dest_node)
1967 target_space_transform.ConcatTransform(
1968 transform_tree.FromScreen(dest_node->id));
1969 if (dest_node->needs_surface_contents_scale)
1970 target_space_transform.matrix().postScale(
1971 dest_node->surface_contents_scale.x(),
1972 dest_node->surface_contents_scale.y(), 1.f);
1973 } else {
1974 target_space_transform =
1975 GetDrawTransforms(transform_node->parent_id, effect_id).to_target;
1976 if (transform_node->flattens_inherited_transform)
1977 target_space_transform.FlattenTo2d();
1978 target_space_transform.PreconcatTransform(transform_node->to_parent);
1979 } 1986 }
1987 DCHECK_EQ(current, transform_node);
1988 gfx::Transform combined_transform;
1989 size_t source_to_destination_size = source_to_destination.size();
1990 for (size_t i = 0; i < source_to_destination_size; ++i) {
1991 size_t index = source_to_destination_size - 1 - i;
1992 const TransformNode* node =
1993 transform_tree.Node(source_to_destination[index]);
1994 if (node->flattens_inherited_transform)
1995 combined_transform.FlattenTo2d();
1996 combined_transform.PreconcatTransform(node->to_parent);
1997 }
1998 if (effect_node->surface_contents_scale.x() != 0.f &&
1999 effect_node->surface_contents_scale.y() != 0.f)
2000 combined_transform.Scale(
2001 1.0f / effect_node->surface_contents_scale.x(),
2002 1.0f / effect_node->surface_contents_scale.y());
2003 cached_data_.draw_transforms[effect_id][transform_id]
2004 .transforms.invertible =
2005 combined_transform.GetInverse(&target_space_transform);
2006 target_space_transform.PreconcatTransform(combined_transform);
ajuma 2016/08/11 23:17:56 I'm probably missing something, but doesn't this l
jaydasika 2016/08/12 00:37:21 Oops, my bad. I din't catch it as there are no uni
2007 from_target = combined_transform;
2008 already_computed_inverse = true;
1980 } 2009 }
1981 cached_data_.draw_transforms[effect_id][transform_id] 2010 if (!already_computed_inverse) {
1982 .transforms.invertible = 2011 cached_data_.draw_transforms[effect_id][transform_id]
1983 target_space_transform.GetInverse(&from_target); 2012 .transforms.invertible =
2013 target_space_transform.GetInverse(&from_target);
2014 }
1984 cached_data_.draw_transforms[effect_id][transform_id].update_number = 2015 cached_data_.draw_transforms[effect_id][transform_id].update_number =
1985 cached_data_.property_tree_update_number; 2016 cached_data_.property_tree_update_number;
1986 cached_data_.draw_transforms[effect_id][transform_id] 2017 cached_data_.draw_transforms[effect_id][transform_id]
1987 .transforms.from_target = from_target; 2018 .transforms.from_target = from_target;
1988 cached_data_.draw_transforms[effect_id][transform_id].transforms.to_target = 2019 cached_data_.draw_transforms[effect_id][transform_id].transforms.to_target =
1989 target_space_transform; 2020 target_space_transform;
1990 } 2021 }
1991 return cached_data_.draw_transforms[effect_id][transform_id].transforms; 2022 return cached_data_.draw_transforms[effect_id][transform_id].transforms;
1992 } 2023 }
1993 2024
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2033 // This can happen when PaintArtifactCompositor builds property trees as 2064 // This can happen when PaintArtifactCompositor builds property trees as
2034 // it doesn't set effect ids on clip nodes. We want to compute transform 2065 // it doesn't set effect ids on clip nodes. We want to compute transform
2035 // to the root in this case. 2066 // to the root in this case.
2036 target_transform_id = TransformTree::kRootNodeId; 2067 target_transform_id = TransformTree::kRootNodeId;
2037 } else { 2068 } else {
2038 DCHECK(effect_node->has_render_surface || 2069 DCHECK(effect_node->has_render_surface ||
2039 effect_node->id == EffectTree::kRootNodeId); 2070 effect_node->id == EffectTree::kRootNodeId);
2040 target_transform_id = effect_node->transform_id; 2071 target_transform_id = effect_node->transform_id;
2041 } 2072 }
2042 2073
2074 if (transform_id == TransformTree::kInvalidNodeId)
2075 return true;
2043 bool success = transform_tree.ComputeTransform( 2076 bool success = transform_tree.ComputeTransform(
2044 transform_id, target_transform_id, transform); 2077 transform_id, target_transform_id, transform);
2045 if (verify_transform_tree_calculations && 2078 if (verify_transform_tree_calculations) {
2046 transform_id > target_transform_id) {
2047 gfx::Transform to_target; 2079 gfx::Transform to_target;
2048 to_target.ConcatTransform( 2080 to_target.ConcatTransform(
2049 GetDrawTransforms(transform_id, effect_id).to_target); 2081 GetDrawTransforms(transform_id, effect_id).to_target);
2050 if (effect_node->surface_contents_scale.x() != 0.f && 2082 if (effect_node->surface_contents_scale.x() != 0.f &&
2051 effect_node->surface_contents_scale.y() != 0.f) 2083 effect_node->surface_contents_scale.y() != 0.f)
2052 to_target.matrix().postScale( 2084 to_target.matrix().postScale(
2053 1.0f / effect_node->surface_contents_scale.x(), 2085 1.0f / effect_node->surface_contents_scale.x(),
2054 1.0f / effect_node->surface_contents_scale.y(), 1.0f); 2086 1.0f / effect_node->surface_contents_scale.y(), 1.0f);
2055 DCHECK(to_target.ApproximatelyEqual(*transform)); 2087 DCHECK(to_target.ApproximatelyEqual(*transform));
2056 } 2088 }
(...skipping 14 matching lines...) Expand all
2071 // to the root in this case. 2103 // to the root in this case.
2072 target_transform_id = TransformTree::kRootNodeId; 2104 target_transform_id = TransformTree::kRootNodeId;
2073 } else { 2105 } else {
2074 DCHECK(effect_node->has_render_surface || 2106 DCHECK(effect_node->has_render_surface ||
2075 effect_node->id == EffectTree::kRootNodeId); 2107 effect_node->id == EffectTree::kRootNodeId);
2076 target_transform_id = effect_node->transform_id; 2108 target_transform_id = effect_node->transform_id;
2077 } 2109 }
2078 2110
2079 bool success = transform_tree.ComputeTransform(target_transform_id, 2111 bool success = transform_tree.ComputeTransform(target_transform_id,
2080 transform_id, transform); 2112 transform_id, transform);
2081 if (verify_transform_tree_calculations && 2113 if (verify_transform_tree_calculations) {
2082 transform_id < target_transform_id) {
2083 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); 2114 auto draw_transforms = GetDrawTransforms(transform_id, effect_id);
2084 gfx::Transform from_target; 2115 gfx::Transform from_target;
2085 from_target.ConcatTransform(draw_transforms.from_target); 2116 from_target.ConcatTransform(draw_transforms.from_target);
2086 from_target.Scale(effect_node->surface_contents_scale.x(), 2117 from_target.Scale(effect_node->surface_contents_scale.x(),
2087 effect_node->surface_contents_scale.y()); 2118 effect_node->surface_contents_scale.y());
2088 DCHECK(from_target.ApproximatelyEqual(*transform) || 2119 DCHECK(from_target.ApproximatelyEqual(*transform) ||
2089 !draw_transforms.invertible); 2120 !draw_transforms.invertible);
2090 } 2121 }
2091 return success; 2122 return success;
2092 } 2123 }
2093 2124
2094 } // namespace cc 2125 } // namespace cc
OLDNEW
« cc/trees/draw_property_utils.cc ('K') | « cc/trees/draw_property_utils.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698