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

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

Issue 287643004: Re-land: cc: Examine layers to determine if we're ready to activate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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
« no previous file with comments | « cc/resources/tile_manager.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 <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 const RasterTaskCompletionStats& stats) { 359 const RasterTaskCompletionStats& stats) {
360 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 360 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
361 state->SetInteger("completed_count", stats.completed_count); 361 state->SetInteger("completed_count", stats.completed_count);
362 state->SetInteger("canceled_count", stats.canceled_count); 362 state->SetInteger("canceled_count", stats.canceled_count);
363 return state.PassAs<base::Value>(); 363 return state.PassAs<base::Value>();
364 } 364 }
365 365
366 // static 366 // static
367 scoped_ptr<TileManager> TileManager::Create( 367 scoped_ptr<TileManager> TileManager::Create(
368 TileManagerClient* client, 368 TileManagerClient* client,
369 base::SequencedTaskRunner* task_runner,
369 ResourcePool* resource_pool, 370 ResourcePool* resource_pool,
370 Rasterizer* rasterizer, 371 Rasterizer* rasterizer,
371 Rasterizer* gpu_rasterizer, 372 Rasterizer* gpu_rasterizer,
372 bool use_rasterize_on_demand,
373 RenderingStatsInstrumentation* rendering_stats_instrumentation) { 373 RenderingStatsInstrumentation* rendering_stats_instrumentation) {
374 return make_scoped_ptr(new TileManager(client, 374 return make_scoped_ptr(new TileManager(client,
375 task_runner,
375 resource_pool, 376 resource_pool,
376 rasterizer, 377 rasterizer,
377 gpu_rasterizer, 378 gpu_rasterizer,
378 use_rasterize_on_demand,
379 rendering_stats_instrumentation)); 379 rendering_stats_instrumentation));
380 } 380 }
381 381
382 TileManager::TileManager( 382 TileManager::TileManager(
383 TileManagerClient* client, 383 TileManagerClient* client,
384 base::SequencedTaskRunner* task_runner,
384 ResourcePool* resource_pool, 385 ResourcePool* resource_pool,
385 Rasterizer* rasterizer, 386 Rasterizer* rasterizer,
386 Rasterizer* gpu_rasterizer, 387 Rasterizer* gpu_rasterizer,
387 bool use_rasterize_on_demand,
388 RenderingStatsInstrumentation* rendering_stats_instrumentation) 388 RenderingStatsInstrumentation* rendering_stats_instrumentation)
389 : client_(client), 389 : client_(client),
390 task_runner_(task_runner),
390 resource_pool_(resource_pool), 391 resource_pool_(resource_pool),
391 prioritized_tiles_dirty_(false), 392 prioritized_tiles_dirty_(false),
392 all_tiles_that_need_to_be_rasterized_have_memory_(true), 393 all_tiles_that_need_to_be_rasterized_have_memory_(true),
393 all_tiles_required_for_activation_have_memory_(true), 394 all_tiles_required_for_activation_have_memory_(true),
394 memory_required_bytes_(0), 395 memory_required_bytes_(0),
395 memory_nice_to_have_bytes_(0), 396 memory_nice_to_have_bytes_(0),
396 bytes_releasable_(0), 397 bytes_releasable_(0),
397 resources_releasable_(0), 398 resources_releasable_(0),
398 ever_exceeded_memory_budget_(false), 399 ever_exceeded_memory_budget_(false),
399 rendering_stats_instrumentation_(rendering_stats_instrumentation), 400 rendering_stats_instrumentation_(rendering_stats_instrumentation),
400 did_initialize_visible_tile_(false), 401 did_initialize_visible_tile_(false),
401 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 402 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
402 use_rasterize_on_demand_(use_rasterize_on_demand) { 403 check_if_ready_to_activate_pending_(false),
404 weak_ptr_factory_(this) {
403 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { 405 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = {
404 rasterizer, // RASTERIZER_TYPE_DEFAULT 406 rasterizer, // RASTERIZER_TYPE_DEFAULT
405 gpu_rasterizer, // RASTERIZER_TYPE_GPU 407 gpu_rasterizer, // RASTERIZER_TYPE_GPU
406 }; 408 };
407 rasterizer_delegate_ = 409 rasterizer_delegate_ =
408 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); 410 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers));
409 } 411 }
410 412
411 TileManager::~TileManager() { 413 TileManager::~TileManager() {
412 // Reset global state and manage. This should cause 414 // Reset global state and manage. This should cause
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 531 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
530 Tile* tile = it->second; 532 Tile* tile = it->second;
531 ManagedTileState& mts = tile->managed_state(); 533 ManagedTileState& mts = tile->managed_state();
532 ManagedTileState::TileVersion& tile_version = 534 ManagedTileState::TileVersion& tile_version =
533 mts.tile_versions[mts.raster_mode]; 535 mts.tile_versions[mts.raster_mode];
534 536
535 if (tile->required_for_activation() && !tile_version.IsReadyToDraw()) { 537 if (tile->required_for_activation() && !tile_version.IsReadyToDraw()) {
536 // If we can't raster on demand, give up early (and don't activate). 538 // If we can't raster on demand, give up early (and don't activate).
537 if (!allow_rasterize_on_demand) 539 if (!allow_rasterize_on_demand)
538 return; 540 return;
539 if (use_rasterize_on_demand_) 541
540 tile_version.set_rasterize_on_demand(); 542 tile_version.set_rasterize_on_demand();
543 client_->NotifyTileInitialized(tile);
vmpstr 2014/05/15 17:46:23 This means that we might end up calling NotifyTile
reveman 2014/05/15 19:01:43 That's already the case as we have multiple tile v
vmpstr 2014/05/16 00:38:45 Fair enough. I agree that with versions it should
541 } 544 }
542 } 545 }
543 546
544 client_->NotifyReadyToActivate(); 547 DCHECK(IsReadyToActivate());
548 ScheduleCheckIfReadyToActivate();
545 } 549 }
546 550
547 void TileManager::DidFinishRunningTasksRequiredForActivation() { 551 void TileManager::DidFinishRunningTasksRequiredForActivation() {
548 // This is only a true indication that all tiles required for 552 // This is only a true indication that all tiles required for
549 // activation are initialized when no tiles are OOM. We need to 553 // activation are initialized when no tiles are OOM. We need to
550 // wait for DidFinishRunningTasks() to be called, try to re-assign 554 // wait for DidFinishRunningTasks() to be called, try to re-assign
551 // memory and in worst case use on-demand raster when tiles 555 // memory and in worst case use on-demand raster when tiles
552 // required for activation are OOM. 556 // required for activation are OOM.
553 if (!all_tiles_required_for_activation_have_memory_) 557 if (!all_tiles_required_for_activation_have_memory_)
554 return; 558 return;
555 559
556 client_->NotifyReadyToActivate(); 560 ScheduleCheckIfReadyToActivate();
557 } 561 }
558 562
559 void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { 563 void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
560 TRACE_EVENT0("cc", "TileManager::GetTilesWithAssignedBins"); 564 TRACE_EVENT0("cc", "TileManager::GetTilesWithAssignedBins");
561 565
562 // Compute new stats to be return by GetMemoryStats(). 566 // Compute new stats to be return by GetMemoryStats().
563 memory_required_bytes_ = 0; 567 memory_required_bytes_ = 0;
564 memory_nice_to_have_bytes_ = 0; 568 memory_nice_to_have_bytes_ = 0;
565 569
566 const TileMemoryLimitPolicy memory_policy = global_state_.memory_limit_policy; 570 const TileMemoryLimitPolicy memory_policy = global_state_.memory_limit_policy;
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 } 887 }
884 } 888 }
885 889
886 // Tile is OOM. 890 // Tile is OOM.
887 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) { 891 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) {
888 FreeResourcesForTile(tile); 892 FreeResourcesForTile(tile);
889 893
890 // This tile was already on screen and now its resources have been 894 // This tile was already on screen and now its resources have been
891 // released. In order to prevent checkerboarding, set this tile as 895 // released. In order to prevent checkerboarding, set this tile as
892 // rasterize on demand immediately. 896 // rasterize on demand immediately.
893 if (mts.visible_and_ready_to_draw && use_rasterize_on_demand_) 897 if (mts.visible_and_ready_to_draw)
vmpstr 2014/05/15 17:46:23 Why this change?
reveman 2014/05/15 19:01:43 We can't handle situations where the renderer does
vmpstr 2014/05/16 00:38:45 I don't follow. This part was there to prevent us
reveman 2014/05/16 16:50:13 This patch just moves the awareness of support for
vmpstr 2014/05/16 17:09:06 Oh, I missed the bit where it's handled in AppendQ
894 tile_version.set_rasterize_on_demand(); 898 tile_version.set_rasterize_on_demand();
895 899
896 oomed_soft = true; 900 oomed_soft = true;
897 if (tile_uses_hard_limit) { 901 if (tile_uses_hard_limit) {
898 oomed_hard = true; 902 oomed_hard = true;
899 bytes_that_exceeded_memory_budget += tile_bytes; 903 bytes_that_exceeded_memory_budget += tile_bytes;
900 } 904 }
901 } else { 905 } else {
902 resources_left -= tile_resources; 906 resources_left -= tile_resources;
903 hard_bytes_left -= tile_bytes; 907 hard_bytes_left -= tile_bytes;
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; 1613 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY;
1610 1614
1611 if (b_priority.resolution != a_priority.resolution) { 1615 if (b_priority.resolution != a_priority.resolution) {
1612 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || 1616 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) ||
1613 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || 1617 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) ||
1614 (a_priority.resolution == NON_IDEAL_RESOLUTION); 1618 (a_priority.resolution == NON_IDEAL_RESOLUTION);
1615 } 1619 }
1616 return a_priority.IsHigherPriorityThan(b_priority); 1620 return a_priority.IsHigherPriorityThan(b_priority);
1617 } 1621 }
1618 1622
1623 bool TileManager::IsReadyToActivate() const {
1624 for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin();
vmpstr 2014/05/16 00:38:45 This is probably dependent on my patch that clears
reveman 2014/05/16 16:50:13 Yes, we should hold off on this until that lands.
1625 it != layers_.end();
1626 ++it) {
1627 if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw())
1628 return false;
1629 }
1630
1631 return true;
1632 }
1633
1634 void TileManager::ScheduleCheckIfReadyToActivate() {
1635 if (check_if_ready_to_activate_pending_)
vmpstr 2014/05/16 00:38:45 As an aside, this pattern seems to be in a few pla
reveman 2014/05/16 16:50:13 Yes, that would be nice and we can probably bake t
1636 return;
1637
1638 task_runner_->PostTask(FROM_HERE,
1639 base::Bind(&TileManager::CheckIfReadyToActivate,
1640 weak_ptr_factory_.GetWeakPtr()));
1641 check_if_ready_to_activate_pending_ = true;
1642 }
1643
1644 void TileManager::CheckIfReadyToActivate() {
1645 DCHECK(check_if_ready_to_activate_pending_);
1646 check_if_ready_to_activate_pending_ = false;
1647
1648 rasterizer_delegate_->CheckForCompletedTasks();
1649 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1650
1651 if (IsReadyToActivate())
1652 client_->NotifyReadyToActivate();
1653 }
1654
1619 } // namespace cc 1655 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698