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

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

Issue 1001833005: Update from https://crrev.com/320343 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Supress Created 5 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 | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl.h » ('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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/layer_tree_host_common.h" 5 #include "cc/trees/layer_tree_host_common.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "cc/animation/layer_animation_controller.h" 10 #include "cc/animation/layer_animation_controller.h"
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( 1471 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1472 parent.get(), parent->bounds(), &render_surface_layer_list); 1472 parent.get(), parent->bounds(), &render_surface_layer_list);
1473 inputs.can_adjust_raster_scales = true; 1473 inputs.can_adjust_raster_scales = true;
1474 LayerTreeHostCommon::CalculateDrawProperties(&inputs); 1474 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1475 EXPECT_TRUE(parent->render_surface()); 1475 EXPECT_TRUE(parent->render_surface());
1476 EXPECT_FALSE(render_surface1->render_surface()); 1476 EXPECT_FALSE(render_surface1->render_surface());
1477 EXPECT_EQ(1U, render_surface_layer_list.size()); 1477 EXPECT_EQ(1U, render_surface_layer_list.size());
1478 } 1478 }
1479 } 1479 }
1480 1480
1481 TEST_F(LayerTreeHostCommonTest, RenderSurfacesFlattenScreenSpaceTransform) {
1482 // Render surfaces act as a flattening point for their subtree, so should
1483 // always flatten the target-to-screen space transform seen by descendants.
1484
1485 scoped_refptr<Layer> root = Layer::Create();
1486 scoped_refptr<Layer> parent = Layer::Create();
1487 scoped_refptr<LayerWithForcedDrawsContent> child =
1488 make_scoped_refptr(new LayerWithForcedDrawsContent());
1489 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
1490 make_scoped_refptr(new LayerWithForcedDrawsContent());
1491
1492 gfx::Transform rotation_about_y_axis;
1493 rotation_about_y_axis.RotateAboutYAxis(30.0);
1494 // Make |parent| have a render surface.
1495 parent->SetOpacity(0.9f);
1496
1497 const gfx::Transform identity_matrix;
1498 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
1499 gfx::PointF(), gfx::Size(100, 100), true, false);
1500 SetLayerPropertiesForTesting(parent.get(), rotation_about_y_axis,
1501 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
1502 true, false);
1503 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
1504 gfx::PointF(), gfx::Size(10, 10), true, false);
1505 SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
1506 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
1507 true, false);
1508
1509 root->AddChild(parent);
1510 parent->AddChild(child);
1511 child->AddChild(grand_child);
1512
1513 grand_child->SetShouldFlattenTransform(false);
1514
1515 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1516 host->SetRootLayer(root);
1517
1518 // Only grand_child should preserve 3d.
1519 EXPECT_TRUE(root->should_flatten_transform());
1520 EXPECT_TRUE(parent->should_flatten_transform());
1521 EXPECT_TRUE(child->should_flatten_transform());
1522 EXPECT_FALSE(grand_child->should_flatten_transform());
1523
1524 gfx::Transform expected_child_draw_transform = identity_matrix;
1525 gfx::Transform expected_grand_child_draw_transform = identity_matrix;
1526
1527 gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
1528 flattened_rotation_about_y.FlattenTo2d();
1529
1530 ExecuteCalculateDrawProperties(root.get());
1531
1532 EXPECT_TRUE(parent->render_surface());
1533 EXPECT_FALSE(child->render_surface());
1534 EXPECT_FALSE(grand_child->render_surface());
1535
1536 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
1537 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
1538 grand_child->draw_transform());
1539
1540 // The screen-space transform inherited by |child| and |grand_child| should
1541 // have been flattened at their render target. In particular, the fact that
1542 // |grand_child| happens to preserve 3d shouldn't affect this flattening.
1543 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
1544 child->screen_space_transform());
1545 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
1546 grand_child->screen_space_transform());
1547 }
1548
1481 TEST_F(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) { 1549 TEST_F(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) {
1482 // The entire subtree of layers that are outside the clip rect should be 1550 // The entire subtree of layers that are outside the clip rect should be
1483 // culled away, and should not affect the render_surface_layer_list. 1551 // culled away, and should not affect the render_surface_layer_list.
1484 // 1552 //
1485 // The test tree is set up as follows: 1553 // The test tree is set up as follows:
1486 // - all layers except the leaf_nodes are forced to be a new render surface 1554 // - all layers except the leaf_nodes are forced to be a new render surface
1487 // that have something to draw. 1555 // that have something to draw.
1488 // - parent is a large container layer. 1556 // - parent is a large container layer.
1489 // - child has masksToBounds=true to cause clipping. 1557 // - child has masksToBounds=true to cause clipping.
1490 // - grand_child is positioned outside of the child's bounds 1558 // - grand_child is positioned outside of the child's bounds
(...skipping 1477 matching lines...) Expand 10 before | Expand all | Expand 10 after
2968 AddAnimatedTransformToLayer( 3036 AddAnimatedTransformToLayer(
2969 root.get(), 10.0, start_transform_operations, end_transform_operations); 3037 root.get(), 10.0, start_transform_operations, end_transform_operations);
2970 3038
2971 EXPECT_TRUE(root->TransformIsAnimating()); 3039 EXPECT_TRUE(root->TransformIsAnimating());
2972 3040
2973 ExecuteCalculateDrawProperties(root.get()); 3041 ExecuteCalculateDrawProperties(root.get());
2974 3042
2975 EXPECT_FALSE(child->draw_properties().sorted_for_recursion); 3043 EXPECT_FALSE(child->draw_properties().sorted_for_recursion);
2976 } 3044 }
2977 3045
2978 TEST_F(LayerTreeHostCommonTest, WillSortAtContextBoundary) {
2979 // Creates a layer tree that looks as follows:
2980 // * root (sorting-context-id1)
2981 // * parent (sorting-context-id2)
2982 // * child1 (sorting-context-id2)
2983 // * child2 (sorting-context-id2)
2984 //
2985 // This test ensures that we sort at |parent| even though both it and root are
2986 // set to be 3d sorted.
2987 FakeImplProxy proxy;
2988 TestSharedBitmapManager shared_bitmap_manager;
2989 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
2990
2991 scoped_ptr<LayerImpl> root_ptr(LayerImpl::Create(host_impl.active_tree(), 1));
2992 LayerImpl* root = root_ptr.get();
2993 scoped_ptr<LayerImpl> parent_ptr(
2994 LayerImpl::Create(host_impl.active_tree(), 2));
2995 LayerImpl* parent = parent_ptr.get();
2996 scoped_ptr<LayerImpl> child1_ptr(
2997 LayerImpl::Create(host_impl.active_tree(), 3));
2998 LayerImpl* child1 = child1_ptr.get();
2999 scoped_ptr<LayerImpl> child2_ptr(
3000 LayerImpl::Create(host_impl.active_tree(), 4));
3001 LayerImpl* child2 = child2_ptr.get();
3002
3003 gfx::Transform identity_matrix;
3004 gfx::Transform below_matrix;
3005 below_matrix.Translate3d(0.f, 0.f, -10.f);
3006 gfx::Transform above_matrix;
3007 above_matrix.Translate3d(0.f, 0.f, 10.f);
3008
3009 SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
3010 gfx::PointF(), gfx::Size(100, 100), true, true,
3011 true);
3012 SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
3013 gfx::PointF(), gfx::Size(50, 50), true, true,
3014 true);
3015 SetLayerPropertiesForTesting(child1, above_matrix, gfx::Point3F(),
3016 gfx::PointF(), gfx::Size(50, 50), true, true,
3017 false);
3018 SetLayerPropertiesForTesting(child2, below_matrix, gfx::Point3F(),
3019 gfx::PointF(), gfx::Size(50, 50), true, true,
3020 false);
3021
3022 root->Set3dSortingContextId(3);
3023 root->SetDrawsContent(true);
3024 parent->Set3dSortingContextId(7);
3025 parent->SetDrawsContent(true);
3026 child1->Set3dSortingContextId(7);
3027 child1->SetDrawsContent(true);
3028 child2->Set3dSortingContextId(7);
3029 child2->SetDrawsContent(true);
3030
3031 parent->AddChild(child1_ptr.Pass());
3032 parent->AddChild(child2_ptr.Pass());
3033 root->AddChild(parent_ptr.Pass());
3034
3035 LayerImplList render_surface_layer_list;
3036 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
3037 root_ptr.get(), root->bounds(), &render_surface_layer_list);
3038 inputs.can_adjust_raster_scales = true;
3039 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
3040
3041 EXPECT_TRUE(root->render_surface());
3042 EXPECT_EQ(2u, render_surface_layer_list.size());
3043
3044 EXPECT_EQ(3u, parent->render_surface()->layer_list().size());
3045 EXPECT_EQ(child2->id(), parent->render_surface()->layer_list().at(0)->id());
3046 EXPECT_EQ(parent->id(), parent->render_surface()->layer_list().at(1)->id());
3047 EXPECT_EQ(child1->id(), parent->render_surface()->layer_list().at(2)->id());
3048 }
3049
3050 TEST_F(LayerTreeHostCommonTest, 3046 TEST_F(LayerTreeHostCommonTest,
3051 SingularNonAnimatingTransformDoesNotPreventClearingDrawProperties) { 3047 SingularNonAnimatingTransformDoesNotPreventClearingDrawProperties) {
3052 scoped_refptr<Layer> root = Layer::Create(); 3048 scoped_refptr<Layer> root = Layer::Create();
3053 3049
3054 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost()); 3050 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3055 host->SetRootLayer(root); 3051 host->SetRootLayer(root);
3056 3052
3057 gfx::Transform identity_matrix; 3053 gfx::Transform identity_matrix;
3058 gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); 3054 gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
3059 ASSERT_FALSE(uninvertible_matrix.IsInvertible()); 3055 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
(...skipping 4525 matching lines...) Expand 10 before | Expand all | Expand 10 after
7585 // right clip, our render_surface_layer_list's order should be unaffected. 7581 // right clip, our render_surface_layer_list's order should be unaffected.
7586 EXPECT_EQ(3u, render_surface_layer_list.size()); 7582 EXPECT_EQ(3u, render_surface_layer_list.size());
7587 EXPECT_EQ(root.get(), render_surface_layer_list.at(0)); 7583 EXPECT_EQ(root.get(), render_surface_layer_list.at(0));
7588 EXPECT_EQ(render_surface2.get(), render_surface_layer_list.at(1)); 7584 EXPECT_EQ(render_surface2.get(), render_surface_layer_list.at(1));
7589 EXPECT_EQ(render_surface1.get(), render_surface_layer_list.at(2)); 7585 EXPECT_EQ(render_surface1.get(), render_surface_layer_list.at(2));
7590 EXPECT_TRUE(render_surface_layer_list.at(0)->render_surface()); 7586 EXPECT_TRUE(render_surface_layer_list.at(0)->render_surface());
7591 EXPECT_TRUE(render_surface_layer_list.at(1)->render_surface()); 7587 EXPECT_TRUE(render_surface_layer_list.at(1)->render_surface());
7592 EXPECT_TRUE(render_surface_layer_list.at(2)->render_surface()); 7588 EXPECT_TRUE(render_surface_layer_list.at(2)->render_surface());
7593 } 7589 }
7594 7590
7595 TEST_F(LayerTreeHostCommonTest, DoNotClobberSorting) {
7596 // We rearrange layer list contributions if we have to visit children out of
7597 // order, but it should be a 'stable' rearrangement. That is, the layer list
7598 // additions for a single layer should not be reordered, though their position
7599 // wrt to the contributions due to a sibling may vary.
7600 //
7601 // + root
7602 // + scroll_child
7603 // + top_content
7604 // + bottom_content
7605 // + scroll_parent_border
7606 // + scroll_parent_clip
7607 // + scroll_parent
7608 //
7609 FakeImplProxy proxy;
7610 TestSharedBitmapManager shared_bitmap_manager;
7611 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
7612 host_impl.CreatePendingTree();
7613 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
7614 scoped_ptr<LayerImpl> scroll_parent_border =
7615 LayerImpl::Create(host_impl.active_tree(), 2);
7616 scoped_ptr<LayerImpl> scroll_parent_clip =
7617 LayerImpl::Create(host_impl.active_tree(), 3);
7618 scoped_ptr<LayerImpl> scroll_parent =
7619 LayerImpl::Create(host_impl.active_tree(), 4);
7620 scoped_ptr<LayerImpl> scroll_child =
7621 LayerImpl::Create(host_impl.active_tree(), 5);
7622 scoped_ptr<LayerImpl> bottom_content =
7623 LayerImpl::Create(host_impl.active_tree(), 6);
7624 scoped_ptr<LayerImpl> top_content =
7625 LayerImpl::Create(host_impl.active_tree(), 7);
7626
7627 scroll_parent_clip->SetMasksToBounds(true);
7628
7629 scroll_child->SetScrollParent(scroll_parent.get());
7630 scoped_ptr<std::set<LayerImpl*>> scroll_children(new std::set<LayerImpl*>);
7631 scroll_children->insert(scroll_child.get());
7632 scroll_parent->SetScrollChildren(scroll_children.release());
7633
7634 scroll_child->SetDrawsContent(true);
7635 scroll_parent->SetDrawsContent(true);
7636 top_content->SetDrawsContent(true);
7637 bottom_content->SetDrawsContent(true);
7638
7639 gfx::Transform identity_transform;
7640 gfx::Transform top_transform;
7641 top_transform.Translate3d(0.0, 0.0, 5.0);
7642 gfx::Transform bottom_transform;
7643 bottom_transform.Translate3d(0.0, 0.0, 3.0);
7644
7645 SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
7646 gfx::PointF(), gfx::Size(50, 50), true, false,
7647 true);
7648 SetLayerPropertiesForTesting(scroll_parent_border.get(), identity_transform,
7649 gfx::Point3F(), gfx::PointF(), gfx::Size(40, 40),
7650 true, false, false);
7651 SetLayerPropertiesForTesting(scroll_parent_clip.get(), identity_transform,
7652 gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
7653 true, false, false);
7654 SetLayerPropertiesForTesting(scroll_parent.get(), identity_transform,
7655 gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
7656 true, false, false);
7657 SetLayerPropertiesForTesting(scroll_child.get(), identity_transform,
7658 gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
7659 true, false, false);
7660 SetLayerPropertiesForTesting(top_content.get(), top_transform, gfx::Point3F(),
7661 gfx::PointF(), gfx::Size(50, 50), false, true,
7662 true);
7663 SetLayerPropertiesForTesting(bottom_content.get(), bottom_transform,
7664 gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
7665 false, true, true);
7666
7667 scroll_child->SetShouldFlattenTransform(false);
7668 scroll_child->Set3dSortingContextId(1);
7669
7670 scroll_child->AddChild(top_content.Pass());
7671 scroll_child->AddChild(bottom_content.Pass());
7672 root->AddChild(scroll_child.Pass());
7673
7674 scroll_parent_clip->AddChild(scroll_parent.Pass());
7675 scroll_parent_border->AddChild(scroll_parent_clip.Pass());
7676 root->AddChild(scroll_parent_border.Pass());
7677
7678 LayerImplList render_surface_layer_list;
7679 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7680 root.get(), root->bounds(), &render_surface_layer_list);
7681
7682 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7683
7684 EXPECT_TRUE(root->render_surface());
7685
7686 // If we don't sort by depth and let the layers get added in the order they
7687 // would normally be visited in, then layers 6 and 7 will be out of order. In
7688 // other words, although we've had to shift 5, 6, and 7 to appear before 4
7689 // in the list (because of the scroll parent relationship), this should not
7690 // have an effect on the the order of 5, 6, and 7 (which had been reordered
7691 // due to layer sorting).
7692 EXPECT_EQ(4u, root->render_surface()->layer_list().size());
7693 EXPECT_EQ(5, root->render_surface()->layer_list().at(0)->id());
7694 EXPECT_EQ(6, root->render_surface()->layer_list().at(1)->id());
7695 EXPECT_EQ(7, root->render_surface()->layer_list().at(2)->id());
7696 EXPECT_EQ(4, root->render_surface()->layer_list().at(3)->id());
7697 }
7698
7699 TEST_F(LayerTreeHostCommonTest, ScrollCompensationWithRounding) { 7591 TEST_F(LayerTreeHostCommonTest, ScrollCompensationWithRounding) {
7700 // This test verifies that a scrolling layer that gets snapped to 7592 // This test verifies that a scrolling layer that gets snapped to
7701 // integer coordinates doesn't move a fixed position child. 7593 // integer coordinates doesn't move a fixed position child.
7702 // 7594 //
7703 // + root 7595 // + root
7704 // + container 7596 // + container
7705 // + scroller 7597 // + scroller
7706 // + fixed 7598 // + fixed
7707 // 7599 //
7708 FakeImplProxy proxy; 7600 FakeImplProxy proxy;
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
8843 8735
8844 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost()); 8736 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8845 host->SetRootLayer(root); 8737 host->SetRootLayer(root);
8846 8738
8847 ExecuteCalculateDrawProperties(root.get()); 8739 ExecuteCalculateDrawProperties(root.get());
8848 8740
8849 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), 8741 EXPECT_EQ(gfx::Rect(0, 0, 50, 50),
8850 grandchild->visible_rect_from_property_trees()); 8742 grandchild->visible_rect_from_property_trees());
8851 } 8743 }
8852 8744
8745 TEST_F(LayerTreeHostCommonTest, CombineClipsUsingContentTarget) {
8746 // In the following layer tree, the layer |box|'s render target is |surface|.
8747 // |surface| also creates a transform node. We want to combine clips for |box|
8748 // in the space of its target (i.e., |surface|), not its target's target. This
8749 // test ensures that happens.
8750
8751 gfx::Transform rotate;
8752 rotate.Rotate(5);
8753 gfx::Transform identity;
8754
8755 scoped_refptr<Layer> root = Layer::Create();
8756 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
8757 gfx::PointF(), gfx::Size(2500, 1500), true,
8758 false);
8759
8760 scoped_refptr<Layer> frame_clip = Layer::Create();
8761 SetLayerPropertiesForTesting(frame_clip.get(), identity, gfx::Point3F(),
8762 gfx::PointF(), gfx::Size(2500, 1500), true,
8763 false);
8764 frame_clip->SetMasksToBounds(true);
8765
8766 scoped_refptr<Layer> rotated = Layer::Create();
8767 SetLayerPropertiesForTesting(rotated.get(), rotate,
8768 gfx::Point3F(1250, 250, 0), gfx::PointF(),
8769 gfx::Size(2500, 500), true, false);
8770
8771 scoped_refptr<Layer> surface = Layer::Create();
8772 SetLayerPropertiesForTesting(surface.get(), rotate, gfx::Point3F(),
8773 gfx::PointF(), gfx::Size(2500, 500), true,
8774 false);
8775 surface->SetOpacity(0.5);
8776
8777 scoped_refptr<LayerWithForcedDrawsContent> container =
8778 make_scoped_refptr(new LayerWithForcedDrawsContent());
8779 SetLayerPropertiesForTesting(container.get(), identity, gfx::Point3F(),
8780 gfx::PointF(), gfx::Size(300, 300), true, false);
8781
8782 scoped_refptr<LayerWithForcedDrawsContent> box =
8783 make_scoped_refptr(new LayerWithForcedDrawsContent());
8784 SetLayerPropertiesForTesting(box.get(), identity, gfx::Point3F(),
8785 gfx::PointF(), gfx::Size(100, 100), true, false);
8786
8787 root->AddChild(frame_clip);
8788 frame_clip->AddChild(rotated);
8789 rotated->AddChild(surface);
8790 surface->AddChild(container);
8791 surface->AddChild(box);
8792
8793 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8794 host->SetRootLayer(root);
8795
8796 ExecuteCalculateDrawProperties(root.get());
8797 }
8798
8853 } // namespace 8799 } // namespace
8854 } // namespace cc 8800 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698