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

Side by Side Diff: cc/tile_manager.cc

Issue 11575015: adding render stats for deferred image decoding (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nit Created 8 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/tile_manager.h ('k') | tools/perf/perf_tools/smoothness_benchmark.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/tile_manager.h" 5 #include "cc/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 base::Unretained(picture_pile), 62 base::Unretained(picture_pile),
63 mapped_buffer, 63 mapped_buffer,
64 rect, 64 rect,
65 contents_scale, 65 contents_scale,
66 stats), 66 stats),
67 base::Bind(&RasterThread::RunReply, base::Unretained(this), reply)); 67 base::Bind(&RasterThread::RunReply, base::Unretained(this), reply));
68 } 68 }
69 69
70 void PostImageDecodingTaskAndReply(const tracked_objects::Location& from_here, 70 void PostImageDecodingTaskAndReply(const tracked_objects::Location& from_here,
71 skia::LazyPixelRef* pixel_ref, 71 skia::LazyPixelRef* pixel_ref,
72 RenderingStats* stats,
72 const base::Closure& reply) { 73 const base::Closure& reply) {
73 ++num_pending_tasks_; 74 ++num_pending_tasks_;
74 message_loop_proxy()->PostTaskAndReply( 75 message_loop_proxy()->PostTaskAndReply(
75 from_here, 76 from_here,
76 base::Bind(&RunImageDecodeTask, base::Unretained(pixel_ref)), 77 base::Bind(&RunImageDecodeTask, pixel_ref, stats),
77 base::Bind(&RasterThread::RunReply, base::Unretained(this), reply)); 78 base::Bind(&RasterThread::RunReply, base::Unretained(this), reply));
78 } 79 }
79 80
80 private: 81 private:
81 static void RunRasterTask(PicturePileImpl* picture_pile, 82 static void RunRasterTask(PicturePileImpl* picture_pile,
82 uint8_t* mapped_buffer, 83 uint8_t* mapped_buffer,
83 const gfx::Rect& rect, 84 const gfx::Rect& rect,
84 float contents_scale, 85 float contents_scale,
85 RenderingStats* stats) { 86 RenderingStats* stats) {
86 TRACE_EVENT0("cc", "RasterThread::RunRasterTask"); 87 TRACE_EVENT0("cc", "RasterThread::RunRasterTask");
87 DCHECK(picture_pile); 88 DCHECK(picture_pile);
88 DCHECK(mapped_buffer); 89 DCHECK(mapped_buffer);
89 SkBitmap bitmap; 90 SkBitmap bitmap;
90 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); 91 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
91 bitmap.setPixels(mapped_buffer); 92 bitmap.setPixels(mapped_buffer);
92 SkDevice device(bitmap); 93 SkDevice device(bitmap);
93 SkCanvas canvas(&device); 94 SkCanvas canvas(&device);
94 picture_pile->Raster( 95 picture_pile->Raster(
95 &canvas, 96 &canvas,
96 rect, 97 rect,
97 contents_scale, 98 contents_scale,
98 stats); 99 stats);
99 } 100 }
100 101
101 static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref) { 102 static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref,
103 RenderingStats* stats) {
102 TRACE_EVENT0("cc", "RasterThread::RunImageDecodeTask"); 104 TRACE_EVENT0("cc", "RasterThread::RunImageDecodeTask");
105 base::TimeTicks decodeBeginTime = base::TimeTicks::Now();
103 pixel_ref->Decode(); 106 pixel_ref->Decode();
107 stats->totalDeferredImageDecodeTimeInSeconds +=
108 (base::TimeTicks::Now() - decodeBeginTime).InSecondsF();
104 } 109 }
105 110
106 void RunReply(const base::Closure& reply) { 111 void RunReply(const base::Closure& reply) {
107 --num_pending_tasks_; 112 --num_pending_tasks_;
108 reply.Run(); 113 reply.Run();
109 } 114 }
110 115
111 int num_pending_tasks_; 116 int num_pending_tasks_;
112 117
113 DISALLOW_COPY_AND_ASSIGN(RasterThread); 118 DISALLOW_COPY_AND_ASSIGN(RasterThread);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 resource_pool_->resource_provider()->releasePixelBuffer( 327 resource_pool_->resource_provider()->releasePixelBuffer(
323 tile->managed_state().resource->id()); 328 tile->managed_state().resource->id());
324 329
325 DidFinishTileInitialization(tile); 330 DidFinishTileInitialization(tile);
326 tiles_with_pending_set_pixels_.pop(); 331 tiles_with_pending_set_pixels_.pop();
327 } 332 }
328 } 333 }
329 334
330 void TileManager::renderingStats(RenderingStats* stats) { 335 void TileManager::renderingStats(RenderingStats* stats) {
331 stats->totalRasterizeTimeInSeconds = 336 stats->totalRasterizeTimeInSeconds =
332 rendering_stats_.totalRasterizeTimeInSeconds; 337 rendering_stats_.totalRasterizeTimeInSeconds;
333 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; 338 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized;
339 stats->totalDeferredImageDecodeCount =
340 rendering_stats_.totalDeferredImageDecodeCount;
341 stats->totalDeferredImageCacheHitCount =
342 rendering_stats_.totalDeferredImageCacheHitCount;
343 stats->totalImageGatheringCount = rendering_stats_.totalImageGatheringCount;
344 stats->totalDeferredImageDecodeTimeInSeconds =
345 rendering_stats_.totalDeferredImageDecodeTimeInSeconds;
346 stats->totalImageGatheringTimeInSeconds =
347 rendering_stats_.totalImageGatheringTimeInSeconds;
334 } 348 }
335 349
336 void TileManager::AssignGpuMemoryToTiles() { 350 void TileManager::AssignGpuMemoryToTiles() {
337 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 351 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
338 // Some memory cannot be released. Figure out which. 352 // Some memory cannot be released. Figure out which.
339 size_t unreleasable_bytes = 0; 353 size_t unreleasable_bytes = 0;
340 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 354 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
341 Tile* tile = *it; 355 Tile* tile = *it;
342 if (!tile->managed_state().can_be_freed) 356 if (!tile->managed_state().can_be_freed)
343 unreleasable_bytes += tile->bytes_consumed_if_allocated(); 357 unreleasable_bytes += tile->bytes_consumed_if_allocated();
344 } 358 }
345 359
346 // Now give memory out to the tiles until we're out, and build 360 // Now give memory out to the tiles until we're out, and build
347 // the needs-to-be-rasterized queue. 361 // the needs-to-be-rasterized queue.
348 tiles_that_need_to_be_rasterized_.erase( 362 tiles_that_need_to_be_rasterized_.erase(
349 tiles_that_need_to_be_rasterized_.begin(), 363 tiles_that_need_to_be_rasterized_.begin(),
350 tiles_that_need_to_be_rasterized_.end()); 364 tiles_that_need_to_be_rasterized_.end());
351 365
352 // Record all the tiles in the image decoding list. A tile will not be 366 // Reset the image decoding list so that we don't mess up with tile
353 // inserted to the rasterizer queue if it is waiting for image decoding. 367 // priorities. Tiles will be added to the image decoding list again
354 std::set<Tile*> image_decoding_tile_set; 368 // when DispatchMoreTasks() is called.
355 for (std::list<Tile*>::iterator it = tiles_with_image_decoding_tasks_.begin();
356 it != tiles_with_image_decoding_tasks_.end(); ++it) {
357 image_decoding_tile_set.insert(*it);
358 }
359 tiles_with_image_decoding_tasks_.clear(); 369 tiles_with_image_decoding_tasks_.clear();
360 370
361 size_t bytes_left = global_state_.memory_limit_in_bytes - unreleasable_bytes; 371 size_t bytes_left = global_state_.memory_limit_in_bytes - unreleasable_bytes;
362 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 372 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
363 Tile* tile = *it; 373 Tile* tile = *it;
364 size_t tile_bytes = tile->bytes_consumed_if_allocated(); 374 size_t tile_bytes = tile->bytes_consumed_if_allocated();
365 ManagedTileState& managed_tile_state = tile->managed_state(); 375 ManagedTileState& managed_tile_state = tile->managed_state();
366 if (!managed_tile_state.can_be_freed) 376 if (!managed_tile_state.can_be_freed)
367 continue; 377 continue;
368 if (managed_tile_state.bin == NEVER_BIN) { 378 if (managed_tile_state.bin == NEVER_BIN) {
369 managed_tile_state.can_use_gpu_memory = false; 379 managed_tile_state.can_use_gpu_memory = false;
370 FreeResourcesForTile(tile); 380 FreeResourcesForTile(tile);
371 continue; 381 continue;
372 } 382 }
373 if (tile_bytes > bytes_left) { 383 if (tile_bytes > bytes_left) {
374 managed_tile_state.can_use_gpu_memory = false; 384 managed_tile_state.can_use_gpu_memory = false;
375 FreeResourcesForTile(tile); 385 FreeResourcesForTile(tile);
376 continue; 386 continue;
377 } 387 }
378 bytes_left -= tile_bytes; 388 bytes_left -= tile_bytes;
379 managed_tile_state.can_use_gpu_memory = true; 389 managed_tile_state.can_use_gpu_memory = true;
380 if (!managed_tile_state.resource && 390 if (!managed_tile_state.resource &&
381 !managed_tile_state.resource_is_being_initialized) { 391 !managed_tile_state.resource_is_being_initialized)
382 if (image_decoding_tile_set.end() != image_decoding_tile_set.find(tile)) 392 tiles_that_need_to_be_rasterized_.push_back(tile);
383 tiles_with_image_decoding_tasks_.push_back(tile);
384 else
385 tiles_that_need_to_be_rasterized_.push_back(tile);
386 }
387 } 393 }
388 394
389 // Reverse two tiles_that_need_* vectors such that pop_back gets 395 // Reverse two tiles_that_need_* vectors such that pop_back gets
390 // the highest priority tile. 396 // the highest priority tile.
391 std::reverse( 397 std::reverse(
392 tiles_that_need_to_be_rasterized_.begin(), 398 tiles_that_need_to_be_rasterized_.begin(),
393 tiles_that_need_to_be_rasterized_.end()); 399 tiles_that_need_to_be_rasterized_.end());
394 } 400 }
395 401
396 void TileManager::FreeResourcesForTile(Tile* tile) { 402 void TileManager::FreeResourcesForTile(Tile* tile) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 } else { 449 } else {
444 RasterThread* thread = GetFreeRasterThread(); 450 RasterThread* thread = GetFreeRasterThread();
445 if (!thread) 451 if (!thread)
446 return; 452 return;
447 DispatchOneRasterTask(thread, tile); 453 DispatchOneRasterTask(thread, tile);
448 } 454 }
449 tiles_that_need_to_be_rasterized_.pop_back(); 455 tiles_that_need_to_be_rasterized_.pop_back();
450 } 456 }
451 } 457 }
452 458
459 void TileManager::GatherPixelRefsForFile(Tile* tile) {
460 TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForFile");
461 ManagedTileState& managed_state = tile->managed_state();
462 if (managed_state.need_to_gather_pixel_refs) {
463 base::TimeTicks gatherBeginTime = base::TimeTicks::Now();
464 const_cast<PicturePileImpl *>(tile->picture_pile())->GatherPixelRefs(
465 tile->content_rect_, managed_state.pending_pixel_refs);
466 rendering_stats_.totalImageGatheringCount++;
467 rendering_stats_.totalImageGatheringTimeInSeconds +=
468 (base::TimeTicks::Now() - gatherBeginTime).InSecondsF();
469 managed_state.need_to_gather_pixel_refs = false;
470 }
471 }
472
453 void TileManager::DispatchImageDecodingTasksForTile(Tile* tile) { 473 void TileManager::DispatchImageDecodingTasksForTile(Tile* tile) {
454 ManagedTileState& managed_state = tile->managed_state(); 474 GatherPixelRefsForFile(tile);
455 if (managed_state.need_to_gather_pixel_refs) {
456 TRACE_EVENT0("cc",
457 "TileManager::DispatchImageDecodingTaskForTile: Gather PixelRefs");
458 const_cast<PicturePileImpl *>(tile->picture_pile())->GatherPixelRefs(
459 tile->content_rect_, managed_state.pending_pixel_refs);
460 managed_state.need_to_gather_pixel_refs = false;
461 }
462
463 std::list<skia::LazyPixelRef*>& pending_pixel_refs = 475 std::list<skia::LazyPixelRef*>& pending_pixel_refs =
464 tile->managed_state().pending_pixel_refs; 476 tile->managed_state().pending_pixel_refs;
465 std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin(); 477 std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin();
466 while (it != pending_pixel_refs.end()) { 478 while (it != pending_pixel_refs.end()) {
467 if (pending_decode_tasks_.end() != pending_decode_tasks_.find( 479 if (pending_decode_tasks_.end() != pending_decode_tasks_.find(
468 (*it)->getGenerationID())) { 480 (*it)->getGenerationID())) {
469 ++it; 481 ++it;
470 continue; 482 continue;
471 } 483 }
472 // TODO(qinmin): passing correct image size to PrepareToDecode(). 484 // TODO(qinmin): passing correct image size to PrepareToDecode().
473 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) { 485 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) {
486 rendering_stats_.totalDeferredImageCacheHitCount++;
474 pending_pixel_refs.erase(it++); 487 pending_pixel_refs.erase(it++);
475 } else { 488 } else {
476 RasterThread* thread = GetFreeRasterThread(); 489 RasterThread* thread = GetFreeRasterThread();
477 if (thread) 490 if (!thread)
478 DispatchOneImageDecodingTask(thread, tile, *it); 491 return;
492 DispatchOneImageDecodingTask(thread, tile, *it);
479 ++it; 493 ++it;
480 } 494 }
481 } 495 }
482 } 496 }
483 497
484 void TileManager::DispatchOneImageDecodingTask(RasterThread* thread, 498 void TileManager::DispatchOneImageDecodingTask(RasterThread* thread,
485 scoped_refptr<Tile> tile, 499 scoped_refptr<Tile> tile,
486 skia::LazyPixelRef* pixel_ref) { 500 skia::LazyPixelRef* pixel_ref) {
487 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodingTask"); 501 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodingTask");
488 uint32_t pixel_ref_id = pixel_ref->getGenerationID(); 502 uint32_t pixel_ref_id = pixel_ref->getGenerationID();
489 DCHECK(pending_decode_tasks_.end() == 503 DCHECK(pending_decode_tasks_.end() ==
490 pending_decode_tasks_.find(pixel_ref_id)); 504 pending_decode_tasks_.find(pixel_ref_id));
491 pending_decode_tasks_[pixel_ref_id] = pixel_ref; 505 pending_decode_tasks_[pixel_ref_id] = pixel_ref;
506 RenderingStats* stats = new RenderingStats();
492 507
493 thread->PostImageDecodingTaskAndReply( 508 thread->PostImageDecodingTaskAndReply(
494 FROM_HERE, 509 FROM_HERE,
495 pixel_ref, 510 pixel_ref,
511 stats,
496 base::Bind(&TileManager::OnImageDecodingTaskCompleted, 512 base::Bind(&TileManager::OnImageDecodingTaskCompleted,
497 base::Unretained(this), 513 base::Unretained(this),
498 tile, 514 tile,
499 pixel_ref_id)); 515 pixel_ref_id,
516 stats));
500 } 517 }
501 518
502 void TileManager::OnImageDecodingTaskCompleted(scoped_refptr<Tile> tile, 519 void TileManager::OnImageDecodingTaskCompleted(scoped_refptr<Tile> tile,
503 uint32_t pixel_ref_id) { 520 uint32_t pixel_ref_id,
521 RenderingStats* stats) {
504 TRACE_EVENT0("cc", "TileManager::OnImageDecoded"); 522 TRACE_EVENT0("cc", "TileManager::OnImageDecoded");
505 pending_decode_tasks_.erase(pixel_ref_id); 523 pending_decode_tasks_.erase(pixel_ref_id);
506 524 rendering_stats_.totalDeferredImageDecodeTimeInSeconds +=
525 stats->totalDeferredImageDecodeTimeInSeconds;
526 rendering_stats_.totalDeferredImageDecodeCount++;
527 delete stats;
507 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); 528 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin();
508 it != tiles_with_image_decoding_tasks_.end(); ++it) { 529 it != tiles_with_image_decoding_tasks_.end(); ++it) {
509 std::list<skia::LazyPixelRef*>& pixel_refs = 530 std::list<skia::LazyPixelRef*>& pixel_refs =
510 (*it)->managed_state().pending_pixel_refs; 531 (*it)->managed_state().pending_pixel_refs;
511 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = 532 for (std::list<skia::LazyPixelRef*>::iterator pixel_it =
512 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { 533 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) {
513 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { 534 if (pixel_ref_id == (*pixel_it)->getGenerationID()) {
514 pixel_refs.erase(pixel_it); 535 pixel_refs.erase(pixel_it);
515 break; 536 break;
516 } 537 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 } 622 }
602 623
603 void TileManager::DidFinishTileInitialization(Tile* tile) { 624 void TileManager::DidFinishTileInitialization(Tile* tile) {
604 ManagedTileState& managed_tile_state = tile->managed_state(); 625 ManagedTileState& managed_tile_state = tile->managed_state();
605 DCHECK(managed_tile_state.resource); 626 DCHECK(managed_tile_state.resource);
606 managed_tile_state.resource_is_being_initialized = false; 627 managed_tile_state.resource_is_being_initialized = false;
607 managed_tile_state.can_be_freed = true; 628 managed_tile_state.can_be_freed = true;
608 } 629 }
609 630
610 } 631 }
OLDNEW
« no previous file with comments | « cc/tile_manager.h ('k') | tools/perf/perf_tools/smoothness_benchmark.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698