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 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
264 } | 264 } |
265 | 265 |
266 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const { | 266 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const { |
267 TaskSetCollection tasks_that_should_be_forced_to_complete; | 267 TaskSetCollection tasks_that_should_be_forced_to_complete; |
268 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) | 268 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) |
269 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true; | 269 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true; |
270 return tasks_that_should_be_forced_to_complete; | 270 return tasks_that_should_be_forced_to_complete; |
271 } | 271 } |
272 | 272 |
273 void TileManager::FreeResourcesForReleasedTiles() { | 273 void TileManager::FreeResourcesForReleasedTiles() { |
274 for (std::vector<Tile*>::iterator it = released_tiles_.begin(); | 274 for (auto* tile : released_tiles_) |
275 it != released_tiles_.end(); | |
276 ++it) { | |
277 Tile* tile = *it; | |
278 FreeResourcesForTile(tile); | 275 FreeResourcesForTile(tile); |
279 } | |
280 } | 276 } |
281 | 277 |
282 void TileManager::CleanUpReleasedTiles() { | 278 void TileManager::CleanUpReleasedTiles() { |
283 std::vector<Tile*> tiles_to_retain; | 279 std::vector<Tile*> tiles_to_retain; |
284 for (auto* tile : released_tiles_) { | 280 for (auto* tile : released_tiles_) { |
285 if (tile->HasRasterTask()) { | 281 if (tile->HasRasterTask()) { |
286 tiles_to_retain.push_back(tile); | 282 tiles_to_retain.push_back(tile); |
287 continue; | 283 continue; |
288 } | 284 } |
289 | 285 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
341 // We need to call CheckForCompletedTasks() once in-between each call | 337 // We need to call CheckForCompletedTasks() once in-between each call |
342 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 338 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
343 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 339 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
344 tile_task_runner_->CheckForCompletedTasks(); | 340 tile_task_runner_->CheckForCompletedTasks(); |
345 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 341 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
346 } | 342 } |
347 | 343 |
348 FreeResourcesForReleasedTiles(); | 344 FreeResourcesForReleasedTiles(); |
349 CleanUpReleasedTiles(); | 345 CleanUpReleasedTiles(); |
350 | 346 |
351 TileVector tiles_that_need_to_be_rasterized; | 347 PrioritizedTileVector tiles_that_need_to_be_rasterized; |
352 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( | 348 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
353 client_->BuildRasterQueue(global_state_.tree_priority, | 349 client_->BuildRasterQueue(global_state_.tree_priority, |
354 RasterTilePriorityQueue::Type::ALL)); | 350 RasterTilePriorityQueue::Type::ALL)); |
355 AssignGpuMemoryToTiles(raster_priority_queue.get(), | 351 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
356 scheduled_raster_task_limit_, | 352 scheduled_raster_task_limit_, |
357 &tiles_that_need_to_be_rasterized); | 353 &tiles_that_need_to_be_rasterized); |
358 | 354 |
359 // Inform the client that will likely require a draw if the highest priority | 355 // Inform the client that will likely require a draw if the highest priority |
360 // tile that will be rasterized is required for draw. | 356 // tile that will be rasterized is required for draw. |
361 client_->SetIsLikelyToRequireADraw( | 357 client_->SetIsLikelyToRequireADraw( |
362 !tiles_that_need_to_be_rasterized.empty() && | 358 !tiles_that_need_to_be_rasterized.empty() && |
363 (*tiles_that_need_to_be_rasterized.begin())->required_for_draw()); | 359 tiles_that_need_to_be_rasterized.front().tile()->required_for_draw()); |
364 | 360 |
365 // Schedule tile tasks. | 361 // Schedule tile tasks. |
366 ScheduleTasks(tiles_that_need_to_be_rasterized); | 362 ScheduleTasks(tiles_that_need_to_be_rasterized); |
367 | 363 |
368 did_notify_ready_to_activate_ = false; | 364 did_notify_ready_to_activate_ = false; |
369 did_notify_ready_to_draw_ = false; | 365 did_notify_ready_to_draw_ = false; |
370 | 366 |
371 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 367 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
372 "state", BasicStateAsValue()); | 368 "state", BasicStateAsValue()); |
373 | 369 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
416 const MemoryUsage& limit, | 412 const MemoryUsage& limit, |
417 MemoryUsage* usage) { | 413 MemoryUsage* usage) { |
418 while (usage->Exceeds(limit)) { | 414 while (usage->Exceeds(limit)) { |
419 if (!eviction_priority_queue) { | 415 if (!eviction_priority_queue) { |
420 eviction_priority_queue = | 416 eviction_priority_queue = |
421 client_->BuildEvictionQueue(global_state_.tree_priority); | 417 client_->BuildEvictionQueue(global_state_.tree_priority); |
422 } | 418 } |
423 if (eviction_priority_queue->IsEmpty()) | 419 if (eviction_priority_queue->IsEmpty()) |
424 break; | 420 break; |
425 | 421 |
426 Tile* tile = eviction_priority_queue->Top(); | 422 Tile* tile = eviction_priority_queue->Top().tile(); |
427 *usage -= MemoryUsage::FromTile(tile); | 423 *usage -= MemoryUsage::FromTile(tile); |
428 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); | 424 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); |
429 eviction_priority_queue->Pop(); | 425 eviction_priority_queue->Pop(); |
430 } | 426 } |
431 return eviction_priority_queue; | 427 return eviction_priority_queue; |
432 } | 428 } |
433 | 429 |
434 scoped_ptr<EvictionTilePriorityQueue> | 430 scoped_ptr<EvictionTilePriorityQueue> |
435 TileManager::FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( | 431 TileManager::FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
436 scoped_ptr<EvictionTilePriorityQueue> eviction_priority_queue, | 432 scoped_ptr<EvictionTilePriorityQueue> eviction_priority_queue, |
437 const MemoryUsage& limit, | 433 const MemoryUsage& limit, |
438 const TilePriority& other_priority, | 434 const TilePriority& other_priority, |
439 MemoryUsage* usage) { | 435 MemoryUsage* usage) { |
440 while (usage->Exceeds(limit)) { | 436 while (usage->Exceeds(limit)) { |
441 if (!eviction_priority_queue) { | 437 if (!eviction_priority_queue) { |
442 eviction_priority_queue = | 438 eviction_priority_queue = |
443 client_->BuildEvictionQueue(global_state_.tree_priority); | 439 client_->BuildEvictionQueue(global_state_.tree_priority); |
444 } | 440 } |
445 if (eviction_priority_queue->IsEmpty()) | 441 if (eviction_priority_queue->IsEmpty()) |
446 break; | 442 break; |
447 | 443 |
448 Tile* tile = eviction_priority_queue->Top(); | 444 const PrioritizedTile& prioritized_tile = eviction_priority_queue->Top(); |
449 if (!other_priority.IsHigherPriorityThan(tile->priority())) | 445 if (!other_priority.IsHigherPriorityThan(prioritized_tile.priority())) |
450 break; | 446 break; |
451 | 447 |
448 Tile* tile = prioritized_tile.tile(); | |
452 *usage -= MemoryUsage::FromTile(tile); | 449 *usage -= MemoryUsage::FromTile(tile); |
453 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); | 450 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); |
454 eviction_priority_queue->Pop(); | 451 eviction_priority_queue->Pop(); |
455 } | 452 } |
456 return eviction_priority_queue; | 453 return eviction_priority_queue; |
457 } | 454 } |
458 | 455 |
459 bool TileManager::TilePriorityViolatesMemoryPolicy( | 456 bool TileManager::TilePriorityViolatesMemoryPolicy( |
460 const TilePriority& priority) { | 457 const TilePriority& priority) { |
461 switch (global_state_.memory_limit_policy) { | 458 switch (global_state_.memory_limit_policy) { |
462 case ALLOW_NOTHING: | 459 case ALLOW_NOTHING: |
463 return true; | 460 return true; |
464 case ALLOW_ABSOLUTE_MINIMUM: | 461 case ALLOW_ABSOLUTE_MINIMUM: |
465 return priority.priority_bin > TilePriority::NOW; | 462 return priority.priority_bin > TilePriority::NOW; |
466 case ALLOW_PREPAINT_ONLY: | 463 case ALLOW_PREPAINT_ONLY: |
467 return priority.priority_bin > TilePriority::SOON; | 464 return priority.priority_bin > TilePriority::SOON; |
468 case ALLOW_ANYTHING: | 465 case ALLOW_ANYTHING: |
469 return priority.distance_to_visible == | 466 return priority.distance_to_visible == |
470 std::numeric_limits<float>::infinity(); | 467 std::numeric_limits<float>::infinity(); |
471 } | 468 } |
472 NOTREACHED(); | 469 NOTREACHED(); |
473 return true; | 470 return true; |
474 } | 471 } |
475 | 472 |
476 void TileManager::AssignGpuMemoryToTiles( | 473 void TileManager::AssignGpuMemoryToTiles( |
477 RasterTilePriorityQueue* raster_priority_queue, | 474 RasterTilePriorityQueue* raster_priority_queue, |
478 size_t scheduled_raster_task_limit, | 475 size_t scheduled_raster_task_limit, |
479 TileVector* tiles_that_need_to_be_rasterized) { | 476 PrioritizedTileVector* tiles_that_need_to_be_rasterized) { |
480 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 477 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
481 | 478 |
482 // Maintain the list of released resources that can potentially be re-used | 479 // Maintain the list of released resources that can potentially be re-used |
483 // or deleted. If this operation becomes expensive too, only do this after | 480 // or deleted. If this operation becomes expensive too, only do this after |
484 // some resource(s) was returned. Note that in that case, one also need to | 481 // some resource(s) was returned. Note that in that case, one also need to |
485 // invalidate when releasing some resource from the pool. | 482 // invalidate when releasing some resource from the pool. |
486 resource_pool_->CheckBusyResources(false); | 483 resource_pool_->CheckBusyResources(false); |
487 | 484 |
488 // Now give memory out to the tiles until we're out, and build | 485 // Now give memory out to the tiles until we're out, and build |
489 // the needs-to-be-rasterized queue. | 486 // the needs-to-be-rasterized queue. |
490 unsigned schedule_priority = 1u; | 487 unsigned schedule_priority = 1u; |
491 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 488 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
492 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 489 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
493 | 490 |
494 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 491 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
495 global_state_.num_resources_limit); | 492 global_state_.num_resources_limit); |
496 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 493 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
497 global_state_.num_resources_limit); | 494 global_state_.num_resources_limit); |
498 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 495 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
499 resource_pool_->acquired_resource_count()); | 496 resource_pool_->acquired_resource_count()); |
500 | 497 |
501 scoped_ptr<EvictionTilePriorityQueue> eviction_priority_queue; | 498 scoped_ptr<EvictionTilePriorityQueue> eviction_priority_queue; |
502 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { | 499 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { |
503 Tile* tile = raster_priority_queue->Top(); | 500 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top(); |
504 TilePriority priority = tile->priority(); | 501 Tile* tile = prioritized_tile.tile(); |
502 TilePriority priority = prioritized_tile.priority(); | |
505 | 503 |
506 if (TilePriorityViolatesMemoryPolicy(priority)) { | 504 if (TilePriorityViolatesMemoryPolicy(priority)) { |
507 TRACE_EVENT_INSTANT0( | 505 TRACE_EVENT_INSTANT0( |
508 "cc", "TileManager::AssignGpuMemory tile violates memory policy", | 506 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
509 TRACE_EVENT_SCOPE_THREAD); | 507 TRACE_EVENT_SCOPE_THREAD); |
510 break; | 508 break; |
511 } | 509 } |
512 | 510 |
513 // We won't be able to schedule this tile, so break out early. | 511 // We won't be able to schedule this tile, so break out early. |
514 if (tiles_that_need_to_be_rasterized->size() >= | 512 if (tiles_that_need_to_be_rasterized->size() >= |
515 scheduled_raster_task_limit) { | 513 scheduled_raster_task_limit) { |
516 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 514 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
517 break; | 515 break; |
518 } | 516 } |
519 | 517 |
520 TileDrawInfo& draw_info = tile->draw_info(); | |
521 tile->scheduled_priority_ = schedule_priority++; | 518 tile->scheduled_priority_ = schedule_priority++; |
522 | 519 |
523 DCHECK_IMPLIES(draw_info.mode() != TileDrawInfo::OOM_MODE, | 520 DCHECK_IMPLIES(tile->draw_info().mode() != TileDrawInfo::OOM_MODE, |
524 !draw_info.IsReadyToDraw()); | 521 !tile->draw_info().IsReadyToDraw()); |
525 | 522 |
526 // If the tile already has a raster_task, then the memory used by it is | 523 // If the tile already has a raster_task, then the memory used by it is |
527 // already accounted for in memory_usage. Otherwise, we'll have to acquire | 524 // already accounted for in memory_usage. Otherwise, we'll have to acquire |
528 // more memory to create a raster task. | 525 // more memory to create a raster task. |
529 MemoryUsage memory_required_by_tile_to_be_scheduled; | 526 MemoryUsage memory_required_by_tile_to_be_scheduled; |
530 if (!tile->raster_task_.get()) { | 527 if (!tile->raster_task_.get()) { |
531 memory_required_by_tile_to_be_scheduled = MemoryUsage::FromConfig( | 528 memory_required_by_tile_to_be_scheduled = MemoryUsage::FromConfig( |
532 tile->desired_texture_size(), tile_task_runner_->GetResourceFormat()); | 529 tile->desired_texture_size(), tile_task_runner_->GetResourceFormat()); |
533 } | 530 } |
534 | 531 |
(...skipping 17 matching lines...) Expand all Loading... | |
552 // If we couldn't fit the tile into our current memory limit, then we're | 549 // If we couldn't fit the tile into our current memory limit, then we're |
553 // done. | 550 // done. |
554 if (!memory_usage_is_within_limit) { | 551 if (!memory_usage_is_within_limit) { |
555 if (tile_is_needed_now) | 552 if (tile_is_needed_now) |
556 had_enough_memory_to_schedule_tiles_needed_now = false; | 553 had_enough_memory_to_schedule_tiles_needed_now = false; |
557 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; | 554 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; |
558 break; | 555 break; |
559 } | 556 } |
560 | 557 |
561 memory_usage += memory_required_by_tile_to_be_scheduled; | 558 memory_usage += memory_required_by_tile_to_be_scheduled; |
562 tiles_that_need_to_be_rasterized->push_back(tile); | 559 tiles_that_need_to_be_rasterized->push_back(prioritized_tile); |
563 } | 560 } |
564 | 561 |
565 // Note that we should try and further reduce memory in case the above loop | 562 // Note that we should try and further reduce memory in case the above loop |
566 // didn't reduce memory. This ensures that we always release as many resources | 563 // didn't reduce memory. This ensures that we always release as many resources |
567 // as possible to stay within the memory limit. | 564 // as possible to stay within the memory limit. |
568 eviction_priority_queue = FreeTileResourcesUntilUsageIsWithinLimit( | 565 eviction_priority_queue = FreeTileResourcesUntilUsageIsWithinLimit( |
569 eviction_priority_queue.Pass(), hard_memory_limit, &memory_usage); | 566 eviction_priority_queue.Pass(), hard_memory_limit, &memory_usage); |
570 | 567 |
571 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", | 568 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", |
572 !had_enough_memory_to_schedule_tiles_needed_now); | 569 !had_enough_memory_to_schedule_tiles_needed_now); |
(...skipping 20 matching lines...) Expand all Loading... | |
593 | 590 |
594 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 591 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
595 Tile* tile) { | 592 Tile* tile) { |
596 bool was_ready_to_draw = tile->IsReadyToDraw(); | 593 bool was_ready_to_draw = tile->IsReadyToDraw(); |
597 FreeResourcesForTile(tile); | 594 FreeResourcesForTile(tile); |
598 if (was_ready_to_draw) | 595 if (was_ready_to_draw) |
599 client_->NotifyTileStateChanged(tile); | 596 client_->NotifyTileStateChanged(tile); |
600 } | 597 } |
601 | 598 |
602 void TileManager::ScheduleTasks( | 599 void TileManager::ScheduleTasks( |
603 const TileVector& tiles_that_need_to_be_rasterized) { | 600 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) { |
604 TRACE_EVENT1("cc", | 601 TRACE_EVENT1("cc", |
605 "TileManager::ScheduleTasks", | 602 "TileManager::ScheduleTasks", |
606 "count", | 603 "count", |
607 tiles_that_need_to_be_rasterized.size()); | 604 tiles_that_need_to_be_rasterized.size()); |
608 | 605 |
609 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 606 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
610 | 607 |
611 raster_queue_.Reset(); | 608 raster_queue_.Reset(); |
612 | 609 |
613 // Build a new task queue containing all task currently needed. Tasks | 610 // Build a new task queue containing all task currently needed. Tasks |
614 // are added in order of priority, highest priority task first. | 611 // are added in order of priority, highest priority task first. |
615 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 612 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
616 it != tiles_that_need_to_be_rasterized.end(); | 613 Tile* tile = prioritized_tile.tile(); |
617 ++it) { | |
618 Tile* tile = *it; | |
619 TileDrawInfo& draw_info = tile->draw_info(); | |
620 | 614 |
621 DCHECK(draw_info.requires_resource()); | 615 DCHECK(tile->draw_info().requires_resource()); |
622 DCHECK(!draw_info.resource_); | 616 DCHECK(!tile->draw_info().resource_); |
623 | 617 |
624 if (!tile->raster_task_.get()) | 618 if (!tile->raster_task_.get()) |
625 tile->raster_task_ = CreateRasterTask(tile); | 619 tile->raster_task_ = CreateRasterTask(prioritized_tile); |
626 | 620 |
627 TaskSetCollection task_sets; | 621 TaskSetCollection task_sets; |
628 if (tile->required_for_activation()) | 622 if (tile->required_for_activation()) |
629 task_sets.set(REQUIRED_FOR_ACTIVATION); | 623 task_sets.set(REQUIRED_FOR_ACTIVATION); |
630 if (tile->required_for_draw()) | 624 if (tile->required_for_draw()) |
631 task_sets.set(REQUIRED_FOR_DRAW); | 625 task_sets.set(REQUIRED_FOR_DRAW); |
632 task_sets.set(ALL); | 626 task_sets.set(ALL); |
633 raster_queue_.items.push_back( | 627 raster_queue_.items.push_back( |
634 TileTaskQueue::Item(tile->raster_task_.get(), task_sets)); | 628 TileTaskQueue::Item(tile->raster_task_.get(), task_sets)); |
635 } | 629 } |
(...skipping 19 matching lines...) Expand all Loading... | |
655 Tile* tile, | 649 Tile* tile, |
656 SkPixelRef* pixel_ref) { | 650 SkPixelRef* pixel_ref) { |
657 return make_scoped_refptr(new ImageDecodeTaskImpl( | 651 return make_scoped_refptr(new ImageDecodeTaskImpl( |
658 pixel_ref, | 652 pixel_ref, |
659 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 653 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
660 base::Unretained(this), | 654 base::Unretained(this), |
661 tile->layer_id(), | 655 tile->layer_id(), |
662 base::Unretained(pixel_ref)))); | 656 base::Unretained(pixel_ref)))); |
663 } | 657 } |
664 | 658 |
665 scoped_refptr<RasterTask> TileManager::CreateRasterTask(Tile* tile) { | 659 scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
660 const PrioritizedTile& prioritized_tile) { | |
661 Tile* tile = prioritized_tile.tile(); | |
666 scoped_ptr<ScopedResource> resource = | 662 scoped_ptr<ScopedResource> resource = |
667 resource_pool_->AcquireResource(tile->desired_texture_size(), | 663 resource_pool_->AcquireResource(tile->desired_texture_size(), |
668 tile_task_runner_->GetResourceFormat()); | 664 tile_task_runner_->GetResourceFormat()); |
669 const ScopedResource* const_resource = resource.get(); | 665 const ScopedResource* const_resource = resource.get(); |
670 | 666 |
671 // Create and queue all image decode tasks that this tile depends on. | 667 // Create and queue all image decode tasks that this tile depends on. |
672 ImageDecodeTask::Vector decode_tasks; | 668 ImageDecodeTask::Vector decode_tasks; |
673 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; | 669 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; |
674 std::vector<SkPixelRef*> pixel_refs; | 670 std::vector<SkPixelRef*> pixel_refs; |
675 tile->raster_source()->GatherPixelRefs( | 671 tile->raster_source()->GatherPixelRefs( |
(...skipping 10 matching lines...) Expand all Loading... | |
686 | 682 |
687 // Create and append new image decode task for this pixel ref. | 683 // Create and append new image decode task for this pixel ref. |
688 scoped_refptr<ImageDecodeTask> decode_task = | 684 scoped_refptr<ImageDecodeTask> decode_task = |
689 CreateImageDecodeTask(tile, pixel_ref); | 685 CreateImageDecodeTask(tile, pixel_ref); |
690 decode_tasks.push_back(decode_task); | 686 decode_tasks.push_back(decode_task); |
691 existing_pixel_refs[id] = decode_task; | 687 existing_pixel_refs[id] = decode_task; |
692 } | 688 } |
693 | 689 |
694 return make_scoped_refptr(new RasterTaskImpl( | 690 return make_scoped_refptr(new RasterTaskImpl( |
695 const_resource, tile->raster_source(), tile->content_rect(), | 691 const_resource, tile->raster_source(), tile->content_rect(), |
696 tile->contents_scale(), tile->priority().resolution, tile->layer_id(), | 692 tile->contents_scale(), prioritized_tile.priority().resolution, |
vmpstr
2015/05/11 16:44:44
Can you see what the resolution is used for? Or wh
hendrikw
2015/05/11 17:38:30
it's passed to Analyze and Raster, which passes it
| |
697 static_cast<const void*>(tile), tile->source_frame_number(), | 693 tile->layer_id(), static_cast<const void*>(tile), |
698 tile->use_picture_analysis(), | 694 tile->source_frame_number(), tile->use_picture_analysis(), |
699 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), | 695 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), |
700 tile->id(), base::Passed(&resource)), | 696 tile->id(), base::Passed(&resource)), |
701 &decode_tasks)); | 697 &decode_tasks)); |
702 } | 698 } |
703 | 699 |
704 void TileManager::OnImageDecodeTaskCompleted(int layer_id, | 700 void TileManager::OnImageDecodeTaskCompleted(int layer_id, |
705 SkPixelRef* pixel_ref, | 701 SkPixelRef* pixel_ref, |
706 bool was_canceled) { | 702 bool was_canceled) { |
707 // If the task was canceled, we need to clean it up | 703 // If the task was canceled, we need to clean it up |
708 // from |image_decode_tasks_|. | 704 // from |image_decode_tasks_|. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
790 bool TileManager::AreRequiredTilesReadyToDraw( | 786 bool TileManager::AreRequiredTilesReadyToDraw( |
791 RasterTilePriorityQueue::Type type) const { | 787 RasterTilePriorityQueue::Type type) const { |
792 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( | 788 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
793 client_->BuildRasterQueue(global_state_.tree_priority, type)); | 789 client_->BuildRasterQueue(global_state_.tree_priority, type)); |
794 // It is insufficient to check whether the raster queue we constructed is | 790 // It is insufficient to check whether the raster queue we constructed is |
795 // empty. The reason for this is that there are situations (rasterize on | 791 // empty. The reason for this is that there are situations (rasterize on |
796 // demand) when the tile both needs raster and it's ready to draw. Hence, we | 792 // demand) when the tile both needs raster and it's ready to draw. Hence, we |
797 // have to iterate the queue to check whether the required tiles are ready to | 793 // have to iterate the queue to check whether the required tiles are ready to |
798 // draw. | 794 // draw. |
799 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { | 795 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { |
800 if (!raster_priority_queue->Top()->IsReadyToDraw()) | 796 if (!raster_priority_queue->Top().tile()->IsReadyToDraw()) |
801 return false; | 797 return false; |
802 } | 798 } |
803 | 799 |
804 #if DCHECK_IS_ON() | 800 #if DCHECK_IS_ON() |
805 scoped_ptr<RasterTilePriorityQueue> all_queue( | 801 scoped_ptr<RasterTilePriorityQueue> all_queue( |
806 client_->BuildRasterQueue(global_state_.tree_priority, type)); | 802 client_->BuildRasterQueue(global_state_.tree_priority, type)); |
807 for (; !all_queue->IsEmpty(); all_queue->Pop()) { | 803 for (; !all_queue->IsEmpty(); all_queue->Pop()) { |
808 auto* tile = all_queue->Top(); | 804 Tile* tile = all_queue->Top().tile(); |
809 DCHECK_IMPLIES(tile->required_for_activation(), tile->IsReadyToDraw()); | 805 DCHECK_IMPLIES(tile->required_for_activation(), tile->IsReadyToDraw()); |
810 } | 806 } |
811 #endif | 807 #endif |
812 return true; | 808 return true; |
813 } | 809 } |
814 bool TileManager::IsReadyToActivate() const { | 810 bool TileManager::IsReadyToActivate() const { |
815 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 811 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
816 return AreRequiredTilesReadyToDraw( | 812 return AreRequiredTilesReadyToDraw( |
817 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 813 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
818 } | 814 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
866 | 862 |
867 NotifyReadyToDraw(); | 863 NotifyReadyToDraw(); |
868 } | 864 } |
869 | 865 |
870 void TileManager::CheckIfMoreTilesNeedToBePrepared() { | 866 void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
871 tile_task_runner_->CheckForCompletedTasks(); | 867 tile_task_runner_->CheckForCompletedTasks(); |
872 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 868 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
873 | 869 |
874 // When OOM, keep re-assigning memory until we reach a steady state | 870 // When OOM, keep re-assigning memory until we reach a steady state |
875 // where top-priority tiles are initialized. | 871 // where top-priority tiles are initialized. |
876 TileVector tiles_that_need_to_be_rasterized; | 872 PrioritizedTileVector tiles_that_need_to_be_rasterized; |
877 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( | 873 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
878 client_->BuildRasterQueue(global_state_.tree_priority, | 874 client_->BuildRasterQueue(global_state_.tree_priority, |
879 RasterTilePriorityQueue::Type::ALL)); | 875 RasterTilePriorityQueue::Type::ALL)); |
880 AssignGpuMemoryToTiles(raster_priority_queue.get(), | 876 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
881 scheduled_raster_task_limit_, | 877 scheduled_raster_task_limit_, |
882 &tiles_that_need_to_be_rasterized); | 878 &tiles_that_need_to_be_rasterized); |
883 | 879 |
884 // Inform the client that will likely require a draw if the highest priority | 880 // Inform the client that will likely require a draw if the highest priority |
885 // tile that will be rasterized is required for draw. | 881 // tile that will be rasterized is required for draw. |
886 client_->SetIsLikelyToRequireADraw( | 882 client_->SetIsLikelyToRequireADraw( |
887 !tiles_that_need_to_be_rasterized.empty() && | 883 !tiles_that_need_to_be_rasterized.empty() && |
888 (*tiles_that_need_to_be_rasterized.begin())->required_for_draw()); | 884 tiles_that_need_to_be_rasterized.front().tile()->required_for_draw()); |
889 | 885 |
890 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 886 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
891 // steady memory state. Keep scheduling tasks until we reach this state. | 887 // steady memory state. Keep scheduling tasks until we reach this state. |
892 if (!tiles_that_need_to_be_rasterized.empty()) { | 888 if (!tiles_that_need_to_be_rasterized.empty()) { |
893 ScheduleTasks(tiles_that_need_to_be_rasterized); | 889 ScheduleTasks(tiles_that_need_to_be_rasterized); |
894 return; | 890 return; |
895 } | 891 } |
896 | 892 |
897 FreeResourcesForReleasedTiles(); | 893 FreeResourcesForReleasedTiles(); |
898 | 894 |
(...skipping 20 matching lines...) Expand all Loading... | |
919 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); | 915 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
920 | 916 |
921 // If we have tiles left to raster for activation, and we don't allow | 917 // If we have tiles left to raster for activation, and we don't allow |
922 // activating without them, then skip activation and return early. | 918 // activating without them, then skip activation and return early. |
923 if (!required_for_activation_queue->IsEmpty() && wait_for_all_required_tiles) | 919 if (!required_for_activation_queue->IsEmpty() && wait_for_all_required_tiles) |
924 return; | 920 return; |
925 | 921 |
926 // Mark required tiles as OOM so that we can activate without them. | 922 // Mark required tiles as OOM so that we can activate without them. |
927 for (; !required_for_activation_queue->IsEmpty(); | 923 for (; !required_for_activation_queue->IsEmpty(); |
928 required_for_activation_queue->Pop()) { | 924 required_for_activation_queue->Pop()) { |
929 Tile* tile = required_for_activation_queue->Top(); | 925 Tile* tile = required_for_activation_queue->Top().tile(); |
930 tile->draw_info().set_oom(); | 926 tile->draw_info().set_oom(); |
931 client_->NotifyTileStateChanged(tile); | 927 client_->NotifyTileStateChanged(tile); |
932 } | 928 } |
933 | 929 |
934 DCHECK(IsReadyToActivate()); | 930 DCHECK(IsReadyToActivate()); |
935 ready_to_activate_check_notifier_.Schedule(); | 931 ready_to_activate_check_notifier_.Schedule(); |
936 } | 932 } |
937 | 933 |
938 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 934 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { |
939 } | 935 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
979 result -= other; | 975 result -= other; |
980 return result; | 976 return result; |
981 } | 977 } |
982 | 978 |
983 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 979 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
984 return memory_bytes_ > limit.memory_bytes_ || | 980 return memory_bytes_ > limit.memory_bytes_ || |
985 resource_count_ > limit.resource_count_; | 981 resource_count_ > limit.resource_count_; |
986 } | 982 } |
987 | 983 |
988 } // namespace cc | 984 } // namespace cc |
OLD | NEW |