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 #include <set> |
9 | 9 |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 EXPECT_TRUE(expect_rect.Contains(geometry)); | 123 EXPECT_TRUE(expect_rect.Contains(geometry)); |
124 EXPECT_TRUE(remaining.Contains(geometry)); | 124 EXPECT_TRUE(remaining.Contains(geometry)); |
125 remaining.Subtract(geometry); | 125 remaining.Subtract(geometry); |
126 | 126 |
127 // Sanity check that texture coords are within the texture rect. | 127 // Sanity check that texture coords are within the texture rect. |
128 gfx::RectF texture_rect = iter.texture_rect(); | 128 gfx::RectF texture_rect = iter.texture_rect(); |
129 EXPECT_GE(texture_rect.x(), 0); | 129 EXPECT_GE(texture_rect.x(), 0); |
130 EXPECT_GE(texture_rect.y(), 0); | 130 EXPECT_GE(texture_rect.y(), 0); |
131 EXPECT_LE(texture_rect.right(), client_.TileSize().width()); | 131 EXPECT_LE(texture_rect.right(), client_.TileSize().width()); |
132 EXPECT_LE(texture_rect.bottom(), client_.TileSize().height()); | 132 EXPECT_LE(texture_rect.bottom(), client_.TileSize().height()); |
133 | |
134 EXPECT_EQ(iter.texture_size(), client_.TileSize()); | |
135 } | 133 } |
136 | 134 |
137 // The entire rect must be filled by geometry from the tiling. | 135 // The entire rect must be filled by geometry from the tiling. |
138 EXPECT_TRUE(remaining.IsEmpty()); | 136 EXPECT_TRUE(remaining.IsEmpty()); |
139 } | 137 } |
140 | 138 |
141 void VerifyTilesExactlyCoverRect(float rect_scale, const gfx::Rect& rect) { | 139 void VerifyTilesExactlyCoverRect(float rect_scale, const gfx::Rect& rect) { |
142 VerifyTilesExactlyCoverRect(rect_scale, rect, rect); | 140 VerifyTilesExactlyCoverRect(rect_scale, rect, rect); |
143 } | 141 } |
144 | 142 |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 // If a layer has a non-invertible transform, then the starting rect | 1080 // If a layer has a non-invertible transform, then the starting rect |
1083 // for the layer would be empty. | 1081 // for the layer would be empty. |
1084 gfx::Rect in(40, 40, 0, 0); | 1082 gfx::Rect in(40, 40, 0, 0); |
1085 gfx::Rect bounds(0, 0, 10, 10); | 1083 gfx::Rect bounds(0, 0, 10, 10); |
1086 int64 target_area = 400 * 400; | 1084 int64 target_area = 400 * 400; |
1087 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( | 1085 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( |
1088 in, target_area, bounds, NULL); | 1086 in, target_area, bounds, NULL); |
1089 EXPECT_TRUE(out.IsEmpty()); | 1087 EXPECT_TRUE(out.IsEmpty()); |
1090 } | 1088 } |
1091 | 1089 |
1092 TEST(PictureLayerTilingTest, TilingRasterTileIteratorStaticViewport) { | |
1093 FakePictureLayerTilingClient client; | |
1094 | |
1095 gfx::Rect viewport(50, 50, 100, 100); | |
1096 gfx::Size layer_bounds(800, 800); | |
1097 | |
1098 gfx::Rect soon_rect = viewport; | |
1099 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); | |
1100 | |
1101 client.SetTileSize(gfx::Size(30, 30)); | |
1102 client.set_tree(ACTIVE_TREE); | |
1103 LayerTreeSettings settings; | |
1104 settings.max_tiles_for_interest_area = 10000; | |
1105 | |
1106 scoped_refptr<FakePicturePileImpl> pile = | |
1107 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); | |
1108 scoped_ptr<TestablePictureLayerTiling> tiling = | |
1109 TestablePictureLayerTiling::Create(1.0f, pile, &client, settings); | |
1110 tiling->ComputeTilePriorityRects(viewport, 1.0f, 1.0, Occlusion()); | |
1111 tiling->UpdateAllTilePrioritiesForTesting(); | |
1112 | |
1113 PictureLayerTiling::TilingRasterTileIterator empty_iterator; | |
1114 EXPECT_FALSE(empty_iterator); | |
1115 | |
1116 std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); | |
1117 | |
1118 // Sanity check. | |
1119 EXPECT_EQ(841u, all_tiles.size()); | |
1120 | |
1121 // The explanation of each iteration is as follows: | |
1122 // 1. First iteration tests that we can get all of the tiles correctly. | |
1123 // 2. Second iteration ensures that we can get all of the tiles again (first | |
1124 // iteration didn't change any tiles), as well set all tiles to be ready to | |
1125 // draw. | |
1126 // 3. Third iteration ensures that no tiles are returned, since they were all | |
1127 // marked as ready to draw. | |
1128 for (int i = 0; i < 3; ++i) { | |
1129 PictureLayerTiling::TilingRasterTileIterator it(tiling.get()); | |
1130 | |
1131 // There are 3 bins in TilePriority. | |
1132 bool have_tiles[3] = {}; | |
1133 | |
1134 // On the third iteration, we should get no tiles since everything was | |
1135 // marked as ready to draw. | |
1136 if (i == 2) { | |
1137 EXPECT_FALSE(it); | |
1138 continue; | |
1139 } | |
1140 | |
1141 EXPECT_TRUE(it); | |
1142 std::set<Tile*> unique_tiles; | |
1143 unique_tiles.insert(*it); | |
1144 Tile* last_tile = *it; | |
1145 have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true; | |
1146 | |
1147 // On the second iteration, mark everything as ready to draw (solid color). | |
1148 if (i == 1) { | |
1149 TileDrawInfo& draw_info = last_tile->draw_info(); | |
1150 draw_info.SetSolidColorForTesting(SK_ColorRED); | |
1151 } | |
1152 ++it; | |
1153 int eventually_bin_order_correct_count = 0; | |
1154 int eventually_bin_order_incorrect_count = 0; | |
1155 while (it) { | |
1156 Tile* new_tile = *it; | |
1157 ++it; | |
1158 unique_tiles.insert(new_tile); | |
1159 | |
1160 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); | |
1161 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); | |
1162 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | |
1163 if (last_priority.priority_bin == new_priority.priority_bin) { | |
1164 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | |
1165 bool order_correct = last_priority.distance_to_visible <= | |
1166 new_priority.distance_to_visible; | |
1167 eventually_bin_order_correct_count += order_correct; | |
1168 eventually_bin_order_incorrect_count += !order_correct; | |
1169 } else if (!soon_rect.Intersects(new_tile->content_rect()) && | |
1170 !soon_rect.Intersects(last_tile->content_rect())) { | |
1171 EXPECT_LE(last_priority.distance_to_visible, | |
1172 new_priority.distance_to_visible); | |
1173 EXPECT_EQ(TilePriority::NOW, new_priority.priority_bin); | |
1174 } else if (new_priority.distance_to_visible > 0.f) { | |
1175 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); | |
1176 } | |
1177 } | |
1178 have_tiles[new_priority.priority_bin] = true; | |
1179 | |
1180 last_tile = new_tile; | |
1181 | |
1182 // On the second iteration, mark everything as ready to draw (solid | |
1183 // color). | |
1184 if (i == 1) { | |
1185 TileDrawInfo& draw_info = last_tile->draw_info(); | |
1186 draw_info.SetSolidColorForTesting(SK_ColorRED); | |
1187 } | |
1188 } | |
1189 | |
1190 EXPECT_GT(eventually_bin_order_correct_count, | |
1191 eventually_bin_order_incorrect_count); | |
1192 | |
1193 // We should have now and eventually tiles, as well as soon tiles from | |
1194 // the border region. | |
1195 EXPECT_TRUE(have_tiles[TilePriority::NOW]); | |
1196 EXPECT_TRUE(have_tiles[TilePriority::SOON]); | |
1197 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); | |
1198 | |
1199 EXPECT_EQ(unique_tiles.size(), all_tiles.size()); | |
1200 } | |
1201 } | |
1202 | |
1203 TEST(PictureLayerTilingTest, TilingRasterTileIteratorMovingViewport) { | |
1204 FakePictureLayerTilingClient client; | |
1205 | |
1206 gfx::Rect viewport(50, 0, 100, 100); | |
1207 gfx::Rect moved_viewport(50, 0, 100, 500); | |
1208 gfx::Size layer_bounds(1000, 1000); | |
1209 | |
1210 client.SetTileSize(gfx::Size(30, 30)); | |
1211 client.set_tree(ACTIVE_TREE); | |
1212 LayerTreeSettings settings; | |
1213 settings.max_tiles_for_interest_area = 10000; | |
1214 | |
1215 scoped_refptr<FakePicturePileImpl> pile = | |
1216 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); | |
1217 scoped_ptr<TestablePictureLayerTiling> tiling = | |
1218 TestablePictureLayerTiling::Create(1.f, pile, &client, settings); | |
1219 tiling->ComputeTilePriorityRects(viewport, 1.0f, 1.0, Occlusion()); | |
1220 tiling->ComputeTilePriorityRects(moved_viewport, 1.0f, 2.0, Occlusion()); | |
1221 tiling->UpdateAllTilePrioritiesForTesting(); | |
1222 | |
1223 gfx::Rect soon_rect = moved_viewport; | |
1224 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); | |
1225 | |
1226 // There are 3 bins in TilePriority. | |
1227 bool have_tiles[3] = {}; | |
1228 Tile* last_tile = NULL; | |
1229 int eventually_bin_order_correct_count = 0; | |
1230 int eventually_bin_order_incorrect_count = 0; | |
1231 for (PictureLayerTiling::TilingRasterTileIterator it(tiling.get()); it; | |
1232 ++it) { | |
1233 if (!last_tile) | |
1234 last_tile = *it; | |
1235 | |
1236 Tile* new_tile = *it; | |
1237 | |
1238 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); | |
1239 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); | |
1240 | |
1241 have_tiles[new_priority.priority_bin] = true; | |
1242 | |
1243 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | |
1244 if (last_priority.priority_bin == new_priority.priority_bin) { | |
1245 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | |
1246 bool order_correct = last_priority.distance_to_visible <= | |
1247 new_priority.distance_to_visible; | |
1248 eventually_bin_order_correct_count += order_correct; | |
1249 eventually_bin_order_incorrect_count += !order_correct; | |
1250 } else if (!soon_rect.Intersects(new_tile->content_rect()) && | |
1251 !soon_rect.Intersects(last_tile->content_rect())) { | |
1252 EXPECT_LE(last_priority.distance_to_visible, | |
1253 new_priority.distance_to_visible); | |
1254 } else if (new_priority.distance_to_visible > 0.f) { | |
1255 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); | |
1256 } | |
1257 } | |
1258 last_tile = new_tile; | |
1259 } | |
1260 | |
1261 EXPECT_GT(eventually_bin_order_correct_count, | |
1262 eventually_bin_order_incorrect_count); | |
1263 | |
1264 EXPECT_TRUE(have_tiles[TilePriority::NOW]); | |
1265 EXPECT_TRUE(have_tiles[TilePriority::SOON]); | |
1266 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); | |
1267 } | |
1268 | |
1269 static void TileExists(bool exists, Tile* tile, | 1090 static void TileExists(bool exists, Tile* tile, |
1270 const gfx::Rect& geometry_rect) { | 1091 const gfx::Rect& geometry_rect) { |
1271 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString(); | 1092 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString(); |
1272 } | 1093 } |
1273 | 1094 |
1274 TEST_F(PictureLayerTilingIteratorTest, TilesExist) { | 1095 TEST_F(PictureLayerTilingIteratorTest, TilesExist) { |
1275 gfx::Size layer_bounds(1099, 801); | 1096 gfx::Size layer_bounds(1099, 801); |
1276 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); | 1097 Initialize(gfx::Size(100, 100), 1.f, layer_bounds); |
1277 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); | 1098 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds)); |
1278 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); | 1099 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false)); |
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 tiling_->SetRasterSourceAndResize(pile); | 1888 tiling_->SetRasterSourceAndResize(pile); |
2068 | 1889 |
2069 // Tile size in the tiling should be resized to 250x200. | 1890 // Tile size in the tiling should be resized to 250x200. |
2070 EXPECT_EQ(250, tiling_->TilingDataForTesting().max_texture_size().width()); | 1891 EXPECT_EQ(250, tiling_->TilingDataForTesting().max_texture_size().width()); |
2071 EXPECT_EQ(200, tiling_->TilingDataForTesting().max_texture_size().height()); | 1892 EXPECT_EQ(200, tiling_->TilingDataForTesting().max_texture_size().height()); |
2072 EXPECT_EQ(0u, tiling_->AllRefTilesForTesting().size()); | 1893 EXPECT_EQ(0u, tiling_->AllRefTilesForTesting().size()); |
2073 } | 1894 } |
2074 | 1895 |
2075 } // namespace | 1896 } // namespace |
2076 } // namespace cc | 1897 } // namespace cc |
OLD | NEW |