Chromium Code Reviews| Index: cc/tiles/tile_manager.cc |
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc |
| index 76d0a2ac9b8254cfd5fe382522880e43354be1f8..427a2b438b79dd2af50ef8cd7256086f2d085579 100644 |
| --- a/cc/tiles/tile_manager.cc |
| +++ b/cc/tiles/tile_manager.cc |
| @@ -691,7 +691,7 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() { |
| tile->scheduled_priority_ = schedule_priority++; |
| DCHECK(tile->draw_info().mode() == TileDrawInfo::OOM_MODE || |
|
vmpstr
2017/03/17 18:32:13
Can you comment this DCHECK, since it's getting a
Khushal
2017/03/27 13:57:33
Its good that you pointed this out. I hadn't reali
|
| - !tile->draw_info().IsReadyToDraw()); |
| + !tile->draw_info().IsReadyToDraw() || tile->is_checker_imaged()); |
| // If the tile already has a raster_task, then the memory used by it is |
| // already accounted for in memory_usage. Otherwise, we'll have to acquire |
| @@ -813,17 +813,31 @@ void TileManager::ScheduleTasks( |
| scoped_refptr<TileTask> all_done_task = |
| CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| + CheckerImageTracker::ImageDecodeQueue checker_image_decode_queue; |
| + |
| // Build a new task queue containing all task currently needed. Tasks |
| // are added in order of priority, highest priority task first. |
| for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
| Tile* tile = prioritized_tile.tile(); |
| DCHECK(tile->draw_info().requires_resource()); |
| - DCHECK(!tile->draw_info().resource()); |
| + DCHECK(!tile->draw_info().resource() || tile->is_checker_imaged()); |
| + |
| + bool process_tile_for_checker_images_only = |
|
vmpstr
2017/03/17 18:32:13
Comment pls
|
| + tile->draw_info().resource() && tile->is_checker_imaged(); |
| + if (process_tile_for_checker_images_only) { |
| + std::vector<DrawImage> images; |
| + ImageIdFlatSet checkered_images; |
| + FilterImagesForCheckering(prioritized_tile, &images, &checkered_images, |
| + &checker_image_decode_queue); |
| + DCHECK(!checkered_images.empty()) |
| + << "Checker-imaged state is sticky on a Tile"; |
|
vmpstr
2017/03/17 18:32:13
nit: "should be sticky", since when this fails it
|
| + continue; |
| + } |
| if (!tile->raster_task_) { |
| - tile->raster_task_ = |
| - CreateRasterTask(prioritized_tile, raster_color_space); |
| + tile->raster_task_ = CreateRasterTask( |
| + prioritized_tile, raster_color_space, &checker_image_decode_queue); |
| } |
| TileTask* task = tile->raster_task_.get(); |
| @@ -925,6 +939,12 @@ void TileManager::ScheduleTasks( |
| // in |raster_queue_|. |
| tile_task_manager_->ScheduleTasks(&graph_); |
| + // Schedule running of the checker-image decode queue. This replaces the |
| + // previously scheduled queue and effectively cancels image decodes from the |
| + // previously scheduled queue, if not already started. |
| + checker_image_tracker_.SetImageDecodeQueue( |
|
vmpstr
2017/03/17 18:32:13
Can you call this ScheduleImageDecodes or somethin
Khushal
2017/03/27 13:57:33
Done.
|
| + std::move(checker_image_decode_queue)); |
| + |
| did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| @@ -933,7 +953,8 @@ void TileManager::ScheduleTasks( |
| scoped_refptr<TileTask> TileManager::CreateRasterTask( |
| const PrioritizedTile& prioritized_tile, |
| - const gfx::ColorSpace& color_space) { |
| + const gfx::ColorSpace& color_space, |
| + CheckerImageTracker::ImageDecodeQueue* checker_image_decode_queue) { |
| Tile* tile = prioritized_tile.tile(); |
| // Get the resource. |
| @@ -966,10 +987,10 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( |
| ImageIdFlatSet images_to_skip; |
| images.clear(); |
| if (!playback_settings.skip_images) { |
| - prioritized_tile.raster_source()->GetDiscardableImagesInRect( |
| - tile->enclosing_layer_rect(), tile->contents_scale(), &images); |
| - checker_image_tracker_.FilterImagesForCheckeringForTile( |
| - &images, &images_to_skip, prioritized_tile.tile()->tiling()->tree()); |
| + FilterImagesForCheckering(prioritized_tile, &images, &images_to_skip, |
| + checker_image_decode_queue); |
| + if (!images_to_skip.empty()) |
| + tile->set_is_checker_imaged(); |
| } |
| // We can skip the image hijack canvas if we have no images, or no images to |
| @@ -994,6 +1015,31 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( |
| use_gpu_rasterization_)); |
| } |
| +void TileManager::FilterImagesForCheckering( |
| + const PrioritizedTile& prioritized_tile, |
| + std::vector<DrawImage>* images_to_decode, |
| + ImageIdFlatSet* checker_images, |
| + CheckerImageTracker::ImageDecodeQueue* checker_image_decode_queue) { |
| + DCHECK_EQ(images_to_decode->size(), 0u); |
| + DCHECK_EQ(checker_images->size(), 0u); |
| + |
| + const Tile* tile = prioritized_tile.tile(); |
| + std::vector<DrawImage> images_in_tile; |
| + prioritized_tile.raster_source()->GetDiscardableImagesInRect( |
|
vmpstr
2017/03/17 18:32:13
I'd prefer you leave this call outside and pass th
Khushal
2017/03/27 13:57:33
Done.
|
| + tile->enclosing_layer_rect(), tile->contents_scale(), &images_in_tile); |
| + for (auto draw_image : images_in_tile) { |
| + const sk_sp<const SkImage>& image = draw_image.image(); |
| + DCHECK(image->isLazyGenerated()); |
| + if (checker_image_tracker_.ShouldCheckerImage(image, |
| + tile->tiling()->tree())) { |
| + checker_images->insert(image->uniqueID()); |
| + checker_image_decode_queue->push_back(std::move(image)); |
| + } else { |
| + images_to_decode->push_back(draw_image); |
| + } |
| + } |
| +} |
| + |
| void TileManager::ResetSignalsForTesting() { |
| signals_.reset(); |
| } |