| Index: cc/tile_manager.cc
|
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
|
| index 06b5090ccfcf5407a7a4bfc2ab7641dd42b4d263..7215b29a1de3d63666fd31cab1c667bfbc98cb26 100644
|
| --- a/cc/tile_manager.cc
|
| +++ b/cc/tile_manager.cc
|
| @@ -69,11 +69,12 @@ class RasterThread : public base::Thread {
|
|
|
| void PostImageDecodingTaskAndReply(const tracked_objects::Location& from_here,
|
| skia::LazyPixelRef* pixel_ref,
|
| + RenderingStats* stats,
|
| const base::Closure& reply) {
|
| ++num_pending_tasks_;
|
| message_loop_proxy()->PostTaskAndReply(
|
| from_here,
|
| - base::Bind(&RunImageDecodeTask, base::Unretained(pixel_ref)),
|
| + base::Bind(&RunImageDecodeTask, pixel_ref, stats),
|
| base::Bind(&RasterThread::RunReply, base::Unretained(this), reply));
|
| }
|
|
|
| @@ -98,9 +99,13 @@ class RasterThread : public base::Thread {
|
| stats);
|
| }
|
|
|
| - static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref) {
|
| + static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref,
|
| + RenderingStats* stats) {
|
| TRACE_EVENT0("cc", "RasterThread::RunImageDecodeTask");
|
| + base::TimeTicks decodeBeginTime = base::TimeTicks::Now();
|
| pixel_ref->Decode();
|
| + stats->totalDeferredImageDecodeTimeInSeconds +=
|
| + (base::TimeTicks::Now() - decodeBeginTime).InSecondsF();
|
| }
|
|
|
| void RunReply(const base::Closure& reply) {
|
| @@ -329,8 +334,17 @@ void TileManager::CheckForCompletedSetPixels() {
|
|
|
| void TileManager::renderingStats(RenderingStats* stats) {
|
| stats->totalRasterizeTimeInSeconds =
|
| - rendering_stats_.totalRasterizeTimeInSeconds;
|
| + rendering_stats_.totalRasterizeTimeInSeconds;
|
| stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized;
|
| + stats->totalDeferredImageDecodeCount =
|
| + rendering_stats_.totalDeferredImageDecodeCount;
|
| + stats->totalDeferredImageCacheHitCount =
|
| + rendering_stats_.totalDeferredImageCacheHitCount;
|
| + stats->totalImageGatheringCount = rendering_stats_.totalImageGatheringCount;
|
| + stats->totalDeferredImageDecodeTimeInSeconds =
|
| + rendering_stats_.totalDeferredImageDecodeTimeInSeconds;
|
| + stats->totalImageGatheringTimeInSeconds =
|
| + rendering_stats_.totalImageGatheringTimeInSeconds;
|
| }
|
|
|
| void TileManager::AssignGpuMemoryToTiles() {
|
| @@ -349,13 +363,9 @@ void TileManager::AssignGpuMemoryToTiles() {
|
| tiles_that_need_to_be_rasterized_.begin(),
|
| tiles_that_need_to_be_rasterized_.end());
|
|
|
| - // Record all the tiles in the image decoding list. A tile will not be
|
| - // inserted to the rasterizer queue if it is waiting for image decoding.
|
| - std::set<Tile*> image_decoding_tile_set;
|
| - for (std::list<Tile*>::iterator it = tiles_with_image_decoding_tasks_.begin();
|
| - it != tiles_with_image_decoding_tasks_.end(); ++it) {
|
| - image_decoding_tile_set.insert(*it);
|
| - }
|
| + // Reset the image decoding list so that we don't mess up with tile
|
| + // priorities. Tiles will be added to the image decoding list again
|
| + // when DispatchMoreTasks() is called.
|
| tiles_with_image_decoding_tasks_.clear();
|
|
|
| size_t bytes_left = global_state_.memory_limit_in_bytes - unreleasable_bytes;
|
| @@ -378,12 +388,8 @@ void TileManager::AssignGpuMemoryToTiles() {
|
| bytes_left -= tile_bytes;
|
| managed_tile_state.can_use_gpu_memory = true;
|
| if (!managed_tile_state.resource &&
|
| - !managed_tile_state.resource_is_being_initialized) {
|
| - if (image_decoding_tile_set.end() != image_decoding_tile_set.find(tile))
|
| - tiles_with_image_decoding_tasks_.push_back(tile);
|
| - else
|
| - tiles_that_need_to_be_rasterized_.push_back(tile);
|
| - }
|
| + !managed_tile_state.resource_is_being_initialized)
|
| + tiles_that_need_to_be_rasterized_.push_back(tile);
|
| }
|
|
|
| // Reverse two tiles_that_need_* vectors such that pop_back gets
|
| @@ -450,16 +456,22 @@ void TileManager::DispatchMoreTasks() {
|
| }
|
| }
|
|
|
| -void TileManager::DispatchImageDecodingTasksForTile(Tile* tile) {
|
| +void TileManager::GatherPixelRefsForFile(Tile* tile) {
|
| + TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForFile");
|
| ManagedTileState& managed_state = tile->managed_state();
|
| if (managed_state.need_to_gather_pixel_refs) {
|
| - TRACE_EVENT0("cc",
|
| - "TileManager::DispatchImageDecodingTaskForTile: Gather PixelRefs");
|
| + base::TimeTicks gatherBeginTime = base::TimeTicks::Now();
|
| const_cast<PicturePileImpl *>(tile->picture_pile())->GatherPixelRefs(
|
| tile->content_rect_, managed_state.pending_pixel_refs);
|
| + rendering_stats_.totalImageGatheringCount++;
|
| + rendering_stats_.totalImageGatheringTimeInSeconds +=
|
| + (base::TimeTicks::Now() - gatherBeginTime).InSecondsF();
|
| managed_state.need_to_gather_pixel_refs = false;
|
| }
|
| +}
|
|
|
| +void TileManager::DispatchImageDecodingTasksForTile(Tile* tile) {
|
| + GatherPixelRefsForFile(tile);
|
| std::list<skia::LazyPixelRef*>& pending_pixel_refs =
|
| tile->managed_state().pending_pixel_refs;
|
| std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin();
|
| @@ -471,11 +483,13 @@ void TileManager::DispatchImageDecodingTasksForTile(Tile* tile) {
|
| }
|
| // TODO(qinmin): passing correct image size to PrepareToDecode().
|
| if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) {
|
| + rendering_stats_.totalDeferredImageCacheHitCount++;
|
| pending_pixel_refs.erase(it++);
|
| } else {
|
| RasterThread* thread = GetFreeRasterThread();
|
| - if (thread)
|
| - DispatchOneImageDecodingTask(thread, tile, *it);
|
| + if (!thread)
|
| + return;
|
| + DispatchOneImageDecodingTask(thread, tile, *it);
|
| ++it;
|
| }
|
| }
|
| @@ -489,21 +503,28 @@ void TileManager::DispatchOneImageDecodingTask(RasterThread* thread,
|
| DCHECK(pending_decode_tasks_.end() ==
|
| pending_decode_tasks_.find(pixel_ref_id));
|
| pending_decode_tasks_[pixel_ref_id] = pixel_ref;
|
| + RenderingStats* stats = new RenderingStats();
|
|
|
| thread->PostImageDecodingTaskAndReply(
|
| FROM_HERE,
|
| pixel_ref,
|
| + stats,
|
| base::Bind(&TileManager::OnImageDecodingTaskCompleted,
|
| base::Unretained(this),
|
| tile,
|
| - pixel_ref_id));
|
| + pixel_ref_id,
|
| + stats));
|
| }
|
|
|
| void TileManager::OnImageDecodingTaskCompleted(scoped_refptr<Tile> tile,
|
| - uint32_t pixel_ref_id) {
|
| + uint32_t pixel_ref_id,
|
| + RenderingStats* stats) {
|
| TRACE_EVENT0("cc", "TileManager::OnImageDecoded");
|
| pending_decode_tasks_.erase(pixel_ref_id);
|
| -
|
| + rendering_stats_.totalDeferredImageDecodeTimeInSeconds +=
|
| + stats->totalDeferredImageDecodeTimeInSeconds;
|
| + rendering_stats_.totalDeferredImageDecodeCount++;
|
| + delete stats;
|
| for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin();
|
| it != tiles_with_image_decoding_tasks_.end(); ++it) {
|
| std::list<skia::LazyPixelRef*>& pixel_refs =
|
|
|