| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |