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

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

Issue 1832663002: cc : Determine if a layer is root by using the value in LayerTreeImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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 | « no previous file | cc/trees/layer_tree_host_common.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
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/layers/draw_properties.h" 12 #include "cc/layers/draw_properties.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/trees/layer_tree_impl.h" 15 #include "cc/trees/layer_tree_impl.h"
16 #include "cc/trees/property_tree.h" 16 #include "cc/trees/property_tree.h"
17 #include "cc/trees/property_tree_builder.h" 17 #include "cc/trees/property_tree_builder.h"
18 #include "ui/gfx/geometry/rect_conversions.h" 18 #include "ui/gfx/geometry/rect_conversions.h"
19 19
20 namespace cc { 20 namespace cc {
21 21
22 namespace draw_property_utils { 22 namespace draw_property_utils {
23 23
24 namespace { 24 namespace {
25 25
26 static bool IsRootLayer(const Layer* layer) {
27 return !layer->parent();
28 }
29
30 static bool IsRootLayer(const LayerImpl* layer) {
31 return layer->layer_tree_impl()->IsRootLayer(layer);
32 }
33
26 template <typename LayerType> 34 template <typename LayerType>
27 static void ValidateRenderSurfaces(LayerType* layer) { 35 static void ValidateRenderSurfaceForLayer(LayerType* layer) {
28 for (size_t i = 0; i < layer->children().size(); ++i) {
29 ValidateRenderSurfaces(layer->child_at(i));
30 }
31
32 // This test verifies that there are no cases where a LayerImpl needs 36 // This test verifies that there are no cases where a LayerImpl needs
33 // a render surface, but doesn't have one. 37 // a render surface, but doesn't have one.
34 if (layer->has_render_surface()) 38 if (layer->has_render_surface())
35 return; 39 return;
36 40
37 DCHECK(layer->filters().IsEmpty()) << "layer: " << layer->id(); 41 DCHECK(layer->filters().IsEmpty()) << "layer: " << layer->id();
38 DCHECK(layer->background_filters().IsEmpty()) << "layer: " << layer->id(); 42 DCHECK(layer->background_filters().IsEmpty()) << "layer: " << layer->id();
39 DCHECK(layer->parent()) << "layer: " << layer->id(); 43 DCHECK(!IsRootLayer(layer)) << "layer: " << layer->id();
40 if (layer->parent()->replica_layer() == layer) 44 if (layer->parent()->replica_layer() == layer)
41 return; 45 return;
42 DCHECK(!layer->mask_layer()) << "layer: " << layer->id(); 46 DCHECK(!layer->mask_layer()) << "layer: " << layer->id();
43 DCHECK(!layer->replica_layer()) << "layer: " << layer->id(); 47 DCHECK(!layer->replica_layer()) << "layer: " << layer->id();
44 DCHECK(!layer->is_root_for_isolated_group()) << "layer: " << layer->id(); 48 DCHECK(!layer->is_root_for_isolated_group()) << "layer: " << layer->id();
45 DCHECK(!layer->HasCopyRequest()) << "layer: " << layer->id(); 49 DCHECK(!layer->HasCopyRequest()) << "layer: " << layer->id();
46 } 50 }
47 51
52 static void ValidateRenderSurfacesRecursive(Layer* layer) {
53 ValidateRenderSurfaceForLayer(layer);
54 for (size_t i = 0; i < layer->children().size(); ++i)
55 ValidateRenderSurfacesRecursive(layer->child_at(i));
56 }
57
48 template <typename LayerType> 58 template <typename LayerType>
49 void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, 59 void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list,
50 const ClipTree& clip_tree, 60 const ClipTree& clip_tree,
51 const TransformTree& transform_tree, 61 const TransformTree& transform_tree,
52 bool non_root_surfaces_enabled) { 62 bool non_root_surfaces_enabled) {
53 for (auto& layer : visible_layer_list) { 63 for (auto& layer : visible_layer_list) {
54 gfx::Size layer_bounds = layer->bounds(); 64 gfx::Size layer_bounds = layer->bounds();
55 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 65 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
56 const bool is_unclipped = clip_node->data.resets_clip && 66 const bool is_unclipped = clip_node->data.resets_clip &&
57 !clip_node->data.applies_local_clip && 67 !clip_node->data.applies_local_clip &&
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 void FindLayersThatNeedUpdates( 430 void FindLayersThatNeedUpdates(
421 LayerType* layer, 431 LayerType* layer,
422 const TransformTree& transform_tree, 432 const TransformTree& transform_tree,
423 const EffectTree& effect_tree, 433 const EffectTree& effect_tree,
424 typename LayerType::LayerListType* update_layer_list, 434 typename LayerType::LayerListType* update_layer_list,
425 std::vector<LayerType*>* visible_layer_list) { 435 std::vector<LayerType*>* visible_layer_list) {
426 DCHECK_GE(layer->effect_tree_index(), 0); 436 DCHECK_GE(layer->effect_tree_index(), 0);
427 bool layer_is_drawn = 437 bool layer_is_drawn =
428 effect_tree.Node(layer->effect_tree_index())->data.is_drawn; 438 effect_tree.Node(layer->effect_tree_index())->data.is_drawn;
429 439
430 if (layer->parent() && 440 if (!IsRootLayer(layer) &&
431 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree)) 441 SubtreeShouldBeSkipped(layer, layer_is_drawn, transform_tree))
432 return; 442 return;
433 443
434 if (!LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree)) { 444 if (!LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree)) {
435 visible_layer_list->push_back(layer); 445 visible_layer_list->push_back(layer);
436 update_layer_list->push_back(layer); 446 update_layer_list->push_back(layer);
437 } 447 }
438 448
439 // Append mask layers to the update layer list. They don't have valid visible 449 // Append mask layers to the update layer list. They don't have valid visible
440 // rects, so need to get added after the above calculation. Replica layers 450 // rects, so need to get added after the above calculation. Replica layers
441 // don't need to be updated. 451 // don't need to be updated.
442 if (LayerType* mask_layer = layer->mask_layer()) 452 if (LayerType* mask_layer = layer->mask_layer())
443 update_layer_list->push_back(mask_layer); 453 update_layer_list->push_back(mask_layer);
444 if (LayerType* replica_layer = layer->replica_layer()) { 454 if (LayerType* replica_layer = layer->replica_layer()) {
445 if (LayerType* mask_layer = replica_layer->mask_layer()) 455 if (LayerType* mask_layer = replica_layer->mask_layer())
446 update_layer_list->push_back(mask_layer); 456 update_layer_list->push_back(mask_layer);
447 } 457 }
448 458
449 for (size_t i = 0; i < layer->children().size(); ++i) { 459 for (size_t i = 0; i < layer->children().size(); ++i) {
450 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree, 460 FindLayersThatNeedUpdates(layer->child_at(i), transform_tree, effect_tree,
451 update_layer_list, visible_layer_list); 461 update_layer_list, visible_layer_list);
452 } 462 }
453 } 463 }
454 464
455 template <typename LayerType> 465 template <typename LayerType>
456 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, 466 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree,
457 bool non_root_surfaces_enabled, 467 bool non_root_surfaces_enabled,
458 LayerType* layer) { 468 LayerType* layer) {
459 if (!non_root_surfaces_enabled) { 469 if (!non_root_surfaces_enabled) {
460 layer->SetHasRenderSurface(!layer->parent()); 470 layer->SetHasRenderSurface(IsRootLayer(layer));
461 return; 471 return;
462 } 472 }
463 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); 473 EffectNode* node = effect_tree->Node(layer->effect_tree_index());
464 474
465 if (node->owner_id == layer->id() && node->data.has_render_surface) 475 if (node->owner_id == layer->id() && node->data.has_render_surface)
466 layer->SetHasRenderSurface(true); 476 layer->SetHasRenderSurface(true);
467 else 477 else
468 layer->SetHasRenderSurface(false); 478 layer->SetHasRenderSurface(false);
469 } 479 }
470 480
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 bool can_render_to_separate_surface, 690 bool can_render_to_separate_surface,
681 PropertyTrees* property_trees, 691 PropertyTrees* property_trees,
682 LayerList* update_layer_list) { 692 LayerList* update_layer_list) {
683 PropertyTreeBuilder::BuildPropertyTrees( 693 PropertyTreeBuilder::BuildPropertyTrees(
684 root_layer, page_scale_layer, inner_viewport_scroll_layer, 694 root_layer, page_scale_layer, inner_viewport_scroll_layer,
685 outer_viewport_scroll_layer, overscroll_elasticity_layer, 695 outer_viewport_scroll_layer, overscroll_elasticity_layer,
686 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 696 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
687 device_transform, property_trees); 697 device_transform, property_trees);
688 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree, 698 UpdateRenderSurfacesForLayersRecursive(&property_trees->effect_tree,
689 root_layer); 699 root_layer);
690 ValidateRenderSurfaces(root_layer); 700 ValidateRenderSurfacesRecursive(root_layer);
691 ComputeVisibleRects(root_layer, property_trees, 701 ComputeVisibleRects(root_layer, property_trees,
692 can_render_to_separate_surface, update_layer_list); 702 can_render_to_separate_surface, update_layer_list);
693 } 703 }
694 704
695 void BuildPropertyTreesAndComputeVisibleRects( 705 void BuildPropertyTreesAndComputeVisibleRects(
696 LayerImpl* root_layer, 706 LayerImpl* root_layer,
697 const LayerImpl* page_scale_layer, 707 const LayerImpl* page_scale_layer,
698 const LayerImpl* inner_viewport_scroll_layer, 708 const LayerImpl* inner_viewport_scroll_layer,
699 const LayerImpl* outer_viewport_scroll_layer, 709 const LayerImpl* outer_viewport_scroll_layer,
700 const LayerImpl* overscroll_elasticity_layer, 710 const LayerImpl* overscroll_elasticity_layer,
(...skipping 21 matching lines...) Expand all
722 std::vector<Layer*> visible_layer_list; 732 std::vector<Layer*> visible_layer_list;
723 ComputeVisibleRectsInternal(root_layer, property_trees, 733 ComputeVisibleRectsInternal(root_layer, property_trees,
724 can_render_to_separate_surface, update_layer_list, 734 can_render_to_separate_surface, update_layer_list,
725 &visible_layer_list); 735 &visible_layer_list);
726 } 736 }
727 737
728 void ComputeVisibleRects(LayerImpl* root_layer, 738 void ComputeVisibleRects(LayerImpl* root_layer,
729 PropertyTrees* property_trees, 739 PropertyTrees* property_trees,
730 bool can_render_to_separate_surface, 740 bool can_render_to_separate_surface,
731 LayerImplList* visible_layer_list) { 741 LayerImplList* visible_layer_list) {
732 for (auto* layer : *root_layer->layer_tree_impl()) 742 for (auto* layer : *root_layer->layer_tree_impl()) {
733 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 743 UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
734 can_render_to_separate_surface, layer); 744 can_render_to_separate_surface, layer);
735 if (can_render_to_separate_surface) 745 if (can_render_to_separate_surface)
736 ValidateRenderSurfaces(root_layer); 746 ValidateRenderSurfaceForLayer(layer);
747 }
737 LayerImplList update_layer_list; 748 LayerImplList update_layer_list;
738 ComputeVisibleRectsInternal(root_layer, property_trees, 749 ComputeVisibleRectsInternal(root_layer, property_trees,
739 can_render_to_separate_surface, 750 can_render_to_separate_surface,
740 &update_layer_list, visible_layer_list); 751 &update_layer_list, visible_layer_list);
741 } 752 }
742 753
743 template <typename LayerType> 754 template <typename LayerType>
744 static gfx::Transform DrawTransformInternal(const LayerType* layer, 755 static gfx::Transform DrawTransformInternal(const LayerType* layer,
745 const TransformNode* node) { 756 const TransformNode* node) {
746 gfx::Transform xform; 757 gfx::Transform xform;
747 const bool owns_non_root_surface = 758 const bool owns_non_root_surface =
748 layer->parent() && layer->has_render_surface(); 759 !IsRootLayer(layer) && layer->has_render_surface();
749 if (!owns_non_root_surface) { 760 if (!owns_non_root_surface) {
750 // If you're not the root, or you don't own a surface, you need to apply 761 // If you're not the root, or you don't own a surface, you need to apply
751 // your local offset. 762 // your local offset.
752 xform = node->data.to_target; 763 xform = node->data.to_target;
753 if (layer->should_flatten_transform_from_property_tree()) 764 if (layer->should_flatten_transform_from_property_tree())
754 xform.FlattenTo2d(); 765 xform.FlattenTo2d();
755 xform.Translate(layer->offset_to_transform_parent().x(), 766 xform.Translate(layer->offset_to_transform_parent().x(),
756 layer->offset_to_transform_parent().y()); 767 layer->offset_to_transform_parent().y());
757 } else { 768 } else {
758 // Surfaces need to apply their sublayer scale. 769 // Surfaces need to apply their sublayer scale.
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 DCHECK(page_scale_layer); 1058 DCHECK(page_scale_layer);
1048 DCHECK_GE(page_scale_layer->transform_tree_index(), 0); 1059 DCHECK_GE(page_scale_layer->transform_tree_index(), 0);
1049 TransformNode* node = property_trees->transform_tree.Node( 1060 TransformNode* node = property_trees->transform_tree.Node(
1050 page_scale_layer->transform_tree_index()); 1061 page_scale_layer->transform_tree_index());
1051 // TODO(enne): property trees can't ask the layer these things, but 1062 // TODO(enne): property trees can't ask the layer these things, but
1052 // the page scale layer should *just* be the page scale. 1063 // the page scale layer should *just* be the page scale.
1053 DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString()); 1064 DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString());
1054 DCHECK_EQ(page_scale_layer->transform_origin().ToString(), 1065 DCHECK_EQ(page_scale_layer->transform_origin().ToString(),
1055 gfx::Point3F().ToString()); 1066 gfx::Point3F().ToString());
1056 1067
1057 if (!page_scale_layer->parent()) { 1068 if (IsRootLayer(page_scale_layer)) {
1058 // When the page scale layer is also the root layer, the node should also 1069 // When the page scale layer is also the root layer, the node should also
1059 // store the combined scale factor and not just the page scale factor. 1070 // store the combined scale factor and not just the page scale factor.
1060 float post_local_scale_factor = page_scale_factor * device_scale_factor; 1071 float post_local_scale_factor = page_scale_factor * device_scale_factor;
1061 node->data.post_local_scale_factor = post_local_scale_factor; 1072 node->data.post_local_scale_factor = post_local_scale_factor;
1062 node->data.post_local = device_transform; 1073 node->data.post_local = device_transform;
1063 node->data.post_local.Scale(post_local_scale_factor, 1074 node->data.post_local.Scale(post_local_scale_factor,
1064 post_local_scale_factor); 1075 post_local_scale_factor);
1065 } else { 1076 } else {
1066 node->data.post_local_scale_factor = page_scale_factor; 1077 node->data.post_local_scale_factor = page_scale_factor;
1067 node->data.update_post_local_transform(gfx::PointF(), gfx::Point3F()); 1078 node->data.update_post_local_transform(gfx::PointF(), gfx::Point3F());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1120 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1131 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1121 const Layer* overscroll_elasticity_layer, 1132 const Layer* overscroll_elasticity_layer,
1122 const gfx::Vector2dF& elastic_overscroll) { 1133 const gfx::Vector2dF& elastic_overscroll) {
1123 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1134 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1124 elastic_overscroll); 1135 elastic_overscroll);
1125 } 1136 }
1126 1137
1127 } // namespace draw_property_utils 1138 } // namespace draw_property_utils
1128 1139
1129 } // namespace cc 1140 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/trees/layer_tree_host_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698