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

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

Issue 296453009: cc: Get rid of rasterizer delegate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: switch tile manager Created 6 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 | Annotate | Revision Log
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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 state->SetInteger("completed_count", stats.completed_count); 360 state->SetInteger("completed_count", stats.completed_count);
361 state->SetInteger("canceled_count", stats.canceled_count); 361 state->SetInteger("canceled_count", stats.canceled_count);
362 return state.PassAs<base::Value>(); 362 return state.PassAs<base::Value>();
363 } 363 }
364 364
365 // static 365 // static
366 scoped_ptr<TileManager> TileManager::Create( 366 scoped_ptr<TileManager> TileManager::Create(
367 TileManagerClient* client, 367 TileManagerClient* client,
368 ResourcePool* resource_pool, 368 ResourcePool* resource_pool,
369 Rasterizer* rasterizer, 369 Rasterizer* rasterizer,
370 Rasterizer* gpu_rasterizer,
371 bool use_rasterize_on_demand, 370 bool use_rasterize_on_demand,
372 RenderingStatsInstrumentation* rendering_stats_instrumentation) { 371 RenderingStatsInstrumentation* rendering_stats_instrumentation) {
373 return make_scoped_ptr(new TileManager(client, 372 return make_scoped_ptr(new TileManager(client,
374 resource_pool, 373 resource_pool,
375 rasterizer, 374 rasterizer,
376 gpu_rasterizer,
377 use_rasterize_on_demand, 375 use_rasterize_on_demand,
378 rendering_stats_instrumentation)); 376 rendering_stats_instrumentation));
379 } 377 }
380 378
381 TileManager::TileManager( 379 TileManager::TileManager(
382 TileManagerClient* client, 380 TileManagerClient* client,
383 ResourcePool* resource_pool, 381 ResourcePool* resource_pool,
384 Rasterizer* rasterizer, 382 Rasterizer* rasterizer,
385 Rasterizer* gpu_rasterizer,
386 bool use_rasterize_on_demand, 383 bool use_rasterize_on_demand,
387 RenderingStatsInstrumentation* rendering_stats_instrumentation) 384 RenderingStatsInstrumentation* rendering_stats_instrumentation)
388 : client_(client), 385 : client_(client),
389 resource_pool_(resource_pool), 386 resource_pool_(resource_pool),
387 rasterizer_(rasterizer),
390 prioritized_tiles_dirty_(false), 388 prioritized_tiles_dirty_(false),
391 all_tiles_that_need_to_be_rasterized_have_memory_(true), 389 all_tiles_that_need_to_be_rasterized_have_memory_(true),
392 all_tiles_required_for_activation_have_memory_(true), 390 all_tiles_required_for_activation_have_memory_(true),
393 memory_required_bytes_(0), 391 memory_required_bytes_(0),
394 memory_nice_to_have_bytes_(0), 392 memory_nice_to_have_bytes_(0),
395 bytes_releasable_(0), 393 bytes_releasable_(0),
396 resources_releasable_(0), 394 resources_releasable_(0),
397 ever_exceeded_memory_budget_(false), 395 ever_exceeded_memory_budget_(false),
398 rendering_stats_instrumentation_(rendering_stats_instrumentation), 396 rendering_stats_instrumentation_(rendering_stats_instrumentation),
399 did_initialize_visible_tile_(false), 397 did_initialize_visible_tile_(false),
400 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 398 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
401 use_rasterize_on_demand_(use_rasterize_on_demand) { 399 use_rasterize_on_demand_(use_rasterize_on_demand) {
402 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { 400 rasterizer_->SetClient(this);
403 rasterizer, // RASTERIZER_TYPE_DEFAULT
404 gpu_rasterizer, // RASTERIZER_TYPE_GPU
405 };
406 rasterizer_delegate_ =
407 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers));
408 } 401 }
409 402
410 TileManager::~TileManager() { 403 TileManager::~TileManager() {
411 // Reset global state and manage. This should cause 404 // Reset global state and manage. This should cause
412 // our memory usage to drop to zero. 405 // our memory usage to drop to zero.
413 global_state_ = GlobalStateThatImpactsTilePriority(); 406 global_state_ = GlobalStateThatImpactsTilePriority();
414 407
415 CleanUpReleasedTiles(); 408 CleanUpReleasedTiles();
416 DCHECK_EQ(0u, tiles_.size()); 409 DCHECK_EQ(0u, tiles_.size());
417 410
418 RasterTaskQueue empty[NUM_RASTERIZER_TYPES]; 411 RasterTaskQueue empty;
419 rasterizer_delegate_->ScheduleTasks(empty); 412 rasterizer_->ScheduleTasks(&empty);
420 orphan_raster_tasks_.clear(); 413 orphan_raster_tasks_.clear();
421 414
422 // This should finish all pending tasks and release any uninitialized 415 // This should finish all pending tasks and release any uninitialized
423 // resources. 416 // resources.
424 rasterizer_delegate_->Shutdown(); 417 rasterizer_->Shutdown();
425 rasterizer_delegate_->CheckForCompletedTasks(); 418 rasterizer_->CheckForCompletedTasks();
426 419
427 DCHECK_EQ(0u, bytes_releasable_); 420 DCHECK_EQ(0u, bytes_releasable_);
428 DCHECK_EQ(0u, resources_releasable_); 421 DCHECK_EQ(0u, resources_releasable_);
429 422
430 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); 423 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin();
431 it != layers_.end(); 424 it != layers_.end();
432 ++it) { 425 ++it) {
433 (*it)->DidUnregisterLayer(); 426 (*it)->DidUnregisterLayer();
434 } 427 }
435 layers_.clear(); 428 layers_.clear();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 486
494 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > 487 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() >
495 global_state_.soft_memory_limit_in_bytes; 488 global_state_.soft_memory_limit_in_bytes;
496 489
497 // When OOM, keep re-assigning memory until we reach a steady state 490 // When OOM, keep re-assigning memory until we reach a steady state
498 // where top-priority tiles are initialized. 491 // where top-priority tiles are initialized.
499 if (all_tiles_that_need_to_be_rasterized_have_memory_ && 492 if (all_tiles_that_need_to_be_rasterized_have_memory_ &&
500 !memory_usage_above_limit) 493 !memory_usage_above_limit)
501 return; 494 return;
502 495
503 rasterizer_delegate_->CheckForCompletedTasks(); 496 rasterizer_->CheckForCompletedTasks();
504 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 497 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
505 498
506 TileVector tiles_that_need_to_be_rasterized; 499 TileVector tiles_that_need_to_be_rasterized;
507 AssignGpuMemoryToTiles(&prioritized_tiles_, 500 AssignGpuMemoryToTiles(&prioritized_tiles_,
508 &tiles_that_need_to_be_rasterized); 501 &tiles_that_need_to_be_rasterized);
509 502
510 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 503 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
511 // steady memory state. Keep scheduling tasks until we reach this state. 504 // steady memory state. Keep scheduling tasks until we reach this state.
512 if (!tiles_that_need_to_be_rasterized.empty()) { 505 if (!tiles_that_need_to_be_rasterized.empty()) {
513 ScheduleTasks(tiles_that_need_to_be_rasterized); 506 ScheduleTasks(tiles_that_need_to_be_rasterized);
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 if (state != global_state_) { 690 if (state != global_state_) {
698 global_state_ = state; 691 global_state_ = state;
699 prioritized_tiles_dirty_ = true; 692 prioritized_tiles_dirty_ = true;
700 } 693 }
701 694
702 CleanUpLayers(); 695 CleanUpLayers();
703 696
704 // We need to call CheckForCompletedTasks() once in-between each call 697 // We need to call CheckForCompletedTasks() once in-between each call
705 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 698 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
706 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 699 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
707 rasterizer_delegate_->CheckForCompletedTasks(); 700 rasterizer_->CheckForCompletedTasks();
708 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 701 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
709 } 702 }
710 703
711 UpdatePrioritizedTileSetIfNeeded(); 704 UpdatePrioritizedTileSetIfNeeded();
712 705
713 TileVector tiles_that_need_to_be_rasterized; 706 TileVector tiles_that_need_to_be_rasterized;
714 AssignGpuMemoryToTiles(&prioritized_tiles_, 707 AssignGpuMemoryToTiles(&prioritized_tiles_,
715 &tiles_that_need_to_be_rasterized); 708 &tiles_that_need_to_be_rasterized);
716 709
717 // Finally, schedule rasterizer tasks. 710 // Finally, schedule rasterizer tasks.
718 ScheduleTasks(tiles_that_need_to_be_rasterized); 711 ScheduleTasks(tiles_that_need_to_be_rasterized);
719 712
720 TRACE_EVENT_INSTANT1("cc", 713 TRACE_EVENT_INSTANT1("cc",
721 "DidManage", 714 "DidManage",
722 TRACE_EVENT_SCOPE_THREAD, 715 TRACE_EVENT_SCOPE_THREAD,
723 "state", 716 "state",
724 TracedValue::FromValue(BasicStateAsValue().release())); 717 TracedValue::FromValue(BasicStateAsValue().release()));
725 718
726 TRACE_COUNTER_ID1("cc", 719 TRACE_COUNTER_ID1("cc",
727 "unused_memory_bytes", 720 "unused_memory_bytes",
728 this, 721 this,
729 resource_pool_->total_memory_usage_bytes() - 722 resource_pool_->total_memory_usage_bytes() -
730 resource_pool_->acquired_memory_usage_bytes()); 723 resource_pool_->acquired_memory_usage_bytes());
731 } 724 }
732 725
733 bool TileManager::UpdateVisibleTiles() { 726 bool TileManager::UpdateVisibleTiles() {
734 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 727 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
735 728
736 rasterizer_delegate_->CheckForCompletedTasks(); 729 rasterizer_->CheckForCompletedTasks();
737 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 730 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
738 731
739 TRACE_EVENT_INSTANT1( 732 TRACE_EVENT_INSTANT1(
740 "cc", 733 "cc",
741 "DidUpdateVisibleTiles", 734 "DidUpdateVisibleTiles",
742 TRACE_EVENT_SCOPE_THREAD, 735 TRACE_EVENT_SCOPE_THREAD,
743 "stats", 736 "stats",
744 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( 737 TracedValue::FromValue(RasterTaskCompletionStatsAsValue(
745 update_visible_tiles_stats_).release())); 738 update_visible_tiles_stats_).release()));
746 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 739 update_visible_tiles_stats_ = RasterTaskCompletionStats();
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 996
1004 void TileManager::ScheduleTasks( 997 void TileManager::ScheduleTasks(
1005 const TileVector& tiles_that_need_to_be_rasterized) { 998 const TileVector& tiles_that_need_to_be_rasterized) {
1006 TRACE_EVENT1("cc", 999 TRACE_EVENT1("cc",
1007 "TileManager::ScheduleTasks", 1000 "TileManager::ScheduleTasks",
1008 "count", 1001 "count",
1009 tiles_that_need_to_be_rasterized.size()); 1002 tiles_that_need_to_be_rasterized.size());
1010 1003
1011 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 1004 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
1012 1005
1013 for (size_t i = 0; i < NUM_RASTERIZER_TYPES; ++i) 1006 raster_queue_.Reset();
1014 raster_queue_[i].Reset();
1015 1007
1016 // Build a new task queue containing all task currently needed. Tasks 1008 // Build a new task queue containing all task currently needed. Tasks
1017 // are added in order of priority, highest priority task first. 1009 // are added in order of priority, highest priority task first.
1018 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 1010 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
1019 it != tiles_that_need_to_be_rasterized.end(); 1011 it != tiles_that_need_to_be_rasterized.end();
1020 ++it) { 1012 ++it) {
1021 Tile* tile = *it; 1013 Tile* tile = *it;
1022 ManagedTileState& mts = tile->managed_state(); 1014 ManagedTileState& mts = tile->managed_state();
1023 ManagedTileState::TileVersion& tile_version = 1015 ManagedTileState::TileVersion& tile_version =
1024 mts.tile_versions[mts.raster_mode]; 1016 mts.tile_versions[mts.raster_mode];
1025 1017
1026 DCHECK(tile_version.requires_resource()); 1018 DCHECK(tile_version.requires_resource());
1027 DCHECK(!tile_version.resource_); 1019 DCHECK(!tile_version.resource_);
1028 1020
1029 if (!tile_version.raster_task_) 1021 if (!tile_version.raster_task_)
1030 tile_version.raster_task_ = CreateRasterTask(tile); 1022 tile_version.raster_task_ = CreateRasterTask(tile);
1031 1023
1032 size_t pool_type = tile->use_gpu_rasterization() ? RASTERIZER_TYPE_GPU 1024 raster_queue_.items.push_back(RasterTaskQueue::Item(
1033 : RASTERIZER_TYPE_DEFAULT;
1034
1035 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item(
1036 tile_version.raster_task_.get(), tile->required_for_activation())); 1025 tile_version.raster_task_.get(), tile->required_for_activation()));
1037 raster_queue_[pool_type].required_for_activation_count += 1026 raster_queue_.required_for_activation_count +=
1038 tile->required_for_activation(); 1027 tile->required_for_activation();
1039 } 1028 }
1040 1029
1041 // We must reduce the amount of unused resoruces before calling 1030 // We must reduce the amount of unused resoruces before calling
1042 // ScheduleTasks to prevent usage from rising above limits. 1031 // ScheduleTasks to prevent usage from rising above limits.
1043 resource_pool_->ReduceResourceUsage(); 1032 resource_pool_->ReduceResourceUsage();
1044 1033
1045 // Schedule running of |raster_tasks_|. This replaces any previously 1034 // Schedule running of |raster_tasks_|. This replaces any previously
1046 // scheduled tasks and effectively cancels all tasks not present 1035 // scheduled tasks and effectively cancels all tasks not present
1047 // in |raster_tasks_|. 1036 // in |raster_tasks_|.
1048 rasterizer_delegate_->ScheduleTasks(raster_queue_); 1037 rasterizer_->ScheduleTasks(&raster_queue_);
1049 1038
1050 // It's now safe to clean up orphan tasks as raster worker pool is not 1039 // It's now safe to clean up orphan tasks as raster worker pool is not
1051 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has 1040 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has
1052 // been called. 1041 // been called.
1053 orphan_raster_tasks_.clear(); 1042 orphan_raster_tasks_.clear();
1054 1043
1055 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 1044 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
1056 } 1045 }
1057 1046
1058 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( 1047 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask(
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; 1612 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY;
1624 1613
1625 if (b_priority.resolution != a_priority.resolution) { 1614 if (b_priority.resolution != a_priority.resolution) {
1626 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || 1615 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) ||
1627 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || 1616 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) ||
1628 (a_priority.resolution == NON_IDEAL_RESOLUTION); 1617 (a_priority.resolution == NON_IDEAL_RESOLUTION);
1629 } 1618 }
1630 return a_priority.IsHigherPriorityThan(b_priority); 1619 return a_priority.IsHigherPriorityThan(b_priority);
1631 } 1620 }
1632 1621
1633 void TileManager::SetRasterizersForTesting(Rasterizer* rasterizer, 1622 void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) {
1634 Rasterizer* gpu_rasterizer) { 1623 rasterizer_ = rasterizer;
1635 Rasterizer* rasterizers[2] = {rasterizer, gpu_rasterizer}; 1624 rasterizer_->SetClient(this);
1636 rasterizer_delegate_ =
1637 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers));
1638 } 1625 }
1639 1626
1640 } // namespace cc 1627 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698