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

Side by Side Diff: cc/trees/draw_property_utils.cc

Issue 2147283002: cc : Fix occlusion tracking bug for contributing surface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mask test Created 4 years, 5 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/draw_property_utils.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | 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 "cc/trees/draw_property_utils.h" 5 #include "cc/trees/draw_property_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 EffectNode* effect_node = 47 EffectNode* effect_node =
48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node(
49 layer->effect_tree_index()); 49 layer->effect_tree_index());
50 if (effect_node->owner_id != layer->id()) 50 if (effect_node->owner_id != layer->id())
51 return; 51 return;
52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id();
53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id();
54 DCHECK(effect_node->background_filters.IsEmpty()); 54 DCHECK(effect_node->background_filters.IsEmpty());
55 } 55 }
56 56
57 #endif
58
59 static void ApplySublayerScale(const int effect_node_id,
60 const EffectTree& effect_tree,
61 gfx::Transform* transform) {
62 const EffectNode* effect_node = effect_tree.Node(effect_node_id);
63 const EffectNode* target_effect_node =
64 effect_node->has_render_surface
65 ? effect_node
66 : effect_tree.Node(effect_node->target_id);
67 transform->matrix().postScale(target_effect_node->sublayer_scale.x(),
68 target_effect_node->sublayer_scale.y(), 1.f);
69 }
70
71 #if DCHECK_IS_ON()
72 void VerifySublayerScalesMatch(const int effect_node_id, 57 void VerifySublayerScalesMatch(const int effect_node_id,
73 const int target_transform_id, 58 const int target_transform_id,
74 const EffectTree& effect_tree, 59 const EffectTree& effect_tree,
75 const TransformTree& transform_tree) { 60 const TransformTree& transform_tree) {
76 const TransformNode* target_transform_node = 61 const TransformNode* target_transform_node =
77 transform_tree.Node(target_transform_id); 62 transform_tree.Node(target_transform_id);
78 const EffectNode* effect_node = effect_tree.Node(effect_node_id); 63 const EffectNode* effect_node = effect_tree.Node(effect_node_id);
79 const EffectNode* target_effect_node = 64 const EffectNode* target_effect_node =
80 effect_node->has_render_surface 65 effect_node->has_render_surface
81 ? effect_node 66 ? effect_node
(...skipping 19 matching lines...) Expand all
101 86
102 gfx::Transform clip_to_target; 87 gfx::Transform clip_to_target;
103 if (clip_node->target_transform_id > target_node_id) { 88 if (clip_node->target_transform_id > target_node_id) {
104 // In this case, layer has a scroll parent. We need to keep the scale 89 // In this case, layer has a scroll parent. We need to keep the scale
105 // at the layer's target but remove the scale at the scroll parent's 90 // at the layer's target but remove the scale at the scroll parent's
106 // target. 91 // target.
107 if (transform_tree.ComputeTransform(clip_node->target_transform_id, 92 if (transform_tree.ComputeTransform(clip_node->target_transform_id,
108 target_node_id, &clip_to_target)) { 93 target_node_id, &clip_to_target)) {
109 // We don't have to apply sublayer scale when target is root. 94 // We don't have to apply sublayer scale when target is root.
110 if (target_node_id != 0) { 95 if (target_node_id != 0) {
111 ApplySublayerScale(layer->effect_tree_index(), effect_tree, 96 PostConcatSublayerScale(layer->effect_tree_index(), effect_tree,
112 &clip_to_target); 97 &clip_to_target);
113 #if DCHECK_IS_ON() 98 #if DCHECK_IS_ON()
114 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id, 99 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id,
115 effect_tree, transform_tree); 100 effect_tree, transform_tree);
116 #endif 101 #endif
117 } 102 }
118 103
119 const TransformNode* source_node = 104 const TransformNode* source_node =
120 transform_tree.Node(clip_node->target_transform_id); 105 transform_tree.Node(clip_node->target_transform_id);
121 if (source_node->sublayer_scale.x() != 0.f && 106 if (source_node->sublayer_scale.x() != 0.f &&
122 source_node->sublayer_scale.y() != 0.f) 107 source_node->sublayer_scale.y() != 0.f)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 int current_transform_id, 155 int current_transform_id,
171 int target_transform_id, 156 int target_transform_id,
172 int target_effect_id) { 157 int target_effect_id) {
173 gfx::Transform current_to_target; 158 gfx::Transform current_to_target;
174 if (!transform_tree.ComputeTransform(current_transform_id, 159 if (!transform_tree.ComputeTransform(current_transform_id,
175 target_transform_id, &current_to_target)) 160 target_transform_id, &current_to_target))
176 // If transform is not invertible, cannot apply clip. 161 // If transform is not invertible, cannot apply clip.
177 return ConditionalClip{false, gfx::RectF()}; 162 return ConditionalClip{false, gfx::RectF()};
178 // We don't have to apply sublayer scale when target is root. 163 // We don't have to apply sublayer scale when target is root.
179 if (target_transform_id != 0) { 164 if (target_transform_id != 0) {
180 ApplySublayerScale(target_effect_id, effect_tree, &current_to_target); 165 PostConcatSublayerScale(target_effect_id, effect_tree, &current_to_target);
181 #if DCHECK_IS_ON() 166 #if DCHECK_IS_ON()
182 VerifySublayerScalesMatch(target_effect_id, target_transform_id, 167 VerifySublayerScalesMatch(target_effect_id, target_transform_id,
183 effect_tree, transform_tree); 168 effect_tree, transform_tree);
184 #endif 169 #endif
185 } 170 }
186 171
187 if (current_transform_id > target_transform_id) 172 if (current_transform_id > target_transform_id)
188 return ConditionalClip{true, // is_clipped. 173 return ConditionalClip{true, // is_clipped.
189 MathUtil::MapClippedRect(current_to_target, rect)}; 174 MathUtil::MapClippedRect(current_to_target, rect)};
190 175
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 } 693 }
709 } 694 }
710 } 695 }
711 696
712 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { 697 static void ResetIfHasNanCoordinate(gfx::RectF* rect) {
713 if (std::isnan(rect->x()) || std::isnan(rect->y()) || 698 if (std::isnan(rect->x()) || std::isnan(rect->y()) ||
714 std::isnan(rect->right()) || std::isnan(rect->bottom())) 699 std::isnan(rect->right()) || std::isnan(rect->bottom()))
715 *rect = gfx::RectF(); 700 *rect = gfx::RectF();
716 } 701 }
717 702
703 void PostConcatSublayerScale(const int effect_node_id,
704 const EffectTree& effect_tree,
705 gfx::Transform* transform) {
706 // TODO(jaydasika): This function should not compute target effect node id. It
707 // should receive it from callers.
708 const EffectNode* effect_node = effect_tree.Node(effect_node_id);
709 const EffectNode* target_effect_node =
710 effect_node->has_render_surface
711 ? effect_node
712 : effect_tree.Node(effect_node->target_id);
713 transform->matrix().postScale(target_effect_node->sublayer_scale.x(),
714 target_effect_node->sublayer_scale.y(), 1.f);
715 }
716
717 void ConcatInverseSublayerScale(const int effect_node_id,
718 const EffectTree& effect_tree,
719 gfx::Transform* transform) {
720 const EffectNode* effect_node = effect_tree.Node(effect_node_id);
721 if (effect_node->sublayer_scale.x() != 0.0 &&
722 effect_node->sublayer_scale.y() != 0.0)
723 transform->Scale(1.0 / effect_node->sublayer_scale.x(),
724 1.0 / effect_node->sublayer_scale.y());
725 }
726
718 void ComputeClips(ClipTree* clip_tree, 727 void ComputeClips(ClipTree* clip_tree,
719 const TransformTree& transform_tree, 728 const TransformTree& transform_tree,
720 const EffectTree& effect_tree, 729 const EffectTree& effect_tree,
721 bool non_root_surfaces_enabled) { 730 bool non_root_surfaces_enabled) {
722 if (!clip_tree->needs_update()) 731 if (!clip_tree->needs_update())
723 return; 732 return;
724 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { 733 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) {
725 ClipNode* clip_node = clip_tree->Node(i); 734 ClipNode* clip_node = clip_tree->Node(i);
726 735
727 if (clip_node->id == 1) { 736 if (clip_node->id == 1) {
(...skipping 26 matching lines...) Expand all
754 gfx::RectF parent_clip_in_target_space = 763 gfx::RectF parent_clip_in_target_space =
755 parent_clip_node->clip_in_target_space; 764 parent_clip_node->clip_in_target_space;
756 if (parent_target_transform_node && 765 if (parent_target_transform_node &&
757 parent_target_transform_node->id != clip_node->target_transform_id && 766 parent_target_transform_node->id != clip_node->target_transform_id &&
758 non_root_surfaces_enabled) { 767 non_root_surfaces_enabled) {
759 success &= transform_tree.ComputeTransform( 768 success &= transform_tree.ComputeTransform(
760 parent_target_transform_node->id, clip_node->target_transform_id, 769 parent_target_transform_node->id, clip_node->target_transform_id,
761 &parent_to_current); 770 &parent_to_current);
762 // We don't have to apply sublayer scale when target is root. 771 // We don't have to apply sublayer scale when target is root.
763 if (clip_node->target_transform_id != 0) { 772 if (clip_node->target_transform_id != 0) {
764 ApplySublayerScale(clip_node->target_effect_id, effect_tree, 773 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree,
765 &parent_to_current); 774 &parent_to_current);
766 #if DCHECK_IS_ON() 775 #if DCHECK_IS_ON()
767 VerifySublayerScalesMatch(clip_node->target_effect_id, 776 VerifySublayerScalesMatch(clip_node->target_effect_id,
768 clip_node->target_transform_id, effect_tree, 777 clip_node->target_transform_id, effect_tree,
769 transform_tree); 778 transform_tree);
770 #endif 779 #endif
771 } 780 }
772 if (parent_target_transform_node->sublayer_scale.x() > 0 && 781 if (parent_target_transform_node->sublayer_scale.x() > 0 &&
773 parent_target_transform_node->sublayer_scale.y() > 0) 782 parent_target_transform_node->sublayer_scale.y() > 0)
774 parent_to_current.Scale( 783 parent_to_current.Scale(
775 1.f / parent_target_transform_node->sublayer_scale.x(), 784 1.f / parent_target_transform_node->sublayer_scale.x(),
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 source_to_target = transform_tree.ToScreen(clip_node->transform_id); 837 source_to_target = transform_tree.ToScreen(clip_node->transform_id);
829 } else if (transform_tree.ContentTargetId(transform_node->id) == 838 } else if (transform_tree.ContentTargetId(transform_node->id) ==
830 clip_node->target_transform_id) { 839 clip_node->target_transform_id) {
831 source_to_target = transform_tree.ToTarget(clip_node->transform_id); 840 source_to_target = transform_tree.ToTarget(clip_node->transform_id);
832 } else { 841 } else {
833 success = transform_tree.ComputeTransform( 842 success = transform_tree.ComputeTransform(
834 transform_node->id, clip_node->target_transform_id, 843 transform_node->id, clip_node->target_transform_id,
835 &source_to_target); 844 &source_to_target);
836 // We don't have to apply sublayer scale when target is root. 845 // We don't have to apply sublayer scale when target is root.
837 if (clip_node->target_transform_id != 0) { 846 if (clip_node->target_transform_id != 0) {
838 ApplySublayerScale(clip_node->target_effect_id, effect_tree, 847 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree,
839 &source_to_target); 848 &source_to_target);
840 #if DCHECK_IS_ON() 849 #if DCHECK_IS_ON()
841 VerifySublayerScalesMatch(clip_node->target_effect_id, 850 VerifySublayerScalesMatch(clip_node->target_effect_id,
842 clip_node->target_transform_id, effect_tree, 851 clip_node->target_transform_id, effect_tree,
843 transform_tree); 852 transform_tree);
844 #endif 853 #endif
845 } 854 }
846 // source_to_target computation should be successful as target is an 855 // source_to_target computation should be successful as target is an
847 // ancestor of the transform node. 856 // ancestor of the transform node.
848 DCHECK(success); 857 DCHECK(success);
849 } 858 }
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 static void VerifyDrawTransformsMatch(LayerImpl* layer, 999 static void VerifyDrawTransformsMatch(LayerImpl* layer,
991 PropertyTrees* property_trees) { 1000 PropertyTrees* property_trees) {
992 const int source_id = layer->transform_tree_index(); 1001 const int source_id = layer->transform_tree_index();
993 int destination_id = FindTargetTransformTreeIndexFromEffectTree( 1002 int destination_id = FindTargetTransformTreeIndexFromEffectTree(
994 property_trees->effect_tree, layer->effect_tree_index()); 1003 property_trees->effect_tree, layer->effect_tree_index());
995 gfx::Transform draw_transform; 1004 gfx::Transform draw_transform;
996 property_trees->transform_tree.ComputeTransform(source_id, destination_id, 1005 property_trees->transform_tree.ComputeTransform(source_id, destination_id,
997 &draw_transform); 1006 &draw_transform);
998 // We don't have to apply sublayer scale when target is root. 1007 // We don't have to apply sublayer scale when target is root.
999 if (destination_id != 0) { 1008 if (destination_id != 0) {
1000 ApplySublayerScale(layer->effect_tree_index(), property_trees->effect_tree, 1009 PostConcatSublayerScale(layer->effect_tree_index(),
1001 &draw_transform); 1010 property_trees->effect_tree, &draw_transform);
1002 #if DCHECK_IS_ON() 1011 #if DCHECK_IS_ON()
1003 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id, 1012 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id,
1004 property_trees->effect_tree, 1013 property_trees->effect_tree,
1005 property_trees->transform_tree); 1014 property_trees->transform_tree);
1006 #endif 1015 #endif
1007 } 1016 }
1008 if (layer->should_flatten_transform_from_property_tree()) 1017 if (layer->should_flatten_transform_from_property_tree())
1009 draw_transform.FlattenTo2d(); 1018 draw_transform.FlattenTo2d();
1010 draw_transform.Translate(layer->offset_to_transform_parent().x(), 1019 draw_transform.Translate(layer->offset_to_transform_parent().x(),
1011 layer->offset_to_transform_parent().y()); 1020 layer->offset_to_transform_parent().y());
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 return; 1196 return;
1188 } 1197 }
1189 1198
1190 gfx::Transform render_surface_transform; 1199 gfx::Transform render_surface_transform;
1191 const TransformNode* target_transform_node = 1200 const TransformNode* target_transform_node =
1192 transform_tree.Node(transform_tree.TargetId(transform_node->id)); 1201 transform_tree.Node(transform_tree.TargetId(transform_node->id));
1193 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, 1202 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id,
1194 &render_surface_transform); 1203 &render_surface_transform);
1195 // We don't have to apply sublayer scale when target is root. 1204 // We don't have to apply sublayer scale when target is root.
1196 if (target_transform_node->id != 0) { 1205 if (target_transform_node->id != 0) {
1197 ApplySublayerScale(effect_node->target_id, effect_tree, 1206 PostConcatSublayerScale(effect_node->target_id, effect_tree,
1198 &render_surface_transform); 1207 &render_surface_transform);
1199 #if DCHECK_IS_ON() 1208 #if DCHECK_IS_ON()
1200 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id, 1209 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id,
1201 effect_tree, transform_tree); 1210 effect_tree, transform_tree);
1202 #endif 1211 #endif
1203 } 1212 }
1204 1213
1205 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale); 1214 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale);
1206 if (effect_node->sublayer_scale.x() != 0.0 && 1215 if (effect_node->sublayer_scale.x() != 0.0 &&
1207 effect_node->sublayer_scale.y() != 0.0) 1216 effect_node->sublayer_scale.y() != 0.0)
1208 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(), 1217 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 transform_tree.TargetId(transform_node->id), 1254 transform_tree.TargetId(transform_node->id),
1246 &clip_parent_target_to_target); 1255 &clip_parent_target_to_target);
1247 1256
1248 if (!success) { 1257 if (!success) {
1249 render_surface->SetClipRect(gfx::Rect()); 1258 render_surface->SetClipRect(gfx::Rect());
1250 return; 1259 return;
1251 } 1260 }
1252 1261
1253 // We don't have to apply sublayer scale when target is root. 1262 // We don't have to apply sublayer scale when target is root.
1254 if (transform_tree.TargetId(transform_node->id) != 0) { 1263 if (transform_tree.TargetId(transform_node->id) != 0) {
1255 ApplySublayerScale(render_surface->EffectTreeIndex(), effect_tree, 1264 PostConcatSublayerScale(render_surface->EffectTreeIndex(), effect_tree,
1256 &clip_parent_target_to_target); 1265 &clip_parent_target_to_target);
1257 #if DCHECK_IS_ON() 1266 #if DCHECK_IS_ON()
1258 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(), 1267 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(),
1259 transform_tree.TargetId(transform_node->id), 1268 transform_tree.TargetId(transform_node->id),
1260 effect_tree, transform_tree); 1269 effect_tree, transform_tree);
1261 #endif 1270 #endif
1262 } 1271 }
1263 1272
1264 DCHECK_LT(parent_clip_node->target_transform_id, 1273 DCHECK_LT(parent_clip_node->target_transform_id,
1265 transform_tree.TargetId(transform_node->id)); 1274 transform_tree.TargetId(transform_node->id));
1266 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 1275 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1527 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1536 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1528 const Layer* overscroll_elasticity_layer, 1537 const Layer* overscroll_elasticity_layer,
1529 const gfx::Vector2dF& elastic_overscroll) { 1538 const gfx::Vector2dF& elastic_overscroll) {
1530 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1539 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1531 elastic_overscroll); 1540 elastic_overscroll);
1532 } 1541 }
1533 1542
1534 } // namespace draw_property_utils 1543 } // namespace draw_property_utils
1535 1544
1536 } // namespace cc 1545 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698