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

Unified Diff: cc/tiles/tile_manager.cc

Issue 2924233002: cc: Move pre-decodes to background worker. (Closed)
Patch Set: flake is flaky. T_T Created 3 years, 6 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
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/tile_manager.cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 7597883e12594fa6fd145ad0b2290a54977d8cee..2e781299d8b01f76724139a2e1fab35937d9912f 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -497,6 +497,12 @@ bool TileManager::PrepareTiles(
signals_.reset();
global_state_ = state;
+ // Ensure that we don't schedule any decode work for checkered images until
+ // the raster work for visible tiles is complete. This is done in
+ // CheckAndIssueSignals when the ready to activate/draw signals are dispatched
+ // to the client.
+ checker_image_tracker_.SetNoDecodesAllowed();
+
// We need to call CheckForCompletedTasks() once in-between each call
// to ScheduleTasks() to prevent canceled tasks from being scheduled.
if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
@@ -513,7 +519,7 @@ bool TileManager::PrepareTiles(
prioritized_work.tiles_to_raster.front().tile()->required_for_draw());
// Schedule tile tasks.
- ScheduleTasks(prioritized_work);
+ ScheduleTasks(std::move(prioritized_work));
TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
"state", BasicStateAsValue());
@@ -709,6 +715,7 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() {
AddCheckeredImagesToDecodeQueue(
prioritized_tile, raster_color_space,
+ CheckerImageTracker::DecodeType::kRaster,
&work_to_schedule.checker_image_decode_queue);
continue;
}
@@ -767,6 +774,7 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() {
prioritized_tile.should_decode_checkered_images_for_tile()) {
AddCheckeredImagesToDecodeQueue(
prioritized_tile, raster_color_space,
+ CheckerImageTracker::DecodeType::kRaster,
&work_to_schedule.checker_image_decode_queue);
}
} else {
@@ -809,6 +817,7 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() {
tile->raster_task_scheduled_with_checker_images()) {
AddCheckeredImagesToDecodeQueue(
prioritized_tile, raster_color_space,
+ CheckerImageTracker::DecodeType::kRaster,
&work_to_schedule.checker_image_decode_queue);
}
}
@@ -878,6 +887,7 @@ void TileManager::PartitionImagesForCheckering(
void TileManager::AddCheckeredImagesToDecodeQueue(
const PrioritizedTile& prioritized_tile,
const gfx::ColorSpace& raster_color_space,
+ CheckerImageTracker::DecodeType decode_type,
CheckerImageTracker::ImageDecodeQueue* image_decode_queue) {
Tile* tile = prioritized_tile.tile();
std::vector<DrawImage> images_in_tile;
@@ -887,13 +897,14 @@ void TileManager::AddCheckeredImagesToDecodeQueue(
WhichTree tree = tile->tiling()->tree();
for (auto& draw_image : images_in_tile) {
- if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree))
- image_decode_queue->push_back(draw_image.paint_image());
+ if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) {
+ image_decode_queue->push_back(CheckerImageTracker::ImageDecodeRequest(
+ draw_image.paint_image(), decode_type));
+ }
}
}
-void TileManager::ScheduleTasks(
- const PrioritizedWorkToSchedule& work_to_schedule) {
+void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) {
const std::vector<PrioritizedTile>& tiles_that_need_to_be_rasterized =
work_to_schedule.tiles_to_raster;
TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
@@ -973,16 +984,23 @@ void TileManager::ScheduleTasks(
work_to_schedule.tiles_to_process_for_images;
std::vector<DrawImage> new_locked_images;
for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) {
- Tile* tile = prioritized_tile.tile();
+ std::vector<DrawImage> sync_decoded_images;
+ std::vector<PaintImage> checkered_images;
+ PartitionImagesForCheckering(prioritized_tile, raster_color_space,
+ &sync_decoded_images, &checkered_images);
- // TODO(khushalsagar): Send these images to the ImageDecodeService, through
- // the CheckerImageTracker as well. See crbug.com/691087.
- std::vector<DrawImage> images;
- prioritized_tile.raster_source()->GetDiscardableImagesInRect(
- tile->enclosing_layer_rect(), tile->raster_transform().scale(),
- raster_color_space, &images);
- new_locked_images.insert(new_locked_images.end(), images.begin(),
- images.end());
+ // Add the sync decoded images to |new_locked_images| so they can be added
+ // to the task graph.
+ new_locked_images.insert(new_locked_images.end(),
+ sync_decoded_images.begin(),
+ sync_decoded_images.end());
+
+ // For checkered-images, send them to the decode service.
+ for (auto& image : checkered_images) {
+ work_to_schedule.checker_image_decode_queue.push_back(
+ CheckerImageTracker::ImageDecodeRequest(
+ std::move(image), CheckerImageTracker::DecodeType::kPreDecode));
+ }
}
// TODO(vmpstr): SOON is misleading here, but these images can come from
@@ -1107,8 +1125,11 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
// or are occluded on the pending tree. While we still need to continue
// skipping images for these tiles, we don't need to decode them since
// they will not be required on the next active tree.
- if (prioritized_tile.should_decode_checkered_images_for_tile())
- checker_image_decode_queue->push_back(image);
+ if (prioritized_tile.should_decode_checkered_images_for_tile()) {
+ checker_image_decode_queue->push_back(
+ CheckerImageTracker::ImageDecodeRequest(
+ image, CheckerImageTracker::DecodeType::kRaster));
+ }
}
}
@@ -1307,6 +1328,19 @@ void TileManager::CheckAndIssueSignals() {
client_->NotifyAllTileTasksCompleted();
}
}
+
+ // Allow decodes for rasterized tiles if all required for draw/activate tiles
+ // are done. And pre-decode tiles once all tile tasks are done.
+ // Note that the order is important here, since all signals could have become
+ // true and in that case we want to allow the most decodes.
+ if (signals_.did_notify_all_tile_tasks_completed) {
+ checker_image_tracker_.SetMaxDecodePriorityAllowed(
+ CheckerImageTracker::DecodeType::kPreDecode);
+ } else if (signals_.did_notify_ready_to_activate &&
+ signals_.did_notify_ready_to_draw) {
+ checker_image_tracker_.SetMaxDecodePriorityAllowed(
+ CheckerImageTracker::DecodeType::kRaster);
+ }
}
void TileManager::CheckIfMoreTilesNeedToBePrepared() {
@@ -1326,7 +1360,7 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() {
// |tiles_that_need_to_be_rasterized| will be empty when we reach a
// steady memory state. Keep scheduling tasks until we reach this state.
if (!work_to_schedule.tiles_to_raster.empty()) {
- ScheduleTasks(work_to_schedule);
+ ScheduleTasks(std::move(work_to_schedule));
return;
}
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698