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

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: Created 4 years, 6 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 "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>
11 11
12 #include "cc/base/math_util.h" 12 #include "cc/base/math_util.h"
13 #include "cc/layers/layer.h" 13 #include "cc/layers/layer.h"
14 #include "cc/layers/layer_impl.h" 14 #include "cc/layers/layer_impl.h"
15 #include "cc/output/copy_output_request.h" 15 #include "cc/output/copy_output_request.h"
16 #include "cc/trees/draw_property_utils.h" 16 #include "cc/trees/draw_property_utils.h"
17 #include "cc/trees/layer_tree_host.h" 17 #include "cc/trees/layer_tree_host.h"
18 #include "cc/trees/layer_tree_impl.h" 18 #include "cc/trees/layer_tree_impl.h"
19 #include "ui/gfx/geometry/point_f.h" 19 #include "ui/gfx/geometry/point_f.h"
20 #include "ui/gfx/geometry/vector2d_conversions.h" 20 #include "ui/gfx/geometry/vector2d_conversions.h"
21 21
22 namespace cc { 22 namespace cc {
23 23
24 class LayerTreeHost; 24 class LayerTreeHost;
25 25
26 namespace { 26 namespace {
27 27
28 static const int kInvalidPropertyTreeNodeId = -1;
29 static const int kRootPropertyTreeNodeId = 0;
30 static const int kViewportClipTreeNodeId = 1;
31
32 template <typename LayerType> 28 template <typename LayerType>
33 struct DataForRecursion { 29 struct DataForRecursion {
34 PropertyTrees* property_trees; 30 PropertyTrees* property_trees;
35 LayerType* transform_tree_parent; 31 LayerType* transform_tree_parent;
36 LayerType* transform_fixed_parent; 32 LayerType* transform_fixed_parent;
37 int render_target; 33 int render_target;
38 int clip_tree_parent; 34 int clip_tree_parent;
39 int effect_tree_parent; 35 int effect_tree_parent;
40 int scroll_tree_parent; 36 int scroll_tree_parent;
41 const LayerType* page_scale_layer; 37 const LayerType* page_scale_layer;
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 440
445 bool requires_node = is_root || is_scrollable || has_significant_transform || 441 bool requires_node = is_root || is_scrollable || has_significant_transform ||
446 has_any_transform_animation || has_surface || is_fixed || 442 has_any_transform_animation || has_surface || is_fixed ||
447 is_page_scale_layer || is_overscroll_elasticity_layer || 443 is_page_scale_layer || is_overscroll_elasticity_layer ||
448 scroll_child_has_different_target || 444 scroll_child_has_different_target ||
449 is_at_boundary_of_3d_rendering_context; 445 is_at_boundary_of_3d_rendering_context;
450 446
451 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); 447 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer);
452 DCHECK(is_root || transform_parent); 448 DCHECK(is_root || transform_parent);
453 449
454 int parent_index = kRootPropertyTreeNodeId; 450 int parent_index = TransformTree::kDeviceNodeId;
455 if (transform_parent) 451 if (transform_parent)
456 parent_index = transform_parent->transform_tree_index(); 452 parent_index = transform_parent->transform_tree_index();
457 453
458 int source_index = parent_index; 454 int source_index = parent_index;
459 455
460 gfx::Vector2dF source_offset; 456 gfx::Vector2dF source_offset;
461 if (transform_parent) { 457 if (transform_parent) {
462 if (ScrollParent(layer)) { 458 if (ScrollParent(layer)) {
463 LayerType* source = layer->parent(); 459 LayerType* source = layer->parent();
464 source_offset += source->offset_to_transform_parent(); 460 source_offset += source->offset_to_transform_parent();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 if (layer == data_from_ancestor.page_scale_layer) 524 if (layer == data_from_ancestor.page_scale_layer)
529 data_for_children->in_subtree_of_page_scale_layer = true; 525 data_for_children->in_subtree_of_page_scale_layer = true;
530 node->data.in_subtree_of_page_scale_layer = 526 node->data.in_subtree_of_page_scale_layer =
531 data_for_children->in_subtree_of_page_scale_layer; 527 data_for_children->in_subtree_of_page_scale_layer;
532 528
533 // Surfaces inherently flatten transforms. 529 // Surfaces inherently flatten transforms.
534 data_for_children->should_flatten = 530 data_for_children->should_flatten =
535 ShouldFlattenTransform(layer) || has_surface; 531 ShouldFlattenTransform(layer) || has_surface;
536 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); 532 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u);
537 533
538 data_for_children->property_trees->transform_tree.SetTargetId( 534 if (data_from_ancestor.render_target == EffectTree::kInvalidNodeId) {
539 node->id, data_for_children->property_trees->effect_tree 535 data_for_children->property_trees->transform_tree.SetTargetId(
540 .Node(data_from_ancestor.render_target) 536 node->id, TransformTree::kDeviceNodeId);
541 ->data.transform_id); 537 } else {
538 data_for_children->property_trees->transform_tree.SetTargetId(
539 node->id, data_for_children->property_trees->effect_tree
540 .Node(data_from_ancestor.render_target)
541 ->data.transform_id);
542 }
542 data_for_children->property_trees->transform_tree.SetContentTargetId( 543 data_for_children->property_trees->transform_tree.SetContentTargetId(
543 node->id, data_for_children->property_trees->effect_tree 544 node->id, data_for_children->property_trees->effect_tree
544 .Node(data_for_children->render_target) 545 .Node(data_for_children->render_target)
545 ->data.transform_id); 546 ->data.transform_id);
546 DCHECK_NE( 547 DCHECK_NE(
547 data_for_children->property_trees->transform_tree.TargetId(node->id), 548 data_for_children->property_trees->transform_tree.TargetId(node->id),
548 kInvalidPropertyTreeNodeId); 549 TransformTree::kInvalidNodeId);
549 550
550 node->data.has_potential_animation = has_potentially_animated_transform; 551 node->data.has_potential_animation = has_potentially_animated_transform;
551 node->data.is_currently_animating = layer->TransformIsAnimating(); 552 node->data.is_currently_animating = layer->TransformIsAnimating();
552 if (has_potentially_animated_transform) { 553 if (has_potentially_animated_transform) {
553 float maximum_animation_target_scale = 0.f; 554 float maximum_animation_target_scale = 0.f;
554 if (layer->MaximumTargetScale(&maximum_animation_target_scale)) { 555 if (layer->MaximumTargetScale(&maximum_animation_target_scale)) {
555 node->data.local_maximum_animation_target_scale = 556 node->data.local_maximum_animation_target_scale =
556 maximum_animation_target_scale; 557 maximum_animation_target_scale;
557 } 558 }
558 559
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 data_from_ancestor.property_trees->transform_tree.next_available_id(); 925 data_from_ancestor.property_trees->transform_tree.next_available_id();
925 node.data.has_unclipped_descendants = 926 node.data.has_unclipped_descendants =
926 (NumUnclippedDescendants(layer) != 0); 927 (NumUnclippedDescendants(layer) != 0);
927 } 928 }
928 node.data.clip_id = data_from_ancestor.clip_tree_parent; 929 node.data.clip_id = data_from_ancestor.clip_tree_parent;
929 } else { 930 } else {
930 // Root render surface acts the unbounded and untransformed to draw content 931 // Root render surface acts the unbounded and untransformed to draw content
931 // into. Transform node created from root layer (includes device scale 932 // into. Transform node created from root layer (includes device scale
932 // factor) and clip node created from root layer (include viewports) applies 933 // factor) and clip node created from root layer (include viewports) applies
933 // to root render surface's content, but not root render surface itself. 934 // to root render surface's content, but not root render surface itself.
934 node.data.transform_id = kRootPropertyTreeNodeId; 935 node.data.transform_id = TransformTree::kDeviceNodeId;
935 node.data.clip_id = kViewportClipTreeNodeId; 936 node.data.clip_id = ClipTree::kRootNodeId;
936 } 937 }
937 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); 938 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id);
938 int node_id = data_for_children->effect_tree_parent; 939 int node_id = data_for_children->effect_tree_parent;
939 layer->SetEffectTreeIndex(node_id); 940 layer->SetEffectTreeIndex(node_id);
940 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = 941 data_for_children->property_trees->effect_id_to_index_map[layer->id()] =
941 data_for_children->effect_tree_parent; 942 data_for_children->effect_tree_parent;
942 943
943 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; 944 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests;
944 TakeCopyRequests(layer, &layer_copy_requests); 945 TakeCopyRequests(layer, &layer_copy_requests);
945 for (auto& it : layer_copy_requests) { 946 for (auto& it : layer_copy_requests) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 ScrollNode node; 989 ScrollNode node;
989 node.owner_id = layer->id(); 990 node.owner_id = layer->id();
990 node.data.scrollable = scrollable; 991 node.data.scrollable = scrollable;
991 node.data.main_thread_scrolling_reasons = main_thread_scrolling_reasons; 992 node.data.main_thread_scrolling_reasons = main_thread_scrolling_reasons;
992 node.data.contains_non_fast_scrollable_region = 993 node.data.contains_non_fast_scrollable_region =
993 contains_non_fast_scrollable_region; 994 contains_non_fast_scrollable_region;
994 gfx::Size clip_bounds; 995 gfx::Size clip_bounds;
995 if (layer->scroll_clip_layer()) { 996 if (layer->scroll_clip_layer()) {
996 clip_bounds = layer->scroll_clip_layer()->bounds(); 997 clip_bounds = layer->scroll_clip_layer()->bounds();
997 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != 998 DCHECK(layer->scroll_clip_layer()->transform_tree_index() !=
998 kInvalidPropertyTreeNodeId); 999 TransformTree::kInvalidNodeId);
999 node.data.max_scroll_offset_affected_by_page_scale = 1000 node.data.max_scroll_offset_affected_by_page_scale =
1000 !data_from_ancestor.property_trees->transform_tree 1001 !data_from_ancestor.property_trees->transform_tree
1001 .Node(layer->scroll_clip_layer()->transform_tree_index()) 1002 .Node(layer->scroll_clip_layer()->transform_tree_index())
1002 ->data.in_subtree_of_page_scale_layer && 1003 ->data.in_subtree_of_page_scale_layer &&
1003 data_from_ancestor.in_subtree_of_page_scale_layer; 1004 data_from_ancestor.in_subtree_of_page_scale_layer;
1004 } 1005 }
1005 1006
1006 node.data.scroll_clip_layer_bounds = clip_bounds; 1007 node.data.scroll_clip_layer_bounds = clip_bounds;
1007 node.data.is_inner_viewport_scroll_layer = 1008 node.data.is_inner_viewport_scroll_layer =
1008 layer == data_from_ancestor.inner_viewport_scroll_layer; 1009 layer == data_from_ancestor.inner_viewport_scroll_layer;
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 root_layer->position()); 1241 root_layer->position());
1241 return; 1242 return;
1242 } 1243 }
1243 1244
1244 property_trees->sequence_number++; 1245 property_trees->sequence_number++;
1245 1246
1246 DataForRecursion<LayerType> data_for_recursion; 1247 DataForRecursion<LayerType> data_for_recursion;
1247 data_for_recursion.property_trees = property_trees; 1248 data_for_recursion.property_trees = property_trees;
1248 data_for_recursion.transform_tree_parent = nullptr; 1249 data_for_recursion.transform_tree_parent = nullptr;
1249 data_for_recursion.transform_fixed_parent = nullptr; 1250 data_for_recursion.transform_fixed_parent = nullptr;
1250 data_for_recursion.render_target = kRootPropertyTreeNodeId; 1251 data_for_recursion.render_target = EffectTree::kInvalidNodeId;
1251 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; 1252 data_for_recursion.clip_tree_parent = ClipTree::kInvalidNodeId;
1252 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; 1253 data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId;
1253 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; 1254 data_for_recursion.scroll_tree_parent = ScrollTree::kInvalidNodeId;
1254 data_for_recursion.page_scale_layer = page_scale_layer; 1255 data_for_recursion.page_scale_layer = page_scale_layer;
1255 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; 1256 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer;
1256 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; 1257 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer;
1257 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; 1258 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer;
1258 data_for_recursion.elastic_overscroll = elastic_overscroll; 1259 data_for_recursion.elastic_overscroll = elastic_overscroll;
1259 data_for_recursion.page_scale_factor = page_scale_factor; 1260 data_for_recursion.page_scale_factor = page_scale_factor;
1260 data_for_recursion.in_subtree_of_page_scale_layer = false; 1261 data_for_recursion.in_subtree_of_page_scale_layer = false;
1261 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; 1262 data_for_recursion.affected_by_inner_viewport_bounds_delta = false;
1262 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; 1263 data_for_recursion.affected_by_outer_viewport_bounds_delta = false;
1263 data_for_recursion.should_flatten = false; 1264 data_for_recursion.should_flatten = false;
(...skipping 18 matching lines...) Expand all
1282 data_for_recursion.property_trees->effect_id_to_index_map.clear(); 1283 data_for_recursion.property_trees->effect_id_to_index_map.clear();
1283 data_for_recursion.property_trees->clip_id_to_index_map.clear(); 1284 data_for_recursion.property_trees->clip_id_to_index_map.clear();
1284 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); 1285 data_for_recursion.property_trees->scroll_id_to_index_map.clear();
1285 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids 1286 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids
1286 .clear(); 1287 .clear();
1287 1288
1288 ClipNode root_clip; 1289 ClipNode root_clip;
1289 root_clip.data.resets_clip = true; 1290 root_clip.data.resets_clip = true;
1290 root_clip.data.applies_local_clip = true; 1291 root_clip.data.applies_local_clip = true;
1291 root_clip.data.clip = gfx::RectF(viewport); 1292 root_clip.data.clip = gfx::RectF(viewport);
1292 root_clip.data.transform_id = kRootPropertyTreeNodeId; 1293 root_clip.data.transform_id = TransformTree::kDeviceNodeId;
1293 data_for_recursion.clip_tree_parent = 1294 data_for_recursion.clip_tree_parent =
1294 data_for_recursion.property_trees->clip_tree.Insert( 1295 data_for_recursion.property_trees->clip_tree.Insert(
1295 root_clip, kRootPropertyTreeNodeId); 1296 root_clip, ClipTree::kInvalidNodeId);
1296 1297
1297 DataForRecursionFromChild<LayerType> data_from_child; 1298 DataForRecursionFromChild<LayerType> data_from_child;
1298 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 1299 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child);
1299 property_trees->needs_rebuild = false; 1300 property_trees->needs_rebuild = false;
1300 1301
1301 // The transform tree is kept up-to-date as it is built, but the 1302 // The transform tree is kept up-to-date as it is built, but the
1302 // combined_clips stored in the clip tree and the screen_space_opacity and 1303 // combined_clips stored in the clip tree and the screen_space_opacity and
1303 // is_drawn in the effect tree aren't computed during tree building. 1304 // is_drawn in the effect tree aren't computed during tree building.
1304 property_trees->transform_tree.set_needs_update(false); 1305 property_trees->transform_tree.set_needs_update(false);
1305 property_trees->clip_tree.set_needs_update(true); 1306 property_trees->clip_tree.set_needs_update(true);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 if (SkColorGetA(color) != 255) 1375 if (SkColorGetA(color) != 255)
1375 color = SkColorSetA(color, 255); 1376 color = SkColorSetA(color, 255);
1376 BuildPropertyTreesTopLevelInternal( 1377 BuildPropertyTreesTopLevelInternal(
1377 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1378 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1378 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1379 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1379 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1380 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1380 device_transform, property_trees, color); 1381 device_transform, property_trees, color);
1381 } 1382 }
1382 1383
1383 } // namespace cc 1384 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698