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/tile_manager.h" | 5 #include "cc/resources/tile_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/debug/trace_event_argument.h" | 12 #include "base/debug/trace_event_argument.h" |
13 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
16 #include "cc/debug/devtools_instrumentation.h" | 16 #include "cc/debug/devtools_instrumentation.h" |
17 #include "cc/debug/frame_viewer_instrumentation.h" | 17 #include "cc/debug/frame_viewer_instrumentation.h" |
18 #include "cc/debug/traced_value.h" | 18 #include "cc/debug/traced_value.h" |
19 #include "cc/layers/picture_layer_impl.h" | 19 #include "cc/layers/picture_layer_impl.h" |
20 #include "cc/resources/raster_buffer.h" | 20 #include "cc/resources/raster_buffer.h" |
| 21 #include "cc/resources/rasterizer.h" |
21 #include "cc/resources/tile.h" | 22 #include "cc/resources/tile.h" |
22 #include "cc/resources/tile_task_runner.h" | 23 #include "cc/resources/tile_task_runner.h" |
23 #include "ui/gfx/geometry/rect_conversions.h" | 24 #include "ui/gfx/geometry/rect_conversions.h" |
24 | 25 |
25 namespace cc { | 26 namespace cc { |
26 namespace { | 27 namespace { |
27 | 28 |
28 // Flag to indicate whether we should try and detect that | 29 // Flag to indicate whether we should try and detect that |
29 // a tile is of solid color. | 30 // a tile is of solid color. |
30 const bool kUseColorEstimator = true; | 31 const bool kUseColorEstimator = true; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 state->SetInteger("canceled_count", stats.canceled_count); | 195 state->SetInteger("canceled_count", stats.canceled_count); |
195 return state; | 196 return state; |
196 } | 197 } |
197 | 198 |
198 // static | 199 // static |
199 scoped_ptr<TileManager> TileManager::Create( | 200 scoped_ptr<TileManager> TileManager::Create( |
200 TileManagerClient* client, | 201 TileManagerClient* client, |
201 base::SequencedTaskRunner* task_runner, | 202 base::SequencedTaskRunner* task_runner, |
202 ResourcePool* resource_pool, | 203 ResourcePool* resource_pool, |
203 TileTaskRunner* tile_task_runner, | 204 TileTaskRunner* tile_task_runner, |
| 205 Rasterizer* rasterizer, |
204 size_t scheduled_raster_task_limit) { | 206 size_t scheduled_raster_task_limit) { |
205 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, | 207 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, |
206 tile_task_runner, | 208 tile_task_runner, rasterizer, |
207 scheduled_raster_task_limit)); | 209 scheduled_raster_task_limit)); |
208 } | 210 } |
209 | 211 |
210 TileManager::TileManager( | 212 TileManager::TileManager( |
211 TileManagerClient* client, | 213 TileManagerClient* client, |
212 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 214 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
213 ResourcePool* resource_pool, | 215 ResourcePool* resource_pool, |
214 TileTaskRunner* tile_task_runner, | 216 TileTaskRunner* tile_task_runner, |
| 217 Rasterizer* rasterizer, |
215 size_t scheduled_raster_task_limit) | 218 size_t scheduled_raster_task_limit) |
216 : client_(client), | 219 : client_(client), |
217 task_runner_(task_runner), | 220 task_runner_(task_runner), |
218 resource_pool_(resource_pool), | 221 resource_pool_(resource_pool), |
219 tile_task_runner_(tile_task_runner), | 222 tile_task_runner_(tile_task_runner), |
| 223 rasterizer_(rasterizer), |
220 scheduled_raster_task_limit_(scheduled_raster_task_limit), | 224 scheduled_raster_task_limit_(scheduled_raster_task_limit), |
221 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), | 225 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), |
222 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 226 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
223 did_oom_on_last_assign_(false), | 227 did_oom_on_last_assign_(false), |
| 228 ready_to_activate_notifier_( |
| 229 task_runner_.get(), |
| 230 base::Bind(&TileManager::NotifyReadyToActivate, |
| 231 base::Unretained(this))), |
| 232 ready_to_draw_notifier_( |
| 233 task_runner_.get(), |
| 234 base::Bind(&TileManager::NotifyReadyToDraw, base::Unretained(this))), |
224 ready_to_activate_check_notifier_( | 235 ready_to_activate_check_notifier_( |
225 task_runner_.get(), | 236 task_runner_.get(), |
226 base::Bind(&TileManager::CheckIfReadyToActivate, | 237 base::Bind(&TileManager::CheckIfReadyToActivate, |
227 base::Unretained(this))), | 238 base::Unretained(this))), |
228 ready_to_draw_check_notifier_( | 239 ready_to_draw_check_notifier_( |
229 task_runner_.get(), | 240 task_runner_.get(), |
230 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), | 241 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), |
231 more_tiles_need_prepare_check_notifier_( | 242 more_tiles_need_prepare_check_notifier_( |
232 task_runner_.get(), | 243 task_runner_.get(), |
233 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 244 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 | 341 |
331 NOTREACHED(); | 342 NOTREACHED(); |
332 } | 343 } |
333 | 344 |
334 void TileManager::PrepareTiles( | 345 void TileManager::PrepareTiles( |
335 const GlobalStateThatImpactsTilePriority& state) { | 346 const GlobalStateThatImpactsTilePriority& state) { |
336 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); | 347 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); |
337 | 348 |
338 global_state_ = state; | 349 global_state_ = state; |
339 | 350 |
340 // We need to call CheckForCompletedTasks() once in-between each call | 351 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode(); |
341 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 352 |
342 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 353 // TODO(hendrikw): Consider moving some of this code to the rasterizer. |
343 tile_task_runner_->CheckForCompletedTasks(); | 354 if (prepare_tiles_mode != PrepareTilesMode::PREPARE_NONE) { |
344 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 355 // We need to call CheckForCompletedTasks() once in-between each call |
| 356 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 357 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 358 tile_task_runner_->CheckForCompletedTasks(); |
| 359 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 360 } |
| 361 |
| 362 FreeResourcesForReleasedTiles(); |
| 363 CleanUpReleasedTiles(); |
| 364 |
| 365 TileVector tiles_that_need_to_be_rasterized; |
| 366 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 367 scheduled_raster_task_limit_, false); |
| 368 |
| 369 // Schedule tile tasks. |
| 370 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 371 |
| 372 did_notify_ready_to_activate_ = false; |
| 373 did_notify_ready_to_draw_ = false; |
| 374 } else { |
| 375 if (global_state_.hard_memory_limit_in_bytes == 0) { |
| 376 TileVector tiles_that_need_to_be_rasterized; |
| 377 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 378 scheduled_raster_task_limit_, false); |
| 379 DCHECK(tiles_that_need_to_be_rasterized.empty()); |
| 380 } |
| 381 |
| 382 did_notify_ready_to_activate_ = false; |
| 383 did_notify_ready_to_draw_ = false; |
| 384 ready_to_activate_notifier_.Schedule(); |
| 385 ready_to_draw_notifier_.Schedule(); |
345 } | 386 } |
346 | 387 |
| 388 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 389 "state", BasicStateAsValue()); |
| 390 |
| 391 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
| 392 resource_pool_->total_memory_usage_bytes() - |
| 393 resource_pool_->acquired_memory_usage_bytes()); |
| 394 } |
| 395 |
| 396 void TileManager::SynchronouslyRasterizeTiles( |
| 397 const GlobalStateThatImpactsTilePriority& state) { |
| 398 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles"); |
| 399 |
| 400 DCHECK(rasterizer_->GetPrepareTilesMode() != |
| 401 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); |
| 402 |
| 403 global_state_ = state; |
| 404 |
347 FreeResourcesForReleasedTiles(); | 405 FreeResourcesForReleasedTiles(); |
348 CleanUpReleasedTiles(); | 406 CleanUpReleasedTiles(); |
349 | 407 |
350 TileVector tiles_that_need_to_be_rasterized; | 408 TileVector tiles_that_need_to_be_rasterized; |
351 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 409 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 410 std::numeric_limits<size_t>::max(), true); |
352 | 411 |
353 // Schedule tile tasks. | 412 // We must reduce the amount of unused resources before calling |
354 ScheduleTasks(tiles_that_need_to_be_rasterized); | 413 // RunTasks to prevent usage from rising above limits. |
| 414 resource_pool_->ReduceResourceUsage(); |
355 | 415 |
356 did_notify_ready_to_activate_ = false; | 416 // Run and complete all raster task synchronously. |
357 did_notify_ready_to_draw_ = false; | 417 rasterizer_->RasterizeTiles( |
| 418 tiles_that_need_to_be_rasterized, resource_pool_, |
| 419 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); |
358 | 420 |
359 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", | 421 // Use on-demand raster for any required-for-activation tiles that have not |
| 422 // been been assigned memory after reaching a steady memory state. This |
| 423 // ensures that we activate even when OOM. Note that we have to rebuilt the |
| 424 // queue in case the last AssignGpuMemoryToTiles evicted some tiles that would |
| 425 // otherwise not be picked up by the old raster queue. |
| 426 client_->BuildRasterQueue(&raster_priority_queue_, |
| 427 global_state_.tree_priority); |
| 428 |
| 429 // Use on-demand raster for any tiles that have not been been assigned |
| 430 // memory. This ensures that we draw even when OOM. |
| 431 while (!raster_priority_queue_.IsEmpty()) { |
| 432 Tile* tile = raster_priority_queue_.Top(); |
| 433 TileDrawInfo& draw_info = tile->draw_info(); |
| 434 |
| 435 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) { |
| 436 draw_info.set_rasterize_on_demand(); |
| 437 client_->NotifyTileStateChanged(tile); |
| 438 } |
| 439 raster_priority_queue_.Pop(); |
| 440 } |
| 441 raster_priority_queue_.Reset(); |
| 442 |
| 443 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", |
360 BasicStateAsValue()); | 444 BasicStateAsValue()); |
361 | 445 |
362 TRACE_COUNTER_ID1("cc", | 446 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, |
363 "unused_memory_bytes", | |
364 this, | |
365 resource_pool_->total_memory_usage_bytes() - | 447 resource_pool_->total_memory_usage_bytes() - |
366 resource_pool_->acquired_memory_usage_bytes()); | 448 resource_pool_->acquired_memory_usage_bytes()); |
367 } | 449 } |
368 | 450 |
369 void TileManager::UpdateVisibleTiles() { | 451 void TileManager::UpdateVisibleTiles( |
| 452 const GlobalStateThatImpactsTilePriority& state) { |
370 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 453 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
371 | 454 |
372 tile_task_runner_->CheckForCompletedTasks(); | 455 tile_task_runner_->CheckForCompletedTasks(); |
| 456 |
| 457 DCHECK(rasterizer_); |
| 458 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode(); |
| 459 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES) |
| 460 SynchronouslyRasterizeTiles(state); |
| 461 |
373 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 462 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
374 | 463 |
375 TRACE_EVENT_INSTANT1( | 464 TRACE_EVENT_INSTANT1( |
376 "cc", | 465 "cc", |
377 "DidUpdateVisibleTiles", | 466 "DidUpdateVisibleTiles", |
378 TRACE_EVENT_SCOPE_THREAD, | 467 TRACE_EVENT_SCOPE_THREAD, |
379 "stats", | 468 "stats", |
380 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); | 469 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); |
381 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 470 update_visible_tiles_stats_ = RasterTaskCompletionStats(); |
382 } | 471 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 return priority.priority_bin > TilePriority::SOON; | 547 return priority.priority_bin > TilePriority::SOON; |
459 case ALLOW_ANYTHING: | 548 case ALLOW_ANYTHING: |
460 return priority.distance_to_visible == | 549 return priority.distance_to_visible == |
461 std::numeric_limits<float>::infinity(); | 550 std::numeric_limits<float>::infinity(); |
462 } | 551 } |
463 NOTREACHED(); | 552 NOTREACHED(); |
464 return true; | 553 return true; |
465 } | 554 } |
466 | 555 |
467 void TileManager::AssignGpuMemoryToTiles( | 556 void TileManager::AssignGpuMemoryToTiles( |
468 TileVector* tiles_that_need_to_be_rasterized) { | 557 TileVector* tiles_that_need_to_be_rasterized, |
| 558 size_t scheduled_raster_task_limit, |
| 559 bool required_for_draw_only) { |
469 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 560 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
470 | 561 |
471 // Maintain the list of released resources that can potentially be re-used | 562 // Maintain the list of released resources that can potentially be re-used |
472 // or deleted. | 563 // or deleted. |
473 // If this operation becomes expensive too, only do this after some | 564 // If this operation becomes expensive too, only do this after some |
474 // resource(s) was returned. Note that in that case, one also need to | 565 // resource(s) was returned. Note that in that case, one also need to |
475 // invalidate when releasing some resource from the pool. | 566 // invalidate when releasing some resource from the pool. |
476 resource_pool_->CheckBusyResources(false); | 567 resource_pool_->CheckBusyResources(false); |
477 | 568 |
478 // Now give memory out to the tiles until we're out, and build | 569 // Now give memory out to the tiles until we're out, and build |
479 // the needs-to-be-rasterized queue. | 570 // the needs-to-be-rasterized queue. |
480 unsigned schedule_priority = 1u; | 571 unsigned schedule_priority = 1u; |
481 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 572 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
482 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 573 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
483 | 574 |
484 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 575 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
485 global_state_.num_resources_limit); | 576 global_state_.num_resources_limit); |
486 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 577 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
487 global_state_.num_resources_limit); | 578 global_state_.num_resources_limit); |
488 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 579 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
489 resource_pool_->acquired_resource_count()); | 580 resource_pool_->acquired_resource_count()); |
490 | 581 |
491 eviction_priority_queue_is_up_to_date_ = false; | 582 eviction_priority_queue_is_up_to_date_ = false; |
492 client_->BuildRasterQueue(&raster_priority_queue_, | 583 client_->BuildRasterQueue(&raster_priority_queue_, |
493 global_state_.tree_priority); | 584 global_state_.tree_priority); |
494 | 585 |
495 while (!raster_priority_queue_.IsEmpty()) { | 586 while (!raster_priority_queue_.IsEmpty()) { |
496 Tile* tile = raster_priority_queue_.Top(); | 587 Tile* tile = raster_priority_queue_.Top(); |
| 588 |
| 589 // TODO(vmpstr): Remove this when the iterator returns the correct tiles |
| 590 // to draw for GPU rasterization. |
| 591 if (required_for_draw_only) { |
| 592 if (!tile->required_for_draw()) { |
| 593 raster_priority_queue_.Pop(); |
| 594 continue; |
| 595 } |
| 596 } |
497 TilePriority priority = tile->combined_priority(); | 597 TilePriority priority = tile->combined_priority(); |
498 | 598 |
499 if (TilePriorityViolatesMemoryPolicy(priority)) { | 599 if (TilePriorityViolatesMemoryPolicy(priority)) { |
500 TRACE_EVENT_INSTANT0( | 600 TRACE_EVENT_INSTANT0( |
501 "cc", | 601 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
502 "TileManager::AssignGpuMemory tile violates memory policy", | |
503 TRACE_EVENT_SCOPE_THREAD); | 602 TRACE_EVENT_SCOPE_THREAD); |
504 break; | 603 break; |
505 } | 604 } |
506 | 605 |
507 // We won't be able to schedule this tile, so break out early. | 606 // We won't be able to schedule this tile, so break out early. |
508 if (tiles_that_need_to_be_rasterized->size() >= | 607 if (tiles_that_need_to_be_rasterized->size() >= |
509 scheduled_raster_task_limit_) { | 608 scheduled_raster_task_limit) { |
510 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 609 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
511 break; | 610 break; |
512 } | 611 } |
513 | 612 |
514 TileDrawInfo& draw_info = tile->draw_info(); | 613 TileDrawInfo& draw_info = tile->draw_info(); |
515 tile->scheduled_priority_ = schedule_priority++; | 614 tile->scheduled_priority_ = schedule_priority++; |
516 | 615 |
517 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || | 616 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || |
518 !draw_info.IsReadyToDraw()); | 617 !draw_info.IsReadyToDraw()); |
519 | 618 |
(...skipping 10 matching lines...) Expand all Loading... |
530 | 629 |
531 // This is the memory limit that will be used by this tile. Depending on | 630 // This is the memory limit that will be used by this tile. Depending on |
532 // the tile priority, it will be one of hard_memory_limit or | 631 // the tile priority, it will be one of hard_memory_limit or |
533 // soft_memory_limit. | 632 // soft_memory_limit. |
534 MemoryUsage& tile_memory_limit = | 633 MemoryUsage& tile_memory_limit = |
535 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; | 634 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; |
536 | 635 |
537 bool memory_usage_is_within_limit = | 636 bool memory_usage_is_within_limit = |
538 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( | 637 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
539 tile_memory_limit - memory_required_by_tile_to_be_scheduled, | 638 tile_memory_limit - memory_required_by_tile_to_be_scheduled, |
540 priority, | 639 priority, &memory_usage); |
541 &memory_usage); | |
542 | 640 |
543 // If we couldn't fit the tile into our current memory limit, then we're | 641 // If we couldn't fit the tile into our current memory limit, then we're |
544 // done. | 642 // done. |
545 if (!memory_usage_is_within_limit) { | 643 if (!memory_usage_is_within_limit) { |
546 if (tile_is_needed_now) | 644 if (tile_is_needed_now) |
547 had_enough_memory_to_schedule_tiles_needed_now = false; | 645 had_enough_memory_to_schedule_tiles_needed_now = false; |
548 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 646 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
549 break; | 647 break; |
550 } | 648 } |
551 | 649 |
(...skipping 12 matching lines...) Expand all Loading... |
564 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; | 662 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; |
565 | 663 |
566 memory_stats_from_last_assign_.total_budget_in_bytes = | 664 memory_stats_from_last_assign_.total_budget_in_bytes = |
567 global_state_.hard_memory_limit_in_bytes; | 665 global_state_.hard_memory_limit_in_bytes; |
568 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); | 666 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); |
569 memory_stats_from_last_assign_.had_enough_memory = | 667 memory_stats_from_last_assign_.had_enough_memory = |
570 had_enough_memory_to_schedule_tiles_needed_now; | 668 had_enough_memory_to_schedule_tiles_needed_now; |
571 | 669 |
572 raster_priority_queue_.Reset(); | 670 raster_priority_queue_.Reset(); |
573 | 671 |
574 TRACE_EVENT_END2("cc", | 672 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
575 "TileManager::AssignGpuMemoryToTiles", | |
576 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 673 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
577 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 674 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
578 "had_enough_memory_to_schedule_tiles_needed_now", | 675 "had_enough_memory_to_schedule_tiles_needed_now", |
579 had_enough_memory_to_schedule_tiles_needed_now); | 676 had_enough_memory_to_schedule_tiles_needed_now); |
580 } | 677 } |
581 | 678 |
582 void TileManager::FreeResourcesForTile(Tile* tile) { | 679 void TileManager::FreeResourcesForTile(Tile* tile) { |
583 TileDrawInfo& draw_info = tile->draw_info(); | 680 TileDrawInfo& draw_info = tile->draw_info(); |
584 if (draw_info.resource_) | 681 if (draw_info.resource_) |
585 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); | 682 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 } | 813 } |
717 | 814 |
718 void TileManager::OnRasterTaskCompleted( | 815 void TileManager::OnRasterTaskCompleted( |
719 Tile::Id tile_id, | 816 Tile::Id tile_id, |
720 scoped_ptr<ScopedResource> resource, | 817 scoped_ptr<ScopedResource> resource, |
721 const RasterSource::SolidColorAnalysis& analysis, | 818 const RasterSource::SolidColorAnalysis& analysis, |
722 bool was_canceled) { | 819 bool was_canceled) { |
723 DCHECK(tiles_.find(tile_id) != tiles_.end()); | 820 DCHECK(tiles_.find(tile_id) != tiles_.end()); |
724 | 821 |
725 Tile* tile = tiles_[tile_id]; | 822 Tile* tile = tiles_[tile_id]; |
726 TileDrawInfo& draw_info = tile->draw_info(); | |
727 DCHECK(tile->raster_task_.get()); | 823 DCHECK(tile->raster_task_.get()); |
728 orphan_raster_tasks_.push_back(tile->raster_task_); | 824 orphan_raster_tasks_.push_back(tile->raster_task_); |
729 tile->raster_task_ = NULL; | 825 tile->raster_task_ = nullptr; |
730 | 826 |
731 if (was_canceled) { | 827 if (was_canceled) { |
732 ++update_visible_tiles_stats_.canceled_count; | 828 ++update_visible_tiles_stats_.canceled_count; |
733 resource_pool_->ReleaseResource(resource.Pass()); | 829 resource_pool_->ReleaseResource(resource.Pass()); |
734 return; | 830 return; |
735 } | 831 } |
736 | 832 |
| 833 UpdateTileDrawInfo(tile, resource.Pass(), analysis); |
| 834 } |
| 835 |
| 836 void TileManager::UpdateTileDrawInfo( |
| 837 Tile* tile, |
| 838 scoped_ptr<ScopedResource> resource, |
| 839 const RasterSource::SolidColorAnalysis& analysis) { |
| 840 TileDrawInfo& draw_info = tile->draw_info(); |
| 841 |
737 ++update_visible_tiles_stats_.completed_count; | 842 ++update_visible_tiles_stats_.completed_count; |
738 | 843 |
739 if (analysis.is_solid_color) { | 844 if (analysis.is_solid_color) { |
740 draw_info.set_solid_color(analysis.solid_color); | 845 draw_info.set_solid_color(analysis.solid_color); |
741 resource_pool_->ReleaseResource(resource.Pass()); | 846 resource_pool_->ReleaseResource(resource.Pass()); |
742 } else { | 847 } else { |
743 draw_info.set_use_resource(); | 848 draw_info.set_use_resource(); |
744 draw_info.resource_ = resource.Pass(); | 849 draw_info.resource_ = resource.Pass(); |
745 } | 850 } |
746 | 851 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); | 892 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
788 | 893 |
789 for (const auto& layer : layers) { | 894 for (const auto& layer : layers) { |
790 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) | 895 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) |
791 return false; | 896 return false; |
792 } | 897 } |
793 | 898 |
794 return true; | 899 return true; |
795 } | 900 } |
796 | 901 |
| 902 void TileManager::NotifyReadyToActivate() { |
| 903 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate"); |
| 904 if (did_notify_ready_to_activate_) |
| 905 return; |
| 906 client_->NotifyReadyToActivate(); |
| 907 did_notify_ready_to_activate_ = true; |
| 908 } |
| 909 |
| 910 void TileManager::NotifyReadyToDraw() { |
| 911 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw"); |
| 912 if (did_notify_ready_to_draw_) |
| 913 return; |
| 914 client_->NotifyReadyToDraw(); |
| 915 did_notify_ready_to_draw_ = true; |
| 916 } |
| 917 |
797 void TileManager::CheckIfReadyToActivate() { | 918 void TileManager::CheckIfReadyToActivate() { |
798 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); | 919 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); |
799 | 920 |
800 tile_task_runner_->CheckForCompletedTasks(); | 921 tile_task_runner_->CheckForCompletedTasks(); |
801 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 922 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
802 | 923 |
803 if (did_notify_ready_to_activate_) | 924 if (did_notify_ready_to_activate_) |
804 return; | 925 return; |
805 if (!IsReadyToActivate()) | 926 if (!IsReadyToActivate()) |
806 return; | 927 return; |
807 | 928 |
808 client_->NotifyReadyToActivate(); | 929 NotifyReadyToActivate(); |
809 did_notify_ready_to_activate_ = true; | |
810 } | 930 } |
811 | 931 |
812 void TileManager::CheckIfReadyToDraw() { | 932 void TileManager::CheckIfReadyToDraw() { |
813 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); | 933 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); |
814 | 934 |
815 tile_task_runner_->CheckForCompletedTasks(); | 935 tile_task_runner_->CheckForCompletedTasks(); |
816 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 936 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
817 | 937 |
818 if (did_notify_ready_to_draw_) | 938 if (did_notify_ready_to_draw_) |
819 return; | 939 return; |
820 if (!IsReadyToDraw()) | 940 if (!IsReadyToDraw()) |
821 return; | 941 return; |
822 | 942 |
823 client_->NotifyReadyToDraw(); | 943 NotifyReadyToDraw(); |
824 did_notify_ready_to_draw_ = true; | |
825 } | 944 } |
826 | 945 |
827 void TileManager::CheckIfMoreTilesNeedToBePrepared() { | 946 void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
828 tile_task_runner_->CheckForCompletedTasks(); | 947 tile_task_runner_->CheckForCompletedTasks(); |
829 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 948 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
830 | 949 |
831 // When OOM, keep re-assigning memory until we reach a steady state | 950 // When OOM, keep re-assigning memory until we reach a steady state |
832 // where top-priority tiles are initialized. | 951 // where top-priority tiles are initialized. |
833 TileVector tiles_that_need_to_be_rasterized; | 952 TileVector tiles_that_need_to_be_rasterized; |
834 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | 953 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
| 954 scheduled_raster_task_limit_, false); |
835 | 955 |
836 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 956 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
837 // steady memory state. Keep scheduling tasks until we reach this state. | 957 // steady memory state. Keep scheduling tasks until we reach this state. |
838 if (!tiles_that_need_to_be_rasterized.empty()) { | 958 if (!tiles_that_need_to_be_rasterized.empty()) { |
839 ScheduleTasks(tiles_that_need_to_be_rasterized); | 959 ScheduleTasks(tiles_that_need_to_be_rasterized); |
840 return; | 960 return; |
841 } | 961 } |
842 | 962 |
843 FreeResourcesForReleasedTiles(); | 963 FreeResourcesForReleasedTiles(); |
844 | 964 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 result -= other; | 1050 result -= other; |
931 return result; | 1051 return result; |
932 } | 1052 } |
933 | 1053 |
934 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1054 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
935 return memory_bytes_ > limit.memory_bytes_ || | 1055 return memory_bytes_ > limit.memory_bytes_ || |
936 resource_count_ > limit.resource_count_; | 1056 resource_count_ > limit.resource_count_; |
937 } | 1057 } |
938 | 1058 |
939 } // namespace cc | 1059 } // namespace cc |
OLD | NEW |