Chromium Code Reviews| Index: cc/tile_manager.cc |
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
| index 3dd12b2ce35077cf5d2d8c8f453e2a6c1e40997f..fa51665fabc9107bd2ddf7cad2af7eedcff70499 100644 |
| --- a/cc/tile_manager.cc |
| +++ b/cc/tile_manager.cc |
| @@ -194,7 +194,9 @@ TileManager::TileManager( |
| has_performed_uploads_since_last_flush_(false), |
| ever_exceeded_memory_budget_(false), |
| record_rendering_stats_(false), |
| - use_cheapness_estimator_(use_cheapness_estimator) { |
| + use_cheapness_estimator_(use_cheapness_estimator), |
| + allow_cheap_tasks_(true), |
| + did_schedule_cheap_tasks_(false) { |
| for (int i = 0; i < NUM_STATES; ++i) { |
| for (int j = 0; j < NUM_TREES; ++j) { |
| for (int k = 0; k < NUM_BINS; ++k) |
| @@ -454,6 +456,11 @@ void TileManager::AbortPendingTileUploads() { |
| } |
| } |
| +void TileManager::DidCompleteFrame() { |
| + allow_cheap_tasks_ = true; |
| + did_schedule_cheap_tasks_ = false; |
| +} |
| + |
| void TileManager::GetMemoryStats( |
| size_t* memoryRequiredBytes, |
| size_t* memoryNiceToHaveBytes, |
| @@ -651,7 +658,7 @@ void TileManager::FreeResourcesForTile(Tile* tile) { |
| resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); |
| } |
| -bool TileManager::CanDispatchRasterTask(Tile* tile) { |
| +bool TileManager::CanDispatchRasterTask(Tile* tile) const { |
| if (raster_worker_pool_->IsBusy()) |
| return false; |
| size_t new_bytes_pending = bytes_pending_set_pixels_; |
| @@ -670,7 +677,7 @@ void TileManager::DispatchMoreTasks() { |
| ManagedTileState& managed_state = (*it)->managed_state(); |
| if (managed_state.pending_pixel_refs.empty()) { |
| if (!CanDispatchRasterTask(*it)) |
| - return; |
| + break; |
|
reveman
2013/02/19 18:05:23
hm, this makes us enter the loop below in cases wh
Sami
2013/02/19 22:24:38
You're right. We only need to make sure the allow_
|
| DispatchOneRasterTask(*it); |
| tiles_with_image_decoding_tasks_.erase(it++); |
| } else { |
| @@ -688,11 +695,14 @@ void TileManager::DispatchMoreTasks() { |
| tiles_with_image_decoding_tasks_.push_back(tile); |
| } else { |
| if (!CanDispatchRasterTask(tile)) |
| - return; |
| + break; |
| DispatchOneRasterTask(tile); |
| } |
| tiles_that_need_to_be_rasterized_.pop_back(); |
| } |
| + |
| + if (did_schedule_cheap_tasks_) |
| + allow_cheap_tasks_ = false; |
| } |
| void TileManager::GatherPixelRefsForTile(Tile* tile) { |
| @@ -748,7 +758,7 @@ void TileManager::DispatchOneImageDecodeTask( |
| pending_decode_tasks_[pixel_ref_id] = pixel_ref; |
| raster_worker_pool_->PostTaskAndReply( |
| - base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), |
| + base::Bind(&TileManager::PerformImageDecode, pixel_ref), |
| base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| base::Unretained(this), |
| tile, |
| @@ -794,8 +804,12 @@ void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
| ResourceProvider::ResourceId resource_id = resource->id(); |
| + bool is_cheap = use_cheapness_estimator_ && allow_cheap_tasks_ && |
| + tile->picture_pile()->IsCheapInRect(tile->content_rect_, |
| + tile->contents_scale()); |
| raster_worker_pool_->PostRasterTaskAndReply( |
| tile->picture_pile(), |
| + is_cheap, |
| base::Bind(&TileManager::PerformRaster, |
| resource_pool_->resource_provider()->mapPixelBuffer( |
| resource_id), |
| @@ -808,22 +822,7 @@ void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| tile, |
| base::Passed(&resource), |
| manage_tiles_call_count_)); |
| -} |
| - |
| -void TileManager::PerformOneRaster(Tile* tile) { |
| - scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
| - ResourceProvider::ResourceId resource_id = resource->id(); |
| - |
| - PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( |
| - resource_id), |
| - tile->content_rect_, |
| - tile->contents_scale(), |
| - use_cheapness_estimator_, |
| - GetRasterTaskMetadata(tile->managed_state()), |
| - tile->picture_pile(), |
| - &rendering_stats_); |
| - |
| - OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_); |
| + did_schedule_cheap_tasks_ |= is_cheap; |
| } |
| void TileManager::OnRasterCompleted( |
| @@ -967,7 +966,7 @@ void TileManager::PerformRaster(uint8* buffer, |
| 10); |
| if (use_cheapness_estimator) { |
| - bool is_predicted_cheap = picture_pile->IsCheapInRect (rect, contents_scale); |
| + bool is_predicted_cheap = picture_pile->IsCheapInRect(rect, contents_scale); |
|
reveman
2013/02/19 18:05:23
nit: make this line <= 80 characters long
Sami
2013/02/19 22:24:38
Whoops, done.
|
| bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; |
| RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); |
| } |
| @@ -987,9 +986,9 @@ void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap, |
| } |
| // static |
| -void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, |
| +void TileManager::PerformImageDecode(skia::LazyPixelRef* pixel_ref, |
| RenderingStats* stats) { |
| - TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |
| + TRACE_EVENT0("cc", "TileManager::PerformImageDecode"); |
| base::TimeTicks decode_begin_time; |
| if (stats) |
| decode_begin_time = base::TimeTicks::HighResNow(); |