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

Side by Side Diff: cc/resources/tile_manager.cc

Issue 69343005: Added preliminary support for tile rasterization with Ganesh (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ported scissoring fix from gr_layer patch. Created 7 years, 1 month 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
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/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
162 state->SetInteger("completed_count", stats.completed_count); 162 state->SetInteger("completed_count", stats.completed_count);
163 state->SetInteger("canceled_count", stats.canceled_count); 163 state->SetInteger("canceled_count", stats.canceled_count);
164 return state.PassAs<base::Value>(); 164 return state.PassAs<base::Value>();
165 } 165 }
166 166
167 // static 167 // static
168 scoped_ptr<TileManager> TileManager::Create( 168 scoped_ptr<TileManager> TileManager::Create(
169 TileManagerClient* client, 169 TileManagerClient* client,
170 ResourceProvider* resource_provider, 170 ResourceProvider* resource_provider,
171 ContextProvider* context_provider,
171 size_t num_raster_threads, 172 size_t num_raster_threads,
172 RenderingStatsInstrumentation* rendering_stats_instrumentation, 173 RenderingStatsInstrumentation* rendering_stats_instrumentation,
173 bool use_map_image, 174 bool use_map_image,
175 bool use_ganesh,
174 size_t max_transfer_buffer_usage_bytes, 176 size_t max_transfer_buffer_usage_bytes,
175 size_t max_raster_usage_bytes) { 177 size_t max_raster_usage_bytes) {
176 return make_scoped_ptr( 178 return make_scoped_ptr(
177 new TileManager(client, 179 new TileManager(client,
178 resource_provider, 180 resource_provider,
179 use_map_image ? 181 use_map_image ?
180 ImageRasterWorkerPool::Create( 182 ImageRasterWorkerPool::Create(
181 resource_provider, num_raster_threads) : 183 resource_provider, num_raster_threads) :
182 PixelBufferRasterWorkerPool::Create( 184 PixelBufferRasterWorkerPool::Create(
183 resource_provider, 185 resource_provider,
184 num_raster_threads, 186 num_raster_threads,
185 max_transfer_buffer_usage_bytes), 187 max_transfer_buffer_usage_bytes),
188 use_ganesh ?
189 GaneshRasterizer::Create(
190 context_provider, resource_provider)
191 : scoped_ptr<GaneshRasterizer>(),
186 num_raster_threads, 192 num_raster_threads,
187 max_raster_usage_bytes, 193 max_raster_usage_bytes,
188 rendering_stats_instrumentation)); 194 rendering_stats_instrumentation));
189 } 195 }
190 196
191 TileManager::TileManager( 197 TileManager::TileManager(
192 TileManagerClient* client, 198 TileManagerClient* client,
193 ResourceProvider* resource_provider, 199 ResourceProvider* resource_provider,
194 scoped_ptr<RasterWorkerPool> raster_worker_pool, 200 scoped_ptr<RasterWorkerPool> raster_worker_pool,
201 scoped_ptr<GaneshRasterizer> ganesh_rasterizer,
195 size_t num_raster_threads, 202 size_t num_raster_threads,
196 size_t max_raster_usage_bytes, 203 size_t max_raster_usage_bytes,
197 RenderingStatsInstrumentation* rendering_stats_instrumentation) 204 RenderingStatsInstrumentation* rendering_stats_instrumentation)
198 : client_(client), 205 : client_(client),
199 resource_pool_(ResourcePool::Create(resource_provider)), 206 resource_pool_(ResourcePool::Create(resource_provider)),
200 raster_worker_pool_(raster_worker_pool.Pass()), 207 raster_worker_pool_(raster_worker_pool.Pass()),
208 ganesh_rasterizer_(ganesh_rasterizer.Pass()),
201 prioritized_tiles_dirty_(false), 209 prioritized_tiles_dirty_(false),
202 all_tiles_that_need_to_be_rasterized_have_memory_(true), 210 all_tiles_that_need_to_be_rasterized_have_memory_(true),
203 all_tiles_required_for_activation_have_memory_(true), 211 all_tiles_required_for_activation_have_memory_(true),
204 memory_required_bytes_(0), 212 memory_required_bytes_(0),
205 memory_nice_to_have_bytes_(0), 213 memory_nice_to_have_bytes_(0),
206 bytes_releasable_(0), 214 bytes_releasable_(0),
207 resources_releasable_(0), 215 resources_releasable_(0),
208 max_raster_usage_bytes_(max_raster_usage_bytes), 216 max_raster_usage_bytes_(max_raster_usage_bytes),
209 ever_exceeded_memory_budget_(false), 217 ever_exceeded_memory_budget_(false),
210 rendering_stats_instrumentation_(rendering_stats_instrumentation), 218 rendering_stats_instrumentation_(rendering_stats_instrumentation),
211 did_initialize_visible_tile_(false), 219 did_initialize_visible_tile_(false),
212 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 220 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
213 raster_worker_pool_->SetClient(this); 221 raster_worker_pool_->SetClient(this);
222 if (ganesh_rasterizer_)
223 ganesh_rasterizer_->SetClient(this);
214 } 224 }
215 225
216 TileManager::~TileManager() { 226 TileManager::~TileManager() {
217 // Reset global state and manage. This should cause 227 // Reset global state and manage. This should cause
218 // our memory usage to drop to zero. 228 // our memory usage to drop to zero.
219 global_state_ = GlobalStateThatImpactsTilePriority(); 229 global_state_ = GlobalStateThatImpactsTilePriority();
220 230
221 CleanUpReleasedTiles(); 231 CleanUpReleasedTiles();
222 DCHECK_EQ(0u, tiles_.size()); 232 DCHECK_EQ(0u, tiles_.size());
223 233
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 return requirements.PassAs<base::Value>(); 591 return requirements.PassAs<base::Value>();
582 } 592 }
583 593
584 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { 594 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const {
585 DCHECK(tile); 595 DCHECK(tile);
586 DCHECK(tile->picture_pile()); 596 DCHECK(tile->picture_pile());
587 597
588 const ManagedTileState& mts = tile->managed_state(); 598 const ManagedTileState& mts = tile->managed_state();
589 RasterMode current_mode = mts.raster_mode; 599 RasterMode current_mode = mts.raster_mode;
590 600
601 // TODO(skaslev)
602 return GANESH_RASTER_MODE;
591 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; 603 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE;
592 if (tile->managed_state().resolution == LOW_RESOLUTION) 604 if (tile->managed_state().resolution == LOW_RESOLUTION)
593 raster_mode = LOW_QUALITY_RASTER_MODE; 605 raster_mode = LOW_QUALITY_RASTER_MODE;
594 else if (tile->can_use_lcd_text()) 606 else if (tile->can_use_lcd_text())
595 raster_mode = HIGH_QUALITY_RASTER_MODE; 607 raster_mode = HIGH_QUALITY_RASTER_MODE;
596 else if (mts.tile_versions[current_mode].has_text_ || 608 else if (mts.tile_versions[current_mode].has_text_ ||
597 !mts.tile_versions[current_mode].IsReadyToDraw()) 609 !mts.tile_versions[current_mode].IsReadyToDraw())
598 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; 610 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE;
599 611
600 return std::min(raster_mode, current_mode); 612 return std::min(raster_mode, current_mode);
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 } 802 }
791 803
792 void TileManager::ScheduleTasks( 804 void TileManager::ScheduleTasks(
793 const TileVector& tiles_that_need_to_be_rasterized) { 805 const TileVector& tiles_that_need_to_be_rasterized) {
794 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", 806 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
795 "count", tiles_that_need_to_be_rasterized.size()); 807 "count", tiles_that_need_to_be_rasterized.size());
796 RasterWorkerPool::RasterTask::Queue tasks; 808 RasterWorkerPool::RasterTask::Queue tasks;
797 809
798 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 810 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
799 811
812 GaneshRasterizer::RasterTaskVector ganesh_tasks;
813
800 // Build a new task queue containing all task currently needed. Tasks 814 // Build a new task queue containing all task currently needed. Tasks
801 // are added in order of priority, highest priority task first. 815 // are added in order of priority, highest priority task first.
802 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 816 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
803 it != tiles_that_need_to_be_rasterized.end(); 817 it != tiles_that_need_to_be_rasterized.end();
804 ++it) { 818 ++it) {
805 Tile* tile = *it; 819 Tile* tile = *it;
806 ManagedTileState& mts = tile->managed_state(); 820 ManagedTileState& mts = tile->managed_state();
807 ManagedTileState::TileVersion& tile_version = 821 ManagedTileState::TileVersion& tile_version =
808 mts.tile_versions[mts.raster_mode]; 822 mts.tile_versions[mts.raster_mode];
809 823
810 DCHECK(tile_version.requires_resource()); 824 DCHECK(tile_version.requires_resource());
811 DCHECK(!tile_version.resource_); 825 DCHECK(!tile_version.resource_);
812 826
813 if (tile_version.raster_task_.is_null()) 827 // TODO(skaslev) Set proper raster_mode somewhere else,
814 tile_version.raster_task_ = CreateRasterTask(tile); 828 // e.g. AssignGpuMemoryToTiles.
829 if (mts.raster_mode == GANESH_RASTER_MODE) {
830 ganesh_tasks.push_back(CreateGaneshRasterTask(tile));
831 } else {
832 if (tile_version.raster_task_.is_null())
833 tile_version.raster_task_ = CreateRasterTask(tile);
815 834
816 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 835 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
836 }
817 } 837 }
818 838
819 // We must reduce the amount of unused resoruces before calling 839 // We must reduce the amount of unused resoruces before calling
820 // ScheduleTasks to prevent usage from rising above limits. 840 // ScheduleTasks to prevent usage from rising above limits.
821 resource_pool_->ReduceResourceUsage(); 841 resource_pool_->ReduceResourceUsage();
822 842
823 // Schedule running of |tasks|. This replaces any previously 843 // Schedule running of |tasks|. This replaces any previously
824 // scheduled tasks and effectively cancels all tasks not present 844 // scheduled tasks and effectively cancels all tasks not present
825 // in |tasks|. 845 // in |tasks|.
826 raster_worker_pool_->ScheduleTasks(&tasks); 846 raster_worker_pool_->ScheduleTasks(&tasks);
827 847
828 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 848 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
849
850 if (!ganesh_tasks.empty()) {
851 ganesh_rasterizer_->Rasterize(
852 ganesh_tasks, rendering_stats_instrumentation_);
853 }
829 } 854 }
830 855
831 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 856 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
832 Tile* tile, skia::LazyPixelRef* pixel_ref) { 857 Tile* tile, skia::LazyPixelRef* pixel_ref) {
833 return RasterWorkerPool::CreateImageDecodeTask( 858 return RasterWorkerPool::CreateImageDecodeTask(
834 pixel_ref, 859 pixel_ref,
835 tile->layer_id(), 860 tile->layer_id(),
836 rendering_stats_instrumentation_, 861 rendering_stats_instrumentation_,
837 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 862 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
838 base::Unretained(this), 863 base::Unretained(this),
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 tile->source_frame_number(), 910 tile->source_frame_number(),
886 rendering_stats_instrumentation_, 911 rendering_stats_instrumentation_,
887 base::Bind(&TileManager::OnRasterTaskCompleted, 912 base::Bind(&TileManager::OnRasterTaskCompleted,
888 base::Unretained(this), 913 base::Unretained(this),
889 tile->id(), 914 tile->id(),
890 base::Passed(&resource), 915 base::Passed(&resource),
891 mts.raster_mode), 916 mts.raster_mode),
892 &decode_tasks); 917 &decode_tasks);
893 } 918 }
894 919
920 GaneshRasterizer::RasterTask* TileManager::CreateGaneshRasterTask(Tile* tile) {
921 scoped_ptr<ResourcePool::Resource> resource =
922 resource_pool_->AcquireResource(tile->tile_size_.size(),
923 ganesh_rasterizer_->GetResourceFormat());
924 return ganesh_rasterizer_->CreateRasterTask(tile, resource.Pass());
925 }
926
895 void TileManager::OnImageDecodeTaskCompleted( 927 void TileManager::OnImageDecodeTaskCompleted(
896 int layer_id, 928 int layer_id,
897 skia::LazyPixelRef* pixel_ref, 929 skia::LazyPixelRef* pixel_ref,
898 bool was_canceled) { 930 bool was_canceled) {
899 // If the task was canceled, we need to clean it up 931 // If the task was canceled, we need to clean it up
900 // from |image_decode_tasks_|. 932 // from |image_decode_tasks_|.
901 if (!was_canceled) 933 if (!was_canceled)
902 return; 934 return;
903 935
904 LayerPixelRefTaskMap::iterator layer_it = 936 LayerPixelRefTaskMap::iterator layer_it =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 985
954 bytes_releasable_ += BytesConsumedIfAllocated(tile); 986 bytes_releasable_ += BytesConsumedIfAllocated(tile);
955 ++resources_releasable_; 987 ++resources_releasable_;
956 } 988 }
957 989
958 FreeUnusedResourcesForTile(tile); 990 FreeUnusedResourcesForTile(tile);
959 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 991 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
960 did_initialize_visible_tile_ = true; 992 did_initialize_visible_tile_ = true;
961 } 993 }
962 994
995 void TileManager::OnGaneshRasterTaskCompleted(
996 Tile* tile,
997 scoped_ptr<ResourcePool::Resource> resource,
998 bool was_canceled) {
999 ManagedTileState& mts = tile->managed_state();
1000 ManagedTileState::TileVersion& tile_version =
1001 mts.tile_versions[GANESH_RASTER_MODE];
1002 DCHECK(tile_version.raster_task_.is_null());
1003
1004 if (was_canceled) {
1005 ++update_visible_tiles_stats_.canceled_count;
1006 resource_pool_->ReleaseResource(resource.Pass());
1007 return;
1008 }
1009
1010 ++update_visible_tiles_stats_.completed_count;
1011
1012 tile_version.set_use_resource();
1013 tile_version.resource_ = resource.Pass();
1014
1015 bytes_releasable_ += BytesConsumedIfAllocated(tile);
1016 ++resources_releasable_;
1017
1018 FreeUnusedResourcesForTile(tile);
1019 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
1020 did_initialize_visible_tile_ = true;
1021 }
1022
963 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1023 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
964 gfx::Size tile_size, 1024 gfx::Size tile_size,
965 gfx::Rect content_rect, 1025 gfx::Rect content_rect,
966 gfx::Rect opaque_rect, 1026 gfx::Rect opaque_rect,
967 float contents_scale, 1027 float contents_scale,
968 int layer_id, 1028 int layer_id,
969 int source_frame_number, 1029 int source_frame_number,
970 bool can_use_lcd_text) { 1030 bool can_use_lcd_text) {
971 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1031 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
972 picture_pile, 1032 picture_pile,
973 tile_size, 1033 tile_size,
974 content_rect, 1034 content_rect,
975 opaque_rect, 1035 opaque_rect,
976 contents_scale, 1036 contents_scale,
977 layer_id, 1037 layer_id,
978 source_frame_number, 1038 source_frame_number,
979 can_use_lcd_text)); 1039 can_use_lcd_text));
980 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1040 DCHECK(tiles_.find(tile->id()) == tiles_.end());
981 1041
982 tiles_[tile->id()] = tile; 1042 tiles_[tile->id()] = tile;
983 used_layer_counts_[tile->layer_id()]++; 1043 used_layer_counts_[tile->layer_id()]++;
984 prioritized_tiles_dirty_ = true; 1044 prioritized_tiles_dirty_ = true;
985 return tile; 1045 return tile;
986 } 1046 }
987 1047
988 } // namespace cc 1048 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698