Index: cc/tile_manager.cc |
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
index 83c0ab2b235d2f557631804d14967b174ae1e1bb..5986015eeafd226d2aef0535f09de4110d05214a 100644 |
--- a/cc/tile_manager.cc |
+++ b/cc/tile_manager.cc |
@@ -116,7 +116,8 @@ TileManager::TileManager( |
TileManagerClient* client, |
ResourceProvider* resource_provider, |
size_t num_raster_threads, |
- bool record_rendering_stats) |
+ bool record_rendering_stats, |
+ bool use_cheapness_estimator) |
: client_(client), |
resource_pool_(ResourcePool::Create(resource_provider)), |
raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_rendering_stats)), |
@@ -124,7 +125,8 @@ TileManager::TileManager( |
manage_tiles_call_count_(0), |
bytes_pending_set_pixels_(0), |
ever_exceeded_memory_budget_(false), |
- record_rendering_stats_(record_rendering_stats) { |
+ record_rendering_stats_(record_rendering_stats), |
+ use_cheapness_estimator_(use_cheapness_estimator) { |
for (int i = 0; i < NUM_STATES; ++i) { |
for (int j = 0; j < NUM_TREES; ++j) { |
for (int k = 0; k < NUM_BINS; ++k) |
@@ -633,8 +635,8 @@ void TileManager::OnImageDecodeTaskCompleted( |
DispatchMoreTasks(); |
} |
-void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
- TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
+scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
+ Tile* tile) { |
ManagedTileState& managed_tile_state = tile->managed_state(); |
DCHECK(managed_tile_state.can_use_gpu_memory); |
scoped_ptr<ResourcePool::Resource> resource = |
@@ -645,16 +647,22 @@ void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
managed_tile_state.can_be_freed = false; |
DidTileRasterStateChange(tile, RASTER_STATE); |
+ return resource.Pass(); |
+} |
+void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
+ TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
+ scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
ResourceProvider::ResourceId resource_id = resource->id(); |
raster_worker_pool_->PostRasterTaskAndReply( |
tile->picture_pile(), |
- base::Bind(&TileManager::RunRasterTask, |
+ base::Bind(&TileManager::PerformRaster, |
resource_pool_->resource_provider()->mapPixelBuffer( |
resource_id), |
tile->content_rect_, |
- tile->contents_scale()), |
+ tile->contents_scale(), |
+ use_cheapness_estimator_), |
base::Bind(&TileManager::OnRasterTaskCompleted, |
base::Unretained(this), |
tile, |
@@ -662,11 +670,26 @@ void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
manage_tiles_call_count_)); |
} |
-void TileManager::OnRasterTaskCompleted( |
+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_, |
+ tile->picture_pile(), |
+ &rendering_stats_); |
+ |
+ OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_); |
+} |
+ |
+void TileManager::OnRasterCompleted( |
scoped_refptr<Tile> tile, |
scoped_ptr<ResourcePool::Resource> resource, |
int manage_tiles_call_count_when_dispatched) { |
- TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); |
+ TRACE_EVENT0("cc", "TileManager::OnRasterCompleted"); |
// Release raster resources. |
resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
@@ -707,7 +730,14 @@ void TileManager::OnRasterTaskCompleted( |
managed_tile_state.resource_is_being_initialized = false; |
DidTileRasterStateChange(tile, IDLE_STATE); |
} |
+} |
+void TileManager::OnRasterTaskCompleted( |
+ scoped_refptr<Tile> tile, |
+ scoped_ptr<ResourcePool::Resource> resource, |
+ int manage_tiles_call_count_when_dispatched) { |
+ OnRasterCompleted(tile, resource.Pass(), |
+ manage_tiles_call_count_when_dispatched); |
DispatchMoreTasks(); |
} |
@@ -750,12 +780,13 @@ void TileManager::DidTileBinChange(Tile* tile, |
} |
// static |
-void TileManager::RunRasterTask(uint8* buffer, |
+void TileManager::PerformRaster(uint8* buffer, |
const gfx::Rect& rect, |
float contents_scale, |
+ bool use_cheapness_estimator, |
PicturePileImpl* picture_pile, |
RenderingStats* stats) { |
- TRACE_EVENT0("cc", "TileManager::RunRasterTask"); |
+ TRACE_EVENT0("cc", "TileManager::PerformRaster"); |
DCHECK(picture_pile); |
DCHECK(buffer); |
SkBitmap bitmap; |
@@ -774,15 +805,33 @@ void TileManager::RunRasterTask(uint8* buffer, |
base::TimeTicks end_time = base::TimeTicks::Now(); |
base::TimeDelta duration = end_time - begin_time; |
stats->totalRasterizeTime += duration; |
- UMA_HISTOGRAM_CUSTOM_COUNTS( |
- "Renderer4.PictureRasterTimeMS", |
- duration.InMilliseconds(), |
- 0, 10, 10 |
- ); |
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.PictureRasterTimeMS", |
+ duration.InMilliseconds(), |
+ 0, |
+ 10, |
+ 10); |
+ |
+ if (use_cheapness_estimator) { |
+ bool is_predicted_cheap = picture_pile->IsCheapInRect (rect, contents_scale); |
+ bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; |
+ RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); |
+ } |
} |
} |
// static |
+void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap, |
+ bool is_actually_cheap) { |
+ if (is_predicted_cheap && !is_actually_cheap) |
+ UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorBadlyWrong", true); |
+ else if (!is_predicted_cheap && is_actually_cheap) |
+ UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorSafelyWrong", true); |
+ |
+ UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorAccuracy", |
+ is_predicted_cheap == is_actually_cheap); |
+} |
+ |
+// static |
void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, |
RenderingStats* stats) { |
TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |