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

Side by Side Diff: cc/tile_manager.cc

Issue 12192025: Add cheapness predictor success histogram (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased the change on top of (partial) 12194015 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 unified diff | Download patch | Annotate | Revision Log
« cc/picture_pile_impl.cc ('K') | « cc/tile_manager.h ('k') | no next file » | 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 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 109
110 ManagedTileState::~ManagedTileState() { 110 ManagedTileState::~ManagedTileState() {
111 DCHECK(!resource); 111 DCHECK(!resource);
112 DCHECK(!resource_is_being_initialized); 112 DCHECK(!resource_is_being_initialized);
113 } 113 }
114 114
115 TileManager::TileManager( 115 TileManager::TileManager(
116 TileManagerClient* client, 116 TileManagerClient* client,
117 ResourceProvider* resource_provider, 117 ResourceProvider* resource_provider,
118 size_t num_raster_threads, 118 size_t num_raster_threads,
119 bool record_rendering_stats) 119 bool record_rendering_stats,
120 bool use_cheapness_estimator)
120 : client_(client), 121 : client_(client),
121 resource_pool_(ResourcePool::Create(resource_provider)), 122 resource_pool_(ResourcePool::Create(resource_provider)),
122 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_re ndering_stats)), 123 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_re ndering_stats)),
123 manage_tiles_pending_(false), 124 manage_tiles_pending_(false),
124 manage_tiles_call_count_(0), 125 manage_tiles_call_count_(0),
125 bytes_pending_set_pixels_(0), 126 bytes_pending_set_pixels_(0),
126 ever_exceeded_memory_budget_(false), 127 ever_exceeded_memory_budget_(false),
127 record_rendering_stats_(record_rendering_stats) { 128 record_rendering_stats_(record_rendering_stats),
129 use_cheapness_estimator_(use_cheapness_estimator) {
128 for (int i = 0; i < NUM_STATES; ++i) { 130 for (int i = 0; i < NUM_STATES; ++i) {
129 for (int j = 0; j < NUM_TREES; ++j) { 131 for (int j = 0; j < NUM_TREES; ++j) {
130 for (int k = 0; k < NUM_BINS; ++k) 132 for (int k = 0; k < NUM_BINS; ++k)
131 raster_state_count_[i][j][k] = 0; 133 raster_state_count_[i][j][k] = 0;
132 } 134 }
133 } 135 }
134 } 136 }
135 137
136 TileManager::~TileManager() { 138 TileManager::~TileManager() {
137 // Reset global state and manage. This should cause 139 // Reset global state and manage. This should cause
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { 628 if (pixel_ref_id == (*pixel_it)->getGenerationID()) {
627 pixel_refs.erase(pixel_it); 629 pixel_refs.erase(pixel_it);
628 break; 630 break;
629 } 631 }
630 } 632 }
631 } 633 }
632 634
633 DispatchMoreTasks(); 635 DispatchMoreTasks();
634 } 636 }
635 637
636 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { 638 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster(
637 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); 639 Tile* tile) {
638 ManagedTileState& managed_tile_state = tile->managed_state(); 640 ManagedTileState& managed_tile_state = tile->managed_state();
639 DCHECK(managed_tile_state.can_use_gpu_memory); 641 DCHECK(managed_tile_state.can_use_gpu_memory);
640 scoped_ptr<ResourcePool::Resource> resource = 642 scoped_ptr<ResourcePool::Resource> resource =
641 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); 643 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_);
642 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); 644 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id());
643 645
644 managed_tile_state.resource_is_being_initialized = true; 646 managed_tile_state.resource_is_being_initialized = true;
645 managed_tile_state.can_be_freed = false; 647 managed_tile_state.can_be_freed = false;
646 648
647 DidTileRasterStateChange(tile, RASTER_STATE); 649 DidTileRasterStateChange(tile, RASTER_STATE);
650 return resource.Pass();
651 }
648 652
653 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) {
654 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask");
655 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
649 ResourceProvider::ResourceId resource_id = resource->id(); 656 ResourceProvider::ResourceId resource_id = resource->id();
650 657
651 raster_worker_pool_->PostRasterTaskAndReply( 658 raster_worker_pool_->PostRasterTaskAndReply(
652 tile->picture_pile(), 659 tile->picture_pile(),
653 base::Bind(&TileManager::RunRasterTask, 660 base::Bind(&TileManager::PerformRaster,
654 resource_pool_->resource_provider()->mapPixelBuffer( 661 resource_pool_->resource_provider()->mapPixelBuffer(
655 resource_id), 662 resource_id),
656 tile->content_rect_, 663 tile->content_rect_,
657 tile->contents_scale()), 664 tile->contents_scale(),
665 use_cheapness_estimator_),
658 base::Bind(&TileManager::OnRasterTaskCompleted, 666 base::Bind(&TileManager::OnRasterTaskCompleted,
659 base::Unretained(this), 667 base::Unretained(this),
660 tile, 668 tile,
661 base::Passed(&resource), 669 base::Passed(&resource),
662 manage_tiles_call_count_)); 670 manage_tiles_call_count_));
663 } 671 }
664 672
665 void TileManager::OnRasterTaskCompleted( 673 void TileManager::PerformOneRaster(Tile* tile) {
674 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
675 ResourceProvider::ResourceId resource_id = resource->id();
676
677 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer(
678 resource_id),
679 tile->content_rect_,
680 tile->contents_scale(),
681 use_cheapness_estimator_,
682 tile->picture_pile(),
683 &rendering_stats_);
684
685 OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_);
686 }
687
688 void TileManager::OnRasterCompleted(
666 scoped_refptr<Tile> tile, 689 scoped_refptr<Tile> tile,
667 scoped_ptr<ResourcePool::Resource> resource, 690 scoped_ptr<ResourcePool::Resource> resource,
668 int manage_tiles_call_count_when_dispatched) { 691 int manage_tiles_call_count_when_dispatched) {
669 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); 692 TRACE_EVENT0("cc", "TileManager::OnRasterCompleted");
670 693
671 // Release raster resources. 694 // Release raster resources.
672 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); 695 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id());
673 696
674 ManagedTileState& managed_tile_state = tile->managed_state(); 697 ManagedTileState& managed_tile_state = tile->managed_state();
675 managed_tile_state.can_be_freed = true; 698 managed_tile_state.can_be_freed = true;
676 699
677 // Tile can be freed after the completion of the raster task. Call 700 // Tile can be freed after the completion of the raster task. Call
678 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority 701 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority
679 // tiles if ManageTiles() was called since task was dispatched. The result 702 // tiles if ManageTiles() was called since task was dispatched. The result
(...skipping 20 matching lines...) Expand all
700 723
701 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); 724 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated();
702 DidTileRasterStateChange(tile, SET_PIXELS_STATE); 725 DidTileRasterStateChange(tile, SET_PIXELS_STATE);
703 tiles_with_pending_set_pixels_.push(tile); 726 tiles_with_pending_set_pixels_.push(tile);
704 } else { 727 } else {
705 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); 728 resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
706 resource_pool_->ReleaseResource(resource.Pass()); 729 resource_pool_->ReleaseResource(resource.Pass());
707 managed_tile_state.resource_is_being_initialized = false; 730 managed_tile_state.resource_is_being_initialized = false;
708 DidTileRasterStateChange(tile, IDLE_STATE); 731 DidTileRasterStateChange(tile, IDLE_STATE);
709 } 732 }
733 }
710 734
735 void TileManager::OnRasterTaskCompleted(
736 scoped_refptr<Tile> tile,
737 scoped_ptr<ResourcePool::Resource> resource,
738 int manage_tiles_call_count_when_dispatched) {
739 OnRasterCompleted(tile, resource.Pass(),
740 manage_tiles_call_count_when_dispatched);
711 DispatchMoreTasks(); 741 DispatchMoreTasks();
712 } 742 }
713 743
714 void TileManager::DidFinishTileInitialization(Tile* tile) { 744 void TileManager::DidFinishTileInitialization(Tile* tile) {
715 ManagedTileState& managed_tile_state = tile->managed_state(); 745 ManagedTileState& managed_tile_state = tile->managed_state();
716 DCHECK(managed_tile_state.resource); 746 DCHECK(managed_tile_state.resource);
717 managed_tile_state.resource_is_being_initialized = false; 747 managed_tile_state.resource_is_being_initialized = false;
718 managed_tile_state.can_be_freed = true; 748 managed_tile_state.can_be_freed = true;
719 } 749 }
720 750
(...skipping 22 matching lines...) Expand all
743 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; 773 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]];
744 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); 774 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0);
745 775
746 // Increment count for new bin. 776 // Increment count for new bin.
747 ++raster_state_count_[mts.raster_state][tree][bin]; 777 ++raster_state_count_[mts.raster_state][tree][bin];
748 778
749 mts.tree_bin[tree] = bin; 779 mts.tree_bin[tree] = bin;
750 } 780 }
751 781
752 // static 782 // static
753 void TileManager::RunRasterTask(uint8* buffer, 783 void TileManager::PerformRaster(uint8* buffer,
754 const gfx::Rect& rect, 784 const gfx::Rect& rect,
755 float contents_scale, 785 float contents_scale,
786 bool use_cheapness_estimator,
756 PicturePileImpl* picture_pile, 787 PicturePileImpl* picture_pile,
757 RenderingStats* stats) { 788 RenderingStats* stats) {
758 TRACE_EVENT0("cc", "TileManager::RunRasterTask"); 789 TRACE_EVENT0("cc", "TileManager::PerformRaster");
759 DCHECK(picture_pile); 790 DCHECK(picture_pile);
760 DCHECK(buffer); 791 DCHECK(buffer);
761 SkBitmap bitmap; 792 SkBitmap bitmap;
762 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); 793 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
763 bitmap.setPixels(buffer); 794 bitmap.setPixels(buffer);
764 SkDevice device(bitmap); 795 SkDevice device(bitmap);
765 SkCanvas canvas(&device); 796 SkCanvas canvas(&device);
766 797
767 base::TimeTicks begin_time; 798 base::TimeTicks begin_time;
768 if (stats) 799 if (stats)
769 begin_time = base::TimeTicks::Now(); 800 begin_time = base::TimeTicks::Now();
770 801
771 picture_pile->Raster(&canvas, rect, contents_scale, stats); 802 picture_pile->Raster(&canvas, rect, contents_scale, stats);
772 803
773 if (stats) { 804 if (stats) {
774 base::TimeTicks end_time = base::TimeTicks::Now(); 805 base::TimeTicks end_time = base::TimeTicks::Now();
775 base::TimeDelta duration = end_time - begin_time; 806 base::TimeDelta duration = end_time - begin_time;
776 stats->totalRasterizeTime += duration; 807 stats->totalRasterizeTime += duration;
777 UMA_HISTOGRAM_CUSTOM_COUNTS( 808 UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.PictureRasterTimeMS",
778 "Renderer4.PictureRasterTimeMS", 809 duration.InMilliseconds(),
779 duration.InMilliseconds(), 810 0,
780 0, 10, 10 811 10,
781 ); 812 10);
813
814 if (use_cheapness_estimator) {
815 bool is_predicted_cheap = picture_pile->IsCheapInRect (rect, contents_scal e);
816 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f;
817 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap);
818 }
782 } 819 }
783 } 820 }
784 821
785 // static 822 // static
823 void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap,
824 bool is_actually_cheap) {
825 if (is_predicted_cheap && !is_actually_cheap)
826 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorBadlyWrong", true);
827 else if (!is_predicted_cheap && is_actually_cheap)
828 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorSafelyWrong", true);
829
830 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorAccuracy",
831 is_predicted_cheap == is_actually_cheap);
832 }
833
834 // static
786 void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, 835 void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref,
787 RenderingStats* stats) { 836 RenderingStats* stats) {
788 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); 837 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask");
789 base::TimeTicks decode_begin_time; 838 base::TimeTicks decode_begin_time;
790 if (stats) 839 if (stats)
791 decode_begin_time = base::TimeTicks::Now(); 840 decode_begin_time = base::TimeTicks::Now();
792 pixel_ref->Decode(); 841 pixel_ref->Decode();
793 if (stats) { 842 if (stats) {
794 stats->totalDeferredImageDecodeCount++; 843 stats->totalDeferredImageDecodeCount++;
795 stats->totalDeferredImageDecodeTime += 844 stats->totalDeferredImageDecodeTime +=
796 base::TimeTicks::Now() - decode_begin_time; 845 base::TimeTicks::Now() - decode_begin_time;
797 } 846 }
798 } 847 }
799 848
800 } // namespace cc 849 } // namespace cc
OLDNEW
« cc/picture_pile_impl.cc ('K') | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698