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

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

Issue 2087963003: cc: Stop creating unused 0 property tree nodes other than transform Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase 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/property_tree.cc ('k') | cc/trees/property_tree_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/property_tree_builder.h" 5 #include "cc/trees/property_tree_builder.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
(...skipping 12 matching lines...) Expand all
23 #include "cc/trees/transform_node.h" 23 #include "cc/trees/transform_node.h"
24 #include "ui/gfx/geometry/point_f.h" 24 #include "ui/gfx/geometry/point_f.h"
25 #include "ui/gfx/geometry/vector2d_conversions.h" 25 #include "ui/gfx/geometry/vector2d_conversions.h"
26 26
27 namespace cc { 27 namespace cc {
28 28
29 class LayerTreeHost; 29 class LayerTreeHost;
30 30
31 namespace { 31 namespace {
32 32
33 static const int kInvalidPropertyTreeNodeId = -1;
34 static const int kRootPropertyTreeNodeId = 0;
35 static const int kViewportClipTreeNodeId = 1;
36
37 template <typename LayerType> 33 template <typename LayerType>
38 struct DataForRecursion { 34 struct DataForRecursion {
39 PropertyTrees* property_trees; 35 PropertyTrees* property_trees;
40 LayerType* transform_tree_parent; 36 LayerType* transform_tree_parent;
41 LayerType* transform_fixed_parent; 37 LayerType* transform_fixed_parent;
42 int render_target; 38 int render_target;
43 int clip_tree_parent; 39 int clip_tree_parent;
44 int effect_tree_parent; 40 int effect_tree_parent;
45 int scroll_tree_parent; 41 int scroll_tree_parent;
46 const LayerType* page_scale_layer; 42 const LayerType* page_scale_layer;
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 510
515 bool requires_node = is_root || is_scrollable || has_significant_transform || 511 bool requires_node = is_root || is_scrollable || has_significant_transform ||
516 has_any_transform_animation || has_surface || is_fixed || 512 has_any_transform_animation || has_surface || is_fixed ||
517 is_page_scale_layer || is_overscroll_elasticity_layer || 513 is_page_scale_layer || is_overscroll_elasticity_layer ||
518 scroll_child_has_different_target || 514 scroll_child_has_different_target ||
519 is_at_boundary_of_3d_rendering_context; 515 is_at_boundary_of_3d_rendering_context;
520 516
521 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); 517 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer);
522 DCHECK(is_root || transform_parent); 518 DCHECK(is_root || transform_parent);
523 519
524 int parent_index = kRootPropertyTreeNodeId; 520 int parent_index = TransformTree::kDeviceNodeId;
525 if (transform_parent) 521 if (transform_parent)
526 parent_index = transform_parent->transform_tree_index(); 522 parent_index = transform_parent->transform_tree_index();
527 523
528 int source_index = parent_index; 524 int source_index = parent_index;
529 525
530 gfx::Vector2dF source_offset; 526 gfx::Vector2dF source_offset;
531 if (transform_parent) { 527 if (transform_parent) {
532 if (ScrollParent(layer)) { 528 if (ScrollParent(layer)) {
533 LayerType* source = Parent(layer); 529 LayerType* source = Parent(layer);
534 source_offset += source->offset_to_transform_parent(); 530 source_offset += source->offset_to_transform_parent();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 if (layer == data_from_ancestor.page_scale_layer) 594 if (layer == data_from_ancestor.page_scale_layer)
599 data_for_children->in_subtree_of_page_scale_layer = true; 595 data_for_children->in_subtree_of_page_scale_layer = true;
600 node->in_subtree_of_page_scale_layer = 596 node->in_subtree_of_page_scale_layer =
601 data_for_children->in_subtree_of_page_scale_layer; 597 data_for_children->in_subtree_of_page_scale_layer;
602 598
603 // Surfaces inherently flatten transforms. 599 // Surfaces inherently flatten transforms.
604 data_for_children->should_flatten = 600 data_for_children->should_flatten =
605 ShouldFlattenTransform(layer) || has_surface; 601 ShouldFlattenTransform(layer) || has_surface;
606 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); 602 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u);
607 603
608 data_for_children->property_trees->transform_tree.SetTargetId( 604 if (data_from_ancestor.render_target == EffectTree::kInvalidNodeId) {
609 node->id, data_for_children->property_trees->effect_tree 605 data_for_children->property_trees->transform_tree.SetTargetId(
610 .Node(data_from_ancestor.render_target) 606 node->id, TransformTree::kDeviceNodeId);
611 ->transform_id); 607 } else {
608 data_for_children->property_trees->transform_tree.SetTargetId(
609 node->id, data_for_children->property_trees->effect_tree
610 .Node(data_from_ancestor.render_target)
611 ->transform_id);
612 }
612 data_for_children->property_trees->transform_tree.SetContentTargetId( 613 data_for_children->property_trees->transform_tree.SetContentTargetId(
613 node->id, data_for_children->property_trees->effect_tree 614 node->id, data_for_children->property_trees->effect_tree
614 .Node(data_for_children->render_target) 615 .Node(data_for_children->render_target)
615 ->transform_id); 616 ->transform_id);
616 DCHECK_NE( 617 DCHECK_NE(
617 data_for_children->property_trees->transform_tree.TargetId(node->id), 618 data_for_children->property_trees->transform_tree.TargetId(node->id),
618 kInvalidPropertyTreeNodeId); 619 TransformTree::kInvalidNodeId);
619 620
620 node->has_potential_animation = has_potentially_animated_transform; 621 node->has_potential_animation = has_potentially_animated_transform;
621 node->is_currently_animating = TransformIsAnimating(layer); 622 node->is_currently_animating = TransformIsAnimating(layer);
622 if (has_potentially_animated_transform) { 623 if (has_potentially_animated_transform) {
623 node->has_only_translation_animations = 624 node->has_only_translation_animations =
624 HasOnlyTranslationTransforms(layer); 625 HasOnlyTranslationTransforms(layer);
625 } 626 }
626 627
627 float post_local_scale_factor = 1.0f; 628 float post_local_scale_factor = 1.0f;
628 if (is_root) 629 if (is_root)
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 node.transform_id = 990 node.transform_id =
990 data_from_ancestor.property_trees->transform_tree.next_available_id(); 991 data_from_ancestor.property_trees->transform_tree.next_available_id();
991 node.has_unclipped_descendants = (NumUnclippedDescendants(layer) != 0); 992 node.has_unclipped_descendants = (NumUnclippedDescendants(layer) != 0);
992 } 993 }
993 node.clip_id = data_from_ancestor.clip_tree_parent; 994 node.clip_id = data_from_ancestor.clip_tree_parent;
994 } else { 995 } else {
995 // Root render surface acts the unbounded and untransformed to draw content 996 // Root render surface acts the unbounded and untransformed to draw content
996 // into. Transform node created from root layer (includes device scale 997 // into. Transform node created from root layer (includes device scale
997 // factor) and clip node created from root layer (include viewports) applies 998 // factor) and clip node created from root layer (include viewports) applies
998 // to root render surface's content, but not root render surface itself. 999 // to root render surface's content, but not root render surface itself.
999 node.transform_id = kRootPropertyTreeNodeId; 1000 node.transform_id = TransformTree::kDeviceNodeId;
1000 node.clip_id = kViewportClipTreeNodeId; 1001 node.clip_id = ClipTree::kRootNodeId;
1001 } 1002 }
1002 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); 1003 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id);
1003 int node_id = data_for_children->effect_tree_parent; 1004 int node_id = data_for_children->effect_tree_parent;
1004 layer->SetEffectTreeIndex(node_id); 1005 layer->SetEffectTreeIndex(node_id);
1005 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = 1006 data_for_children->property_trees->effect_id_to_index_map[layer->id()] =
1006 data_for_children->effect_tree_parent; 1007 data_for_children->effect_tree_parent;
1007 1008
1008 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; 1009 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests;
1009 TakeCopyRequests(layer, &layer_copy_requests); 1010 TakeCopyRequests(layer, &layer_copy_requests);
1010 for (auto& it : layer_copy_requests) { 1011 for (auto& it : layer_copy_requests) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 ScrollNode node; 1054 ScrollNode node;
1054 node.owner_id = layer->id(); 1055 node.owner_id = layer->id();
1055 node.scrollable = scrollable; 1056 node.scrollable = scrollable;
1056 node.main_thread_scrolling_reasons = main_thread_scrolling_reasons; 1057 node.main_thread_scrolling_reasons = main_thread_scrolling_reasons;
1057 node.contains_non_fast_scrollable_region = 1058 node.contains_non_fast_scrollable_region =
1058 contains_non_fast_scrollable_region; 1059 contains_non_fast_scrollable_region;
1059 gfx::Size clip_bounds; 1060 gfx::Size clip_bounds;
1060 if (layer->scroll_clip_layer()) { 1061 if (layer->scroll_clip_layer()) {
1061 clip_bounds = layer->scroll_clip_layer()->bounds(); 1062 clip_bounds = layer->scroll_clip_layer()->bounds();
1062 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != 1063 DCHECK(layer->scroll_clip_layer()->transform_tree_index() !=
1063 kInvalidPropertyTreeNodeId); 1064 TransformTree::kInvalidNodeId);
1064 node.max_scroll_offset_affected_by_page_scale = 1065 node.max_scroll_offset_affected_by_page_scale =
1065 !data_from_ancestor.property_trees->transform_tree 1066 !data_from_ancestor.property_trees->transform_tree
1066 .Node(layer->scroll_clip_layer()->transform_tree_index()) 1067 .Node(layer->scroll_clip_layer()->transform_tree_index())
1067 ->in_subtree_of_page_scale_layer && 1068 ->in_subtree_of_page_scale_layer &&
1068 data_from_ancestor.in_subtree_of_page_scale_layer; 1069 data_from_ancestor.in_subtree_of_page_scale_layer;
1069 } 1070 }
1070 1071
1071 node.scroll_clip_layer_bounds = clip_bounds; 1072 node.scroll_clip_layer_bounds = clip_bounds;
1072 node.is_inner_viewport_scroll_layer = 1073 node.is_inner_viewport_scroll_layer =
1073 layer == data_from_ancestor.inner_viewport_scroll_layer; 1074 layer == data_from_ancestor.inner_viewport_scroll_layer;
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 root_layer->position()); 1305 root_layer->position());
1305 return; 1306 return;
1306 } 1307 }
1307 1308
1308 property_trees->sequence_number++; 1309 property_trees->sequence_number++;
1309 1310
1310 DataForRecursion<LayerType> data_for_recursion; 1311 DataForRecursion<LayerType> data_for_recursion;
1311 data_for_recursion.property_trees = property_trees; 1312 data_for_recursion.property_trees = property_trees;
1312 data_for_recursion.transform_tree_parent = nullptr; 1313 data_for_recursion.transform_tree_parent = nullptr;
1313 data_for_recursion.transform_fixed_parent = nullptr; 1314 data_for_recursion.transform_fixed_parent = nullptr;
1314 data_for_recursion.render_target = kRootPropertyTreeNodeId; 1315 data_for_recursion.render_target = EffectTree::kInvalidNodeId;
1315 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; 1316 data_for_recursion.clip_tree_parent = ClipTree::kInvalidNodeId;
1316 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; 1317 data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId;
1317 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; 1318 data_for_recursion.scroll_tree_parent = ScrollTree::kInvalidNodeId;
1318 data_for_recursion.page_scale_layer = page_scale_layer; 1319 data_for_recursion.page_scale_layer = page_scale_layer;
1319 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; 1320 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer;
1320 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; 1321 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer;
1321 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; 1322 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer;
1322 data_for_recursion.elastic_overscroll = elastic_overscroll; 1323 data_for_recursion.elastic_overscroll = elastic_overscroll;
1323 data_for_recursion.page_scale_factor = page_scale_factor; 1324 data_for_recursion.page_scale_factor = page_scale_factor;
1324 data_for_recursion.in_subtree_of_page_scale_layer = false; 1325 data_for_recursion.in_subtree_of_page_scale_layer = false;
1325 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; 1326 data_for_recursion.affected_by_inner_viewport_bounds_delta = false;
1326 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; 1327 data_for_recursion.affected_by_outer_viewport_bounds_delta = false;
1327 data_for_recursion.should_flatten = false; 1328 data_for_recursion.should_flatten = false;
(...skipping 18 matching lines...) Expand all
1346 data_for_recursion.property_trees->effect_id_to_index_map.clear(); 1347 data_for_recursion.property_trees->effect_id_to_index_map.clear();
1347 data_for_recursion.property_trees->clip_id_to_index_map.clear(); 1348 data_for_recursion.property_trees->clip_id_to_index_map.clear();
1348 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); 1349 data_for_recursion.property_trees->scroll_id_to_index_map.clear();
1349 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids 1350 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids
1350 .clear(); 1351 .clear();
1351 1352
1352 ClipNode root_clip; 1353 ClipNode root_clip;
1353 root_clip.resets_clip = true; 1354 root_clip.resets_clip = true;
1354 root_clip.applies_local_clip = true; 1355 root_clip.applies_local_clip = true;
1355 root_clip.clip = gfx::RectF(viewport); 1356 root_clip.clip = gfx::RectF(viewport);
1356 root_clip.transform_id = kRootPropertyTreeNodeId; 1357 root_clip.transform_id = TransformTree::kDeviceNodeId;
1357 data_for_recursion.clip_tree_parent = 1358 data_for_recursion.clip_tree_parent =
1358 data_for_recursion.property_trees->clip_tree.Insert( 1359 data_for_recursion.property_trees->clip_tree.Insert(
1359 root_clip, kRootPropertyTreeNodeId); 1360 root_clip, ClipTree::kInvalidNodeId);
1360 1361
1361 DataForRecursionFromChild<LayerType> data_from_child; 1362 DataForRecursionFromChild<LayerType> data_from_child;
1362 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 1363 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child);
1363 property_trees->needs_rebuild = false; 1364 property_trees->needs_rebuild = false;
1364 1365
1365 // The transform tree is kept up to date as it is built, but the 1366 // The transform tree is kept up to date as it is built, but the
1366 // combined_clips stored in the clip tree and the screen_space_opacity and 1367 // combined_clips stored in the clip tree and the screen_space_opacity and
1367 // is_drawn in the effect tree aren't computed during tree building. 1368 // is_drawn in the effect tree aren't computed during tree building.
1368 property_trees->transform_tree.set_needs_update(false); 1369 property_trees->transform_tree.set_needs_update(false);
1369 property_trees->clip_tree.set_needs_update(true); 1370 property_trees->clip_tree.set_needs_update(true);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 color = SkColorSetA(color, 255); 1440 color = SkColorSetA(color, 255);
1440 BuildPropertyTreesTopLevelInternal( 1441 BuildPropertyTreesTopLevelInternal(
1441 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1442 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1442 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1443 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1443 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1444 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1444 device_transform, property_trees, color); 1445 device_transform, property_trees, color);
1445 property_trees->ResetCachedData(); 1446 property_trees->ResetCachedData();
1446 } 1447 }
1447 1448
1448 } // namespace cc 1449 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698