| 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 "base/thread_task_runner_handle.h" | 5 #include "base/thread_task_runner_handle.h" |
| 6 #include "cc/resources/eviction_tile_priority_queue.h" | 6 #include "cc/resources/eviction_tile_priority_queue.h" |
| 7 #include "cc/resources/raster_tile_priority_queue.h" | 7 #include "cc/resources/raster_tile_priority_queue.h" |
| 8 #include "cc/resources/resource_pool.h" | 8 #include "cc/resources/resource_pool.h" |
| 9 #include "cc/resources/tile.h" | 9 #include "cc/resources/tile.h" |
| 10 #include "cc/resources/tile_priority.h" | 10 #include "cc/resources/tile_priority.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 host_impl_.SetViewportSize(layer_bounds); | 159 host_impl_.SetViewportSize(layer_bounds); |
| 160 SetupDefaultTrees(layer_bounds); | 160 SetupDefaultTrees(layer_bounds); |
| 161 | 161 |
| 162 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 162 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 163 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 163 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 164 EXPECT_FALSE(queue->IsEmpty()); | 164 EXPECT_FALSE(queue->IsEmpty()); |
| 165 | 165 |
| 166 size_t tile_count = 0; | 166 size_t tile_count = 0; |
| 167 std::set<Tile*> all_tiles; | 167 std::set<Tile*> all_tiles; |
| 168 while (!queue->IsEmpty()) { | 168 while (!queue->IsEmpty()) { |
| 169 EXPECT_TRUE(queue->Top()); | 169 EXPECT_TRUE(queue->Top().tile()); |
| 170 all_tiles.insert(queue->Top()); | 170 all_tiles.insert(queue->Top().tile()); |
| 171 ++tile_count; | 171 ++tile_count; |
| 172 queue->Pop(); | 172 queue->Pop(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 EXPECT_EQ(tile_count, all_tiles.size()); | 175 EXPECT_EQ(tile_count, all_tiles.size()); |
| 176 EXPECT_EQ(16u, tile_count); | 176 EXPECT_EQ(16u, tile_count); |
| 177 | 177 |
| 178 // Sanity check, all tiles should be visible. | 178 // Sanity check, all tiles should be visible. |
| 179 std::set<Tile*> smoothness_tiles; | 179 std::set<Tile*> smoothness_tiles; |
| 180 queue = host_impl_.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY, | 180 queue = host_impl_.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY, |
| 181 RasterTilePriorityQueue::Type::ALL); | 181 RasterTilePriorityQueue::Type::ALL); |
| 182 bool had_low_res = false; | 182 bool had_low_res = false; |
| 183 while (!queue->IsEmpty()) { | 183 while (!queue->IsEmpty()) { |
| 184 Tile* tile = queue->Top(); | 184 PrioritizedTile prioritized_tile = queue->Top(); |
| 185 EXPECT_TRUE(tile); | 185 EXPECT_TRUE(prioritized_tile.tile()); |
| 186 EXPECT_EQ(TilePriority::NOW, tile->priority().priority_bin); | 186 EXPECT_EQ(TilePriority::NOW, prioritized_tile.priority().priority_bin); |
| 187 if (tile->priority().resolution == LOW_RESOLUTION) | 187 if (prioritized_tile.priority().resolution == LOW_RESOLUTION) |
| 188 had_low_res = true; | 188 had_low_res = true; |
| 189 else | 189 else |
| 190 smoothness_tiles.insert(tile); | 190 smoothness_tiles.insert(prioritized_tile.tile()); |
| 191 queue->Pop(); | 191 queue->Pop(); |
| 192 } | 192 } |
| 193 EXPECT_EQ(all_tiles, smoothness_tiles); | 193 EXPECT_EQ(all_tiles, smoothness_tiles); |
| 194 EXPECT_TRUE(had_low_res); | 194 EXPECT_TRUE(had_low_res); |
| 195 | 195 |
| 196 // Check that everything is required for activation. | 196 // Check that everything is required for activation. |
| 197 queue = host_impl_.BuildRasterQueue( | 197 queue = host_impl_.BuildRasterQueue( |
| 198 SMOOTHNESS_TAKES_PRIORITY, | 198 SMOOTHNESS_TAKES_PRIORITY, |
| 199 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 199 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 200 std::set<Tile*> required_for_activation_tiles; | 200 std::set<Tile*> required_for_activation_tiles; |
| 201 while (!queue->IsEmpty()) { | 201 while (!queue->IsEmpty()) { |
| 202 Tile* tile = queue->Top(); | 202 PrioritizedTile prioritized_tile = queue->Top(); |
| 203 EXPECT_TRUE(tile->required_for_activation()); | 203 EXPECT_TRUE(prioritized_tile.tile()->required_for_activation()); |
| 204 required_for_activation_tiles.insert(tile); | 204 required_for_activation_tiles.insert(prioritized_tile.tile()); |
| 205 queue->Pop(); | 205 queue->Pop(); |
| 206 } | 206 } |
| 207 EXPECT_EQ(all_tiles, required_for_activation_tiles); | 207 EXPECT_EQ(all_tiles, required_for_activation_tiles); |
| 208 | 208 |
| 209 // Check that everything is required for draw. | 209 // Check that everything is required for draw. |
| 210 queue = host_impl_.BuildRasterQueue( | 210 queue = host_impl_.BuildRasterQueue( |
| 211 SMOOTHNESS_TAKES_PRIORITY, | 211 SMOOTHNESS_TAKES_PRIORITY, |
| 212 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 212 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 213 std::set<Tile*> required_for_draw_tiles; | 213 std::set<Tile*> required_for_draw_tiles; |
| 214 while (!queue->IsEmpty()) { | 214 while (!queue->IsEmpty()) { |
| 215 Tile* tile = queue->Top(); | 215 PrioritizedTile prioritized_tile = queue->Top(); |
| 216 EXPECT_TRUE(tile->required_for_draw()); | 216 EXPECT_TRUE(prioritized_tile.tile()->required_for_draw()); |
| 217 required_for_draw_tiles.insert(tile); | 217 required_for_draw_tiles.insert(prioritized_tile.tile()); |
| 218 queue->Pop(); | 218 queue->Pop(); |
| 219 } | 219 } |
| 220 EXPECT_EQ(all_tiles, required_for_draw_tiles); | 220 EXPECT_EQ(all_tiles, required_for_draw_tiles); |
| 221 | 221 |
| 222 Region invalidation(gfx::Rect(0, 0, 500, 500)); | 222 Region invalidation(gfx::Rect(0, 0, 500, 500)); |
| 223 | 223 |
| 224 // Invalidate the pending tree. | 224 // Invalidate the pending tree. |
| 225 pending_layer_->set_invalidation(invalidation); | 225 pending_layer_->set_invalidation(invalidation); |
| 226 pending_layer_->HighResTiling()->Invalidate(invalidation); | 226 pending_layer_->HighResTiling()->Invalidate(invalidation); |
| 227 pending_layer_->LowResTiling()->Invalidate(invalidation); | 227 pending_layer_->LowResTiling()->Invalidate(invalidation); |
| 228 | 228 |
| 229 active_layer_->ResetAllTilesPriorities(); | |
| 230 pending_layer_->ResetAllTilesPriorities(); | |
| 231 | |
| 232 // Renew all of the tile priorities. | 229 // Renew all of the tile priorities. |
| 233 gfx::Rect viewport(50, 50, 100, 100); | 230 gfx::Rect viewport(50, 50, 100, 100); |
| 234 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 231 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 235 Occlusion()); | 232 Occlusion()); |
| 236 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 233 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 237 Occlusion()); | 234 Occlusion()); |
| 238 active_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 235 active_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 239 Occlusion()); | 236 Occlusion()); |
| 240 active_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 237 active_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 241 Occlusion()); | 238 Occlusion()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 260 for (size_t i = 0; i < active_high_res_tiles.size(); ++i) { | 257 for (size_t i = 0; i < active_high_res_tiles.size(); ++i) { |
| 261 all_tiles.insert(active_high_res_tiles[i]); | 258 all_tiles.insert(active_high_res_tiles[i]); |
| 262 high_res_tiles.insert(active_high_res_tiles[i]); | 259 high_res_tiles.insert(active_high_res_tiles[i]); |
| 263 } | 260 } |
| 264 | 261 |
| 265 std::vector<Tile*> active_low_res_tiles = | 262 std::vector<Tile*> active_low_res_tiles = |
| 266 active_layer_->LowResTiling()->AllTilesForTesting(); | 263 active_layer_->LowResTiling()->AllTilesForTesting(); |
| 267 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) | 264 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) |
| 268 all_tiles.insert(active_low_res_tiles[i]); | 265 all_tiles.insert(active_low_res_tiles[i]); |
| 269 | 266 |
| 270 Tile* last_tile = NULL; | 267 PrioritizedTile last_tile; |
| 271 smoothness_tiles.clear(); | 268 smoothness_tiles.clear(); |
| 272 tile_count = 0; | 269 tile_count = 0; |
| 273 size_t correct_order_tiles = 0u; | 270 size_t correct_order_tiles = 0u; |
| 274 // Here we expect to get increasing ACTIVE_TREE priority_bin. | 271 // Here we expect to get increasing ACTIVE_TREE priority_bin. |
| 275 queue = host_impl_.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY, | 272 queue = host_impl_.BuildRasterQueue(SMOOTHNESS_TAKES_PRIORITY, |
| 276 RasterTilePriorityQueue::Type::ALL); | 273 RasterTilePriorityQueue::Type::ALL); |
| 277 std::set<Tile*> expected_required_for_draw_tiles; | 274 std::set<Tile*> expected_required_for_draw_tiles; |
| 278 std::set<Tile*> expected_required_for_activation_tiles; | 275 std::set<Tile*> expected_required_for_activation_tiles; |
| 279 while (!queue->IsEmpty()) { | 276 while (!queue->IsEmpty()) { |
| 280 Tile* tile = queue->Top(); | 277 PrioritizedTile prioritized_tile = queue->Top(); |
| 281 EXPECT_TRUE(tile); | 278 EXPECT_TRUE(prioritized_tile.tile()); |
| 282 | 279 |
| 283 if (!last_tile) | 280 if (!last_tile.tile()) |
| 284 last_tile = tile; | 281 last_tile = prioritized_tile; |
| 285 | 282 |
| 286 EXPECT_LE(last_tile->priority().priority_bin, | 283 EXPECT_LE(last_tile.priority().priority_bin, |
| 287 tile->priority().priority_bin); | 284 prioritized_tile.priority().priority_bin); |
| 288 bool skip_updating_last_tile = false; | 285 bool skip_updating_last_tile = false; |
| 289 if (last_tile->priority().priority_bin == tile->priority().priority_bin) { | 286 if (last_tile.priority().priority_bin == |
| 290 correct_order_tiles += last_tile->priority().distance_to_visible <= | 287 prioritized_tile.priority().priority_bin) { |
| 291 tile->priority().distance_to_visible; | 288 correct_order_tiles += last_tile.priority().distance_to_visible <= |
| 292 } else if (tile->priority().priority_bin == TilePriority::NOW) { | 289 prioritized_tile.priority().distance_to_visible; |
| 290 } else if (prioritized_tile.priority().priority_bin == TilePriority::NOW) { |
| 293 // Since we'd return pending tree now tiles before the eventually tiles on | 291 // Since we'd return pending tree now tiles before the eventually tiles on |
| 294 // the active tree, update the value. | 292 // the active tree, update the value. |
| 295 ++correct_order_tiles; | 293 ++correct_order_tiles; |
| 296 skip_updating_last_tile = true; | 294 skip_updating_last_tile = true; |
| 297 } | 295 } |
| 298 | 296 |
| 299 if (tile->priority().priority_bin == TilePriority::NOW && | 297 if (prioritized_tile.priority().priority_bin == TilePriority::NOW && |
| 300 last_tile->priority().resolution != tile->priority().resolution) { | 298 last_tile.priority().resolution != |
| 299 prioritized_tile.priority().resolution) { |
| 301 // Low resolution should come first. | 300 // Low resolution should come first. |
| 302 EXPECT_EQ(LOW_RESOLUTION, last_tile->priority().resolution); | 301 EXPECT_EQ(LOW_RESOLUTION, last_tile.priority().resolution); |
| 303 } | 302 } |
| 304 | 303 |
| 305 if (!skip_updating_last_tile) | 304 if (!skip_updating_last_tile) |
| 306 last_tile = tile; | 305 last_tile = prioritized_tile; |
| 307 ++tile_count; | 306 ++tile_count; |
| 308 smoothness_tiles.insert(tile); | 307 smoothness_tiles.insert(prioritized_tile.tile()); |
| 309 if (tile->required_for_draw()) | 308 if (prioritized_tile.tile()->required_for_draw()) |
| 310 expected_required_for_draw_tiles.insert(tile); | 309 expected_required_for_draw_tiles.insert(prioritized_tile.tile()); |
| 311 if (tile->required_for_activation()) | 310 if (prioritized_tile.tile()->required_for_activation()) |
| 312 expected_required_for_activation_tiles.insert(tile); | 311 expected_required_for_activation_tiles.insert(prioritized_tile.tile()); |
| 313 queue->Pop(); | 312 queue->Pop(); |
| 314 } | 313 } |
| 315 | 314 |
| 316 EXPECT_EQ(tile_count, smoothness_tiles.size()); | 315 EXPECT_EQ(tile_count, smoothness_tiles.size()); |
| 317 EXPECT_EQ(all_tiles, smoothness_tiles); | 316 EXPECT_EQ(all_tiles, smoothness_tiles); |
| 318 // Since we don't guarantee increasing distance due to spiral iterator, we | 317 // Since we don't guarantee increasing distance due to spiral iterator, we |
| 319 // should check that we're _mostly_ right. | 318 // should check that we're _mostly_ right. |
| 320 EXPECT_GT(correct_order_tiles, 3 * tile_count / 4); | 319 EXPECT_GT(correct_order_tiles, 3 * tile_count / 4); |
| 321 | 320 |
| 322 // Check that we have consistent required_for_activation tiles. | 321 // Check that we have consistent required_for_activation tiles. |
| 323 queue = host_impl_.BuildRasterQueue( | 322 queue = host_impl_.BuildRasterQueue( |
| 324 SMOOTHNESS_TAKES_PRIORITY, | 323 SMOOTHNESS_TAKES_PRIORITY, |
| 325 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 324 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 326 required_for_activation_tiles.clear(); | 325 required_for_activation_tiles.clear(); |
| 327 while (!queue->IsEmpty()) { | 326 while (!queue->IsEmpty()) { |
| 328 Tile* tile = queue->Top(); | 327 PrioritizedTile prioritized_tile = queue->Top(); |
| 329 EXPECT_TRUE(tile->required_for_activation()); | 328 EXPECT_TRUE(prioritized_tile.tile()->required_for_activation()); |
| 330 required_for_activation_tiles.insert(tile); | 329 required_for_activation_tiles.insert(prioritized_tile.tile()); |
| 331 queue->Pop(); | 330 queue->Pop(); |
| 332 } | 331 } |
| 333 EXPECT_EQ(expected_required_for_activation_tiles, | 332 EXPECT_EQ(expected_required_for_activation_tiles, |
| 334 required_for_activation_tiles); | 333 required_for_activation_tiles); |
| 335 EXPECT_NE(all_tiles, required_for_activation_tiles); | 334 EXPECT_NE(all_tiles, required_for_activation_tiles); |
| 336 | 335 |
| 337 // Check that we have consistent required_for_draw tiles. | 336 // Check that we have consistent required_for_draw tiles. |
| 338 queue = host_impl_.BuildRasterQueue( | 337 queue = host_impl_.BuildRasterQueue( |
| 339 SMOOTHNESS_TAKES_PRIORITY, | 338 SMOOTHNESS_TAKES_PRIORITY, |
| 340 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 339 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 341 required_for_draw_tiles.clear(); | 340 required_for_draw_tiles.clear(); |
| 342 while (!queue->IsEmpty()) { | 341 while (!queue->IsEmpty()) { |
| 343 Tile* tile = queue->Top(); | 342 PrioritizedTile prioritized_tile = queue->Top(); |
| 344 EXPECT_TRUE(tile->required_for_draw()); | 343 EXPECT_TRUE(prioritized_tile.tile()->required_for_draw()); |
| 345 required_for_draw_tiles.insert(tile); | 344 required_for_draw_tiles.insert(prioritized_tile.tile()); |
| 346 queue->Pop(); | 345 queue->Pop(); |
| 347 } | 346 } |
| 348 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); | 347 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); |
| 349 EXPECT_NE(all_tiles, required_for_draw_tiles); | 348 EXPECT_NE(all_tiles, required_for_draw_tiles); |
| 350 | 349 |
| 351 std::set<Tile*> new_content_tiles; | 350 std::set<Tile*> new_content_tiles; |
| 352 last_tile = NULL; | 351 last_tile.Invalidate(); |
| 353 size_t increasing_distance_tiles = 0u; | 352 size_t increasing_distance_tiles = 0u; |
| 354 // Here we expect to get increasing PENDING_TREE priority_bin. | 353 // Here we expect to get increasing PENDING_TREE priority_bin. |
| 355 queue = host_impl_.BuildRasterQueue(NEW_CONTENT_TAKES_PRIORITY, | 354 queue = host_impl_.BuildRasterQueue(NEW_CONTENT_TAKES_PRIORITY, |
| 356 RasterTilePriorityQueue::Type::ALL); | 355 RasterTilePriorityQueue::Type::ALL); |
| 357 tile_count = 0; | 356 tile_count = 0; |
| 358 while (!queue->IsEmpty()) { | 357 while (!queue->IsEmpty()) { |
| 359 Tile* tile = queue->Top(); | 358 PrioritizedTile prioritized_tile = queue->Top(); |
| 360 EXPECT_TRUE(tile); | 359 EXPECT_TRUE(prioritized_tile.tile()); |
| 361 | 360 |
| 362 if (!last_tile) | 361 if (!last_tile.tile()) |
| 363 last_tile = tile; | 362 last_tile = prioritized_tile; |
| 364 | 363 |
| 365 EXPECT_LE(last_tile->priority().priority_bin, | 364 EXPECT_LE(last_tile.priority().priority_bin, |
| 366 tile->priority().priority_bin); | 365 prioritized_tile.priority().priority_bin); |
| 367 if (last_tile->priority().priority_bin == tile->priority().priority_bin) { | 366 if (last_tile.priority().priority_bin == |
| 368 increasing_distance_tiles += last_tile->priority().distance_to_visible <= | 367 prioritized_tile.priority().priority_bin) { |
| 369 tile->priority().distance_to_visible; | 368 increasing_distance_tiles += |
| 369 last_tile.priority().distance_to_visible <= |
| 370 prioritized_tile.priority().distance_to_visible; |
| 370 } | 371 } |
| 371 | 372 |
| 372 if (tile->priority().priority_bin == TilePriority::NOW && | 373 if (prioritized_tile.priority().priority_bin == TilePriority::NOW && |
| 373 last_tile->priority().resolution != tile->priority().resolution) { | 374 last_tile.priority().resolution != |
| 375 prioritized_tile.priority().resolution) { |
| 374 // High resolution should come first. | 376 // High resolution should come first. |
| 375 EXPECT_EQ(HIGH_RESOLUTION, last_tile->priority().resolution); | 377 EXPECT_EQ(HIGH_RESOLUTION, last_tile.priority().resolution); |
| 376 } | 378 } |
| 377 | 379 |
| 378 last_tile = tile; | 380 last_tile = prioritized_tile; |
| 379 new_content_tiles.insert(tile); | 381 new_content_tiles.insert(prioritized_tile.tile()); |
| 380 ++tile_count; | 382 ++tile_count; |
| 381 queue->Pop(); | 383 queue->Pop(); |
| 382 } | 384 } |
| 383 | 385 |
| 384 EXPECT_EQ(tile_count, new_content_tiles.size()); | 386 EXPECT_EQ(tile_count, new_content_tiles.size()); |
| 385 EXPECT_EQ(high_res_tiles, new_content_tiles); | 387 EXPECT_EQ(high_res_tiles, new_content_tiles); |
| 386 // Since we don't guarantee increasing distance due to spiral iterator, we | 388 // Since we don't guarantee increasing distance due to spiral iterator, we |
| 387 // should check that we're _mostly_ right. | 389 // should check that we're _mostly_ right. |
| 388 EXPECT_GE(increasing_distance_tiles, 3 * tile_count / 4); | 390 EXPECT_GE(increasing_distance_tiles, 3 * tile_count / 4); |
| 389 | 391 |
| 390 // Check that we have consistent required_for_activation tiles. | 392 // Check that we have consistent required_for_activation tiles. |
| 391 queue = host_impl_.BuildRasterQueue( | 393 queue = host_impl_.BuildRasterQueue( |
| 392 NEW_CONTENT_TAKES_PRIORITY, | 394 NEW_CONTENT_TAKES_PRIORITY, |
| 393 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 395 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 394 required_for_activation_tiles.clear(); | 396 required_for_activation_tiles.clear(); |
| 395 while (!queue->IsEmpty()) { | 397 while (!queue->IsEmpty()) { |
| 396 Tile* tile = queue->Top(); | 398 PrioritizedTile prioritized_tile = queue->Top(); |
| 397 EXPECT_TRUE(tile->required_for_activation()); | 399 EXPECT_TRUE(prioritized_tile.tile()->required_for_activation()); |
| 398 required_for_activation_tiles.insert(tile); | 400 required_for_activation_tiles.insert(prioritized_tile.tile()); |
| 399 queue->Pop(); | 401 queue->Pop(); |
| 400 } | 402 } |
| 401 EXPECT_EQ(expected_required_for_activation_tiles, | 403 EXPECT_EQ(expected_required_for_activation_tiles, |
| 402 required_for_activation_tiles); | 404 required_for_activation_tiles); |
| 403 EXPECT_NE(new_content_tiles, required_for_activation_tiles); | 405 EXPECT_NE(new_content_tiles, required_for_activation_tiles); |
| 404 | 406 |
| 405 // Check that we have consistent required_for_draw tiles. | 407 // Check that we have consistent required_for_draw tiles. |
| 406 queue = host_impl_.BuildRasterQueue( | 408 queue = host_impl_.BuildRasterQueue( |
| 407 NEW_CONTENT_TAKES_PRIORITY, | 409 NEW_CONTENT_TAKES_PRIORITY, |
| 408 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 410 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 409 required_for_draw_tiles.clear(); | 411 required_for_draw_tiles.clear(); |
| 410 while (!queue->IsEmpty()) { | 412 while (!queue->IsEmpty()) { |
| 411 Tile* tile = queue->Top(); | 413 PrioritizedTile prioritized_tile = queue->Top(); |
| 412 EXPECT_TRUE(tile->required_for_draw()); | 414 EXPECT_TRUE(prioritized_tile.tile()->required_for_draw()); |
| 413 required_for_draw_tiles.insert(tile); | 415 required_for_draw_tiles.insert(prioritized_tile.tile()); |
| 414 queue->Pop(); | 416 queue->Pop(); |
| 415 } | 417 } |
| 416 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); | 418 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); |
| 417 EXPECT_NE(new_content_tiles, required_for_draw_tiles); | 419 EXPECT_NE(new_content_tiles, required_for_draw_tiles); |
| 418 } | 420 } |
| 419 | 421 |
| 420 TEST_F(TileManagerTilePriorityQueueTest, | 422 TEST_F(TileManagerTilePriorityQueueTest, |
| 421 RasterTilePriorityQueueHighNonIdealTilings) { | 423 RasterTilePriorityQueueHighNonIdealTilings) { |
| 422 const gfx::Size layer_bounds(1000, 1000); | 424 const gfx::Size layer_bounds(1000, 1000); |
| 423 const gfx::Size viewport(800, 800); | 425 const gfx::Size viewport(800, 800); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 450 PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i); | 452 PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i); |
| 451 if (tiling->contents_scale() == 1.5f) { | 453 if (tiling->contents_scale() == 1.5f) { |
| 452 tiling->set_resolution(HIGH_RESOLUTION); | 454 tiling->set_resolution(HIGH_RESOLUTION); |
| 453 const auto& all_tiles = tiling->AllTilesForTesting(); | 455 const auto& all_tiles = tiling->AllTilesForTesting(); |
| 454 all_expected_tiles.insert(all_tiles.begin(), all_tiles.end()); | 456 all_expected_tiles.insert(all_tiles.begin(), all_tiles.end()); |
| 455 } else { | 457 } else { |
| 456 tiling->set_resolution(NON_IDEAL_RESOLUTION); | 458 tiling->set_resolution(NON_IDEAL_RESOLUTION); |
| 457 // Non ideal tilings with a high res pending twin have to be processed | 459 // Non ideal tilings with a high res pending twin have to be processed |
| 458 // because of possible activation tiles. | 460 // because of possible activation tiles. |
| 459 if (tiling->contents_scale() == 1.f) { | 461 if (tiling->contents_scale() == 1.f) { |
| 460 tiling->UpdateAllTilePrioritiesForTesting(); | 462 tiling->UpdateAndGetAllPrioritizedTilesForTesting(); |
| 461 const auto& all_tiles = tiling->AllTilesForTesting(); | 463 const auto& all_tiles = tiling->AllTilesForTesting(); |
| 462 for (auto* tile : all_tiles) | 464 for (auto* tile : all_tiles) |
| 463 EXPECT_TRUE(tile->required_for_activation()); | 465 EXPECT_TRUE(tile->required_for_activation()); |
| 464 all_expected_tiles.insert(all_tiles.begin(), all_tiles.end()); | 466 all_expected_tiles.insert(all_tiles.begin(), all_tiles.end()); |
| 465 } | 467 } |
| 466 } | 468 } |
| 467 } | 469 } |
| 468 | 470 |
| 469 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 471 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 470 SMOOTHNESS_TAKES_PRIORITY, RasterTilePriorityQueue::Type::ALL)); | 472 SMOOTHNESS_TAKES_PRIORITY, RasterTilePriorityQueue::Type::ALL)); |
| 471 EXPECT_FALSE(queue->IsEmpty()); | 473 EXPECT_FALSE(queue->IsEmpty()); |
| 472 | 474 |
| 473 size_t tile_count = 0; | 475 size_t tile_count = 0; |
| 474 std::set<Tile*> all_actual_tiles; | 476 std::set<Tile*> all_actual_tiles; |
| 475 while (!queue->IsEmpty()) { | 477 while (!queue->IsEmpty()) { |
| 476 EXPECT_TRUE(queue->Top()); | 478 EXPECT_TRUE(queue->Top().tile()); |
| 477 all_actual_tiles.insert(queue->Top()); | 479 all_actual_tiles.insert(queue->Top().tile()); |
| 478 ++tile_count; | 480 ++tile_count; |
| 479 queue->Pop(); | 481 queue->Pop(); |
| 480 } | 482 } |
| 481 | 483 |
| 482 EXPECT_EQ(tile_count, all_actual_tiles.size()); | 484 EXPECT_EQ(tile_count, all_actual_tiles.size()); |
| 483 EXPECT_EQ(all_expected_tiles.size(), all_actual_tiles.size()); | 485 EXPECT_EQ(all_expected_tiles.size(), all_actual_tiles.size()); |
| 484 EXPECT_EQ(all_expected_tiles, all_actual_tiles); | 486 EXPECT_EQ(all_expected_tiles, all_actual_tiles); |
| 485 } | 487 } |
| 486 | 488 |
| 487 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueInvalidation) { | 489 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueInvalidation) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 // Expect 15 shared tiles and 1 unshared tile. | 554 // Expect 15 shared tiles and 1 unshared tile. |
| 553 EXPECT_EQ(17u, expected_all_tiles.size()); | 555 EXPECT_EQ(17u, expected_all_tiles.size()); |
| 554 | 556 |
| 555 // The actual test will now build different queues and verify that the queues | 557 // The actual test will now build different queues and verify that the queues |
| 556 // return the same information as computed manually above. | 558 // return the same information as computed manually above. |
| 557 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 559 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 558 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 560 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 559 std::set<Tile*> actual_now_tiles; | 561 std::set<Tile*> actual_now_tiles; |
| 560 std::set<Tile*> actual_all_tiles; | 562 std::set<Tile*> actual_all_tiles; |
| 561 while (!queue->IsEmpty()) { | 563 while (!queue->IsEmpty()) { |
| 562 Tile* tile = queue->Top(); | 564 PrioritizedTile prioritized_tile = queue->Top(); |
| 563 queue->Pop(); | 565 queue->Pop(); |
| 564 if (tile->priority().priority_bin == TilePriority::NOW) | 566 if (prioritized_tile.priority().priority_bin == TilePriority::NOW) |
| 565 actual_now_tiles.insert(tile); | 567 actual_now_tiles.insert(prioritized_tile.tile()); |
| 566 actual_all_tiles.insert(tile); | 568 actual_all_tiles.insert(prioritized_tile.tile()); |
| 567 } | 569 } |
| 568 EXPECT_EQ(expected_now_tiles, actual_now_tiles); | 570 EXPECT_EQ(expected_now_tiles, actual_now_tiles); |
| 569 EXPECT_EQ(expected_all_tiles, actual_all_tiles); | 571 EXPECT_EQ(expected_all_tiles, actual_all_tiles); |
| 570 | 572 |
| 571 queue = host_impl_.BuildRasterQueue( | 573 queue = host_impl_.BuildRasterQueue( |
| 572 SAME_PRIORITY_FOR_BOTH_TREES, | 574 SAME_PRIORITY_FOR_BOTH_TREES, |
| 573 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 575 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 574 std::set<Tile*> actual_required_for_draw_tiles; | 576 std::set<Tile*> actual_required_for_draw_tiles; |
| 575 while (!queue->IsEmpty()) { | 577 while (!queue->IsEmpty()) { |
| 576 Tile* tile = queue->Top(); | 578 PrioritizedTile prioritized_tile = queue->Top(); |
| 577 queue->Pop(); | 579 queue->Pop(); |
| 578 actual_required_for_draw_tiles.insert(tile); | 580 actual_required_for_draw_tiles.insert(prioritized_tile.tile()); |
| 579 } | 581 } |
| 580 EXPECT_EQ(expected_required_for_draw_tiles, actual_required_for_draw_tiles); | 582 EXPECT_EQ(expected_required_for_draw_tiles, actual_required_for_draw_tiles); |
| 581 | 583 |
| 582 queue = host_impl_.BuildRasterQueue( | 584 queue = host_impl_.BuildRasterQueue( |
| 583 SAME_PRIORITY_FOR_BOTH_TREES, | 585 SAME_PRIORITY_FOR_BOTH_TREES, |
| 584 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 586 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 585 std::set<Tile*> actual_required_for_activation_tiles; | 587 std::set<Tile*> actual_required_for_activation_tiles; |
| 586 while (!queue->IsEmpty()) { | 588 while (!queue->IsEmpty()) { |
| 587 Tile* tile = queue->Top(); | 589 Tile* tile = queue->Top().tile(); |
| 588 queue->Pop(); | 590 queue->Pop(); |
| 589 actual_required_for_activation_tiles.insert(tile); | 591 actual_required_for_activation_tiles.insert(tile); |
| 590 } | 592 } |
| 591 EXPECT_EQ(expected_required_for_activation_tiles, | 593 EXPECT_EQ(expected_required_for_activation_tiles, |
| 592 actual_required_for_activation_tiles); | 594 actual_required_for_activation_tiles); |
| 593 } | 595 } |
| 594 | 596 |
| 595 TEST_F(TileManagerTilePriorityQueueTest, ActivationComesBeforeEventually) { | 597 TEST_F(TileManagerTilePriorityQueueTest, ActivationComesBeforeEventually) { |
| 596 base::TimeTicks time_ticks; | 598 base::TimeTicks time_ticks; |
| 597 time_ticks += base::TimeDelta::FromMilliseconds(1); | 599 time_ticks += base::TimeDelta::FromMilliseconds(1); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 622 | 624 |
| 623 host_impl_.SetRequiresHighResToDraw(); | 625 host_impl_.SetRequiresHighResToDraw(); |
| 624 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 626 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 625 SMOOTHNESS_TAKES_PRIORITY, RasterTilePriorityQueue::Type::ALL)); | 627 SMOOTHNESS_TAKES_PRIORITY, RasterTilePriorityQueue::Type::ALL)); |
| 626 EXPECT_FALSE(queue->IsEmpty()); | 628 EXPECT_FALSE(queue->IsEmpty()); |
| 627 | 629 |
| 628 // Get all the tiles that are NOW or SOON and make sure they are ready to | 630 // Get all the tiles that are NOW or SOON and make sure they are ready to |
| 629 // draw. | 631 // draw. |
| 630 std::vector<Tile*> all_tiles; | 632 std::vector<Tile*> all_tiles; |
| 631 while (!queue->IsEmpty()) { | 633 while (!queue->IsEmpty()) { |
| 632 Tile* tile = queue->Top(); | 634 PrioritizedTile prioritized_tile = queue->Top(); |
| 633 if (tile->priority().priority_bin >= TilePriority::EVENTUALLY) | 635 if (prioritized_tile.priority().priority_bin >= TilePriority::EVENTUALLY) |
| 634 break; | 636 break; |
| 635 | 637 |
| 636 all_tiles.push_back(tile); | 638 all_tiles.push_back(prioritized_tile.tile()); |
| 637 queue->Pop(); | 639 queue->Pop(); |
| 638 } | 640 } |
| 639 | 641 |
| 640 tile_manager()->InitializeTilesWithResourcesForTesting( | 642 tile_manager()->InitializeTilesWithResourcesForTesting( |
| 641 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); | 643 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); |
| 642 | 644 |
| 643 // Ensure we can activate. | 645 // Ensure we can activate. |
| 644 EXPECT_TRUE(tile_manager()->IsReadyToActivate()); | 646 EXPECT_TRUE(tile_manager()->IsReadyToActivate()); |
| 645 } | 647 } |
| 646 | 648 |
| 647 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) { | 649 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) { |
| 648 const gfx::Size layer_bounds(1000, 1000); | 650 const gfx::Size layer_bounds(1000, 1000); |
| 649 host_impl_.SetViewportSize(layer_bounds); | 651 host_impl_.SetViewportSize(layer_bounds); |
| 650 SetupDefaultTrees(layer_bounds); | 652 SetupDefaultTrees(layer_bounds); |
| 651 | 653 |
| 652 scoped_ptr<EvictionTilePriorityQueue> empty_queue( | 654 scoped_ptr<EvictionTilePriorityQueue> empty_queue( |
| 653 host_impl_.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES)); | 655 host_impl_.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES)); |
| 654 EXPECT_TRUE(empty_queue->IsEmpty()); | 656 EXPECT_TRUE(empty_queue->IsEmpty()); |
| 655 std::set<Tile*> all_tiles; | 657 std::set<Tile*> all_tiles; |
| 656 size_t tile_count = 0; | 658 size_t tile_count = 0; |
| 657 | 659 |
| 658 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( | 660 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( |
| 659 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 661 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 660 while (!raster_queue->IsEmpty()) { | 662 while (!raster_queue->IsEmpty()) { |
| 661 ++tile_count; | 663 ++tile_count; |
| 662 EXPECT_TRUE(raster_queue->Top()); | 664 EXPECT_TRUE(raster_queue->Top().tile()); |
| 663 all_tiles.insert(raster_queue->Top()); | 665 all_tiles.insert(raster_queue->Top().tile()); |
| 664 raster_queue->Pop(); | 666 raster_queue->Pop(); |
| 665 } | 667 } |
| 666 | 668 |
| 667 EXPECT_EQ(tile_count, all_tiles.size()); | 669 EXPECT_EQ(tile_count, all_tiles.size()); |
| 668 EXPECT_EQ(16u, tile_count); | 670 EXPECT_EQ(16u, tile_count); |
| 669 | 671 |
| 670 tile_manager()->InitializeTilesWithResourcesForTesting( | 672 tile_manager()->InitializeTilesWithResourcesForTesting( |
| 671 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); | 673 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); |
| 672 | 674 |
| 673 scoped_ptr<EvictionTilePriorityQueue> queue( | 675 scoped_ptr<EvictionTilePriorityQueue> queue( |
| 674 host_impl_.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY)); | 676 host_impl_.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY)); |
| 675 EXPECT_FALSE(queue->IsEmpty()); | 677 EXPECT_FALSE(queue->IsEmpty()); |
| 676 | 678 |
| 677 // Sanity check, all tiles should be visible. | 679 // Sanity check, all tiles should be visible. |
| 678 std::set<Tile*> smoothness_tiles; | 680 std::set<Tile*> smoothness_tiles; |
| 679 while (!queue->IsEmpty()) { | 681 while (!queue->IsEmpty()) { |
| 680 Tile* tile = queue->Top(); | 682 PrioritizedTile prioritized_tile = queue->Top(); |
| 681 EXPECT_TRUE(tile); | 683 EXPECT_TRUE(prioritized_tile.tile()); |
| 682 EXPECT_EQ(TilePriority::NOW, tile->priority().priority_bin); | 684 EXPECT_EQ(TilePriority::NOW, prioritized_tile.priority().priority_bin); |
| 683 EXPECT_TRUE(tile->HasResource()); | 685 EXPECT_TRUE(prioritized_tile.tile()->HasResource()); |
| 684 smoothness_tiles.insert(tile); | 686 smoothness_tiles.insert(prioritized_tile.tile()); |
| 685 queue->Pop(); | 687 queue->Pop(); |
| 686 } | 688 } |
| 687 EXPECT_EQ(all_tiles, smoothness_tiles); | 689 EXPECT_EQ(all_tiles, smoothness_tiles); |
| 688 | 690 |
| 689 tile_manager()->ReleaseTileResourcesForTesting( | 691 tile_manager()->ReleaseTileResourcesForTesting( |
| 690 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); | 692 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); |
| 691 | 693 |
| 692 Region invalidation(gfx::Rect(0, 0, 500, 500)); | 694 Region invalidation(gfx::Rect(0, 0, 500, 500)); |
| 693 | 695 |
| 694 // Invalidate the pending tree. | 696 // Invalidate the pending tree. |
| 695 pending_layer_->set_invalidation(invalidation); | 697 pending_layer_->set_invalidation(invalidation); |
| 696 pending_layer_->HighResTiling()->Invalidate(invalidation); | 698 pending_layer_->HighResTiling()->Invalidate(invalidation); |
| 697 pending_layer_->HighResTiling()->CreateMissingTilesInLiveTilesRect(); | 699 pending_layer_->HighResTiling()->CreateMissingTilesInLiveTilesRect(); |
| 698 pending_layer_->LowResTiling()->Invalidate(invalidation); | 700 pending_layer_->LowResTiling()->Invalidate(invalidation); |
| 699 pending_layer_->LowResTiling()->CreateMissingTilesInLiveTilesRect(); | 701 pending_layer_->LowResTiling()->CreateMissingTilesInLiveTilesRect(); |
| 700 | 702 |
| 701 active_layer_->ResetAllTilesPriorities(); | |
| 702 pending_layer_->ResetAllTilesPriorities(); | |
| 703 | |
| 704 // Renew all of the tile priorities. | 703 // Renew all of the tile priorities. |
| 705 gfx::Rect viewport(50, 50, 100, 100); | 704 gfx::Rect viewport(50, 50, 100, 100); |
| 706 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 705 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 707 Occlusion()); | 706 Occlusion()); |
| 708 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 707 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 709 Occlusion()); | 708 Occlusion()); |
| 710 active_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 709 active_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 711 Occlusion()); | 710 Occlusion()); |
| 712 active_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 711 active_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 713 Occlusion()); | 712 Occlusion()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 730 all_tiles.insert(active_high_res_tiles[i]); | 729 all_tiles.insert(active_high_res_tiles[i]); |
| 731 | 730 |
| 732 std::vector<Tile*> active_low_res_tiles = | 731 std::vector<Tile*> active_low_res_tiles = |
| 733 active_layer_->LowResTiling()->AllTilesForTesting(); | 732 active_layer_->LowResTiling()->AllTilesForTesting(); |
| 734 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) | 733 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) |
| 735 all_tiles.insert(active_low_res_tiles[i]); | 734 all_tiles.insert(active_low_res_tiles[i]); |
| 736 | 735 |
| 737 tile_manager()->InitializeTilesWithResourcesForTesting( | 736 tile_manager()->InitializeTilesWithResourcesForTesting( |
| 738 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); | 737 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); |
| 739 | 738 |
| 740 Tile* last_tile = NULL; | 739 PrioritizedTile last_tile; |
| 741 smoothness_tiles.clear(); | 740 smoothness_tiles.clear(); |
| 742 tile_count = 0; | 741 tile_count = 0; |
| 743 // Here we expect to get increasing combined priority_bin. | 742 // Here we expect to get increasing combined priority_bin. |
| 744 queue = host_impl_.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY); | 743 queue = host_impl_.BuildEvictionQueue(SMOOTHNESS_TAKES_PRIORITY); |
| 745 int distance_increasing = 0; | 744 int distance_increasing = 0; |
| 746 int distance_decreasing = 0; | 745 int distance_decreasing = 0; |
| 747 while (!queue->IsEmpty()) { | 746 while (!queue->IsEmpty()) { |
| 748 Tile* tile = queue->Top(); | 747 PrioritizedTile prioritized_tile = queue->Top(); |
| 748 Tile* tile = prioritized_tile.tile(); |
| 749 EXPECT_TRUE(tile); | 749 EXPECT_TRUE(tile); |
| 750 EXPECT_TRUE(tile->HasResource()); | 750 EXPECT_TRUE(tile->HasResource()); |
| 751 | 751 |
| 752 if (!last_tile) | 752 if (!last_tile.tile()) |
| 753 last_tile = tile; | 753 last_tile = prioritized_tile; |
| 754 | 754 |
| 755 const TilePriority& last_priority = last_tile->priority(); | 755 const TilePriority& last_priority = last_tile.priority(); |
| 756 const TilePriority& priority = tile->priority(); | 756 const TilePriority& priority = prioritized_tile.priority(); |
| 757 | 757 |
| 758 EXPECT_GE(last_priority.priority_bin, priority.priority_bin); | 758 EXPECT_GE(last_priority.priority_bin, priority.priority_bin); |
| 759 if (last_priority.priority_bin == priority.priority_bin) { | 759 if (last_priority.priority_bin == priority.priority_bin) { |
| 760 EXPECT_LE(last_tile->required_for_activation(), | 760 EXPECT_LE(last_tile.tile()->required_for_activation(), |
| 761 tile->required_for_activation()); | 761 tile->required_for_activation()); |
| 762 if (last_tile->required_for_activation() == | 762 if (last_tile.tile()->required_for_activation() == |
| 763 tile->required_for_activation()) { | 763 tile->required_for_activation()) { |
| 764 if (last_priority.distance_to_visible >= priority.distance_to_visible) | 764 if (last_priority.distance_to_visible >= priority.distance_to_visible) |
| 765 ++distance_decreasing; | 765 ++distance_decreasing; |
| 766 else | 766 else |
| 767 ++distance_increasing; | 767 ++distance_increasing; |
| 768 } | 768 } |
| 769 } | 769 } |
| 770 | 770 |
| 771 last_tile = tile; | 771 last_tile = prioritized_tile; |
| 772 ++tile_count; | 772 ++tile_count; |
| 773 smoothness_tiles.insert(tile); | 773 smoothness_tiles.insert(tile); |
| 774 queue->Pop(); | 774 queue->Pop(); |
| 775 } | 775 } |
| 776 | 776 |
| 777 // Ensure that the distance is decreasing many more times than increasing. | 777 // Ensure that the distance is decreasing many more times than increasing. |
| 778 EXPECT_EQ(3, distance_increasing); | 778 EXPECT_EQ(3, distance_increasing); |
| 779 EXPECT_EQ(17, distance_decreasing); | 779 EXPECT_EQ(17, distance_decreasing); |
| 780 EXPECT_EQ(tile_count, smoothness_tiles.size()); | 780 EXPECT_EQ(tile_count, smoothness_tiles.size()); |
| 781 EXPECT_EQ(all_tiles, smoothness_tiles); | 781 EXPECT_EQ(all_tiles, smoothness_tiles); |
| 782 | 782 |
| 783 std::set<Tile*> new_content_tiles; | 783 std::set<Tile*> new_content_tiles; |
| 784 last_tile = NULL; | 784 last_tile.Invalidate(); |
| 785 // Again, we expect to get increasing combined priority_bin. | 785 // Again, we expect to get increasing combined priority_bin. |
| 786 queue = host_impl_.BuildEvictionQueue(NEW_CONTENT_TAKES_PRIORITY); | 786 queue = host_impl_.BuildEvictionQueue(NEW_CONTENT_TAKES_PRIORITY); |
| 787 distance_decreasing = 0; | 787 distance_decreasing = 0; |
| 788 distance_increasing = 0; | 788 distance_increasing = 0; |
| 789 while (!queue->IsEmpty()) { | 789 while (!queue->IsEmpty()) { |
| 790 Tile* tile = queue->Top(); | 790 PrioritizedTile prioritized_tile = queue->Top(); |
| 791 Tile* tile = prioritized_tile.tile(); |
| 791 EXPECT_TRUE(tile); | 792 EXPECT_TRUE(tile); |
| 792 | 793 |
| 793 if (!last_tile) | 794 if (!last_tile.tile()) |
| 794 last_tile = tile; | 795 last_tile = prioritized_tile; |
| 795 | 796 |
| 796 const TilePriority& last_priority = last_tile->priority(); | 797 const TilePriority& last_priority = last_tile.priority(); |
| 797 const TilePriority& priority = tile->priority(); | 798 const TilePriority& priority = prioritized_tile.priority(); |
| 798 | 799 |
| 799 EXPECT_GE(last_priority.priority_bin, priority.priority_bin); | 800 EXPECT_GE(last_priority.priority_bin, priority.priority_bin); |
| 800 if (last_priority.priority_bin == priority.priority_bin) { | 801 if (last_priority.priority_bin == priority.priority_bin) { |
| 801 EXPECT_LE(last_tile->required_for_activation(), | 802 EXPECT_LE(last_tile.tile()->required_for_activation(), |
| 802 tile->required_for_activation()); | 803 tile->required_for_activation()); |
| 803 if (last_tile->required_for_activation() == | 804 if (last_tile.tile()->required_for_activation() == |
| 804 tile->required_for_activation()) { | 805 tile->required_for_activation()) { |
| 805 if (last_priority.distance_to_visible >= priority.distance_to_visible) | 806 if (last_priority.distance_to_visible >= priority.distance_to_visible) |
| 806 ++distance_decreasing; | 807 ++distance_decreasing; |
| 807 else | 808 else |
| 808 ++distance_increasing; | 809 ++distance_increasing; |
| 809 } | 810 } |
| 810 } | 811 } |
| 811 | 812 |
| 812 last_tile = tile; | 813 last_tile = prioritized_tile; |
| 813 new_content_tiles.insert(tile); | 814 new_content_tiles.insert(tile); |
| 814 queue->Pop(); | 815 queue->Pop(); |
| 815 } | 816 } |
| 816 | 817 |
| 817 // Ensure that the distance is decreasing many more times than increasing. | 818 // Ensure that the distance is decreasing many more times than increasing. |
| 818 EXPECT_EQ(3, distance_increasing); | 819 EXPECT_EQ(3, distance_increasing); |
| 819 EXPECT_EQ(17, distance_decreasing); | 820 EXPECT_EQ(17, distance_decreasing); |
| 820 EXPECT_EQ(tile_count, new_content_tiles.size()); | 821 EXPECT_EQ(tile_count, new_content_tiles.size()); |
| 821 EXPECT_EQ(all_tiles, new_content_tiles); | 822 EXPECT_EQ(all_tiles, new_content_tiles); |
| 822 } | 823 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 | 858 |
| 858 FakePictureLayerImpl* active_child_layer = | 859 FakePictureLayerImpl* active_child_layer = |
| 859 static_cast<FakePictureLayerImpl*>(active_layer_->children()[0]); | 860 static_cast<FakePictureLayerImpl*>(active_layer_->children()[0]); |
| 860 | 861 |
| 861 std::set<Tile*> all_tiles; | 862 std::set<Tile*> all_tiles; |
| 862 size_t tile_count = 0; | 863 size_t tile_count = 0; |
| 863 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( | 864 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( |
| 864 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 865 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 865 while (!raster_queue->IsEmpty()) { | 866 while (!raster_queue->IsEmpty()) { |
| 866 ++tile_count; | 867 ++tile_count; |
| 867 EXPECT_TRUE(raster_queue->Top()); | 868 EXPECT_TRUE(raster_queue->Top().tile()); |
| 868 all_tiles.insert(raster_queue->Top()); | 869 all_tiles.insert(raster_queue->Top().tile()); |
| 869 raster_queue->Pop(); | 870 raster_queue->Pop(); |
| 870 } | 871 } |
| 871 EXPECT_EQ(tile_count, all_tiles.size()); | 872 EXPECT_EQ(tile_count, all_tiles.size()); |
| 872 EXPECT_EQ(32u, tile_count); | 873 EXPECT_EQ(32u, tile_count); |
| 873 | 874 |
| 874 pending_layer_->ResetAllTilesPriorities(); | |
| 875 | |
| 876 // Renew all of the tile priorities. | 875 // Renew all of the tile priorities. |
| 877 gfx::Rect viewport(layer_bounds); | 876 gfx::Rect viewport(layer_bounds); |
| 878 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 877 pending_layer_->HighResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 879 Occlusion()); | 878 Occlusion()); |
| 880 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, | 879 pending_layer_->LowResTiling()->ComputeTilePriorityRects(viewport, 1.0f, 1.0, |
| 881 Occlusion()); | 880 Occlusion()); |
| 882 pending_child_layer->HighResTiling()->ComputeTilePriorityRects( | 881 pending_child_layer->HighResTiling()->ComputeTilePriorityRects( |
| 883 viewport, 1.0f, 1.0, Occlusion()); | 882 viewport, 1.0f, 1.0, Occlusion()); |
| 884 pending_child_layer->LowResTiling()->ComputeTilePriorityRects( | 883 pending_child_layer->LowResTiling()->ComputeTilePriorityRects( |
| 885 viewport, 1.0f, 1.0, Occlusion()); | 884 viewport, 1.0f, 1.0, Occlusion()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 active_child_layer->LowResTiling()->SetAllTilesOccludedForTesting(); | 917 active_child_layer->LowResTiling()->SetAllTilesOccludedForTesting(); |
| 919 all_tiles.insert(pending_child_low_res_tiles.begin(), | 918 all_tiles.insert(pending_child_low_res_tiles.begin(), |
| 920 pending_child_low_res_tiles.end()); | 919 pending_child_low_res_tiles.end()); |
| 921 | 920 |
| 922 tile_manager()->InitializeTilesWithResourcesForTesting( | 921 tile_manager()->InitializeTilesWithResourcesForTesting( |
| 923 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); | 922 std::vector<Tile*>(all_tiles.begin(), all_tiles.end())); |
| 924 | 923 |
| 925 // Verify occlusion is considered by EvictionTilePriorityQueue. | 924 // Verify occlusion is considered by EvictionTilePriorityQueue. |
| 926 TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY; | 925 TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY; |
| 927 size_t occluded_count = 0u; | 926 size_t occluded_count = 0u; |
| 928 Tile* last_tile = NULL; | 927 PrioritizedTile last_tile; |
| 929 scoped_ptr<EvictionTilePriorityQueue> queue( | 928 scoped_ptr<EvictionTilePriorityQueue> queue( |
| 930 host_impl_.BuildEvictionQueue(tree_priority)); | 929 host_impl_.BuildEvictionQueue(tree_priority)); |
| 931 while (!queue->IsEmpty()) { | 930 while (!queue->IsEmpty()) { |
| 932 Tile* tile = queue->Top(); | 931 PrioritizedTile prioritized_tile = queue->Top(); |
| 933 if (!last_tile) | 932 if (!last_tile.tile()) |
| 934 last_tile = tile; | 933 last_tile = prioritized_tile; |
| 935 | 934 |
| 936 bool tile_is_occluded = tile->is_occluded(); | 935 bool tile_is_occluded = prioritized_tile.is_occluded(); |
| 937 | 936 |
| 938 // The only way we will encounter an occluded tile after an unoccluded | 937 // The only way we will encounter an occluded tile after an unoccluded |
| 939 // tile is if the priorty bin decreased, the tile is required for | 938 // tile is if the priorty bin decreased, the tile is required for |
| 940 // activation, or the scale changed. | 939 // activation, or the scale changed. |
| 941 if (tile_is_occluded) { | 940 if (tile_is_occluded) { |
| 942 occluded_count++; | 941 occluded_count++; |
| 943 | 942 |
| 944 bool last_tile_is_occluded = last_tile->is_occluded(); | 943 bool last_tile_is_occluded = last_tile.is_occluded(); |
| 945 if (!last_tile_is_occluded) { | 944 if (!last_tile_is_occluded) { |
| 946 TilePriority::PriorityBin tile_priority_bin = | 945 TilePriority::PriorityBin tile_priority_bin = |
| 947 tile->priority().priority_bin; | 946 prioritized_tile.priority().priority_bin; |
| 948 TilePriority::PriorityBin last_tile_priority_bin = | 947 TilePriority::PriorityBin last_tile_priority_bin = |
| 949 last_tile->priority().priority_bin; | 948 last_tile.priority().priority_bin; |
| 950 | 949 |
| 951 EXPECT_TRUE((tile_priority_bin < last_tile_priority_bin) || | 950 EXPECT_TRUE((tile_priority_bin < last_tile_priority_bin) || |
| 952 tile->required_for_activation() || | 951 prioritized_tile.tile()->required_for_activation() || |
| 953 (tile->contents_scale() != last_tile->contents_scale())); | 952 (prioritized_tile.tile()->contents_scale() != |
| 953 last_tile.tile()->contents_scale())); |
| 954 } | 954 } |
| 955 } | 955 } |
| 956 last_tile = tile; | 956 last_tile = prioritized_tile; |
| 957 queue->Pop(); | 957 queue->Pop(); |
| 958 } | 958 } |
| 959 size_t expected_occluded_count = | 959 size_t expected_occluded_count = |
| 960 pending_child_high_res_tiles.size() + pending_child_low_res_tiles.size(); | 960 pending_child_high_res_tiles.size() + pending_child_low_res_tiles.size(); |
| 961 EXPECT_EQ(expected_occluded_count, occluded_count); | 961 EXPECT_EQ(expected_occluded_count, occluded_count); |
| 962 } | 962 } |
| 963 | 963 |
| 964 TEST_F(TileManagerTilePriorityQueueTest, | 964 TEST_F(TileManagerTilePriorityQueueTest, |
| 965 EvictionTilePriorityQueueWithTransparentLayer) { | 965 EvictionTilePriorityQueueWithTransparentLayer) { |
| 966 base::TimeTicks time_ticks; | 966 base::TimeTicks time_ticks; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1048 | 1048 |
| 1049 // Verify that eviction queue returns tiles also from layers without valid | 1049 // Verify that eviction queue returns tiles also from layers without valid |
| 1050 // tile priorities and that the tile priority bin of those tiles is (at most) | 1050 // tile priorities and that the tile priority bin of those tiles is (at most) |
| 1051 // EVENTUALLY. | 1051 // EVENTUALLY. |
| 1052 TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY; | 1052 TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY; |
| 1053 std::set<Tile*> new_content_tiles; | 1053 std::set<Tile*> new_content_tiles; |
| 1054 size_t tile_count = 0; | 1054 size_t tile_count = 0; |
| 1055 scoped_ptr<EvictionTilePriorityQueue> queue( | 1055 scoped_ptr<EvictionTilePriorityQueue> queue( |
| 1056 host_impl_.BuildEvictionQueue(tree_priority)); | 1056 host_impl_.BuildEvictionQueue(tree_priority)); |
| 1057 while (!queue->IsEmpty()) { | 1057 while (!queue->IsEmpty()) { |
| 1058 Tile* tile = queue->Top(); | 1058 PrioritizedTile prioritized_tile = queue->Top(); |
| 1059 const TilePriority& pending_priority = tile->priority(); | 1059 Tile* tile = prioritized_tile.tile(); |
| 1060 const TilePriority& pending_priority = prioritized_tile.priority(); |
| 1060 EXPECT_NE(std::numeric_limits<float>::infinity(), | 1061 EXPECT_NE(std::numeric_limits<float>::infinity(), |
| 1061 pending_priority.distance_to_visible); | 1062 pending_priority.distance_to_visible); |
| 1062 if (all_pending_child_tiles.find(tile) != all_pending_child_tiles.end()) | 1063 if (all_pending_child_tiles.find(tile) != all_pending_child_tiles.end()) |
| 1063 EXPECT_EQ(TilePriority::EVENTUALLY, pending_priority.priority_bin); | 1064 EXPECT_EQ(TilePriority::EVENTUALLY, pending_priority.priority_bin); |
| 1064 else | 1065 else |
| 1065 EXPECT_EQ(TilePriority::NOW, pending_priority.priority_bin); | 1066 EXPECT_EQ(TilePriority::NOW, pending_priority.priority_bin); |
| 1066 new_content_tiles.insert(tile); | 1067 new_content_tiles.insert(tile); |
| 1067 ++tile_count; | 1068 ++tile_count; |
| 1068 queue->Pop(); | 1069 queue->Pop(); |
| 1069 } | 1070 } |
| 1070 EXPECT_EQ(tile_count, new_content_tiles.size()); | 1071 EXPECT_EQ(tile_count, new_content_tiles.size()); |
| 1071 EXPECT_EQ(all_tiles, new_content_tiles); | 1072 EXPECT_EQ(all_tiles, new_content_tiles); |
| 1072 } | 1073 } |
| 1073 | 1074 |
| 1074 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { | 1075 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { |
| 1075 const gfx::Size layer_bounds(1000, 1000); | 1076 const gfx::Size layer_bounds(1000, 1000); |
| 1076 host_impl_.SetViewportSize(layer_bounds); | 1077 host_impl_.SetViewportSize(layer_bounds); |
| 1077 SetupDefaultTrees(layer_bounds); | 1078 SetupDefaultTrees(layer_bounds); |
| 1078 | 1079 |
| 1079 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 1080 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 1080 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 1081 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 1081 EXPECT_FALSE(queue->IsEmpty()); | 1082 EXPECT_FALSE(queue->IsEmpty()); |
| 1082 | 1083 |
| 1083 size_t tile_count = 0; | 1084 size_t tile_count = 0; |
| 1084 std::set<Tile*> all_tiles; | 1085 std::set<Tile*> all_tiles; |
| 1085 while (!queue->IsEmpty()) { | 1086 while (!queue->IsEmpty()) { |
| 1086 EXPECT_TRUE(queue->Top()); | 1087 EXPECT_TRUE(queue->Top().tile()); |
| 1087 all_tiles.insert(queue->Top()); | 1088 all_tiles.insert(queue->Top().tile()); |
| 1088 ++tile_count; | 1089 ++tile_count; |
| 1089 queue->Pop(); | 1090 queue->Pop(); |
| 1090 } | 1091 } |
| 1091 | 1092 |
| 1092 EXPECT_EQ(tile_count, all_tiles.size()); | 1093 EXPECT_EQ(tile_count, all_tiles.size()); |
| 1093 EXPECT_EQ(16u, tile_count); | 1094 EXPECT_EQ(16u, tile_count); |
| 1094 | 1095 |
| 1095 for (int i = 1; i < 10; ++i) { | 1096 for (int i = 1; i < 10; ++i) { |
| 1096 scoped_ptr<FakePictureLayerImpl> pending_layer = | 1097 scoped_ptr<FakePictureLayerImpl> pending_layer = |
| 1097 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); | 1098 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); |
| 1098 pending_layer->SetDrawsContent(true); | 1099 pending_layer->SetDrawsContent(true); |
| 1099 pending_layer->set_has_valid_tile_priorities(true); | 1100 pending_layer->set_has_valid_tile_priorities(true); |
| 1100 pending_layer_->AddChild(pending_layer.Pass()); | 1101 pending_layer_->AddChild(pending_layer.Pass()); |
| 1101 } | 1102 } |
| 1102 | 1103 |
| 1103 queue = host_impl_.BuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES, | 1104 queue = host_impl_.BuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES, |
| 1104 RasterTilePriorityQueue::Type::ALL); | 1105 RasterTilePriorityQueue::Type::ALL); |
| 1105 EXPECT_FALSE(queue->IsEmpty()); | 1106 EXPECT_FALSE(queue->IsEmpty()); |
| 1106 | 1107 |
| 1107 tile_count = 0; | 1108 tile_count = 0; |
| 1108 all_tiles.clear(); | 1109 all_tiles.clear(); |
| 1109 while (!queue->IsEmpty()) { | 1110 while (!queue->IsEmpty()) { |
| 1110 EXPECT_TRUE(queue->Top()); | 1111 EXPECT_TRUE(queue->Top().tile()); |
| 1111 all_tiles.insert(queue->Top()); | 1112 all_tiles.insert(queue->Top().tile()); |
| 1112 ++tile_count; | 1113 ++tile_count; |
| 1113 queue->Pop(); | 1114 queue->Pop(); |
| 1114 } | 1115 } |
| 1115 EXPECT_EQ(tile_count, all_tiles.size()); | 1116 EXPECT_EQ(tile_count, all_tiles.size()); |
| 1116 EXPECT_EQ(16u, tile_count); | 1117 EXPECT_EQ(16u, tile_count); |
| 1117 } | 1118 } |
| 1118 | 1119 |
| 1119 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) { | 1120 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) { |
| 1120 const gfx::Size layer_bounds(1000, 1000); | 1121 const gfx::Size layer_bounds(1000, 1000); |
| 1121 host_impl_.SetViewportSize(layer_bounds); | 1122 host_impl_.SetViewportSize(layer_bounds); |
| 1122 SetupDefaultTrees(layer_bounds); | 1123 SetupDefaultTrees(layer_bounds); |
| 1123 | 1124 |
| 1124 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( | 1125 scoped_ptr<RasterTilePriorityQueue> raster_queue(host_impl_.BuildRasterQueue( |
| 1125 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 1126 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 1126 EXPECT_FALSE(raster_queue->IsEmpty()); | 1127 EXPECT_FALSE(raster_queue->IsEmpty()); |
| 1127 | 1128 |
| 1128 size_t tile_count = 0; | 1129 size_t tile_count = 0; |
| 1129 std::set<Tile*> all_tiles; | 1130 std::set<Tile*> all_tiles; |
| 1130 while (!raster_queue->IsEmpty()) { | 1131 while (!raster_queue->IsEmpty()) { |
| 1131 EXPECT_TRUE(raster_queue->Top()); | 1132 EXPECT_TRUE(raster_queue->Top().tile()); |
| 1132 all_tiles.insert(raster_queue->Top()); | 1133 all_tiles.insert(raster_queue->Top().tile()); |
| 1133 ++tile_count; | 1134 ++tile_count; |
| 1134 raster_queue->Pop(); | 1135 raster_queue->Pop(); |
| 1135 } | 1136 } |
| 1136 EXPECT_EQ(tile_count, all_tiles.size()); | 1137 EXPECT_EQ(tile_count, all_tiles.size()); |
| 1137 EXPECT_EQ(16u, tile_count); | 1138 EXPECT_EQ(16u, tile_count); |
| 1138 | 1139 |
| 1139 std::vector<Tile*> tiles(all_tiles.begin(), all_tiles.end()); | 1140 std::vector<Tile*> tiles(all_tiles.begin(), all_tiles.end()); |
| 1140 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); | 1141 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
| 1141 | 1142 |
| 1142 for (int i = 1; i < 10; ++i) { | 1143 for (int i = 1; i < 10; ++i) { |
| 1143 scoped_ptr<FakePictureLayerImpl> pending_layer = | 1144 scoped_ptr<FakePictureLayerImpl> pending_layer = |
| 1144 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); | 1145 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); |
| 1145 pending_layer->SetDrawsContent(true); | 1146 pending_layer->SetDrawsContent(true); |
| 1146 pending_layer->set_has_valid_tile_priorities(true); | 1147 pending_layer->set_has_valid_tile_priorities(true); |
| 1147 pending_layer_->AddChild(pending_layer.Pass()); | 1148 pending_layer_->AddChild(pending_layer.Pass()); |
| 1148 } | 1149 } |
| 1149 | 1150 |
| 1150 scoped_ptr<EvictionTilePriorityQueue> queue( | 1151 scoped_ptr<EvictionTilePriorityQueue> queue( |
| 1151 host_impl_.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES)); | 1152 host_impl_.BuildEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES)); |
| 1152 EXPECT_FALSE(queue->IsEmpty()); | 1153 EXPECT_FALSE(queue->IsEmpty()); |
| 1153 | 1154 |
| 1154 tile_count = 0; | 1155 tile_count = 0; |
| 1155 all_tiles.clear(); | 1156 all_tiles.clear(); |
| 1156 while (!queue->IsEmpty()) { | 1157 while (!queue->IsEmpty()) { |
| 1157 EXPECT_TRUE(queue->Top()); | 1158 EXPECT_TRUE(queue->Top().tile()); |
| 1158 all_tiles.insert(queue->Top()); | 1159 all_tiles.insert(queue->Top().tile()); |
| 1159 ++tile_count; | 1160 ++tile_count; |
| 1160 queue->Pop(); | 1161 queue->Pop(); |
| 1161 } | 1162 } |
| 1162 EXPECT_EQ(tile_count, all_tiles.size()); | 1163 EXPECT_EQ(tile_count, all_tiles.size()); |
| 1163 EXPECT_EQ(16u, tile_count); | 1164 EXPECT_EQ(16u, tile_count); |
| 1164 } | 1165 } |
| 1165 | 1166 |
| 1166 TEST_F(TileManagerTilePriorityQueueTest, | 1167 TEST_F(TileManagerTilePriorityQueueTest, |
| 1167 RasterTilePriorityQueueStaticViewport) { | 1168 RasterTilePriorityQueueStaticViewport) { |
| 1168 FakePictureLayerTilingClient client; | 1169 FakePictureLayerTilingClient client; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 | 1210 |
| 1210 // On the third iteration, we should get no tiles since everything was | 1211 // On the third iteration, we should get no tiles since everything was |
| 1211 // marked as ready to draw. | 1212 // marked as ready to draw. |
| 1212 if (i == 2) { | 1213 if (i == 2) { |
| 1213 EXPECT_TRUE(queue->IsEmpty()); | 1214 EXPECT_TRUE(queue->IsEmpty()); |
| 1214 continue; | 1215 continue; |
| 1215 } | 1216 } |
| 1216 | 1217 |
| 1217 EXPECT_FALSE(queue->IsEmpty()); | 1218 EXPECT_FALSE(queue->IsEmpty()); |
| 1218 std::set<Tile*> unique_tiles; | 1219 std::set<Tile*> unique_tiles; |
| 1219 unique_tiles.insert(queue->Top()); | 1220 unique_tiles.insert(queue->Top().tile()); |
| 1220 Tile* last_tile = queue->Top(); | 1221 PrioritizedTile last_tile = queue->Top(); |
| 1221 have_tiles[last_tile->priority().priority_bin] = true; | 1222 have_tiles[last_tile.priority().priority_bin] = true; |
| 1222 | 1223 |
| 1223 // On the second iteration, mark everything as ready to draw (solid color). | 1224 // On the second iteration, mark everything as ready to draw (solid color). |
| 1224 if (i == 1) { | 1225 if (i == 1) { |
| 1225 TileDrawInfo& draw_info = last_tile->draw_info(); | 1226 TileDrawInfo& draw_info = last_tile.tile()->draw_info(); |
| 1226 draw_info.SetSolidColorForTesting(SK_ColorRED); | 1227 draw_info.SetSolidColorForTesting(SK_ColorRED); |
| 1227 } | 1228 } |
| 1228 queue->Pop(); | 1229 queue->Pop(); |
| 1229 int eventually_bin_order_correct_count = 0; | 1230 int eventually_bin_order_correct_count = 0; |
| 1230 int eventually_bin_order_incorrect_count = 0; | 1231 int eventually_bin_order_incorrect_count = 0; |
| 1231 while (!queue->IsEmpty()) { | 1232 while (!queue->IsEmpty()) { |
| 1232 Tile* new_tile = queue->Top(); | 1233 PrioritizedTile new_tile = queue->Top(); |
| 1233 queue->Pop(); | 1234 queue->Pop(); |
| 1234 unique_tiles.insert(new_tile); | 1235 unique_tiles.insert(new_tile.tile()); |
| 1235 | 1236 |
| 1236 TilePriority last_priority = last_tile->priority(); | 1237 TilePriority last_priority = last_tile.priority(); |
| 1237 TilePriority new_priority = new_tile->priority(); | 1238 TilePriority new_priority = new_tile.priority(); |
| 1238 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | 1239 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 1239 if (last_priority.priority_bin == new_priority.priority_bin) { | 1240 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 1240 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | 1241 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 1241 bool order_correct = last_priority.distance_to_visible <= | 1242 bool order_correct = last_priority.distance_to_visible <= |
| 1242 new_priority.distance_to_visible; | 1243 new_priority.distance_to_visible; |
| 1243 eventually_bin_order_correct_count += order_correct; | 1244 eventually_bin_order_correct_count += order_correct; |
| 1244 eventually_bin_order_incorrect_count += !order_correct; | 1245 eventually_bin_order_incorrect_count += !order_correct; |
| 1245 } else if (!soon_rect.Intersects(new_tile->content_rect()) && | 1246 } else if (!soon_rect.Intersects(new_tile.tile()->content_rect()) && |
| 1246 !soon_rect.Intersects(last_tile->content_rect())) { | 1247 !soon_rect.Intersects(last_tile.tile()->content_rect())) { |
| 1247 EXPECT_LE(last_priority.distance_to_visible, | 1248 EXPECT_LE(last_priority.distance_to_visible, |
| 1248 new_priority.distance_to_visible); | 1249 new_priority.distance_to_visible); |
| 1249 EXPECT_EQ(TilePriority::NOW, new_priority.priority_bin); | 1250 EXPECT_EQ(TilePriority::NOW, new_priority.priority_bin); |
| 1250 } else if (new_priority.distance_to_visible > 0.f) { | 1251 } else if (new_priority.distance_to_visible > 0.f) { |
| 1251 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); | 1252 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); |
| 1252 } | 1253 } |
| 1253 } | 1254 } |
| 1254 have_tiles[new_priority.priority_bin] = true; | 1255 have_tiles[new_priority.priority_bin] = true; |
| 1255 | 1256 |
| 1256 last_tile = new_tile; | 1257 last_tile = new_tile; |
| 1257 | 1258 |
| 1258 // On the second iteration, mark everything as ready to draw (solid | 1259 // On the second iteration, mark everything as ready to draw (solid |
| 1259 // color). | 1260 // color). |
| 1260 if (i == 1) { | 1261 if (i == 1) { |
| 1261 TileDrawInfo& draw_info = last_tile->draw_info(); | 1262 TileDrawInfo& draw_info = last_tile.tile()->draw_info(); |
| 1262 draw_info.SetSolidColorForTesting(SK_ColorRED); | 1263 draw_info.SetSolidColorForTesting(SK_ColorRED); |
| 1263 } | 1264 } |
| 1264 } | 1265 } |
| 1265 | 1266 |
| 1266 EXPECT_GT(eventually_bin_order_correct_count, | 1267 EXPECT_GT(eventually_bin_order_correct_count, |
| 1267 eventually_bin_order_incorrect_count); | 1268 eventually_bin_order_incorrect_count); |
| 1268 | 1269 |
| 1269 // We should have now and eventually tiles, as well as soon tiles from | 1270 // We should have now and eventually tiles, as well as soon tiles from |
| 1270 // the border region. | 1271 // the border region. |
| 1271 EXPECT_TRUE(have_tiles[TilePriority::NOW]); | 1272 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1302 tiling_set->UpdateTilePriorities(moved_viewport, 1.0f, 2.0, Occlusion(), | 1303 tiling_set->UpdateTilePriorities(moved_viewport, 1.0f, 2.0, Occlusion(), |
| 1303 true); | 1304 true); |
| 1304 | 1305 |
| 1305 float inset = | 1306 float inset = |
| 1306 PictureLayerTiling::CalculateSoonBorderDistance(moved_viewport, 1.0f); | 1307 PictureLayerTiling::CalculateSoonBorderDistance(moved_viewport, 1.0f); |
| 1307 gfx::Rect soon_rect = moved_viewport; | 1308 gfx::Rect soon_rect = moved_viewport; |
| 1308 soon_rect.Inset(-inset, -inset); | 1309 soon_rect.Inset(-inset, -inset); |
| 1309 | 1310 |
| 1310 // There are 3 bins in TilePriority. | 1311 // There are 3 bins in TilePriority. |
| 1311 bool have_tiles[3] = {}; | 1312 bool have_tiles[3] = {}; |
| 1312 Tile* last_tile = NULL; | 1313 PrioritizedTile last_tile; |
| 1313 int eventually_bin_order_correct_count = 0; | 1314 int eventually_bin_order_correct_count = 0; |
| 1314 int eventually_bin_order_incorrect_count = 0; | 1315 int eventually_bin_order_incorrect_count = 0; |
| 1315 scoped_ptr<TilingSetRasterQueueAll> queue( | 1316 scoped_ptr<TilingSetRasterQueueAll> queue( |
| 1316 new TilingSetRasterQueueAll(tiling_set.get(), false)); | 1317 new TilingSetRasterQueueAll(tiling_set.get(), false)); |
| 1317 for (; !queue->IsEmpty(); queue->Pop()) { | 1318 for (; !queue->IsEmpty(); queue->Pop()) { |
| 1318 if (!last_tile) | 1319 if (!last_tile.tile()) |
| 1319 last_tile = queue->Top(); | 1320 last_tile = queue->Top(); |
| 1320 | 1321 |
| 1321 Tile* new_tile = queue->Top(); | 1322 PrioritizedTile new_tile = queue->Top(); |
| 1322 | 1323 |
| 1323 TilePriority last_priority = last_tile->priority(); | 1324 TilePriority last_priority = last_tile.priority(); |
| 1324 TilePriority new_priority = new_tile->priority(); | 1325 TilePriority new_priority = new_tile.priority(); |
| 1325 | 1326 |
| 1326 have_tiles[new_priority.priority_bin] = true; | 1327 have_tiles[new_priority.priority_bin] = true; |
| 1327 | 1328 |
| 1328 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | 1329 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
| 1329 if (last_priority.priority_bin == new_priority.priority_bin) { | 1330 if (last_priority.priority_bin == new_priority.priority_bin) { |
| 1330 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | 1331 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
| 1331 bool order_correct = last_priority.distance_to_visible <= | 1332 bool order_correct = last_priority.distance_to_visible <= |
| 1332 new_priority.distance_to_visible; | 1333 new_priority.distance_to_visible; |
| 1333 eventually_bin_order_correct_count += order_correct; | 1334 eventually_bin_order_correct_count += order_correct; |
| 1334 eventually_bin_order_incorrect_count += !order_correct; | 1335 eventually_bin_order_incorrect_count += !order_correct; |
| 1335 } else if (!soon_rect.Intersects(new_tile->content_rect()) && | 1336 } else if (!soon_rect.Intersects(new_tile.tile()->content_rect()) && |
| 1336 !soon_rect.Intersects(last_tile->content_rect())) { | 1337 !soon_rect.Intersects(last_tile.tile()->content_rect())) { |
| 1337 EXPECT_LE(last_priority.distance_to_visible, | 1338 EXPECT_LE(last_priority.distance_to_visible, |
| 1338 new_priority.distance_to_visible); | 1339 new_priority.distance_to_visible); |
| 1339 } else if (new_priority.distance_to_visible > 0.f) { | 1340 } else if (new_priority.distance_to_visible > 0.f) { |
| 1340 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); | 1341 EXPECT_EQ(TilePriority::SOON, new_priority.priority_bin); |
| 1341 } | 1342 } |
| 1342 } | 1343 } |
| 1343 last_tile = new_tile; | 1344 last_tile = new_tile; |
| 1344 } | 1345 } |
| 1345 | 1346 |
| 1346 EXPECT_GT(eventually_bin_order_correct_count, | 1347 EXPECT_GT(eventually_bin_order_correct_count, |
| 1347 eventually_bin_order_incorrect_count); | 1348 eventually_bin_order_incorrect_count); |
| 1348 | 1349 |
| 1349 EXPECT_TRUE(have_tiles[TilePriority::NOW]); | 1350 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
| 1350 EXPECT_TRUE(have_tiles[TilePriority::SOON]); | 1351 EXPECT_TRUE(have_tiles[TilePriority::SOON]); |
| 1351 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); | 1352 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
| 1352 } | 1353 } |
| 1353 | 1354 |
| 1354 TEST_F(TileManagerTilePriorityQueueTest, SetIsLikelyToRequireADraw) { | 1355 TEST_F(TileManagerTilePriorityQueueTest, SetIsLikelyToRequireADraw) { |
| 1355 const gfx::Size layer_bounds(1000, 1000); | 1356 const gfx::Size layer_bounds(1000, 1000); |
| 1356 host_impl_.SetViewportSize(layer_bounds); | 1357 host_impl_.SetViewportSize(layer_bounds); |
| 1357 SetupDefaultTrees(layer_bounds); | 1358 SetupDefaultTrees(layer_bounds); |
| 1358 | 1359 |
| 1359 // Verify that the queue has a required for draw tile at Top. | 1360 // Verify that the queue has a required for draw tile at Top. |
| 1360 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 1361 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 1361 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 1362 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 1362 EXPECT_FALSE(queue->IsEmpty()); | 1363 EXPECT_FALSE(queue->IsEmpty()); |
| 1363 EXPECT_TRUE(queue->Top()->required_for_draw()); | 1364 EXPECT_TRUE(queue->Top().tile()->required_for_draw()); |
| 1364 | 1365 |
| 1365 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); | 1366 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); |
| 1366 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); | 1367 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); |
| 1367 EXPECT_TRUE(host_impl_.is_likely_to_require_a_draw()); | 1368 EXPECT_TRUE(host_impl_.is_likely_to_require_a_draw()); |
| 1368 } | 1369 } |
| 1369 | 1370 |
| 1370 TEST_F(TileManagerTilePriorityQueueTest, | 1371 TEST_F(TileManagerTilePriorityQueueTest, |
| 1371 SetIsLikelyToRequireADrawOnZeroMemoryBudget) { | 1372 SetIsLikelyToRequireADrawOnZeroMemoryBudget) { |
| 1372 const gfx::Size layer_bounds(1000, 1000); | 1373 const gfx::Size layer_bounds(1000, 1000); |
| 1373 host_impl_.SetViewportSize(layer_bounds); | 1374 host_impl_.SetViewportSize(layer_bounds); |
| 1374 SetupDefaultTrees(layer_bounds); | 1375 SetupDefaultTrees(layer_bounds); |
| 1375 | 1376 |
| 1376 // Verify that the queue has a required for draw tile at Top. | 1377 // Verify that the queue has a required for draw tile at Top. |
| 1377 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 1378 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 1378 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 1379 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 1379 EXPECT_FALSE(queue->IsEmpty()); | 1380 EXPECT_FALSE(queue->IsEmpty()); |
| 1380 EXPECT_TRUE(queue->Top()->required_for_draw()); | 1381 EXPECT_TRUE(queue->Top().tile()->required_for_draw()); |
| 1381 | 1382 |
| 1382 ManagedMemoryPolicy policy = host_impl_.ActualManagedMemoryPolicy(); | 1383 ManagedMemoryPolicy policy = host_impl_.ActualManagedMemoryPolicy(); |
| 1383 policy.bytes_limit_when_visible = 0; | 1384 policy.bytes_limit_when_visible = 0; |
| 1384 host_impl_.SetMemoryPolicy(policy); | 1385 host_impl_.SetMemoryPolicy(policy); |
| 1385 | 1386 |
| 1386 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); | 1387 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); |
| 1387 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); | 1388 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); |
| 1388 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); | 1389 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); |
| 1389 } | 1390 } |
| 1390 | 1391 |
| 1391 TEST_F(TileManagerTilePriorityQueueTest, | 1392 TEST_F(TileManagerTilePriorityQueueTest, |
| 1392 SetIsLikelyToRequireADrawOnLimitedMemoryBudget) { | 1393 SetIsLikelyToRequireADrawOnLimitedMemoryBudget) { |
| 1393 const gfx::Size layer_bounds(1000, 1000); | 1394 const gfx::Size layer_bounds(1000, 1000); |
| 1394 host_impl_.SetViewportSize(layer_bounds); | 1395 host_impl_.SetViewportSize(layer_bounds); |
| 1395 SetupDefaultTrees(layer_bounds); | 1396 SetupDefaultTrees(layer_bounds); |
| 1396 | 1397 |
| 1397 // Verify that the queue has a required for draw tile at Top. | 1398 // Verify that the queue has a required for draw tile at Top. |
| 1398 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( | 1399 scoped_ptr<RasterTilePriorityQueue> queue(host_impl_.BuildRasterQueue( |
| 1399 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); | 1400 SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL)); |
| 1400 EXPECT_FALSE(queue->IsEmpty()); | 1401 EXPECT_FALSE(queue->IsEmpty()); |
| 1401 EXPECT_TRUE(queue->Top()->required_for_draw()); | 1402 EXPECT_TRUE(queue->Top().tile()->required_for_draw()); |
| 1402 EXPECT_EQ(gfx::Size(256, 256), queue->Top()->desired_texture_size()); | 1403 EXPECT_EQ(gfx::Size(256, 256), queue->Top().tile()->desired_texture_size()); |
| 1403 EXPECT_EQ(RGBA_8888, host_impl_.resource_provider()->best_texture_format()); | 1404 EXPECT_EQ(RGBA_8888, host_impl_.resource_provider()->best_texture_format()); |
| 1404 | 1405 |
| 1405 ManagedMemoryPolicy policy = host_impl_.ActualManagedMemoryPolicy(); | 1406 ManagedMemoryPolicy policy = host_impl_.ActualManagedMemoryPolicy(); |
| 1406 policy.bytes_limit_when_visible = | 1407 policy.bytes_limit_when_visible = |
| 1407 Resource::MemorySizeBytes(gfx::Size(256, 256), RGBA_8888); | 1408 Resource::MemorySizeBytes(gfx::Size(256, 256), RGBA_8888); |
| 1408 host_impl_.SetMemoryPolicy(policy); | 1409 host_impl_.SetMemoryPolicy(policy); |
| 1409 | 1410 |
| 1410 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); | 1411 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); |
| 1411 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); | 1412 host_impl_.tile_manager()->PrepareTiles(host_impl_.global_tile_state()); |
| 1412 EXPECT_TRUE(host_impl_.is_likely_to_require_a_draw()); | 1413 EXPECT_TRUE(host_impl_.is_likely_to_require_a_draw()); |
| 1413 | 1414 |
| 1414 scoped_ptr<ScopedResource> resource = | 1415 scoped_ptr<ScopedResource> resource = |
| 1415 host_impl_.resource_pool()->AcquireResource(gfx::Size(256, 256), | 1416 host_impl_.resource_pool()->AcquireResource(gfx::Size(256, 256), |
| 1416 RGBA_8888); | 1417 RGBA_8888); |
| 1417 | 1418 |
| 1418 host_impl_.tile_manager()->CheckIfMoreTilesNeedToBePreparedForTesting(); | 1419 host_impl_.tile_manager()->CheckIfMoreTilesNeedToBePreparedForTesting(); |
| 1419 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); | 1420 EXPECT_FALSE(host_impl_.is_likely_to_require_a_draw()); |
| 1420 | 1421 |
| 1421 host_impl_.resource_pool()->ReleaseResource(resource.Pass()); | 1422 host_impl_.resource_pool()->ReleaseResource(resource.Pass()); |
| 1422 } | 1423 } |
| 1423 | 1424 |
| 1424 } // namespace | 1425 } // namespace |
| 1425 } // namespace cc | 1426 } // namespace cc |
| OLD | NEW |