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

Unified 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: address review feeback 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 side-by-side diff with in-line comments
Download patch
Index: cc/resources/tile_manager.cc
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 9868a4e180553b16e62b9fd35b9d24420532580a..c207ddddd80d4f4236ed2fe1882bd9677c50861e 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -365,27 +365,28 @@ scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue(
// static
scoped_ptr<TileManager> TileManager::Create(
TileManagerClient* client,
+ base::SequencedTaskRunner* task_runner,
ResourcePool* resource_pool,
Rasterizer* rasterizer,
Rasterizer* gpu_rasterizer,
- bool use_rasterize_on_demand,
RenderingStatsInstrumentation* rendering_stats_instrumentation) {
return make_scoped_ptr(new TileManager(client,
+ task_runner,
resource_pool,
rasterizer,
gpu_rasterizer,
- use_rasterize_on_demand,
rendering_stats_instrumentation));
}
TileManager::TileManager(
TileManagerClient* client,
+ base::SequencedTaskRunner* task_runner,
ResourcePool* resource_pool,
Rasterizer* rasterizer,
Rasterizer* gpu_rasterizer,
- bool use_rasterize_on_demand,
RenderingStatsInstrumentation* rendering_stats_instrumentation)
: client_(client),
+ task_runner_(task_runner),
resource_pool_(resource_pool),
prioritized_tiles_dirty_(false),
all_tiles_that_need_to_be_rasterized_have_memory_(true),
@@ -398,7 +399,8 @@ TileManager::TileManager(
rendering_stats_instrumentation_(rendering_stats_instrumentation),
did_initialize_visible_tile_(false),
did_check_for_completed_tasks_since_last_schedule_tasks_(true),
- use_rasterize_on_demand_(use_rasterize_on_demand) {
+ check_if_ready_to_activate_pending_(false),
+ weak_ptr_factory_(this) {
Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = {
rasterizer, // RASTERIZER_TYPE_DEFAULT
gpu_rasterizer, // RASTERIZER_TYPE_GPU
@@ -535,12 +537,14 @@ void TileManager::DidFinishRunningTasks() {
// If we can't raster on demand, give up early (and don't activate).
if (!allow_rasterize_on_demand)
return;
- if (use_rasterize_on_demand_)
- tile_version.set_rasterize_on_demand();
+
+ tile_version.set_rasterize_on_demand();
+ client_->NotifyTileStateChanged(tile);
}
}
- client_->NotifyReadyToActivate();
+ DCHECK(IsReadyToActivate());
+ ScheduleCheckIfReadyToActivate();
}
void TileManager::DidFinishRunningTasksRequiredForActivation() {
@@ -552,7 +556,7 @@ void TileManager::DidFinishRunningTasksRequiredForActivation() {
if (!all_tiles_required_for_activation_have_memory_)
return;
- client_->NotifyReadyToActivate();
+ ScheduleCheckIfReadyToActivate();
}
void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
@@ -668,7 +672,7 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
// can visit it.
if (mts.bin == NEVER_BIN &&
!mts.tile_versions[mts.raster_mode].raster_task_) {
- FreeResourcesForTile(tile);
+ FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile);
vmpstr 2014/05/16 17:09:06 yay 56 character function names :P
continue;
}
@@ -842,7 +846,7 @@ void TileManager::AssignGpuMemoryToTiles(
// If the tile is not needed, free it up.
if (mts.bin == NEVER_BIN) {
- FreeResourcesForTile(tile);
+ FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile);
continue;
}
@@ -884,14 +888,19 @@ void TileManager::AssignGpuMemoryToTiles(
// Tile is OOM.
if (tile_bytes > tile_bytes_left || tile_resources > resources_left) {
+ bool was_ready_to_draw = tile->IsReadyToDraw();
+
FreeResourcesForTile(tile);
// This tile was already on screen and now its resources have been
// released. In order to prevent checkerboarding, set this tile as
// rasterize on demand immediately.
- if (mts.visible_and_ready_to_draw && use_rasterize_on_demand_)
+ if (mts.visible_and_ready_to_draw)
tile_version.set_rasterize_on_demand();
+ if (was_ready_to_draw)
+ client_->NotifyTileStateChanged(tile);
+
oomed_soft = true;
if (tile_uses_hard_limit) {
oomed_hard = true;
@@ -986,6 +995,14 @@ void TileManager::FreeUnusedResourcesForTile(Tile* tile) {
}
}
+void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
+ Tile* tile) {
+ bool was_ready_to_draw = tile->IsReadyToDraw();
+ FreeResourcesForTile(tile);
+ if (was_ready_to_draw)
+ client_->NotifyTileStateChanged(tile);
+}
+
void TileManager::ScheduleTasks(
const TileVector& tiles_that_need_to_be_rasterized) {
TRACE_EVENT1("cc",
@@ -1182,11 +1199,11 @@ void TileManager::OnRasterTaskCompleted(
++resources_releasable_;
}
- client_->NotifyTileInitialized(tile);
-
FreeUnusedResourcesForTile(tile);
if (tile->priority(ACTIVE_TREE).distance_to_visible == 0.f)
did_initialize_visible_tile_ = true;
+
+ client_->NotifyTileStateChanged(tile);
}
scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
@@ -1622,4 +1639,36 @@ void TileManager::SetRasterizersForTesting(Rasterizer* rasterizer,
RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers));
}
+bool TileManager::IsReadyToActivate() const {
+ for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin();
+ it != layers_.end();
+ ++it) {
+ if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw())
+ return false;
+ }
+
+ return true;
+}
+
+void TileManager::ScheduleCheckIfReadyToActivate() {
+ if (check_if_ready_to_activate_pending_)
+ return;
+
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&TileManager::CheckIfReadyToActivate,
+ weak_ptr_factory_.GetWeakPtr()));
+ check_if_ready_to_activate_pending_ = true;
+}
+
+void TileManager::CheckIfReadyToActivate() {
+ DCHECK(check_if_ready_to_activate_pending_);
+ check_if_ready_to_activate_pending_ = false;
+
+ rasterizer_delegate_->CheckForCompletedTasks();
+ did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
+
+ if (IsReadyToActivate())
+ client_->NotifyReadyToActivate();
+}
+
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698