Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 1c04d077f106ecabe69a71cd6b4d5482b4f5aceb..a81614ae2a58ae774010a05f05e9b9362711f1dc 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -366,27 +366,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), |
@@ -399,7 +400,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 |
@@ -536,12 +538,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_->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
|
} |
} |
- client_->NotifyReadyToActivate(); |
+ DCHECK(IsReadyToActivate()); |
+ ScheduleCheckIfReadyToActivate(); |
} |
void TileManager::DidFinishRunningTasksRequiredForActivation() { |
@@ -553,7 +557,7 @@ void TileManager::DidFinishRunningTasksRequiredForActivation() { |
if (!all_tiles_required_for_activation_have_memory_) |
return; |
- client_->NotifyReadyToActivate(); |
+ ScheduleCheckIfReadyToActivate(); |
} |
void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { |
@@ -890,7 +894,7 @@ void TileManager::AssignGpuMemoryToTiles( |
// 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_) |
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
|
+ if (mts.visible_and_ready_to_draw) |
tile_version.set_rasterize_on_demand(); |
oomed_soft = true; |
@@ -1616,4 +1620,36 @@ bool TileManager::EvictionTileIterator::EvictionOrderComparator::operator()( |
return a_priority.IsHigherPriorityThan(b_priority); |
} |
+bool TileManager::IsReadyToActivate() const { |
+ 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.
|
+ it != layers_.end(); |
+ ++it) { |
+ if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw()) |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+void TileManager::ScheduleCheckIfReadyToActivate() { |
+ 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
|
+ 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 |