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

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

Issue 15715031: cc: Remove memory state from tile management (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 6 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
« no previous file with comments | « cc/resources/tile.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete()) 300 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete())
301 return; 301 return;
302 302
303 TileSet initialized_tiles; 303 TileSet initialized_tiles;
304 for (TileSet::iterator it = 304 for (TileSet::iterator it =
305 tiles_that_need_to_be_initialized_for_activation_.begin(); 305 tiles_that_need_to_be_initialized_for_activation_.begin();
306 it != tiles_that_need_to_be_initialized_for_activation_.end(); 306 it != tiles_that_need_to_be_initialized_for_activation_.end();
307 ++it) { 307 ++it) {
308 Tile* tile = *it; 308 Tile* tile = *it;
309 if (!tile->managed_state().raster_task.is_null() && 309 if (!tile->managed_state().raster_task.is_null() &&
310 tile->tile_version().memory_state_ == USING_UNRELEASABLE_MEMORY &&
311 !tile->tile_version().forced_upload_) { 310 !tile->tile_version().forced_upload_) {
312 if (!raster_worker_pool_->ForceUploadToComplete( 311 if (!raster_worker_pool_->ForceUploadToComplete(
313 tile->managed_state().raster_task)) 312 tile->managed_state().raster_task))
314 continue; 313 continue;
315 314
316 // Setting |forced_upload_| to true makes this tile ready to draw. 315 // Setting |forced_upload_| to true makes this tile ready to draw.
317 tile->tile_version().forced_upload_ = true; 316 tile->tile_version().forced_upload_ = true;
318 initialized_tiles.insert(tile); 317 initialized_tiles.insert(tile);
319 } 318 }
320 } 319 }
(...skipping 20 matching lines...) Expand all
341 const Tile* tile = *it; 340 const Tile* tile = *it;
342 if (!tile->tile_version().requires_resource()) 341 if (!tile->tile_version().requires_resource())
343 continue; 342 continue;
344 343
345 const ManagedTileState& mts = tile->managed_state(); 344 const ManagedTileState& mts = tile->managed_state();
346 size_t tile_bytes = tile->bytes_consumed_if_allocated(); 345 size_t tile_bytes = tile->bytes_consumed_if_allocated();
347 if (mts.gpu_memmgr_stats_bin == NOW_BIN) 346 if (mts.gpu_memmgr_stats_bin == NOW_BIN)
348 *memory_required_bytes += tile_bytes; 347 *memory_required_bytes += tile_bytes;
349 if (mts.gpu_memmgr_stats_bin != NEVER_BIN) 348 if (mts.gpu_memmgr_stats_bin != NEVER_BIN)
350 *memory_nice_to_have_bytes += tile_bytes; 349 *memory_nice_to_have_bytes += tile_bytes;
351 if (tile->tile_version().memory_state_ != NOT_ALLOWED_TO_USE_MEMORY) 350 if (!tile->managed_state().raster_task.is_null())
reveman 2013/06/03 14:11:34 This is not the same. raster_task is only set whil
vmpstr 2013/06/03 17:08:26 Done.
352 *memory_used_bytes += tile_bytes; 351 *memory_used_bytes += tile_bytes;
353 } 352 }
354 } 353 }
355 354
356 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { 355 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const {
357 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 356 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
358 state->SetInteger("tile_count", tiles_.size()); 357 state->SetInteger("tile_count", tiles_.size());
359 state->Set("global_state", global_state_.AsValue().release()); 358 state->Set("global_state", global_state_.AsValue().release());
360 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); 359 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release());
361 return state.PassAs<base::Value>(); 360 return state.PassAs<base::Value>();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 tiles_that_need_to_be_initialized_for_activation_.clear(); 405 tiles_that_need_to_be_initialized_for_activation_.clear();
407 406
408 // By clearing the tiles_that_need_to_be_rasterized_ vector list 407 // By clearing the tiles_that_need_to_be_rasterized_ vector list
409 // above we move all tiles currently waiting for raster to idle state. 408 // above we move all tiles currently waiting for raster to idle state.
410 // Some memory cannot be released. We figure out how much in this 409 // Some memory cannot be released. We figure out how much in this
411 // loop. 410 // loop.
412 for (TileVector::const_iterator it = tiles_.begin(); 411 for (TileVector::const_iterator it = tiles_.begin();
413 it != tiles_.end(); 412 it != tiles_.end();
414 ++it) { 413 ++it) {
415 const Tile* tile = *it; 414 const Tile* tile = *it;
416 if (tile->tile_version().memory_state_ == USING_UNRELEASABLE_MEMORY) 415 if (!tile->managed_state().raster_task.is_null())
reveman 2013/06/03 14:11:34 It's a bit weird that we examine |raster_task| to
vmpstr 2013/06/03 17:08:26 Done.
417 unreleasable_bytes += tile->bytes_consumed_if_allocated(); 416 unreleasable_bytes += tile->bytes_consumed_if_allocated();
418 } 417 }
419 418
420 // Global state's memory limit can decrease, causing 419 // Global state's memory limit can decrease, causing
421 // it to be less than unreleasable_bytes 420 // it to be less than unreleasable_bytes
422 size_t bytes_allocatable = 421 size_t bytes_allocatable =
423 global_state_.memory_limit_in_bytes > unreleasable_bytes ? 422 global_state_.memory_limit_in_bytes > unreleasable_bytes ?
424 global_state_.memory_limit_in_bytes - unreleasable_bytes : 423 global_state_.memory_limit_in_bytes - unreleasable_bytes :
425 0; 424 0;
426 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; 425 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0;
427 size_t bytes_left = bytes_allocatable; 426 size_t bytes_left = bytes_allocatable;
428 size_t bytes_oom_in_now_bin_on_pending_tree = 0; 427 size_t bytes_oom_in_now_bin_on_pending_tree = 0;
429 TileVector tiles_requiring_memory_but_oomed; 428 TileVector tiles_requiring_memory_but_oomed;
430 bool higher_priority_tile_oomed = false; 429 bool higher_priority_tile_oomed = false;
431 for (TileVector::iterator it = tiles_.begin(); 430 for (TileVector::iterator it = tiles_.begin();
432 it != tiles_.end(); 431 it != tiles_.end();
433 ++it) { 432 ++it) {
434 Tile* tile = *it; 433 Tile* tile = *it;
435 ManagedTileState& mts = tile->managed_state(); 434 ManagedTileState& mts = tile->managed_state();
436 ManagedTileState::TileVersion& tile_version = tile->tile_version(); 435 ManagedTileState::TileVersion& tile_version = tile->tile_version();
437 436
438 // If this tile doesn't need a resource, then nothing to do. 437 // If this tile doesn't need a resource, then nothing to do.
439 if (!tile_version.requires_resource()) 438 if (!tile_version.requires_resource())
440 continue; 439 continue;
441 440
442 size_t tile_bytes = tile->bytes_consumed_if_allocated(); 441 size_t tile_bytes = tile->bytes_consumed_if_allocated();
443 // Memory is already reserved for tile with unreleasable memory 442 // Memory is already reserved for tile with unreleasable memory
444 // so adding it to |tiles_that_need_to_be_rasterized_| doesn't 443 // so adding it to |tiles_that_need_to_be_rasterized_| doesn't
445 // affect bytes_allocatable. 444 // affect bytes_allocatable.
446 if (tile_version.memory_state_ == USING_UNRELEASABLE_MEMORY) 445 if (!mts.raster_task.is_null())
447 tile_bytes = 0; 446 tile_bytes = 0;
reveman 2013/06/03 14:11:34 Maybe we should reverse this. Make tile_bytes=0 by
vmpstr 2013/06/03 17:08:26 Done.
448 447
449 // If the tile is not needed, free it up. 448 // If the tile is not needed, free it up.
450 if (mts.is_in_never_bin_on_both_trees()) { 449 if (mts.is_in_never_bin_on_both_trees()) {
451 if (tile_version.memory_state_ != USING_UNRELEASABLE_MEMORY) { 450 FreeResourcesForTile(tile);
452 FreeResourcesForTile(tile);
453 tile_version.memory_state_ = NOT_ALLOWED_TO_USE_MEMORY;
454 }
455 continue; 451 continue;
456 } 452 }
457 453
458 // Tile is OOM. 454 // Tile is OOM.
459 if (tile_bytes > bytes_left) { 455 if (tile_bytes > bytes_left) {
460 tile->tile_version().set_rasterize_on_demand(); 456 tile->tile_version().set_rasterize_on_demand();
461 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { 457 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) {
462 tiles_requiring_memory_but_oomed.push_back(tile); 458 tiles_requiring_memory_but_oomed.push_back(tile);
463 bytes_oom_in_now_bin_on_pending_tree += tile_bytes; 459 bytes_oom_in_now_bin_on_pending_tree += tile_bytes;
464 } 460 }
(...skipping 22 matching lines...) Expand all
487 } 483 }
488 484
489 // In OOM situation, we iterate tiles_, remove the memory for active tree 485 // In OOM situation, we iterate tiles_, remove the memory for active tree
490 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree 486 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree
491 if (!tiles_requiring_memory_but_oomed.empty()) { 487 if (!tiles_requiring_memory_but_oomed.empty()) {
492 size_t bytes_freed = 0; 488 size_t bytes_freed = 0;
493 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 489 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
494 Tile* tile = *it; 490 Tile* tile = *it;
495 ManagedTileState& mts = tile->managed_state(); 491 ManagedTileState& mts = tile->managed_state();
496 ManagedTileState::TileVersion& tile_version = tile->tile_version(); 492 ManagedTileState::TileVersion& tile_version = tile->tile_version();
497 if ((tile_version.memory_state_ == CAN_USE_MEMORY || 493 if (tile_version.resource_ &&
498 tile_version.memory_state_ == USING_RELEASABLE_MEMORY) &&
499 mts.tree_bin[PENDING_TREE] == NEVER_BIN && 494 mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
500 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { 495 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
501 DCHECK(!tile->required_for_activation()); 496 DCHECK(!tile->required_for_activation());
502 FreeResourcesForTile(tile); 497 FreeResourcesForTile(tile);
503 tile_version.set_rasterize_on_demand(); 498 tile_version.set_rasterize_on_demand();
504 bytes_freed += tile->bytes_consumed_if_allocated(); 499 bytes_freed += tile->bytes_consumed_if_allocated();
505 TileVector::iterator it = std::find( 500 TileVector::iterator it = std::find(
506 tiles_that_need_to_be_rasterized_.begin(), 501 tiles_that_need_to_be_rasterized_.begin(),
507 tiles_that_need_to_be_rasterized_.end(), 502 tiles_that_need_to_be_rasterized_.end(),
508 tile); 503 tile);
(...skipping 29 matching lines...) Expand all
538 memory_stats_from_last_assign_.total_budget_in_bytes = 533 memory_stats_from_last_assign_.total_budget_in_bytes =
539 global_state_.memory_limit_in_bytes; 534 global_state_.memory_limit_in_bytes;
540 memory_stats_from_last_assign_.bytes_allocated = 535 memory_stats_from_last_assign_.bytes_allocated =
541 bytes_allocatable - bytes_left; 536 bytes_allocatable - bytes_left;
542 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; 537 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes;
543 memory_stats_from_last_assign_.bytes_over = 538 memory_stats_from_last_assign_.bytes_over =
544 bytes_that_exceeded_memory_budget_in_now_bin; 539 bytes_that_exceeded_memory_budget_in_now_bin;
545 } 540 }
546 541
547 void TileManager::FreeResourcesForTile(Tile* tile) { 542 void TileManager::FreeResourcesForTile(Tile* tile) {
548 DCHECK_NE(USING_UNRELEASABLE_MEMORY, tile->tile_version().memory_state_);
549 if (tile->tile_version().resource_) { 543 if (tile->tile_version().resource_) {
550 resource_pool_->ReleaseResource( 544 resource_pool_->ReleaseResource(
551 tile->tile_version().resource_.Pass()); 545 tile->tile_version().resource_.Pass());
552 } 546 }
553 tile->tile_version().memory_state_ = NOT_ALLOWED_TO_USE_MEMORY;
554 } 547 }
555 548
556 void TileManager::ScheduleTasks() { 549 void TileManager::ScheduleTasks() {
557 TRACE_EVENT0("cc", "TileManager::ScheduleTasks"); 550 TRACE_EVENT0("cc", "TileManager::ScheduleTasks");
558 RasterWorkerPool::RasterTask::Queue tasks; 551 RasterWorkerPool::RasterTask::Queue tasks;
559 552
560 // Build a new task queue containing all task currently needed. Tasks 553 // Build a new task queue containing all task currently needed. Tasks
561 // are added in order of priority, highest priority task first. 554 // are added in order of priority, highest priority task first.
562 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); 555 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin();
563 it != tiles_that_need_to_be_rasterized_.end(); 556 it != tiles_that_need_to_be_rasterized_.end();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 613
621 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { 614 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
622 TRACE_EVENT0("cc", "TileManager::CreateRasterTask"); 615 TRACE_EVENT0("cc", "TileManager::CreateRasterTask");
623 616
624 scoped_ptr<ResourcePool::Resource> resource = 617 scoped_ptr<ResourcePool::Resource> resource =
625 resource_pool_->AcquireResource( 618 resource_pool_->AcquireResource(
626 tile->tile_size_.size(), 619 tile->tile_size_.size(),
627 tile->tile_version().resource_format_); 620 tile->tile_version().resource_format_);
628 const Resource* const_resource = resource.get(); 621 const Resource* const_resource = resource.get();
629 622
630 DCHECK_EQ(CAN_USE_MEMORY, tile->tile_version().memory_state_);
631 tile->tile_version().memory_state_ = USING_UNRELEASABLE_MEMORY;
632 tile->tile_version().resource_id_ = resource->id(); 623 tile->tile_version().resource_id_ = resource->id();
633 624
634 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis; 625 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis;
635 626
636 // Create and queue all image decode tasks that this tile depends on. 627 // Create and queue all image decode tasks that this tile depends on.
637 RasterWorkerPool::Task::Set decode_tasks; 628 RasterWorkerPool::Task::Set decode_tasks;
638 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), 629 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(),
639 tile->contents_scale(), 630 tile->contents_scale(),
640 tile->picture_pile()); 631 tile->picture_pile());
641 iter; ++iter) { 632 iter; ++iter) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 scoped_ptr<ResourcePool::Resource> resource, 683 scoped_ptr<ResourcePool::Resource> resource,
693 PicturePileImpl::Analysis* analysis, 684 PicturePileImpl::Analysis* analysis,
694 bool was_canceled) { 685 bool was_canceled) {
695 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", 686 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted",
696 "was_canceled", was_canceled); 687 "was_canceled", was_canceled);
697 688
698 ManagedTileState& mts = tile->managed_state(); 689 ManagedTileState& mts = tile->managed_state();
699 DCHECK(!mts.raster_task.is_null()); 690 DCHECK(!mts.raster_task.is_null());
700 mts.raster_task.Reset(); 691 mts.raster_task.Reset();
701 692
702 // Tile resources can't be freed until task has completed.
703 DCHECK_EQ(USING_UNRELEASABLE_MEMORY, tile->tile_version().memory_state_);
704
705 if (was_canceled) { 693 if (was_canceled) {
706 tile->tile_version().memory_state_ = CAN_USE_MEMORY;
707 resource_pool_->ReleaseResource(resource.Pass()); 694 resource_pool_->ReleaseResource(resource.Pass());
708 return; 695 return;
709 } 696 }
710 697
711 mts.picture_pile_analysis = *analysis; 698 mts.picture_pile_analysis = *analysis;
712 mts.picture_pile_analyzed = true; 699 mts.picture_pile_analyzed = true;
713 700
714 if (analysis->is_solid_color) { 701 if (analysis->is_solid_color) {
715 tile->tile_version().set_solid_color(analysis->solid_color); 702 tile->tile_version().set_solid_color(analysis->solid_color);
716 resource_pool_->ReleaseResource(resource.Pass()); 703 resource_pool_->ReleaseResource(resource.Pass());
717 } else { 704 } else {
718 tile->tile_version().memory_state_ = USING_RELEASABLE_MEMORY;
719 tile->tile_version().resource_ = resource.Pass(); 705 tile->tile_version().resource_ = resource.Pass();
720 } 706 }
721 707
722 DidFinishTileInitialization(tile); 708 DidFinishTileInitialization(tile);
723 } 709 }
724 710
725 void TileManager::DidFinishTileInitialization(Tile* tile) { 711 void TileManager::DidFinishTileInitialization(Tile* tile) {
726 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 712 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
727 did_initialize_visible_tile_ = true; 713 did_initialize_visible_tile_ = true;
728 if (tile->required_for_activation()) { 714 if (tile->required_for_activation()) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 100000, 829 100000,
844 100); 830 100);
845 } else { 831 } else {
846 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL); 832 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL);
847 } 833 }
848 834
849 return true; 835 return true;
850 } 836 }
851 837
852 } // namespace cc 838 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698