OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/eviction_tile_priority_queue.h" | 5 #include "cc/resources/eviction_tile_priority_queue.h" |
6 #include "cc/resources/raster_tile_priority_queue.h" | 6 #include "cc/resources/raster_tile_priority_queue.h" |
7 #include "cc/resources/tile.h" | 7 #include "cc/resources/tile.h" |
8 #include "cc/resources/tile_priority.h" | 8 #include "cc/resources/tile_priority.h" |
9 #include "cc/test/begin_frame_args_test.h" | 9 #include "cc/test/begin_frame_args_test.h" |
10 #include "cc/test/fake_impl_proxy.h" | 10 #include "cc/test/fake_impl_proxy.h" |
11 #include "cc/test/fake_layer_tree_host_impl.h" | 11 #include "cc/test/fake_layer_tree_host_impl.h" |
12 #include "cc/test/fake_output_surface.h" | 12 #include "cc/test/fake_output_surface.h" |
13 #include "cc/test/fake_output_surface_client.h" | 13 #include "cc/test/fake_output_surface_client.h" |
14 #include "cc/test/fake_picture_layer_impl.h" | 14 #include "cc/test/fake_picture_layer_impl.h" |
| 15 #include "cc/test/fake_picture_layer_tiling_client.h" |
15 #include "cc/test/fake_picture_pile_impl.h" | 16 #include "cc/test/fake_picture_pile_impl.h" |
16 #include "cc/test/fake_tile_manager.h" | 17 #include "cc/test/fake_tile_manager.h" |
17 #include "cc/test/impl_side_painting_settings.h" | 18 #include "cc/test/impl_side_painting_settings.h" |
18 #include "cc/test/test_shared_bitmap_manager.h" | 19 #include "cc/test/test_shared_bitmap_manager.h" |
19 #include "cc/test/test_tile_priorities.h" | 20 #include "cc/test/test_tile_priorities.h" |
20 #include "cc/trees/layer_tree_impl.h" | 21 #include "cc/trees/layer_tree_impl.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
22 | 23 |
23 namespace cc { | 24 namespace cc { |
24 namespace { | 25 namespace { |
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 while (!queue.IsEmpty()) { | 872 while (!queue.IsEmpty()) { |
872 EXPECT_TRUE(queue.Top()); | 873 EXPECT_TRUE(queue.Top()); |
873 all_tiles.insert(queue.Top()); | 874 all_tiles.insert(queue.Top()); |
874 ++tile_count; | 875 ++tile_count; |
875 queue.Pop(); | 876 queue.Pop(); |
876 } | 877 } |
877 EXPECT_EQ(tile_count, all_tiles.size()); | 878 EXPECT_EQ(tile_count, all_tiles.size()); |
878 EXPECT_EQ(16u, tile_count); | 879 EXPECT_EQ(16u, tile_count); |
879 } | 880 } |
880 | 881 |
| 882 TEST_F(TileManagerTilePriorityQueueTest, |
| 883 RasterTilePriorityQueueStaticViewport) { |
| 884 FakePictureLayerTilingClient client; |
| 885 |
| 886 gfx::Rect viewport(50, 50, 100, 100); |
| 887 gfx::Size layer_bounds(800, 800); |
| 888 |
| 889 gfx::Rect soon_rect = viewport; |
| 890 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); |
| 891 |
| 892 client.SetTileSize(gfx::Size(30, 30)); |
| 893 client.set_tree(ACTIVE_TREE); |
| 894 LayerTreeSettings settings; |
| 895 settings.max_tiles_for_interest_area = 10000; |
| 896 |
| 897 scoped_ptr<PictureLayerTilingSet> tiling_set = PictureLayerTilingSet::Create( |
| 898 &client, settings.max_tiles_for_interest_area, |
| 899 settings.skewport_target_time_in_seconds, |
| 900 settings.skewport_extrapolation_limit_in_content_pixels); |
| 901 |
| 902 scoped_refptr<FakePicturePileImpl> pile = |
| 903 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
| 904 PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile); |
| 905 tiling->set_resolution(HIGH_RESOLUTION); |
| 906 |
| 907 tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true); |
| 908 |
| 909 TilingSetRasterQueue empty_queue; |
| 910 EXPECT_TRUE(empty_queue.IsEmpty()); |
| 911 |
| 912 std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); |
| 913 |
| 914 // Sanity check. |
| 915 EXPECT_EQ(841u, all_tiles.size()); |
| 916 |
| 917 // The explanation of each iteration is as follows: |
| 918 // 1. First iteration tests that we can get all of the tiles correctly. |
| 919 // 2. Second iteration ensures that we can get all of the tiles again (first |
| 920 // iteration didn't change any tiles), as well set all tiles to be ready to |
| 921 // draw. |
| 922 // 3. Third iteration ensures that no tiles are returned, since they were all |
| 923 // marked as ready to draw. |
| 924 for (int i = 0; i < 3; ++i) { |
| 925 TilingSetRasterQueue queue(tiling_set.get(), false); |
| 926 |
| 927 // There are 3 bins in TilePriority. |
| 928 bool have_tiles[3] = {}; |
| 929 |
| 930 // On the third iteration, we should get no tiles since everything was |
| 931 // marked as ready to draw. |
| 932 if (i == 2) { |
| 933 EXPECT_TRUE(queue.IsEmpty()); |
| 934 continue; |
| 935 } |
| 936 |
| 937 EXPECT_FALSE(queue.IsEmpty()); |
| 938 std::set<Tile*> unique_tiles; |
| 939 unique_tiles.insert(queue.Top()); |
| 940 Tile* last_tile = queue.Top(); |
| 941 have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true; |
| 942 |
| 943 // On the second iteration, mark everything as ready to draw (solid color). |
| 944 if (i == 1) { |
| 945 TileDrawInfo& draw_info = last_tile->draw_info(); |
| 946 draw_info.SetSolidColorForTesting(SK_ColorRED); |
| 947 } |
| 948 queue.Pop(); |
| 949 int eventually_bin_order_correct_count = 0; |
| 950 int eventually_bin_order_incorrect_count = 0; |
| 951 while (!queue.IsEmpty()) { |
| 952 Tile* new_tile = queue.Top(); |
| 953 queue.Pop(); |
| 954 unique_tiles.insert(new_tile); |
| 955 |
| 956 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
| 957 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
| 958 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 959 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 960 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 961 bool order_correct = last_priority.distance_to_visible <= |
| 962 new_priority.distance_to_visible; |
| 963 eventually_bin_order_correct_count += order_correct; |
| 964 eventually_bin_order_incorrect_count += !order_correct; |
| 965 } else if (!soon_rect.Intersects(new_tile->content_rect()) && |
| 966 !soon_rect.Intersects(last_tile->content_rect())) { |
| 967 EXPECT_LE(last_priority.distance_to_visible, |
| 968 new_priority.distance_to_visible); |
| 969 EXPECT_EQ(TilePriority::NOW, new_priority.priority_bin); |
| 970 } else if (new_priority.distance_to_visible > 0.f) { |
| 971 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); |
| 972 } |
| 973 } |
| 974 have_tiles[new_priority.priority_bin] = true; |
| 975 |
| 976 last_tile = new_tile; |
| 977 |
| 978 // On the second iteration, mark everything as ready to draw (solid |
| 979 // color). |
| 980 if (i == 1) { |
| 981 TileDrawInfo& draw_info = last_tile->draw_info(); |
| 982 draw_info.SetSolidColorForTesting(SK_ColorRED); |
| 983 } |
| 984 } |
| 985 |
| 986 EXPECT_GT(eventually_bin_order_correct_count, |
| 987 eventually_bin_order_incorrect_count); |
| 988 |
| 989 // We should have now and eventually tiles, as well as soon tiles from |
| 990 // the border region. |
| 991 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| 992 EXPECT_TRUE(have_tiles[TilePriority::SOON]); |
| 993 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
| 994 |
| 995 EXPECT_EQ(unique_tiles.size(), all_tiles.size()); |
| 996 } |
| 997 } |
| 998 |
| 999 TEST_F(TileManagerTilePriorityQueueTest, |
| 1000 RasterTilePriorityQueueMovingViewport) { |
| 1001 FakePictureLayerTilingClient client; |
| 1002 |
| 1003 gfx::Rect viewport(50, 0, 100, 100); |
| 1004 gfx::Rect moved_viewport(50, 0, 100, 500); |
| 1005 gfx::Size layer_bounds(1000, 1000); |
| 1006 |
| 1007 client.SetTileSize(gfx::Size(30, 30)); |
| 1008 client.set_tree(ACTIVE_TREE); |
| 1009 LayerTreeSettings settings; |
| 1010 settings.max_tiles_for_interest_area = 10000; |
| 1011 |
| 1012 scoped_ptr<PictureLayerTilingSet> tiling_set = PictureLayerTilingSet::Create( |
| 1013 &client, settings.max_tiles_for_interest_area, |
| 1014 settings.skewport_target_time_in_seconds, |
| 1015 settings.skewport_extrapolation_limit_in_content_pixels); |
| 1016 |
| 1017 scoped_refptr<FakePicturePileImpl> pile = |
| 1018 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
| 1019 PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile); |
| 1020 tiling->set_resolution(HIGH_RESOLUTION); |
| 1021 |
| 1022 tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true); |
| 1023 tiling_set->UpdateTilePriorities(moved_viewport, 1.0f, 2.0, Occlusion(), |
| 1024 true); |
| 1025 |
| 1026 gfx::Rect soon_rect = moved_viewport; |
| 1027 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); |
| 1028 |
| 1029 // There are 3 bins in TilePriority. |
| 1030 bool have_tiles[3] = {}; |
| 1031 Tile* last_tile = NULL; |
| 1032 int eventually_bin_order_correct_count = 0; |
| 1033 int eventually_bin_order_incorrect_count = 0; |
| 1034 for (TilingSetRasterQueue queue(tiling_set.get(), false); !queue.IsEmpty(); |
| 1035 queue.Pop()) { |
| 1036 if (!last_tile) |
| 1037 last_tile = queue.Top(); |
| 1038 |
| 1039 Tile* new_tile = queue.Top(); |
| 1040 |
| 1041 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
| 1042 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
| 1043 |
| 1044 have_tiles[new_priority.priority_bin] = true; |
| 1045 |
| 1046 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 1047 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 1048 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 1049 bool order_correct = last_priority.distance_to_visible <= |
| 1050 new_priority.distance_to_visible; |
| 1051 eventually_bin_order_correct_count += order_correct; |
| 1052 eventually_bin_order_incorrect_count += !order_correct; |
| 1053 } else if (!soon_rect.Intersects(new_tile->content_rect()) && |
| 1054 !soon_rect.Intersects(last_tile->content_rect())) { |
| 1055 EXPECT_LE(last_priority.distance_to_visible, |
| 1056 new_priority.distance_to_visible); |
| 1057 } else if (new_priority.distance_to_visible > 0.f) { |
| 1058 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); |
| 1059 } |
| 1060 } |
| 1061 last_tile = new_tile; |
| 1062 } |
| 1063 |
| 1064 EXPECT_GT(eventually_bin_order_correct_count, |
| 1065 eventually_bin_order_incorrect_count); |
| 1066 |
| 1067 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| 1068 EXPECT_TRUE(have_tiles[TilePriority::SOON]); |
| 1069 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
| 1070 } |
| 1071 |
881 } // namespace | 1072 } // namespace |
882 } // namespace cc | 1073 } // namespace cc |
OLD | NEW |