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

Unified Diff: cc/tile_manager.cc

Issue 12194015: cc: Rasterize cheap tiles immediately (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Post a task to run cheap tasks. Created 7 years, 10 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/tile_manager.cc
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
index 6a70ca3267e43eb701f249c5854af12a5a238cbf..55ec7bf40a3a2d9930482cad95a07f71903c0526 100644
--- a/cc/tile_manager.cc
+++ b/cc/tile_manager.cc
@@ -187,7 +187,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)
@@ -442,6 +444,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,
@@ -639,7 +646,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_;
@@ -658,7 +665,7 @@ void TileManager::DispatchMoreTasks() {
ManagedTileState& managed_state = (*it)->managed_state();
if (managed_state.pending_pixel_refs.empty()) {
if (!CanDispatchRasterTask(*it))
- return;
+ break;
DispatchOneRasterTask(*it);
tiles_with_image_decoding_tasks_.erase(it++);
} else {
@@ -676,11 +683,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) {
@@ -736,7 +746,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,
@@ -782,8 +792,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),
@@ -796,22 +810,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(
@@ -952,7 +951,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);
bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f;
RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap);
}
@@ -972,9 +971,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::Now();

Powered by Google App Engine
This is Rietveld 408576698