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

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: 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 unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 using
1963 // screen space transforms.
1964 target_space_transform.ConcatTransform(
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 if (transform_node->id > dest_node->id) {
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);
1957 } else { 1979 } else {
1958 // Compute transform from transform_id to effect_node->transform. 1980 const TransformNode* current = dest_node;
1959 DCHECK_GT(transform_id, effect_node->transform_id); 1981 std::vector<int> source_to_destination;
1960 const TransformNode* dest_node = 1982 source_to_destination.push_back(current->id);
1961 transform_tree.Node(effect_node->transform_id); 1983 current = transform_tree.parent(current);
1962 if (!dest_node || (dest_node->ancestors_are_invertible && 1984 for (; current && current->id > transform_node->id;
1963 dest_node->node_and_ancestors_are_flat)) { 1985 current = transform_tree.parent(current)) {
1964 target_space_transform.ConcatTransform( 1986 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 } 1987 }
1988 DCHECK_EQ(current, transform_node);
1989 gfx::Transform combined_transform;
1990 size_t source_to_destination_size = source_to_destination.size();
1991 for (size_t i = 0; i < source_to_destination_size; ++i) {
1992 size_t index = source_to_destination_size - 1 - i;
1993 const TransformNode* node =
1994 transform_tree.Node(source_to_destination[index]);
1995 if (node->flattens_inherited_transform)
1996 combined_transform.FlattenTo2d();
1997 combined_transform.PreconcatTransform(node->to_parent);
1998 }
1999 if (effect_node->surface_contents_scale.x() != 0.f &&
2000 effect_node->surface_contents_scale.y() != 0.f)
2001 combined_transform.Scale(
2002 1.0f / effect_node->surface_contents_scale.x(),
2003 1.0f / effect_node->surface_contents_scale.y());
2004 cached_data_.draw_transforms[effect_id][transform_id]
2005 .transforms.invertible =
2006 combined_transform.GetInverse(&target_space_transform);
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 26 matching lines...) Expand all
2020 screen_space_transform.Scale(1.0 / effect_node->surface_contents_scale.x(), 2051 screen_space_transform.Scale(1.0 / effect_node->surface_contents_scale.x(),
2021 1.0 / effect_node->surface_contents_scale.y()); 2052 1.0 / effect_node->surface_contents_scale.y());
2022 return screen_space_transform; 2053 return screen_space_transform;
2023 } 2054 }
2024 2055
2025 bool PropertyTrees::ComputeTransformToTarget(int transform_id, 2056 bool PropertyTrees::ComputeTransformToTarget(int transform_id,
2026 int effect_id, 2057 int effect_id,
2027 gfx::Transform* transform) const { 2058 gfx::Transform* transform) const {
2028 transform->MakeIdentity(); 2059 transform->MakeIdentity();
2029 2060
2061 if (transform_id == TransformTree::kInvalidNodeId)
2062 return true;
2063
2030 int target_transform_id; 2064 int target_transform_id;
2031 const EffectNode* effect_node = effect_tree.Node(effect_id); 2065 const EffectNode* effect_node = effect_tree.Node(effect_id);
2032 if (effect_id == EffectTree::kInvalidNodeId) { 2066 if (effect_id == EffectTree::kInvalidNodeId) {
2033 // This can happen when PaintArtifactCompositor builds property trees as 2067 // This can happen when PaintArtifactCompositor builds property trees as
2034 // it doesn't set effect ids on clip nodes. We want to compute transform 2068 // it doesn't set effect ids on clip nodes. We want to compute transform
2035 // to the root in this case. 2069 // to the root in this case.
2036 target_transform_id = TransformTree::kRootNodeId; 2070 target_transform_id = TransformTree::kRootNodeId;
2037 } else { 2071 } else {
2038 DCHECK(effect_node->has_render_surface || 2072 DCHECK(effect_node->has_render_surface ||
2039 effect_node->id == EffectTree::kRootNodeId); 2073 effect_node->id == EffectTree::kRootNodeId);
2040 target_transform_id = effect_node->transform_id; 2074 target_transform_id = effect_node->transform_id;
2041 } 2075 }
2042 2076
2043 bool success = transform_tree.ComputeTransform( 2077 bool success = transform_tree.ComputeTransform(
2044 transform_id, target_transform_id, transform); 2078 transform_id, target_transform_id, transform);
2045 if (verify_transform_tree_calculations && 2079 if (verify_transform_tree_calculations) {
2046 transform_id > target_transform_id) {
2047 gfx::Transform to_target; 2080 gfx::Transform to_target;
2048 to_target.ConcatTransform( 2081 to_target.ConcatTransform(
2049 GetDrawTransforms(transform_id, effect_id).to_target); 2082 GetDrawTransforms(transform_id, effect_id).to_target);
2050 if (effect_node->surface_contents_scale.x() != 0.f && 2083 if (effect_node->surface_contents_scale.x() != 0.f &&
2051 effect_node->surface_contents_scale.y() != 0.f) 2084 effect_node->surface_contents_scale.y() != 0.f)
2052 to_target.matrix().postScale( 2085 to_target.matrix().postScale(
2053 1.0f / effect_node->surface_contents_scale.x(), 2086 1.0f / effect_node->surface_contents_scale.x(),
2054 1.0f / effect_node->surface_contents_scale.y(), 1.0f); 2087 1.0f / effect_node->surface_contents_scale.y(), 1.0f);
2055 DCHECK(to_target.ApproximatelyEqual(*transform)); 2088 DCHECK(to_target.ApproximatelyEqual(*transform));
2056 } 2089 }
2057 return success; 2090 return success;
2058 } 2091 }
2059 2092
2060 bool PropertyTrees::ComputeTransformFromTarget( 2093 bool PropertyTrees::ComputeTransformFromTarget(
2061 int transform_id, 2094 int transform_id,
2062 int effect_id, 2095 int effect_id,
2063 gfx::Transform* transform) const { 2096 gfx::Transform* transform) const {
2064 transform->MakeIdentity(); 2097 transform->MakeIdentity();
2065 2098
2099 if (transform_id == TransformTree::kInvalidNodeId)
2100 return true;
2101
2066 int target_transform_id; 2102 int target_transform_id;
2067 const EffectNode* effect_node = effect_tree.Node(effect_id); 2103 const EffectNode* effect_node = effect_tree.Node(effect_id);
2068 if (effect_id == EffectTree::kInvalidNodeId) { 2104 if (effect_id == EffectTree::kInvalidNodeId) {
2069 // This can happen when PaintArtifactCompositor builds property trees as 2105 // This can happen when PaintArtifactCompositor builds property trees as
2070 // it doesn't set effect ids on clip nodes. We want to compute transform 2106 // it doesn't set effect ids on clip nodes. We want to compute transform
2071 // to the root in this case. 2107 // to the root in this case.
2072 target_transform_id = TransformTree::kRootNodeId; 2108 target_transform_id = TransformTree::kRootNodeId;
2073 } else { 2109 } else {
2074 DCHECK(effect_node->has_render_surface || 2110 DCHECK(effect_node->has_render_surface ||
2075 effect_node->id == EffectTree::kRootNodeId); 2111 effect_node->id == EffectTree::kRootNodeId);
2076 target_transform_id = effect_node->transform_id; 2112 target_transform_id = effect_node->transform_id;
2077 } 2113 }
2078 2114
2079 bool success = transform_tree.ComputeTransform(target_transform_id, 2115 bool success = transform_tree.ComputeTransform(target_transform_id,
2080 transform_id, transform); 2116 transform_id, transform);
2081 if (verify_transform_tree_calculations && 2117 if (verify_transform_tree_calculations) {
2082 transform_id < target_transform_id) {
2083 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); 2118 auto draw_transforms = GetDrawTransforms(transform_id, effect_id);
2084 gfx::Transform from_target; 2119 gfx::Transform from_target;
2085 from_target.ConcatTransform(draw_transforms.from_target); 2120 from_target.ConcatTransform(draw_transforms.from_target);
2086 from_target.Scale(effect_node->surface_contents_scale.x(), 2121 from_target.Scale(effect_node->surface_contents_scale.x(),
2087 effect_node->surface_contents_scale.y()); 2122 effect_node->surface_contents_scale.y());
2088 DCHECK(from_target.ApproximatelyEqual(*transform) || 2123 DCHECK(from_target.ApproximatelyEqual(*transform) ||
2089 !draw_transforms.invertible); 2124 !draw_transforms.invertible);
2090 } 2125 }
2091 return success; 2126 return success;
2092 } 2127 }
2093 2128
2094 } // namespace cc 2129 } // namespace cc
OLDNEW
« 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