| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/resources/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <set> |
| 8 | 9 |
| 9 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
| 10 #include "cc/resources/picture_layer_tiling_set.h" | 11 #include "cc/resources/picture_layer_tiling_set.h" |
| 12 #include "cc/test/fake_output_surface.h" |
| 13 #include "cc/test/fake_output_surface_client.h" |
| 11 #include "cc/test/fake_picture_layer_tiling_client.h" | 14 #include "cc/test/fake_picture_layer_tiling_client.h" |
| 15 #include "cc/test/test_context_provider.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "ui/gfx/rect_conversions.h" | 17 #include "ui/gfx/rect_conversions.h" |
| 14 #include "ui/gfx/size_conversions.h" | 18 #include "ui/gfx/size_conversions.h" |
| 15 | 19 |
| 16 namespace cc { | 20 namespace cc { |
| 17 namespace { | 21 namespace { |
| 18 | 22 |
| 19 static gfx::Rect ViewportInLayerSpace( | 23 static gfx::Rect ViewportInLayerSpace( |
| 20 const gfx::Transform& transform, | 24 const gfx::Transform& transform, |
| 21 const gfx::Size& device_viewport) { | 25 const gfx::Size& device_viewport) { |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 bool have_soon = false; | 489 bool have_soon = false; |
| 486 | 490 |
| 487 // Viewport moved, so we expect to find some NOW tiles, some SOON tiles and | 491 // Viewport moved, so we expect to find some NOW tiles, some SOON tiles and |
| 488 // some EVENTUALLY tiles. | 492 // some EVENTUALLY tiles. |
| 489 for (int i = 0; i < 6; ++i) { | 493 for (int i = 0; i < 6; ++i) { |
| 490 for (int j = 0; j < 6; ++j) { | 494 for (int j = 0; j < 6; ++j) { |
| 491 Tile* tile = tiling->TileAt(i, j); | 495 Tile* tile = tiling->TileAt(i, j); |
| 492 TilePriority priority = tile->priority(ACTIVE_TREE); | 496 TilePriority priority = tile->priority(ACTIVE_TREE); |
| 493 | 497 |
| 494 if (viewport_in_content_space.Intersects(tile->content_rect())) { | 498 if (viewport_in_content_space.Intersects(tile->content_rect())) { |
| 495 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); | 499 EXPECT_EQ(TilePriority::NOW, priority.priority_bin) << "i: " << i |
| 496 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); | 500 << " j: " << j; |
| 501 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible) << "i: " << i |
| 502 << " j: " << j; |
| 497 have_now = true; | 503 have_now = true; |
| 498 } else if (skewport.Intersects(tile->content_rect())) { | 504 } else if (skewport.Intersects(tile->content_rect())) { |
| 499 EXPECT_EQ(TilePriority::SOON, priority.priority_bin); | 505 EXPECT_EQ(TilePriority::SOON, priority.priority_bin) << "i: " << i |
| 500 EXPECT_GT(priority.distance_to_visible, 0.f); | 506 << " j: " << j; |
| 507 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i |
| 508 << " j: " << j; |
| 501 have_soon = true; | 509 have_soon = true; |
| 502 } else { | 510 } else { |
| 503 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin); | 511 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin) |
| 504 EXPECT_GT(priority.distance_to_visible, 0.f); | 512 << "i: " << i << " j: " << j; |
| 513 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i |
| 514 << " j: " << j; |
| 505 have_eventually = true; | 515 have_eventually = true; |
| 506 } | 516 } |
| 507 } | 517 } |
| 508 } | 518 } |
| 509 | 519 |
| 510 EXPECT_TRUE(have_now); | 520 EXPECT_TRUE(have_now); |
| 511 EXPECT_TRUE(have_soon); | 521 EXPECT_TRUE(have_soon); |
| 512 EXPECT_TRUE(have_eventually); | 522 EXPECT_TRUE(have_eventually); |
| 513 | 523 |
| 514 priority = tiling->TileAt(5, 1)->priority(ACTIVE_TREE); | 524 priority = tiling->TileAt(5, 1)->priority(ACTIVE_TREE); |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 // If a layer has a non-invertible transform, then the starting rect | 754 // If a layer has a non-invertible transform, then the starting rect |
| 745 // for the layer would be empty. | 755 // for the layer would be empty. |
| 746 gfx::Rect in(40, 40, 0, 0); | 756 gfx::Rect in(40, 40, 0, 0); |
| 747 gfx::Rect bounds(0, 0, 10, 10); | 757 gfx::Rect bounds(0, 0, 10, 10); |
| 748 int64 target_area = 400 * 400; | 758 int64 target_area = 400 * 400; |
| 749 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( | 759 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( |
| 750 in, target_area, bounds, NULL); | 760 in, target_area, bounds, NULL); |
| 751 EXPECT_TRUE(out.IsEmpty()); | 761 EXPECT_TRUE(out.IsEmpty()); |
| 752 } | 762 } |
| 753 | 763 |
| 764 TEST(PictureLayerTilingTest, TilingRasterTileIteratorStaticViewport) { |
| 765 FakePictureLayerTilingClient client; |
| 766 scoped_ptr<TestablePictureLayerTiling> tiling; |
| 767 |
| 768 gfx::Rect viewport(50, 50, 100, 100); |
| 769 gfx::Size layer_bounds(200, 200); |
| 770 |
| 771 client.SetTileSize(gfx::Size(30, 30)); |
| 772 |
| 773 tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client); |
| 774 tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.0f, 1.0); |
| 775 |
| 776 PictureLayerTiling::TilingRasterTileIterator empty_iterator; |
| 777 EXPECT_FALSE(empty_iterator); |
| 778 |
| 779 std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); |
| 780 |
| 781 // Sanity check. |
| 782 EXPECT_EQ(64u, all_tiles.size()); |
| 783 |
| 784 // The explanation of each iteration is as follows: |
| 785 // 1. First iteration tests that we can get all of the tiles correctly. |
| 786 // 2. Second iteration ensures that we can get all of the tiles again (first |
| 787 // iteration didn't change any tiles), as well set all tiles to be ready to |
| 788 // draw. |
| 789 // 3. Third iteration ensures that no tiles are returned, since they were all |
| 790 // marked as ready to draw. |
| 791 for (int i = 0; i < 3; ++i) { |
| 792 PictureLayerTiling::TilingRasterTileIterator it(tiling.get(), ACTIVE_TREE); |
| 793 |
| 794 // There are 3 bins in TilePriority. |
| 795 bool have_tiles[3] = {}; |
| 796 |
| 797 // On the third iteration, we should get no tiles since everything was |
| 798 // marked as ready to draw. |
| 799 if (i == 2) { |
| 800 EXPECT_FALSE(it); |
| 801 continue; |
| 802 } |
| 803 |
| 804 EXPECT_TRUE(it); |
| 805 std::set<Tile*> unique_tiles; |
| 806 unique_tiles.insert(*it); |
| 807 Tile* last_tile = *it; |
| 808 have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true; |
| 809 |
| 810 // On the second iteration, mark everything as ready to draw (solid color). |
| 811 if (i == 1) { |
| 812 ManagedTileState::TileVersion& tile_version = |
| 813 last_tile->GetTileVersionForTesting( |
| 814 last_tile->DetermineRasterModeForTree(ACTIVE_TREE)); |
| 815 tile_version.SetSolidColorForTesting(SK_ColorRED); |
| 816 } |
| 817 ++it; |
| 818 int eventually_bin_order_correct_count = 0; |
| 819 int eventually_bin_order_incorrect_count = 0; |
| 820 while (it) { |
| 821 Tile* new_tile = *it; |
| 822 ++it; |
| 823 unique_tiles.insert(new_tile); |
| 824 |
| 825 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
| 826 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
| 827 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 828 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 829 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 830 bool order_correct = last_priority.distance_to_visible <= |
| 831 new_priority.distance_to_visible; |
| 832 eventually_bin_order_correct_count += order_correct; |
| 833 eventually_bin_order_incorrect_count += !order_correct; |
| 834 } else { |
| 835 EXPECT_LE(last_priority.distance_to_visible, |
| 836 new_priority.distance_to_visible); |
| 837 } |
| 838 } |
| 839 have_tiles[new_priority.priority_bin] = true; |
| 840 |
| 841 last_tile = new_tile; |
| 842 |
| 843 // On the second iteration, mark everything as ready to draw (solid |
| 844 // color). |
| 845 if (i == 1) { |
| 846 ManagedTileState::TileVersion& tile_version = |
| 847 last_tile->GetTileVersionForTesting( |
| 848 last_tile->DetermineRasterModeForTree(ACTIVE_TREE)); |
| 849 tile_version.SetSolidColorForTesting(SK_ColorRED); |
| 850 } |
| 851 } |
| 852 |
| 853 EXPECT_GT(eventually_bin_order_correct_count, |
| 854 eventually_bin_order_incorrect_count); |
| 855 |
| 856 // We should have now and eventually tiles, but not soon tiles because the |
| 857 // viewport is static. |
| 858 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| 859 EXPECT_FALSE(have_tiles[TilePriority::SOON]); |
| 860 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
| 861 |
| 862 EXPECT_EQ(unique_tiles.size(), all_tiles.size()); |
| 863 } |
| 864 } |
| 865 |
| 866 TEST(PictureLayerTilingTest, TilingRasterTileIteratorMovingViewport) { |
| 867 FakePictureLayerTilingClient client; |
| 868 scoped_ptr<TestablePictureLayerTiling> tiling; |
| 869 |
| 870 gfx::Rect viewport(50, 0, 100, 100); |
| 871 gfx::Rect moved_viewport(50, 0, 100, 250); |
| 872 gfx::Size layer_bounds(500, 500); |
| 873 |
| 874 client.SetTileSize(gfx::Size(30, 30)); |
| 875 |
| 876 tiling = TestablePictureLayerTiling::Create(1.f, layer_bounds, &client); |
| 877 tiling->UpdateTilePriorities(ACTIVE_TREE, viewport, 1.0f, 1.0); |
| 878 tiling->UpdateTilePriorities(ACTIVE_TREE, moved_viewport, 1.0f, 2.0); |
| 879 |
| 880 // There are 3 bins in TilePriority. |
| 881 bool have_tiles[3] = {}; |
| 882 Tile* last_tile = NULL; |
| 883 int eventually_bin_order_correct_count = 0; |
| 884 int eventually_bin_order_incorrect_count = 0; |
| 885 for (PictureLayerTiling::TilingRasterTileIterator it(tiling.get(), |
| 886 ACTIVE_TREE); |
| 887 it; |
| 888 ++it) { |
| 889 if (!last_tile) |
| 890 last_tile = *it; |
| 891 |
| 892 Tile* new_tile = *it; |
| 893 |
| 894 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
| 895 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
| 896 |
| 897 have_tiles[new_priority.priority_bin] = true; |
| 898 |
| 899 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 900 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 901 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 902 bool order_correct = last_priority.distance_to_visible <= |
| 903 new_priority.distance_to_visible; |
| 904 eventually_bin_order_correct_count += order_correct; |
| 905 eventually_bin_order_incorrect_count += !order_correct; |
| 906 } else { |
| 907 EXPECT_LE(last_priority.distance_to_visible, |
| 908 new_priority.distance_to_visible); |
| 909 } |
| 910 } |
| 911 last_tile = new_tile; |
| 912 } |
| 913 |
| 914 EXPECT_GT(eventually_bin_order_correct_count, |
| 915 eventually_bin_order_incorrect_count); |
| 916 |
| 917 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| 918 EXPECT_TRUE(have_tiles[TilePriority::SOON]); |
| 919 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
| 920 } |
| 921 |
| 754 static void TileExists(bool exists, Tile* tile, | 922 static void TileExists(bool exists, Tile* tile, |
| 755 const gfx::Rect& geometry_rect) { | 923 const gfx::Rect& geometry_rect) { |
| 756 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString(); | 924 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString(); |
| 757 } | 925 } |
| 758 | 926 |
| 759 TEST_F(PictureLayerTilingIteratorTest, TilesExist) { | 927 TEST_F(PictureLayerTilingIteratorTest, TilesExist) { |
| 760 gfx::Size layer_bounds(1099, 801); | 928 gfx::Size layer_bounds(1099, 801); |
| 761 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); | 929 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); |
| 762 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); | 930 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); |
| 763 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); | 931 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); | 1627 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); |
| 1460 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); | 1628 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); |
| 1461 | 1629 |
| 1462 priority = tiling->TileAt(1, 0)->priority(ACTIVE_TREE); | 1630 priority = tiling->TileAt(1, 0)->priority(ACTIVE_TREE); |
| 1463 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); | 1631 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible); |
| 1464 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); | 1632 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); |
| 1465 } | 1633 } |
| 1466 | 1634 |
| 1467 } // namespace | 1635 } // namespace |
| 1468 } // namespace cc | 1636 } // namespace cc |
| OLD | NEW |