Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: cc/resources/tile_manager.cc

Issue 1130123003: cc: Separate the priority from the tile and put in new PrioritizedTile (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: make reviewer happier Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698